@unifylib/ui-lib 1.2.15 → 1.2.17

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.
Files changed (84) hide show
  1. package/cli/client-app-component-guide.md +166 -166
  2. package/cli/generators/dashboard.js +147 -147
  3. package/cli/generators/form-screen.js +95 -95
  4. package/cli/generators/line-editor.js +110 -110
  5. package/cli/generators/permission-matrix.js +115 -115
  6. package/cli/generators/section-form.js +103 -103
  7. package/cli/generators/table-screen.js +181 -181
  8. package/cli/index.js +185 -185
  9. package/cli/utils.js +228 -228
  10. package/esm2022/iq-ui-lib.mjs +5 -0
  11. package/esm2022/lib/base-model/SearchStrConfig.mjs +1 -1
  12. package/esm2022/lib/base-model/api-response.mjs +1 -1
  13. package/esm2022/lib/base-model/audit-log-entry.mjs +1 -1
  14. package/esm2022/lib/base-model/button-action-settings.mjs +1 -1
  15. package/esm2022/lib/base-model/column-def.model.mjs +1 -1
  16. package/esm2022/lib/base-model/do-action-request.mjs +1 -1
  17. package/esm2022/lib/base-model/field-action.mjs +1 -1
  18. package/esm2022/lib/base-model/field-filter.model.mjs +1 -1
  19. package/esm2022/lib/base-model/field-info.mjs +1 -1
  20. package/esm2022/lib/base-model/field-predicate.model.mjs +1 -1
  21. package/esm2022/lib/base-model/filter-request.mjs +1 -1
  22. package/esm2022/lib/base-model/filter.model.mjs +1 -1
  23. package/esm2022/lib/base-model/get-items-list.mjs +1 -1
  24. package/esm2022/lib/base-model/index.mjs +1 -1
  25. package/esm2022/lib/base-model/items-total.model.mjs +1 -1
  26. package/esm2022/lib/base-model/line-item.model.mjs +1 -1
  27. package/esm2022/lib/base-model/lookupItem.mjs +1 -1
  28. package/esm2022/lib/base-model/page-info.mjs +1 -1
  29. package/esm2022/lib/base-model/permission-matrix.model.mjs +1 -1
  30. package/esm2022/lib/base-model/report-request.model.mjs +1 -1
  31. package/esm2022/lib/base-model/response-envelop.model.mjs +1 -1
  32. package/esm2022/lib/base-model/snack-message.model.mjs +1 -1
  33. package/esm2022/lib/base-model/table-column.interface.mjs +1 -1
  34. package/esm2022/lib/base-model/table-page-user-action.interface.mjs +1 -1
  35. package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +1 -1
  36. package/esm2022/lib/base-model/workflow/workflow.model.mjs +1 -1
  37. package/esm2022/lib/components/action-comment/action-comment.component.mjs +3 -3
  38. package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +3 -3
  39. package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +3 -3
  40. package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +3 -3
  41. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +3 -3
  42. package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +3 -3
  43. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +3 -3
  44. package/esm2022/lib/components/base-form/base-form.component.mjs +3 -3
  45. package/esm2022/lib/components/base-form-canvas/MaxDigitsDirective.mjs +1 -1
  46. package/esm2022/lib/components/base-form-canvas/NumbersOnlyDirective.mjs +1 -1
  47. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +3 -3
  48. package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +3 -3
  49. package/esm2022/lib/components/base-table/base-table.component.mjs +3 -3
  50. package/esm2022/lib/components/button-actions/button-actions.component.mjs +3 -3
  51. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +3 -3
  52. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +3 -3
  53. package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +3 -3
  54. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +3 -3
  55. package/esm2022/lib/components/paginator/paginator.component.mjs +3 -3
  56. package/esm2022/lib/components/permission-matrix/permission-matrix.component.mjs +3 -3
  57. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +3 -3
  58. package/esm2022/lib/components/report-form/report-form.component.mjs +3 -3
  59. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  60. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +3 -3
  61. package/esm2022/lib/components/shared/action-button/action-button.component.mjs +3 -3
  62. package/esm2022/lib/components/shared/action-card/action-card.component.mjs +3 -3
  63. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +3 -3
  64. package/esm2022/lib/components/shared-list/shared-list.component.mjs +3 -3
  65. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +3 -3
  66. package/esm2022/lib/components/title-bar/title-bar.component.mjs +3 -3
  67. package/esm2022/lib/directives/phone-number-only.directive.mjs +1 -1
  68. package/esm2022/lib/services/backend-service.mjs +1 -1
  69. package/esm2022/lib/services/index.mjs +1 -1
  70. package/esm2022/lib/services/top-panel.mjs +1 -1
  71. package/esm2022/lib/services/trigger-form.service.mjs +1 -1
  72. package/esm2022/lib/utils/base-utils.mjs +1 -1
  73. package/esm2022/lib/validators/date-range-validator.mjs +1 -1
  74. package/esm2022/lib/validators/index.mjs +1 -1
  75. package/esm2022/lib/validators/match-list.validator.mjs +1 -1
  76. package/esm2022/lib/validators/multi-email-validator.mjs +1 -1
  77. package/esm2022/public-api.mjs +1 -1
  78. package/fesm2022/iq-ui-lib.mjs +7059 -0
  79. package/fesm2022/iq-ui-lib.mjs.map +1 -0
  80. package/index.d.ts +1 -1
  81. package/package.json +14 -6
  82. package/esm2022/unifylib-ui-lib.mjs +0 -5
  83. package/fesm2022/unifylib-ui-lib.mjs +0 -7059
  84. package/fesm2022/unifylib-ui-lib.mjs.map +0 -1
@@ -414,7 +414,7 @@ export class EditableBaseTableComponent extends BaseUtils {
414
414
  // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
415
415
  // },
416
416
  // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
417
- ], viewQueries: [{ propertyName: "uploaderComponent", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "pipe", type: i9.PaginatePipe, name: "paginate" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "component", type: EquationBuilderComponent, selector: "lib-equation-builder", inputs: ["form", "field", "isPending", "readOnly"], outputs: ["valueChanged"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "attachmentsAlwaysEditable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], animations: [] }); }
417
+ ], viewQueries: [{ propertyName: "uploaderComponent", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"baseTable flex-column\">\n <div class=\"left-align\">\n <app-attachment-uploader #uploader\n *ngIf=\"isBulkItemsSupported\"\n (fileSelected)=\"handleFileUpload($event)\">\n </app-attachment-uploader>\n </div>\n\n <div class=\"flex-row full-width\">\n <div class=\"flex-half flex-column align-center-start\">\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [titleMode]=\"''\"\n [newAction]=\"false\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\n </app-title-bar>\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\n </div>\n <div class=\"flex-half flex-column align-start-end\">\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\n {{ 'finished' | translate }}\n </mat-chip-option>\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\n {{ 'todo' | translate }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n </div>\n\n <ng-container *ngIf=\"showSearch()\">\n <div class=\"flex-row full-width\">\n <div class=\"flex-80 flex-column align-start-end\">\n <app-base-form-canvas class=\"flex-fill\"\n [pageInfo]=\"pageInfo\"\n [fields]=\"searchFormFields\"\n [editable]=\"true\"\n (formUpdated)=\"updateSearchForm($event)\">\n </app-base-form-canvas>\n </div>\n <div class=\"flex-15 flex-column align-start-end\">\n <div class=\"flex-row align-center-center gap-8 full-width\">\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\n <mat-icon>search</mat-icon>\n {{ 'search' | translate }}\n </button>\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\n <mat-icon>clear</mat-icon>\n {{ 'clear' | translate }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex-row full-width baseTable__detailsColumn\">\n <div class=\"flex-full\">\n <ng-container *ngIf=\"isLoaded\">\n <div class=\"flex-row mainTable gap-0 align-start-start\">\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\n <ng-container matColumnDef=\"{{column.property}}\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\n <lib-equation-builder\n [form]=\"element\"\n [field]=\"column\"\n [readOnly]=\"column.readonly\"\n [isPending]=\"isPending\"\n (valueChanged)=\"handleEquationChange($event, element, column)\">\n </lib-equation-builder>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <app-auto-complete\n [form]=\"element\"\n [field]=\"column\"\n [defaultValue]=\"element.get(column.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, column.property)\">\n </app-auto-complete>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'list'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-label>{{element}}</mat-label>\n <mat-select\n formControlName=\"{{column.property}}\"\n [attr.aria-label]=\"column.label! | translate\"\n [multiple]=\"false\"\n [(value)]=\"element[column.property]\">\n <ng-container>\n <mat-option\n *ngFor=\"let item of column.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-container>\n </mat-select>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'stateType'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ 'action' | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\n <div class=\"flex-column\">\n <div class=\"flex-row full-width\">\n <div class=\"flex-third flex-column align-center-center\">\n <button mat-button class=\"btn-none-background-primary\"\n color=\"primary\"\n [disabled]=\"disabledSaveButton(element)\"\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\n </button>\n </div>\n <div class=\"flex-third flex-column align-center-center\">\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\n color=\"accent\"\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\n </button>\n </div>\n <div class=\"flex-third flex-column align-center-center\"></div>\n </div>\n </div>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\n <input matInput\n [disabled]=\"column.readonly\"\n [readonly]=\"column.readonly\"\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker startView=\"multi-year\"\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\n panelClass=\"example-month-picker\"></mat-datepicker>\n\n </mat-form-field>\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\n <!-- </mat-form-field>-->\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\n <mat-label>\n </mat-label>\n\n <input matInput\n type=\"number\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n </mat-form-field>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'status'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-checkbox\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\"\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\n (click)=\"column.readonly ? $event.preventDefault() : null\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'text'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <mat-label>\n {{ labelKey(column) | translate }}\n </mat-label>\n <input matInput\n type=\"text\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n </mat-form-field>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"xpicker\"\n [min]=\"minDate\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [disabled]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"xpicker\"\n [disabled]=\"column.readonly\">\n </mat-datepicker-toggle>\n <mat-datepicker #xpicker></mat-datepicker>\n </mat-form-field>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <input matInput\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [formControl]=\"getField(element, column)\">\n </mat-form-field>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\n mat-row></tr>\n </table>\n </form>\n </div>\n\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\n <div class=\"flex-column flex-full\">\n <span class=\"dataNotFound__details\">\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\n <span>{{ 'dataNotFound' | translate }}</span>\n </span>\n </div>\n </div>\n\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\n <div>\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\n <mat-icon>add_box</mat-icon>\n {{ translationKey | translate }}\n </button>\n </div>\n </div>\n\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\n <div class=\"flex-column flex-full\">\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\n </div>\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\n </div>\n <div class=\"flex-column flex-2\"></div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\n <div>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\n <mat-icon>add_box</mat-icon>\n {{ 'addAll' | translate }}\n </button>\n </div>\n <div>\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\n <mat-icon>delete</mat-icon>\n {{ 'clearAll' | translate }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "pipe", type: i9.PaginatePipe, name: "paginate" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "component", type: EquationBuilderComponent, selector: "lib-equation-builder", inputs: ["form", "field", "isPending", "readOnly"], outputs: ["valueChanged"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "attachmentsAlwaysEditable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], animations: [] }); }
418
418
  }
419
419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableBaseTableComponent, decorators: [{
420
420
  type: Component,
@@ -470,7 +470,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
470
470
  // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
471
471
  // },
472
472
  // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
473
- ], template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"] }]
473
+ ], template: "<div class=\"baseTable flex-column\">\n <div class=\"left-align\">\n <app-attachment-uploader #uploader\n *ngIf=\"isBulkItemsSupported\"\n (fileSelected)=\"handleFileUpload($event)\">\n </app-attachment-uploader>\n </div>\n\n <div class=\"flex-row full-width\">\n <div class=\"flex-half flex-column align-center-start\">\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [titleMode]=\"''\"\n [newAction]=\"false\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\n </app-title-bar>\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\n </div>\n <div class=\"flex-half flex-column align-start-end\">\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\n {{ 'finished' | translate }}\n </mat-chip-option>\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\n {{ 'todo' | translate }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n </div>\n\n <ng-container *ngIf=\"showSearch()\">\n <div class=\"flex-row full-width\">\n <div class=\"flex-80 flex-column align-start-end\">\n <app-base-form-canvas class=\"flex-fill\"\n [pageInfo]=\"pageInfo\"\n [fields]=\"searchFormFields\"\n [editable]=\"true\"\n (formUpdated)=\"updateSearchForm($event)\">\n </app-base-form-canvas>\n </div>\n <div class=\"flex-15 flex-column align-start-end\">\n <div class=\"flex-row align-center-center gap-8 full-width\">\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\n <mat-icon>search</mat-icon>\n {{ 'search' | translate }}\n </button>\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\n <mat-icon>clear</mat-icon>\n {{ 'clear' | translate }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex-row full-width baseTable__detailsColumn\">\n <div class=\"flex-full\">\n <ng-container *ngIf=\"isLoaded\">\n <div class=\"flex-row mainTable gap-0 align-start-start\">\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\n <ng-container matColumnDef=\"{{column.property}}\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\n <lib-equation-builder\n [form]=\"element\"\n [field]=\"column\"\n [readOnly]=\"column.readonly\"\n [isPending]=\"isPending\"\n (valueChanged)=\"handleEquationChange($event, element, column)\">\n </lib-equation-builder>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <app-auto-complete\n [form]=\"element\"\n [field]=\"column\"\n [defaultValue]=\"element.get(column.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, column.property)\">\n </app-auto-complete>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'list'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-label>{{element}}</mat-label>\n <mat-select\n formControlName=\"{{column.property}}\"\n [attr.aria-label]=\"column.label! | translate\"\n [multiple]=\"false\"\n [(value)]=\"element[column.property]\">\n <ng-container>\n <mat-option\n *ngFor=\"let item of column.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-container>\n </mat-select>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'stateType'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ 'action' | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\n <div class=\"flex-column\">\n <div class=\"flex-row full-width\">\n <div class=\"flex-third flex-column align-center-center\">\n <button mat-button class=\"btn-none-background-primary\"\n color=\"primary\"\n [disabled]=\"disabledSaveButton(element)\"\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\n </button>\n </div>\n <div class=\"flex-third flex-column align-center-center\">\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\n color=\"accent\"\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\n </button>\n </div>\n <div class=\"flex-third flex-column align-center-center\"></div>\n </div>\n </div>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\n <input matInput\n [disabled]=\"column.readonly\"\n [readonly]=\"column.readonly\"\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker startView=\"multi-year\"\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\n panelClass=\"example-month-picker\"></mat-datepicker>\n\n </mat-form-field>\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\n <!-- </mat-form-field>-->\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\n <mat-label>\n </mat-label>\n\n <input matInput\n type=\"number\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n </mat-form-field>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'status'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-checkbox\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\"\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\n (click)=\"column.readonly ? $event.preventDefault() : null\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'text'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <mat-label>\n {{ labelKey(column) | translate }}\n </mat-label>\n <input matInput\n type=\"text\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n </mat-form-field>\n </td>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\n {{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"xpicker\"\n [min]=\"minDate\"\n [formControl]=\"getField(element, column)\"\n [required]=\"column.required\"\n [readonly]=\"column.readonly\"\n [disabled]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [attr.aria-labelledby]=\"'label-' + column.property\"\n [attr.aria-describedby]=\"'error-' + column.property\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"xpicker\"\n [disabled]=\"column.readonly\">\n </mat-datepicker-toggle>\n <mat-datepicker #xpicker></mat-datepicker>\n </mat-form-field>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\n </th>\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\n mat-cell>\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\n <input matInput\n [readonly]=\"column.readonly\"\n [attr.aria-required]=\"column.required\"\n [formControl]=\"getField(element, column)\">\n </mat-form-field>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\n mat-row></tr>\n </table>\n </form>\n </div>\n\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\n <div class=\"flex-column flex-full\">\n <span class=\"dataNotFound__details\">\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\n <span>{{ 'dataNotFound' | translate }}</span>\n </span>\n </div>\n </div>\n\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\n <div>\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\n <mat-icon>add_box</mat-icon>\n {{ translationKey | translate }}\n </button>\n </div>\n </div>\n\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\n <div class=\"flex-column flex-full\">\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\n </div>\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\n </div>\n <div class=\"flex-column flex-2\"></div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\n <div>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\n <mat-icon>add_box</mat-icon>\n {{ 'addAll' | translate }}\n </button>\n </div>\n <div>\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\n <mat-icon>delete</mat-icon>\n {{ 'clearAll' | translate }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"] }]
474
474
  }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.Router }, { type: i3.FormBuilder }, { type: i4.MatDialog }, { type: i5.Directionality }], propDecorators: { filterRequest: [{
475
475
  type: Input
476
476
  }], superDataElements: [{
@@ -504,4 +504,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
504
504
  type: ViewChild,
505
505
  args: ['fileUpload']
506
506
  }] } });
507
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQTBD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RkFBNEY7b0JBQzVGLDhGQUE4RjtvQkFDOUYsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLDBCQUEwQjtvQkFDMUIsaUNBQWlDO29CQUNqQyw4REFBOEQ7b0JBQzlELEtBQUs7b0JBRUwsdURBQXVEO3FCQUN4RDt1TEFxQ0QsYUFBYTtzQkFEWixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFHRSxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRWlCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQTRTSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgTWF0Q2VsbCxcclxuICBNYXRDZWxsRGVmLFxyXG4gIE1hdENvbHVtbkRlZixcclxuICBNYXRIZWFkZXJDZWxsLFxyXG4gIE1hdEhlYWRlckNlbGxEZWYsXHJcbiAgTWF0SGVhZGVyUm93LFxyXG4gIE1hdEhlYWRlclJvd0RlZixcclxuICBNYXRSb3csXHJcbiAgTWF0Um93RGVmLFxyXG4gIE1hdFRhYmxlXHJcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdFNvcnRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEJ1dHRvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQge05neFBhZ2luYXRpb25Nb2R1bGV9IGZyb20gXCJuZ3gtcGFnaW5hdGlvblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7TWF0RXJyb3IsIE1hdEZvcm1GaWVsZCwgTWF0SW5wdXQsIE1hdExhYmVsLCBNYXRTdWZmaXh9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlVXRpbHMsXHJcbiAgYnVpbGRGb3JtRmllbGRzLFxyXG4gIGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXksXHJcbiAgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSxcclxuICBnZXRXZkFjdGlvbklkXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBFTVBUWV9QQUdFX0lORk8sXHJcbiAgRmllbGRJbmZvLFxyXG4gIEZpbHRlcixcclxuICBGaWx0ZXJSZXF1ZXN0LFxyXG4gIExvb2t1cEl0ZW0sXHJcbiAgUGFnZUluZm8sXHJcbiAgU0VMRUNUX1JFQ09SRF9BQ1RJT04sXHJcbiAgU25hY2tNZXNzYWdlLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFJFSkVDVCwgU0FWRX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZG8tYWN0aW9uLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtBY3Rpb25Db21tZW50Q29tcG9uZW50fSBmcm9tIFwiLi4vYWN0aW9uLWNvbW1lbnQvYWN0aW9uLWNvbW1lbnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7TWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNYXREYXRlcGlja2VyVG9nZ2xlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xyXG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQge0F1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7TWF0Q2hpcExpc3Rib3gsIE1hdENoaXBPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGlwc1wiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuaW1wb3J0IHtBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnR9IGZyb20gXCIuLi9zaGFyZWQvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0VxdWF0aW9uQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuXHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1lZGl0YWJsZS1iYXNlLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTWF0Q29sdW1uRGVmLFxyXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcclxuICAgIE5nSWYsXHJcbiAgICBNYXRUYWJsZSxcclxuICAgIE1hdEhlYWRlckNlbGwsXHJcbiAgICBOZ1N3aXRjaCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENlbGwsXHJcbiAgICBNYXRDZWxsRGVmLFxyXG4gICAgTmd4UGFnaW5hdGlvbk1vZHVsZSxcclxuICAgIE1hdFJvdyxcclxuICAgIE1hdFJvd0RlZixcclxuICAgIE1hdEhlYWRlclJvdyxcclxuICAgIE5nU3dpdGNoQ2FzZSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgIE1hdEhlYWRlclJvd0RlZixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXREYXRlcGlja2VyLFxyXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxyXG4gICAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcclxuICAgIE1hdExhYmVsLFxyXG4gICAgTWF0U3VmZml4LFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRDaGlwT3B0aW9uLFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQsXHJcbiAgICBFcXVhdGlvbkJ1aWxkZXJDb21wb25lbnQsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICAvLyBgTW9tZW50RGF0ZUFkYXB0ZXJgIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIGJ5IGltcG9ydGluZyBgTW9tZW50RGF0ZU1vZHVsZWAgaW4geW91clxyXG4gICAgLy8gYXBwbGljYXRpb24ncyByb290IG1vZHVsZS4gV2UgcHJvdmlkZSBpdCBhdCB0aGUgY29tcG9uZW50IGxldmVsIGhlcmUsIGR1ZSB0byBsaW1pdGF0aW9ucyBvZlxyXG4gICAgLy8gb3VyIGV4YW1wbGUgZ2VuZXJhdGlvbiBzY3JpcHQuXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgIHByb3ZpZGU6IERhdGVBZGFwdGVyLFxyXG4gICAgLy8gICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXHJcbiAgICAvLyAgIGRlcHM6IFtNQVRfREFURV9MT0NBTEUsIE1BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlNdLFxyXG4gICAgLy8gfSxcclxuXHJcbiAgICAvLyB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBNWV9GT1JNQVRTIH0sXHJcbiAgXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IG1vbWVudChbMTgwMCwgMCwgMV0pO1xyXG5cclxuICBjb2xsZWN0aW9uID0ge2NvdW50OiA2MCwgZGF0YTogW119O1xyXG4gIGNvbmZpZyA9IHtcclxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXHJcbiAgICBjdXJyZW50UGFnZTogMSxcclxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxyXG4gIH07XHJcbiAgcHVibGljIG1heFNpemU6IG51bWJlciA9IDc7XHJcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYXV0b0hpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xyXG4gICAgcHJldmlvdXNMYWJlbDogJzwnLFxyXG4gICAgbmV4dExhYmVsOiAnPicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcclxuICAgIHNjcmVlblJlYWRlclBhZ2VMYWJlbDogJ3BhZ2UnLFxyXG4gICAgc2NyZWVuUmVhZGVyQ3VycmVudExhYmVsOiBgWW91J3JlIG9uIHBhZ2VgXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIGRhdGFFbGVtZW50czogYW55W10gPSBbXTtcclxuICBub0RhdGFGb3VuZCA9IGZhbHNlO1xyXG4gIGlzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG90YWxFbGVtZW50cyA9IDA7XHJcbiAgcGFnZXNDb3VudCA9IDA7XHJcbiAgcGFnZUluZGV4ID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIGZvcm1QYXJhbTogRm9ybUdyb3VwO1xyXG4gIHNlYXJjaEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgQElucHV0KClcclxuICBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHN1cGVyRGF0YUVsZW1lbnRzOiBhbnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBvdmVycmlkZSBwYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNCdWxrSXRlbXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIGZpZWxkczogRmllbGRJbmZvW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIHNlYXJjaEZvcm1GaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5OiBzdHJpbmcgPSAnYWRkTmV3JztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZm9ybVVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBY3Rpb25FbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBdHRhY2htZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCkgYWN0aW9uUmVxdWVzdENhbGxiYWNrITogKGFjdGlvblJlcXVlc3Q6IERvQWN0aW9uUmVxdWVzdCkgPT4gRG9BY3Rpb25SZXF1ZXN0O1xyXG5cclxuICBAVmlld0NoaWxkKCd1cGxvYWRlcicpIHVwbG9hZGVyQ29tcG9uZW50ITogQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50O1xyXG5cclxuICBjdXJyZW50RGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnO1xyXG4gIHNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjogRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHlcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YUZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVBhcmFtLmdldCgnZGF0YUZvcm1BcnJheScpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RGb3JtYXQoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+KSB7XHJcbiAgICByZXR1cm4gY29sdW1uPy5mb3JtYXQgfHwgJ2QvTS95eXl5LCBoOm1tIGEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRm9ybUFycmF5LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmKHRoaXMuc3VwZXJEYXRhRWxlbWVudHM/Lmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHM9dGhpcy5zdXBlckRhdGFFbGVtZW50cztcclxuICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGEoKSB7XHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLnJlYWRvbmx5ID0gdGhpcy5pc1BlbmRpbmcpO1xyXG5cclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSAwO1xyXG4gICAgdGhpcy5wYWdlc0NvdW50ID0gMTtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSkge1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSByZXNwLmJvZHkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwLnRvdGFsU2l6ZSB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlc0NvdW50ID0gTWF0aC5tYXgoTWF0aC5jZWlsKHRoaXMudG90YWxFbGVtZW50cyAvIHRoaXMucGFnZVNpemUpLCAxKTtcclxuICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggfHwgMCkgKyAxO1xyXG4gICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybVBhcmFtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRhdGFGb3JtQXJyYXk6IHRoaXMuZmIuYXJyYXkodGhpcy5kYXRhRWxlbWVudHMubWFwKGl0ZW0gPT4gdGhpcy5mYi5ncm91cChidWlsZEZvcm1GaWVsZHModGhpcy5maWVsZHMsIGl0ZW0pKSkpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLm5leHQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQ7XHJcbiAgICB0aGlzLmdldE5leHQodGhpcy5wYWdlSW5kZXggLSAxKTtcclxuICB9XHJcbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIGlmIChwcm9wZXJ0eS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSAmJiBjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcclxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS8ke21vZGV9YDtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gLCByb3c/LmlkXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHJvdztcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnZXRGaWVsZChlbGVtZW50LCBjb2x1bW46IEZpZWxkSW5mbykge1xyXG4gICAgICByZXR1cm4gIGVsZW1lbnQuY29udHJvbHNbY29sdW1uLnByb3BlcnR5XTtcclxuICB9XHJcblxyXG4gIGZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLCBlbGVtZW50LCBhY3Rpb25JZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgYWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW0sIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSlcclxuICB9XHJcblxyXG4gIGFkZE5ld0l0ZW0oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy5mb3JtUGFyYW0/LmdldCgnZGF0YUZvcm1BcnJheScpPy52YWx1ZTtcclxuICAgIGlmIChjdXJyZW50VmFsdWVzKSB7XHJcbiAgICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gWy4uLmN1cnJlbnRWYWx1ZXNdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhRWxlbWVudHMucHVzaCh7fSk7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgdXNlckFjdGlvbklkKSB7XHJcbiAgICBsZXQgYWN0aW9uSWQgPSAgZ2V0V2ZBY3Rpb25JZChlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSk7XHJcbiAgICBpZiAodXNlckFjdGlvbklkID09PSBSRUpFQ1QgJiYgdGhpcy5pc1BlbmRpbmcpIHtcclxuICAgICAgYWN0aW9uSWQgPTNcclxuICAgIH1cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2spIHtcclxuICAgICAgcmVxdWVzdCA9IHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKHJlcXVlc3QpO1xyXG4gICAgICBpZiAocmVxdWVzdC5zdWJqZWN0LmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgICByZXF1ZXN0LnN1YmplY3Quc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXF1ZXN0LnN1YmplY3QuaWQgPT09IFwiXCIpIHtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LnN0YXRlVHlwZSA9IFwiTkVXXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7bGFiZWw6IHVzZXJBY3Rpb25JZCA9PT0gMiA/ICdzYXZlJyA6ICdyZWplY3QnLCBpc1Rlcm1pbmF0aW9uOiBmYWxzZX0sXHJcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgZGlyZWN0aW9uOiAgdGhpcy5jdXJyZW50RGlyZWN0aW9uXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgcmVxdWVzdC5jb21tZW50ID0gcmVzdWx0LmNvbW1lbnQ7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgICAgICAgbGV0ICBtZXNzYWdlID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25JZCA9PT0gMSApIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlID0gJ3NhdmVkX3N1Y2Nlc3NmdWxseScgO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbklkID09PTIgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICd1cGRhdGVkX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uSWQgPT09MyApIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc3VjY2Vzc2Z1bF9yZWplY3RfbWVzc2FnZSc7XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKGFjdGlvbklkID09PTQgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICdhcHByb3ZlX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZShtZXNzYWdlLCB0cnVlLCAnc3VjY2VzcycpKTtcclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHJlc3AubWVzc2FnZT8ubGVuZ3RoID4wID8gcmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZSA6ICdGQUlMRURfQ09OVEFDVF9BRE1JTic7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoeCwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQWN0aW9uRW1pdHRlci5lbWl0KHtpdGVtOnJlcXVlc3Quc3ViamVjdCwgcmVzcH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkgPSBnZXRQb3NpdGl2ZVdmQWN0aW9uS2V5O1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5ID0gZ2V0TmVnYXRpdmVXZkFjdGlvbktleTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgU0FWRSA9IFNBVkU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFJFSkVDVCA9IFJFSkVDVDtcclxuXHJcblxyXG4gIHNldE1vbnRoQW5kWWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyOiBNb21lbnQsIHBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+LCBlbGVtZW50LCBjb2x1bW4pIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRm9ybUNvbnRyb2wobW9tZW50KCkpO1xyXG4gICAgY29uc3QgY3RybFZhbHVlID0gZGF0ZS52YWx1ZTtcclxuICAgIGN0cmxWYWx1ZS55ZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXIueWVhcigpKTtcclxuICAgIGN0cmxWYWx1ZS5tb250aCgxKTtcclxuICAgIGN0cmxWYWx1ZS5kYXlPZlllYXIoMSk7XHJcbiAgICBlbGVtZW50LmNvbnRyb2xzW2NvbHVtbi5wcm9wZXJ0eV0uc2V0VmFsdWUoY3RybFZhbHVlKTtcclxuICAgIHBpY2tlci5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoVmlld01vZGUoYjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1BlbmRpbmcgPSBiO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlwU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnksIGxpc3Rib3g/OiBNYXRDaGlwTGlzdGJveCk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gJ0NPTVBMRVRFRCcgJiYgdmFsdWUgIT09ICdQRU5ESU5HJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxpc3Rib3ggJiYgKGxpc3Rib3gudmFsdWUgPSB0aGlzLmlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzUGVuZGluZyA9IHZhbHVlID09PSAnUEVORElORyc7XHJcbiAgICBpZiAodGhpcy5pc1BlbmRpbmcgIT09IGlzUGVuZGluZykgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xyXG4gIH1cclxuXHJcbiAgYWRkQnVsa0l0ZW1zKCkge1xyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YUZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChncm91cDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIG1lcmdlZC5wdXNoKGdyb3VwLnZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IDE7XHJcblxyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0geyBpbnZvaWNlczogbWVyZ2VkIH07XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XHJcbiAgICAgIHJlcXVlc3QgPSB0aGlzLmFjdGlvblJlcXVlc3RDYWxsYmFjayhyZXF1ZXN0KTtcclxuXHJcbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBpdGVtLmlkID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pZCA9PT0gXCJcIikge1xyXG4gICAgICAgIGl0ZW0uaWQgPSBudWxsO1xyXG4gICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Db21tZW50Q29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHtsYWJlbDogICdzYXZlJyAsIGlzVGVybWluYXRpb246IGZhbHNlfSxcclxuICAgICAgd2lkdGg6ICc2MDBweCcsXHJcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICBkaXJlY3Rpb246ICB0aGlzLmN1cnJlbnREaXJlY3Rpb25cclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvQWN0aW9uV2l0aEF0dGFjaG1lbnQocmVxdWVzdCwgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIsIHRoaXMucGFnZUluZm8hKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQnVsa0l0ZW1zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ3NhdmVkX3N1Y2Nlc3NmdWxseScsIHRydWUsICdzdWNjZXNzJykpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgcmVzcC5tZXNzYWdlPy5bMF0/LmVycm9yQ29kZSwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7aXRlbTpyZXF1ZXN0LnN1YmplY3QsIHJlc3B9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7ICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWQnKSBmaWxlVXBsb2FkOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBoYW5kbGVGaWxlVXBsb2FkKCRldmVudDogRmlsZSkge1xyXG4gICAgbGV0IGFjdGlvbklkID0gIGdldFdmQWN0aW9uSWQoJ05FVycpO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgRG9BY3Rpb25SZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LmFjdGlvbklkID0gYWN0aW9uSWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSAkZXZlbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdWxkRGlzYWJsZUJ1bGtBZGQoKSB7XHJcbiAgICBjb25zdCBoYXNGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjtcclxuICAgIHJldHVybiAoIXRoaXMuZm9ybVBhcmFtPy52YWxpZCB8fCB0aGlzLmRhdGFGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSAmJiAhaGFzRmlsZTtcclxuICB9XHJcbiAgaGFuZGxlRXF1YXRpb25DaGFuZ2UoZXZlbnQ6IHsgdmFsdWU6IGFueVtdLCB2YWxpZDogYm9vbGVhbiB9LCBlbGVtZW50OiBGb3JtR3JvdXAsIGNvbHVtbjogYW55KTogdm9pZCB7XHJcbiAgICBlbGVtZW50LnZhbHVlW2NvbHVtbi5wcm9wZXJ0eV0gPSBldmVudC52YWx1ZTtcclxuICAgIGNvbnN0IHsgdmFsdWUsIHZhbGlkIH0gPSBldmVudDtcclxuICAgIGVsZW1lbnQuZ2V0KGNvbHVtbi5wcm9wZXJ0eSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKHsgaW52YWxpZEVxdWF0aW9uOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdWxrSXRlbXMoKSB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRlckNvbXBvbmVudC5jbGVhckZpbGUoKTtcclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgaGFzRGF0YVRvQ2xlYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuZGF0YUVsZW1lbnRzICYmIHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA+IDApIHx8ICEhdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXI7XHJcbiAgfVxyXG5nZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID9cclxuICAgICAgaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW07XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudCkge1xyXG4gICAgcmV0dXJuICFlbGVtZW50LnZhbGlkIHx8ICghdGhpcy5pc1BlbmRpbmcgJiYgZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUgPT0gJ1BFTkRJTkcnKTtcclxuICB9XHJcblxyXG4gIGRvU2VhcmNoKCkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXMgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleD0wO1xyXG4gICAgICB0aGlzLmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm1GaWVsZHMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWVzW3gucHJvcGVydHldO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgIGtleTogMCxcclxuICAgICAgICAgICAgICBsYWJlbDogeC5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWVsZE5hbWU6IHguc2VhcmNoQXR0cmlidXRlLFxyXG4gICAgICAgICAgICAgIHZhbHVlT2JqZWN0IDogeC5zZWFyY2hBdHRyaWJ1dGUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlW3guc2VhcmNoQXR0cmlidXRlLnNwbGl0KCcuJykucG9wKCldIDogdmFsdWUsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IHguc2VhcmNoT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5maWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ0lOVkFMSURfU0VBUkNIX0ZPUk0nLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VhcmNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybUZpZWxkcz8ubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgnc2VjdG9yVHlwZScpLnNldFZhbHVlKHtpZDotMTAwLCBlbmdsaXNoTmFtZTonYWFhJywgY29kZTonYWFhJywgYXJhYmljTmFtZTonYWFhJ30pO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmRvU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGb3JtKCRldmVudDogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm0gPSAkZXZlbnRcclxuICB9XHJcblxyXG4gIHZhbGlkU2VhcmNoRGF0YSgpIHtcclxuICAgIHJldHVybiAhdGhpcy5zZWFyY2hGb3JtLnZhbGlkIHx8IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYmFzZVRhYmxlIGZsZXgtY29sdW1uXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxlZnQtYWxpZ25cIj5cclxuICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlciAjdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQnVsa0l0ZW1zU3VwcG9ydGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cImhhbmRsZUZpbGVVcGxvYWQoJGV2ZW50KVwiPlxyXG4gICAgPC9hcHAtYXR0YWNobWVudC11cGxvYWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLXN0YXJ0XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyIFtwYWdlVGl0bGVdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycubGlzdF90aXRsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93RXh0cmFjdEJ1dHRvbl09XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc21hbGxcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1oYWxmIGZsZXgtY29sdW1uIGFsaWduLXN0YXJ0LWVuZFwiPlxyXG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjYm94IFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUuZG9jdW1lbnRTdGF0dXMnIHwgdHJhbnNsYXRlXCIgW211bHRpcGxlXT1cImZhbHNlXCIgW3ZhbHVlXT1cImlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwib25DaGlwU2VsZWN0aW9uQ2hhbmdlKCRldmVudCwgYm94KVwiICpuZ0lmPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIj5cclxuICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIFtzZWxlY3RlZF09XCIhaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJDT01QTEVURURcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICB7eyAnZmluaXNoZWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1jaGlwLW9wdGlvbiBbc2VsZWN0ZWRdPVwiaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJQRU5ESU5HXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAge3sgJ3RvZG8nIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NlYXJjaCgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC04MCBmbGV4LWNvbHVtbiBhbGlnbi1zdGFydC1lbmRcIj5cclxuICAgICAgICA8YXBwLWJhc2UtZm9ybS1jYW52YXMgY2xhc3M9XCJmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cInNlYXJjaEZvcm1GaWVsZHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtVXBkYXRlZCk9XCJ1cGRhdGVTZWFyY2hGb3JtKCRldmVudClcIj5cclxuICAgICAgICA8L2FwcC1iYXNlLWZvcm0tY2FudmFzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMTUgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGFsaWduLWNlbnRlci1jZW50ZXIgZ2FwLTggZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG9TZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAge3sgJ3NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtY2xlYXItc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICB7eyAnY2xlYXInIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGggYmFzZVRhYmxlX19kZXRhaWxzQ29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1mdWxsXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBtYWluVGFibGUgZ2FwLTAgYWxpZ24tc3RhcnQtc3RhcnRcIj5cclxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCIgY2xhc3M9XCJmbGV4LWZpbGxcIj5cclxuICAgICAgICAgICAgPHRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFGb3JtQXJyYXkuY29udHJvbHNcIiBjbGFzcz1cImZsZXgtZmlsbFwiIG1hdC10YWJsZSBtYXRTb3J0PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0aGlzLmZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5wcm9wZXJ0eX19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVxdWF0aW9uLWJ1aWxkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJlbGVtZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJoYW5kbGVFcXVhdGlvbkNoYW5nZSgkZXZlbnQsIGVsZW1lbnQsIGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItZXF1YXRpb24tYnVpbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0by1jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFZhbHVlKT1cInBhdGNoTG9va3VwVmFsdWUoJGV2ZW50LCBjb2x1bW4ucHJvcGVydHkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWF1dG8tY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2VsZW1lbnR9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7Y29sdW1uLnByb3BlcnR5fX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sdW1uLmxhYmVsISB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29sdW1uLmxpc3RPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0T3B0aW9uVmFsdWUoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdGVUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FjdGlvbicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWVsZEJ1dHRvbkV2ZW50KGNvbHVtbixlbGVtZW50LFNBVkUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtc2F2ZS0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpc1BlbmRpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLGVsZW1lbnQsUkVKRUNUKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2VkaXRhYmxlLXJlamVjdC0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIneWVhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciBzdGFydFZpZXc9XCJtdWx0aS15ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRNb250aEFuZFllYXIoJGV2ZW50LCBwaWNrZXIsIGVsZW1lbnQsY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJleGFtcGxlLW1vbnRoLXBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0b1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZnhGbGV4RmlsbD4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4LWF1dG8gZngtZmxleC1maWxsXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZpc3VhbGx5IGhpZGRlbiBsYWJlbCBqdXN0IHRvIHRyaWdnZXIgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBhc3RlcmlzayAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNHB4OyBwYWRkaW5nLXRvcDogMTRweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiY29sdW1uLnJlYWRvbmx5ID8gJ25vbmUnIDogJ2F1dG8nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJjb2x1bW4ucmVhZG9ubHkgPyAwLjcgOiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sdW1uLnJlYWRvbmx5ID8gJGV2ZW50LnByZXZlbnREZWZhdWx0KCkgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInZXJyb3ItJyArIGNvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJ4cGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwieHBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICN4cGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8dHIgKm1hdEhlYWRlclJvd0RlZj1cInZpc2libGVDb2x1bW5zXCIgbWF0LWhlYWRlci1yb3c+PC90cj5cclxuICAgICAgICAgICAgICA8dHIgKGNsaWNrKT1cIm9uU2VsZWN0SXRlbShyb3cpXCIgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiB2aXNpYmxlQ29sdW1ucyAgfCBwYWdpbmF0ZTpjb25maWdcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtcm93LScgKyAocm93Py52YWx1ZT8uaWQgfHwgcm93Py52YWx1ZT8ua2V5IHx8ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1yb3c+PC90cj5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YUZvdW5kICYmICFwYWdlSW5mby5sYXp5TG9hZERhdGFcIiBjbGFzcz1cImZsZXgtcm93IGRhdGFOb3RGb3VuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc19faWNvblwiPmluZm88L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdkYXRhTm90Rm91bmQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IG1haW5UYWJsZVwiICpuZ0lmPVwiIXNlbGVjdGVkRmlsZUZyb21VcGxvYWRlclwiPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1BlbmRpbmcgJiYgcGFnZUluZm8uaGFzQWRkQnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3SXRlbSgpXCIgaWQ9XCJlZGl0YWJsZS1hZGQtaXRlbS1idG5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2JveDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25LZXkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtd3JhcCBhbGlnbi1jZW50ZXItY2VudGVyIG1haW4tcGFnaW5hdGlvblwiICpuZ0lmPVwidG90YWxFbGVtZW50cyA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LWZ1bGxcIj5cclxuICAgICAgICAgICAgPGFwcC1wYWdpbmF0b3IgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvYXBwLXBhZ2luYXRvcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbCBjb3VudEl0ZW0gaGlkZS1ndC14c1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50SXRlbV9fdG90YWxFbGVtZW50XCI+e3sgJ3RvdGFsQ291bnRJdGVtJyB8IHRyYW5zbGF0ZSB9fSA6IHt7IHRoaXMudG90YWxFbGVtZW50cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMlwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNCdWxrSXRlbXNTdXBwb3J0ZWRcIiBjbGFzcz1cImZsZXgtcm93IGdhcC0xMCBhbGlnbi1zdGFydC1zdGFydCBtYWluVGFibGVcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkQnVsa0l0ZW1zKClcIiBbZGlzYWJsZWRdPVwic2hvdWxkRGlzYWJsZUJ1bGtBZGQoKVwiIGlkPVwiZWRpdGFibGUtYnVsay1hZGQtYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZF9ib3g8L21hdC1pY29uPlxyXG4gICAgICAgIHt7ICdhZGRBbGwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFoYXNEYXRhVG9DbGVhcigpXCIgKGNsaWNrKT1cImNsZWFyQnVsa0l0ZW1zKClcIiBpZD1cImVkaXRhYmxlLWJ1bGstY2xlYXItYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAge3sgJ2NsZWFyQWxsJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQTBD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RkFBNEY7b0JBQzVGLDhGQUE4RjtvQkFDOUYsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLDBCQUEwQjtvQkFDMUIsaUNBQWlDO29CQUNqQyw4REFBOEQ7b0JBQzlELEtBQUs7b0JBRUwsdURBQXVEO3FCQUN4RDt1TEFxQ0QsYUFBYTtzQkFEWixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFHRSxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRWlCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQTRTSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgTWF0Q2VsbCxcbiAgTWF0Q2VsbERlZixcbiAgTWF0Q29sdW1uRGVmLFxuICBNYXRIZWFkZXJDZWxsLFxuICBNYXRIZWFkZXJDZWxsRGVmLFxuICBNYXRIZWFkZXJSb3csXG4gIE1hdEhlYWRlclJvd0RlZixcbiAgTWF0Um93LFxuICBNYXRSb3dEZWYsXG4gIE1hdFRhYmxlXG59IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGV9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge01hdFNvcnRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQge05nQ2xhc3MsIE5nRm9yT2YsIE5nSWYsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIE5nU3dpdGNoRGVmYXVsdH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEJ1dHRvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xuaW1wb3J0IHtOZ3hQYWdpbmF0aW9uTW9kdWxlfSBmcm9tIFwibmd4LXBhZ2luYXRpb25cIjtcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge01hdEVycm9yLCBNYXRGb3JtRmllbGQsIE1hdElucHV0LCBNYXRMYWJlbCwgTWF0U3VmZml4fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlc1wiO1xuaW1wb3J0IHtcbiAgQmFzZVV0aWxzLFxuICBidWlsZEZvcm1GaWVsZHMsXG4gIGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXksXG4gIGdldFBvc2l0aXZlV2ZBY3Rpb25LZXksXG4gIGdldFdmQWN0aW9uSWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcbmltcG9ydCB7XG4gIEVNUFRZX1BBR0VfSU5GTyxcbiAgRmllbGRJbmZvLFxuICBGaWx0ZXIsXG4gIEZpbHRlclJlcXVlc3QsXG4gIExvb2t1cEl0ZW0sXG4gIFBhZ2VJbmZvLFxuICBTRUxFQ1RfUkVDT1JEX0FDVElPTixcbiAgU25hY2tNZXNzYWdlLFxuICBUYWJsZUNvbHVtblxufSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFJFSkVDVCwgU0FWRX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZG8tYWN0aW9uLXJlcXVlc3RcIjtcbmltcG9ydCB7QWN0aW9uQ29tbWVudENvbXBvbmVudH0gZnJvbSBcIi4uL2FjdGlvbi1jb21tZW50L2FjdGlvbi1jb21tZW50LmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcbmltcG9ydCB7TWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNYXREYXRlcGlja2VyVG9nZ2xlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xuaW1wb3J0IG1vbWVudCwge01vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7QXV0b0NvbXBsZXRlQ29tcG9uZW50fSBmcm9tIFwiLi4vYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XG5pbXBvcnQge01hdENoaXBMaXN0Ym94LCBNYXRDaGlwT3B0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHNcIjtcbmltcG9ydCB7VGl0bGVCYXJDb21wb25lbnR9IGZyb20gXCIuLi90aXRsZS1iYXIvdGl0bGUtYmFyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9iaWRpXCI7XG5pbXBvcnQge0F0dGFjaG1lbnRVcGxvYWRlckNvbXBvbmVudH0gZnJvbSBcIi4uL3NoYXJlZC9hdHRhY2htZW50LXVwbG9hZGVyL2F0dGFjaG1lbnQtdXBsb2FkZXIuY29tcG9uZW50XCI7XG5pbXBvcnQge0VxdWF0aW9uQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7TWF0U2VsZWN0fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0XCI7XG5cbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1lZGl0YWJsZS1iYXNlLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRhYmxlLWJhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SWNvbixcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdENvbHVtbkRlZixcbiAgICBNYXRIZWFkZXJDZWxsRGVmLFxuICAgIE5nSWYsXG4gICAgTWF0VGFibGUsXG4gICAgTWF0SGVhZGVyQ2VsbCxcbiAgICBOZ1N3aXRjaCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2VsbCxcbiAgICBNYXRDZWxsRGVmLFxuICAgIE5neFBhZ2luYXRpb25Nb2R1bGUsXG4gICAgTWF0Um93LFxuICAgIE1hdFJvd0RlZixcbiAgICBNYXRIZWFkZXJSb3csXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIE5nU3dpdGNoRGVmYXVsdCxcbiAgICBNYXRIZWFkZXJSb3dEZWYsXG4gICAgTmdGb3JPZixcbiAgICBNYXRCdXR0b24sXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRJbnB1dCxcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdERhdGVwaWNrZXIsXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxuICAgIE1hdERhdGVwaWNrZXJUb2dnbGUsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0U3VmZml4LFxuICAgIE1hdENoaXBMaXN0Ym94LFxuICAgIE1hdENoaXBPcHRpb24sXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIEF0dGFjaG1lbnRVcGxvYWRlckNvbXBvbmVudCxcbiAgICBFcXVhdGlvbkJ1aWxkZXJDb21wb25lbnQsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCxcbiAgICBNYXRDaGVja2JveCxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gYE1vbWVudERhdGVBZGFwdGVyYCBjYW4gYmUgYXV0b21hdGljYWxseSBwcm92aWRlZCBieSBpbXBvcnRpbmcgYE1vbWVudERhdGVNb2R1bGVgIGluIHlvdXJcbiAgICAvLyBhcHBsaWNhdGlvbidzIHJvb3QgbW9kdWxlLiBXZSBwcm92aWRlIGl0IGF0IHRoZSBjb21wb25lbnQgbGV2ZWwgaGVyZSwgZHVlIHRvIGxpbWl0YXRpb25zIG9mXG4gICAgLy8gb3VyIGV4YW1wbGUgZ2VuZXJhdGlvbiBzY3JpcHQuXG4gICAgLy8ge1xuICAgIC8vICAgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsXG4gICAgLy8gICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgLy8gICBkZXBzOiBbTUFUX0RBVEVfTE9DQUxFLCBNQVRfTU9NRU5UX0RBVEVfQURBUFRFUl9PUFRJT05TXSxcbiAgICAvLyB9LFxuXG4gICAgLy8geyBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogTVlfRk9STUFUUyB9LFxuICBdLFxufSlcblxuZXhwb3J0IGNsYXNzIEVkaXRhYmxlQmFzZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgQmFzZVV0aWxzIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUgPSBtb21lbnQoWzE4MDAsIDAsIDFdKTtcblxuICBjb2xsZWN0aW9uID0ge2NvdW50OiA2MCwgZGF0YTogW119O1xuICBjb25maWcgPSB7XG4gICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICB0b3RhbEl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24uY291bnRcbiAgfTtcbiAgcHVibGljIG1heFNpemU6IG51bWJlciA9IDc7XG4gIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBhdXRvSGlkZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBsYWJlbHM6IGFueSA9IHtcbiAgICBwcmV2aW91c0xhYmVsOiAnPCcsXG4gICAgbmV4dExhYmVsOiAnPicsXG4gICAgc2NyZWVuUmVhZGVyUGFnaW5hdGlvbkxhYmVsOiAnUGFnaW5hdGlvbicsXG4gICAgc2NyZWVuUmVhZGVyUGFnZUxhYmVsOiAncGFnZScsXG4gICAgc2NyZWVuUmVhZGVyQ3VycmVudExhYmVsOiBgWW91J3JlIG9uIHBhZ2VgXG4gIH07XG5cbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xuICBkYXRhRWxlbWVudHM6IGFueVtdID0gW107XG4gIG5vRGF0YUZvdW5kID0gZmFsc2U7XG4gIGlzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHRvdGFsRWxlbWVudHMgPSAwO1xuICBwYWdlc0NvdW50ID0gMDtcbiAgcGFnZUluZGV4ID0gMTtcbiAgcGFnZVNpemUgPSAxMDtcbiAgZm9ybVBhcmFtOiBGb3JtR3JvdXA7XG4gIHNlYXJjaEZvcm06IEZvcm1Hcm91cDtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0O1xuXG4gIEBJbnB1dCgpXG4gIHN1cGVyRGF0YUVsZW1lbnRzOiBhbnlbXTtcblxuICBASW5wdXQoKVxuICBvdmVycmlkZSBwYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XG5cbiAgQElucHV0KCkgLy9AdHMtaWdub3JlXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgaXNCdWxrSXRlbXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcbiAgcHVibGljIGZpZWxkczogRmllbGRJbmZvW10gPSBbXTtcblxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHNlYXJjaEZvcm1GaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XG5cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXk6IHN0cmluZyA9ICdhZGROZXcnO1xuXG4gIEBPdXRwdXQoKVxuICBmb3JtVXBkYXRlZDogRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcblxuICBAT3V0cHV0KClcbiAgc2F2ZUFjdGlvbkVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBzYXZlQXR0YWNobWVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KCkgYWN0aW9uUmVxdWVzdENhbGxiYWNrITogKGFjdGlvblJlcXVlc3Q6IERvQWN0aW9uUmVxdWVzdCkgPT4gRG9BY3Rpb25SZXF1ZXN0O1xuXG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZGVyJykgdXBsb2FkZXJDb21wb25lbnQhOiBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQ7XG5cbiAgY3VycmVudERpcmVjdGlvbjogJ2x0cicgfCAncnRsJztcbiAgc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyOiBGaWxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBhbnk7XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IGRhdGFGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtUGFyYW0uZ2V0KCdkYXRhRm9ybUFycmF5JykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZXh0cmFjdEZvcm1hdChjb2x1bW46IFRhYmxlQ29sdW1uPGFueT4pIHtcbiAgICByZXR1cm4gY29sdW1uPy5mb3JtYXQgfHwgJ2QvTS95eXl5LCBoOm1tIGEnO1xuICB9XG5cbiAgZ2V0IGRhdGFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YUZvcm1BcnJheS52YWx1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcbiAgICB0aGlzLmRpcmVjdGlvbmFsaXR5LmNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnREaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICB9KVxuXG4gICAgaWYodGhpcy5zdXBlckRhdGFFbGVtZW50cz8ubGVuZ3RoPjApe1xuICAgICAgdGhpcy5kYXRhRWxlbWVudHM9dGhpcy5zdXBlckRhdGFFbGVtZW50cztcbiAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICB9ZWxzZSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YSgpIHtcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLnJlYWRvbmx5ID0gdGhpcy5pc1BlbmRpbmcpO1xuXG4gICAgdGhpcy5kYXRhRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSAwO1xuICAgIHRoaXMucGFnZXNDb3VudCA9IDE7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xuICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XG5cbiAgICBpZiAoIXRoaXMucGFnZUluZm8ubGF6eUxvYWREYXRhKSB7XG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSlcbiAgICAgICAgLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50cyA9IHJlc3AuYm9keSB8fCBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwLnRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICAgIHRoaXMucGFnZXNDb3VudCA9IE1hdGgubWF4KE1hdGguY2VpbCh0aGlzLnRvdGFsRWxlbWVudHMgLyB0aGlzLnBhZ2VTaXplKSwgMSk7XG4gICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSAodGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCB8fCAwKSArIDE7XG4gICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKCkge1xuICAgIHRoaXMuZm9ybVBhcmFtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkYXRhRm9ybUFycmF5OiB0aGlzLmZiLmFycmF5KHRoaXMuZGF0YUVsZW1lbnRzLm1hcChpdGVtID0+IHRoaXMuZmIuZ3JvdXAoYnVpbGRGb3JtRmllbGRzKHRoaXMuZmllbGRzLCBpdGVtKSkpKSxcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1VcGRhdGVkLm5leHQodGhpcy5mb3JtUGFyYW0pO1xuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50O1xuICAgIHRoaXMuZ2V0TmV4dCh0aGlzLnBhZ2VJbmRleCAtIDEpO1xuICB9XG4gIGdldE5leHQocGFnZUluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcbiAgICB0aGlzLmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMuZ2V0TmV4dCgwKTtcbiAgfVxuXG5cbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvcGVydHkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XG4gIH1cblxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdICYmICFjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uaXNGaXJzdENoYW5nZSgpICYmIGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXS5jdXJyZW50VmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdEl0ZW0ocm93OiBhbnkpIHtcbiAgICBpZiAodGhpcy5wYWdlSW5mby5zZWxmUm91dGluZykge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybH0vJHttb2RlfWA7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dXJsfWAsIHJvdz8uaWRdKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aW9uID0gU0VMRUNUX1JFQ09SRF9BQ1RJT047XG4gICAgYWN0aW9uLmlkID0gcm93Py5pZDtcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSByb3c7XG4gIH1cblxuICBvcGVuTmV3VGFiKHJvdykge1xuICAgIGlmICghdGhpcy5wYWdlSW5mby5lbWJlZGVkVGFibGVPbmx5KSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XG4gICAgICB3aW5kb3cub3BlbihgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGh9LyR7bW9kZX1gICsgJy8nICsgcm93Py5pZCk7XG4gICAgfVxuICB9XG5cblxuICBnZXRGaWVsZChlbGVtZW50LCBjb2x1bW46IEZpZWxkSW5mbykge1xuICAgICAgcmV0dXJuICBlbGVtZW50LmNvbnRyb2xzW2NvbHVtbi5wcm9wZXJ0eV07XG4gIH1cblxuICBmaWVsZEJ1dHRvbkV2ZW50KGNvbHVtbiwgZWxlbWVudCwgYWN0aW9uSWQ6IG51bWJlcikge1xuICAgIHRoaXMuZG9TYXZlQXBwcm92ZUFjdGlvbihlbGVtZW50LCBhY3Rpb25JZCk7XG4gIH1cblxuICBwYXRjaExvb2t1cFZhbHVlKCRldmVudDogTG9va3VwSXRlbSwgcHJvcGVydHk6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSlcbiAgfVxuXG4gIGFkZE5ld0l0ZW0oKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMuZm9ybVBhcmFtPy5nZXQoJ2RhdGFGb3JtQXJyYXknKT8udmFsdWU7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZXMpIHtcbiAgICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gWy4uLmN1cnJlbnRWYWx1ZXNdO1xuICAgIH1cbiAgICB0aGlzLmRhdGFFbGVtZW50cy5wdXNoKHt9KTtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICB9XG5cblxuICBkb1NhdmVBcHByb3ZlQWN0aW9uKGVsZW1lbnQsIHVzZXJBY3Rpb25JZCkge1xuICAgIGxldCBhY3Rpb25JZCA9ICBnZXRXZkFjdGlvbklkKGVsZW1lbnQudmFsdWUuc3RhdGVUeXBlKTtcbiAgICBpZiAodXNlckFjdGlvbklkID09PSBSRUpFQ1QgJiYgdGhpcy5pc1BlbmRpbmcpIHtcbiAgICAgIGFjdGlvbklkID0zXG4gICAgfVxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QuYWN0aW9uSWQgPSBhY3Rpb25JZDtcbiAgICByZXF1ZXN0LnN1YmplY3QgPSBlbGVtZW50LnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XG4gICAgICByZXF1ZXN0ID0gdGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2socmVxdWVzdCk7XG4gICAgICBpZiAocmVxdWVzdC5zdWJqZWN0LmlkID09PSBcIlwiKSB7XG4gICAgICAgIHJlcXVlc3Quc3ViamVjdC5pZCA9IG51bGw7XG4gICAgICAgIHJlcXVlc3Quc3ViamVjdC5zdGF0ZVR5cGUgPSBcIk5FV1wiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnN1YmplY3QuaWQgPT09IFwiXCIpIHtcbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pZCA9IG51bGw7XG4gICAgICByZXF1ZXN0LnN1YmplY3Quc3RhdGVUeXBlID0gXCJORVdcIjtcbiAgICB9XG5cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xuICAgICAgZGF0YToge2xhYmVsOiB1c2VyQWN0aW9uSWQgPT09IDIgPyAnc2F2ZScgOiAncmVqZWN0JywgaXNUZXJtaW5hdGlvbjogZmFsc2V9LFxuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgIGRpcmVjdGlvbjogIHRoaXMuY3VycmVudERpcmVjdGlvblxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICAgICAgbGV0ICBtZXNzYWdlID0gJyc7XG4gICAgICAgICAgICBpZiAoYWN0aW9uSWQgPT09IDEgKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc2F2ZWRfc3VjY2Vzc2Z1bGx5JyA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbklkID09PTIgKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSAndXBkYXRlZF9zdWNjZXNzZnVsbHknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25JZCA9PT0zICkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc3VjY2Vzc2Z1bF9yZWplY3RfbWVzc2FnZSc7XG4gICAgICAgICAgICB9ICBlbHNlIGlmIChhY3Rpb25JZCA9PT00ICkge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gJ2FwcHJvdmVfc3VjY2Vzc2Z1bGx5JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UobWVzc2FnZSwgdHJ1ZSwgJ3N1Y2Nlc3MnKSk7XG4gICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeCA9IHJlc3AubWVzc2FnZT8ubGVuZ3RoID4wID8gcmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZSA6ICdGQUlMRURfQ09OVEFDVF9BRE1JTic7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnRvcFBhbmVsTWVzc2FnZSQubmV4dChuZXcgU25hY2tNZXNzYWdlKHgsIHRydWUsICdlcnJvcicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zYXZlQWN0aW9uRW1pdHRlci5lbWl0KHtpdGVtOnJlcXVlc3Quc3ViamVjdCwgcmVzcH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSA9IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXk7XG4gIHByb3RlY3RlZCByZWFkb25seSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5ID0gZ2V0TmVnYXRpdmVXZkFjdGlvbktleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFNBVkUgPSBTQVZFO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgUkVKRUNUID0gUkVKRUNUO1xuXG5cbiAgc2V0TW9udGhBbmRZZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXI6IE1vbWVudCwgcGlja2VyOiBNYXREYXRlcGlja2VyPE1vbWVudD4sIGVsZW1lbnQsIGNvbHVtbikge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRm9ybUNvbnRyb2wobW9tZW50KCkpO1xuICAgIGNvbnN0IGN0cmxWYWx1ZSA9IGRhdGUudmFsdWU7XG4gICAgY3RybFZhbHVlLnllYXIobm9ybWFsaXplZE1vbnRoQW5kWWVhci55ZWFyKCkpO1xuICAgIGN0cmxWYWx1ZS5tb250aCgxKTtcbiAgICBjdHJsVmFsdWUuZGF5T2ZZZWFyKDEpO1xuICAgIGVsZW1lbnQuY29udHJvbHNbY29sdW1uLnByb3BlcnR5XS5zZXRWYWx1ZShjdHJsVmFsdWUpO1xuICAgIHBpY2tlci5jbG9zZSgpO1xuICB9XG5cbiAgc3dpdGNoVmlld01vZGUoYjogYm9vbGVhbikge1xuICAgIHRoaXMuaXNQZW5kaW5nID0gYjtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBvbkNoaXBTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSwgbGlzdGJveD86IE1hdENoaXBMaXN0Ym94KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09ICdDT01QTEVURUQnICYmIHZhbHVlICE9PSAnUEVORElORycpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gbGlzdGJveCAmJiAobGlzdGJveC52YWx1ZSA9IHRoaXMuaXNQZW5kaW5nID8gJ1BFTkRJTkcnIDogJ0NPTVBMRVRFRCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNQZW5kaW5nID0gdmFsdWUgPT09ICdQRU5ESU5HJztcbiAgICBpZiAodGhpcy5pc1BlbmRpbmcgIT09IGlzUGVuZGluZykgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xuICB9XG5cbiAgYWRkQnVsa0l0ZW1zKCkge1xuICAgIGNvbnN0IG1lcmdlZDogYW55W10gPSBbXTtcblxuICAgIHRoaXMuZGF0YUZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChncm91cDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICBtZXJnZWQucHVzaChncm91cC52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBEb0FjdGlvblJlcXVlc3QoKTtcbiAgICByZXF1ZXN0LmFjdGlvbklkID0gMTtcblxuICAgIHJlcXVlc3Quc3ViamVjdCA9IHsgaW52b2ljZXM6IG1lcmdlZCB9O1xuXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XG4gICAgICByZXF1ZXN0ID0gdGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2socmVxdWVzdCk7XG5cbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pZCA9PT0gXCJcIikge1xuICAgICAgICAgIGl0ZW0uaWQgPSBudWxsO1xuICAgICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaWQgPT09IFwiXCIpIHtcbiAgICAgICAgaXRlbS5pZCA9IG51bGw7XG4gICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG5cblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xuICAgICAgZGF0YToge2xhYmVsOiAgJ3NhdmUnICwgaXNUZXJtaW5hdGlvbjogZmFsc2V9LFxuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgIGRpcmVjdGlvbjogIHRoaXMuY3VycmVudERpcmVjdGlvblxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50KHJlcXVlc3QsIHRoaXMuc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyLCB0aGlzLnBhZ2VJbmZvISkuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQnVsa0l0ZW1zKCk7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnRvcFBhbmVsTWVzc2FnZSQubmV4dChuZXcgU25hY2tNZXNzYWdlKCdzYXZlZF9zdWNjZXNzZnVsbHknLCB0cnVlLCAnc3VjY2VzcycpKTtcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnRvcFBhbmVsTWVzc2FnZSQubmV4dChuZXcgU25hY2tNZXNzYWdlKHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIHJlc3AubWVzc2FnZT8uWzBdPy5lcnJvckNvZGUsIHRydWUsICdlcnJvcicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zYXZlQXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7aXRlbTpyZXF1ZXN0LnN1YmplY3QsIHJlc3B9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7ICB9XG5cbiAgQFZpZXdDaGlsZCgnZmlsZVVwbG9hZCcpIGZpbGVVcGxvYWQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgaGFuZGxlRmlsZVVwbG9hZCgkZXZlbnQ6IEZpbGUpIHtcbiAgICBsZXQgYWN0aW9uSWQgPSAgZ2V0V2ZBY3Rpb25JZCgnTkVXJyk7XG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgRG9BY3Rpb25SZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xuXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSAkZXZlbnQ7XG5cbiAgfVxuXG4gIHNob3VsZERpc2FibGVCdWxrQWRkKCkge1xuICAgIGNvbnN0IGhhc0ZpbGUgPSAhIXRoaXMuc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyO1xuICAgIHJldHVybiAoIXRoaXMuZm9ybVBhcmFtPy52YWxpZCB8fCB0aGlzLmRhdGFGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSAmJiAhaGFzRmlsZTtcbiAgfVxuICBoYW5kbGVFcXVhdGlvbkNoYW5nZShldmVudDogeyB2YWx1ZTogYW55W10sIHZhbGlkOiBib29sZWFuIH0sIGVsZW1lbnQ6IEZvcm1Hcm91cCwgY29sdW1uOiBhbnkpOiB2b2lkIHtcbiAgICBlbGVtZW50LnZhbHVlW2NvbHVtbi5wcm9wZXJ0eV0gPSBldmVudC52YWx1ZTtcbiAgICBjb25zdCB7IHZhbHVlLCB2YWxpZCB9ID0gZXZlbnQ7XG4gICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIGVsZW1lbnQuZ2V0KGNvbHVtbi5wcm9wZXJ0eSk/LnNldEVycm9ycyh7IGludmFsaWRFcXVhdGlvbjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQnVsa0l0ZW1zKCkge1xuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSBudWxsO1xuICAgIHRoaXMudXBsb2FkZXJDb21wb25lbnQuY2xlYXJGaWxlKCk7XG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQodGhpcy5mb3JtUGFyYW0pO1xuICB9XG5cbiAgaGFzRGF0YVRvQ2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFFbGVtZW50cyAmJiB0aGlzLmRhdGFFbGVtZW50cy5sZW5ndGggPiAwKSB8fCAhIXRoaXMuc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyO1xuICB9XG5nZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/XG4gICAgICBpdGVtLmVuZ2xpc2hOYW1lIDogaXRlbTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudCkge1xuICAgIHJldHVybiAhZWxlbWVudC52YWxpZCB8fCAoIXRoaXMuaXNQZW5kaW5nICYmIGVsZW1lbnQudmFsdWUuc3RhdGVUeXBlID09ICdQRU5ESU5HJyk7XG4gIH1cblxuICBkb1NlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hGb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCByYXdWYWx1ZXMgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXg9MDtcbiAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW107XG4gICAgICB0aGlzLnNlYXJjaEZvcm1GaWVsZHMuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJhd1ZhbHVlc1t4LnByb3BlcnR5XTtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xuICAgICAgICAgICAgICBrZXk6IDAsXG4gICAgICAgICAgICAgIGxhYmVsOiB4LnByb3BlcnR5LFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6IHguc2VhcmNoQXR0cmlidXRlLFxuICAgICAgICAgICAgICB2YWx1ZU9iamVjdCA6IHguc2VhcmNoQXR0cmlidXRlLmluY2x1ZGVzKCcuJykgPyB2YWx1ZVt4LnNlYXJjaEF0dHJpYnV0ZS5zcGxpdCgnLicpLnBvcCgpXSA6IHZhbHVlLFxuICAgICAgICAgICAgICBvcGVyYXRvcjogeC5zZWFyY2hPcGVyYXRvcixcbiAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnRvcFBhbmVsTWVzc2FnZSQubmV4dChuZXcgU25hY2tNZXNzYWdlKCdJTlZBTElEX1NFQVJDSF9GT1JNJywgdHJ1ZSwgJ2Vycm9yJykpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dTZWFyY2goKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybUZpZWxkcz8ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3NlY3RvclR5cGUnKS5zZXRWYWx1ZSh7aWQ6LTEwMCwgZW5nbGlzaE5hbWU6J2FhYScsIGNvZGU6J2FhYScsIGFyYWJpY05hbWU6J2FhYSd9KTtcbiAgICB0aGlzLnNlYXJjaEZvcm0ucmVzZXQoKTtcbiAgICB0aGlzLmRvU2VhcmNoKCk7XG4gIH1cblxuICB1cGRhdGVTZWFyY2hGb3JtKCRldmVudDogRm9ybUdyb3VwKSB7XG4gICAgdGhpcy5zZWFyY2hGb3JtID0gJGV2ZW50XG4gIH1cblxuICB2YWxpZFNlYXJjaERhdGEoKSB7XG4gICAgcmV0dXJuICF0aGlzLnNlYXJjaEZvcm0udmFsaWQgfHwgdHJ1ZTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiYmFzZVRhYmxlIGZsZXgtY29sdW1uXCI+XG4gIDxkaXYgY2xhc3M9XCJsZWZ0LWFsaWduXCI+XG4gICAgPGFwcC1hdHRhY2htZW50LXVwbG9hZGVyICN1cGxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQnVsa0l0ZW1zU3VwcG9ydGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVTZWxlY3RlZCk9XCJoYW5kbGVGaWxlVXBsb2FkKCRldmVudClcIj5cbiAgICA8L2FwcC1hdHRhY2htZW50LXVwbG9hZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLXN0YXJ0XCI+XG4gICAgICA8YXBwLXRpdGxlLWJhciBbcGFnZVRpdGxlXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/ICcnIDogcGFnZUluZm8ubGFiZWxzU2VjdGlvbisnLmxpc3RfdGl0bGUnXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZU1vZGVdPVwiJydcIlxuICAgICAgICAgICAgICAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICBbc2hvd0V4dHJhY3RCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCI+XG4gICAgICA8L2FwcC10aXRsZS1iYXI+XG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc21hbGxcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjYm94IFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUuZG9jdW1lbnRTdGF0dXMnIHwgdHJhbnNsYXRlXCIgW211bHRpcGxlXT1cImZhbHNlXCIgW3ZhbHVlXT1cImlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwib25DaGlwU2VsZWN0aW9uQ2hhbmdlKCRldmVudCwgYm94KVwiICpuZ0lmPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIj5cbiAgICAgICAgPG1hdC1jaGlwLW9wdGlvbiBbc2VsZWN0ZWRdPVwiIWlzUGVuZGluZ1wiIFtjb2xvcl09XCInYWNjZW50J1wiIHZhbHVlPVwiQ09NUExFVEVEXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIHt7ICdmaW5pc2hlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XG4gICAgICAgIDxtYXQtY2hpcC1vcHRpb24gW3NlbGVjdGVkXT1cImlzUGVuZGluZ1wiIFtjb2xvcl09XCInYWNjZW50J1wiIHZhbHVlPVwiUEVORElOR1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICB7eyAndG9kbycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XG4gICAgICA8L21hdC1jaGlwLWxpc3Rib3g+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U2VhcmNoKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtODAgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XG4gICAgICAgIDxhcHAtYmFzZS1mb3JtLWNhbnZhcyBjbGFzcz1cImZsZXgtZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkc109XCJzZWFyY2hGb3JtRmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtVXBkYXRlZCk9XCJ1cGRhdGVTZWFyY2hGb3JtKCRldmVudClcIj5cbiAgICAgICAgPC9hcHAtYmFzZS1mb3JtLWNhbnZhcz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMTUgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBhbGlnbi1jZW50ZXItY2VudGVyIGdhcC04IGZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkb1NlYXJjaCgpXCIgaWQ9XCJlZGl0YWJsZS1zZWFyY2gtYnRuXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIHt7ICdzZWFyY2gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtY2xlYXItc2VhcmNoLWJ0blwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIHt7ICdjbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGggYmFzZVRhYmxlX19kZXRhaWxzQ29sdW1uXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtZnVsbFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBtYWluVGFibGUgZ2FwLTAgYWxpZ24tc3RhcnQtc3RhcnRcIj5cbiAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiIGNsYXNzPVwiZmxleC1maWxsXCI+XG4gICAgICAgICAgICA8dGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YUZvcm1BcnJheS5jb250cm9sc1wiIGNsYXNzPVwiZmxleC1maWxsXCIgbWF0LXRhYmxlIG1hdFNvcnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0aGlzLmZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwie3tjb2x1bW4ucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIiBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZXF1YXRpb24tYnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJlbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwiaGFuZGxlRXF1YXRpb25DaGFuZ2UoJGV2ZW50LCBlbGVtZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1lcXVhdGlvbi1idWlsZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJlbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRWYWx1ZSk9XCJwYXRjaExvb2t1cFZhbHVlKCRldmVudCwgY29sdW1uLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtYXV0by1jb21wbGV0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpc3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tlbGVtZW50fX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7Y29sdW1uLnByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbHVtbi5sYWJlbCEgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29sdW1uLmxpc3RPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRPcHRpb25WYWx1ZShpdGVtKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhY3Rpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImJ0bi1ub25lLWJhY2tncm91bmQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGRCdXR0b25FdmVudChjb2x1bW4sZWxlbWVudCxTQVZFKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidlZGl0YWJsZS1zYXZlLScgKyAoZWxlbWVudC52YWx1ZT8uaWQgfHwgJycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNQZW5kaW5nXCIgbWF0LWJ1dHRvbiBjbGFzcz1cImJ0bi1ub25lLWJhY2tncm91bmQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLGVsZW1lbnQsUkVKRUNUKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidlZGl0YWJsZS1yZWplY3QtJyArIChlbGVtZW50LnZhbHVlPy5pZCB8fCAnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0TmVnYXRpdmVXZkFjdGlvbktleShlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIHN0YXJ0Vmlldz1cIm11bHRpLXllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRNb250aEFuZFllYXIoJGV2ZW50LCBwaWNrZXIsIGVsZW1lbnQsY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwiZXhhbXBsZS1tb250aC1waWNrZXJcIj48L21hdC1kYXRlcGlja2VyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4LWF1dG9cIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZ4RmxleEZpbGw+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmlzdWFsbHkgaGlkZGVuIGxhYmVsIGp1c3QgdG8gdHJpZ2dlciB0aGUgZmxvYXRpbmcgbGFiZWwgYW5kIGFzdGVyaXNrIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdHVzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbTogMTRweDsgcGFkZGluZy10b3A6IDE0cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cImNvbHVtbi5yZWFkb25seSA/ICdub25lJyA6ICdhdXRvJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cImNvbHVtbi5yZWFkb25seSA/IDAuNyA6IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sdW1uLnJlYWRvbmx5ID8gJGV2ZW50LnByZXZlbnREZWZhdWx0KCkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInhwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9yXT1cInhwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjeHBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDx0ciAqbWF0SGVhZGVyUm93RGVmPVwidmlzaWJsZUNvbHVtbnNcIiBtYXQtaGVhZGVyLXJvdz48L3RyPlxuICAgICAgICAgICAgICA8dHIgKGNsaWNrKT1cIm9uU2VsZWN0SXRlbShyb3cpXCIgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXG4gICAgICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogdmlzaWJsZUNvbHVtbnMgIHwgcGFnaW5hdGU6Y29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidlZGl0YWJsZS1yb3ctJyArIChyb3c/LnZhbHVlPy5pZCB8fCByb3c/LnZhbHVlPy5rZXkgfHwgJycpXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1yb3c+PC90cj5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibm9EYXRhRm91bmQgJiYgIXBhZ2VJbmZvLmxhenlMb2FkRGF0YVwiIGNsYXNzPVwiZmxleC1yb3cgZGF0YU5vdEZvdW5kXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhTm90Rm91bmRfX2RldGFpbHNcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19kZXRhaWxzX19pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdkYXRhTm90Rm91bmQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgbWFpblRhYmxlXCIgKm5nSWY9XCIhc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNQZW5kaW5nICYmIHBhZ2VJbmZvLmhhc0FkZEJ1dHRvblwiIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdJdGVtKClcIiBpZD1cImVkaXRhYmxlLWFkZC1pdGVtLWJ0blwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2JveDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIHt7IHRyYW5zbGF0aW9uS2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtd3JhcCBhbGlnbi1jZW50ZXItY2VudGVyIG1haW4tcGFnaW5hdGlvblwiICpuZ0lmPVwidG90YWxFbGVtZW50cyA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gZmxleC1mdWxsXCI+XG4gICAgICAgICAgICA8YXBwLXBhZ2luYXRvciBbY3VycmVudFBhZ2VdPVwicGFnZUluZGV4XCIgW3RvdGFsSXRlbXNdPVwidG90YWxFbGVtZW50c1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2FwcC1wYWdpbmF0b3I+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbCBjb3VudEl0ZW0gaGlkZS1ndC14c1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudEl0ZW1fX3RvdGFsRWxlbWVudFwiPnt7ICd0b3RhbENvdW50SXRlbScgfCB0cmFuc2xhdGUgfX0gOiB7eyB0aGlzLnRvdGFsRWxlbWVudHMgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMlwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaXNCdWxrSXRlbXNTdXBwb3J0ZWRcIiBjbGFzcz1cImZsZXgtcm93IGdhcC0xMCBhbGlnbi1zdGFydC1zdGFydCBtYWluVGFibGVcIj5cbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRCdWxrSXRlbXMoKVwiIFtkaXNhYmxlZF09XCJzaG91bGREaXNhYmxlQnVsa0FkZCgpXCIgaWQ9XCJlZGl0YWJsZS1idWxrLWFkZC1idG5cIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZF9ib3g8L21hdC1pY29uPlxuICAgICAgICB7eyAnYWRkQWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwid2FyblwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIWhhc0RhdGFUb0NsZWFyKClcIiAoY2xpY2spPVwiY2xlYXJCdWxrSXRlbXMoKVwiIGlkPVwiZWRpdGFibGUtYnVsay1jbGVhci1idG5cIj5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgIHt7ICdjbGVhckFsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19