@c8y/ngx-components 1017.0.8 → 1017.0.10

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 (79) hide show
  1. package/core/dynamic-component/dynamic-component.component.d.ts +1 -0
  2. package/core/dynamic-component/dynamic-component.model.d.ts +45 -9
  3. package/esm2020/actility-device-registration/actility-device-registration.component.mjs +3 -3
  4. package/esm2020/context-dashboard/context-dashboard.component.mjs +3 -3
  5. package/esm2020/context-dashboard/dashboard-detail.component.mjs +3 -3
  6. package/esm2020/context-dashboard/device-info-dashboard/device-info-dashboard.component.mjs +43 -51
  7. package/esm2020/context-dashboard/widget-preview.component.mjs +3 -3
  8. package/esm2020/core/authentication/sms-challenge.component.mjs +3 -3
  9. package/esm2020/core/authentication/totp-challenge.component.mjs +3 -3
  10. package/esm2020/core/breadcrumb/breadcrumb-outlet.component.mjs +3 -3
  11. package/esm2020/core/dashboard/dashboard-child.component.mjs +3 -3
  12. package/esm2020/core/dashboard/widget-time-context.component.mjs +3 -3
  13. package/esm2020/core/data-grid/data-grid.component.mjs +3 -3
  14. package/esm2020/core/date-picker/date-picker.component.mjs +3 -3
  15. package/esm2020/core/drop-area/drop-area.component.mjs +3 -3
  16. package/esm2020/core/dynamic-component/dynamic-component.component.mjs +21 -5
  17. package/esm2020/core/dynamic-component/dynamic-component.model.mjs +7 -1
  18. package/esm2020/core/file-picker/file-picker.component.mjs +3 -3
  19. package/esm2020/core/header/application/app-switcher.component.mjs +3 -3
  20. package/esm2020/core/login/credentials.component.mjs +3 -3
  21. package/esm2020/core/login/login.component.mjs +3 -3
  22. package/esm2020/core/modal/modal.component.mjs +3 -3
  23. package/esm2020/core/select/typeahead.component.mjs +3 -3
  24. package/esm2020/device-grid/columns/alarms.cell-renderer.component.mjs +3 -3
  25. package/esm2020/loriot-device-registration/loriot-device-registration-button.component.mjs +3 -1
  26. package/esm2020/loriot-device-registration/loriot-device-registration.component.mjs +3 -3
  27. package/esm2020/operations/bulk-operations-list/bulk-operations-list.component.mjs +3 -3
  28. package/esm2020/operations/operations-list/operations-list-item.component.mjs +3 -3
  29. package/esm2020/operations/operations-list/operations-list.component.mjs +3 -3
  30. package/esm2020/register-device/bulk/bulk-device-registration-modal.component.mjs +3 -3
  31. package/esm2020/register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.mjs +3 -3
  32. package/esm2020/register-device/extensible/single/extensible-device-registration-modal.component.mjs +3 -3
  33. package/esm2020/register-device/general/general-device-registration.component.mjs +3 -3
  34. package/esm2020/repository/software/device-tab/device-software-list.component.mjs +3 -3
  35. package/esm2020/repository/software/device-tab/installed-software.component.mjs +3 -3
  36. package/esm2020/repository/software/list/add-software-modal.component.mjs +3 -3
  37. package/esm2020/sigfox-device-registration/sigfox-device-registration.component.mjs +3 -3
  38. package/fesm2015/c8y-ngx-components-actility-device-registration.mjs +2 -2
  39. package/fesm2015/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
  40. package/fesm2015/c8y-ngx-components-context-dashboard.mjs +48 -56
  41. package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  42. package/fesm2015/c8y-ngx-components-device-grid.mjs +2 -2
  43. package/fesm2015/c8y-ngx-components-device-grid.mjs.map +1 -1
  44. package/fesm2015/c8y-ngx-components-loriot-device-registration.mjs +4 -2
  45. package/fesm2015/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
  46. package/fesm2015/c8y-ngx-components-operations-bulk-operations-list.mjs +2 -2
  47. package/fesm2015/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  48. package/fesm2015/c8y-ngx-components-operations-operations-list.mjs +4 -4
  49. package/fesm2015/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  50. package/fesm2015/c8y-ngx-components-register-device.mjs +8 -8
  51. package/fesm2015/c8y-ngx-components-register-device.mjs.map +1 -1
  52. package/fesm2015/c8y-ngx-components-repository-software.mjs +6 -6
  53. package/fesm2015/c8y-ngx-components-repository-software.mjs.map +1 -1
  54. package/fesm2015/c8y-ngx-components-sigfox-device-registration.mjs +2 -2
  55. package/fesm2015/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
  56. package/fesm2015/c8y-ngx-components.mjs +72 -46
  57. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  58. package/fesm2020/c8y-ngx-components-actility-device-registration.mjs +2 -2
  59. package/fesm2020/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
  60. package/fesm2020/c8y-ngx-components-context-dashboard.mjs +48 -56
  61. package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  62. package/fesm2020/c8y-ngx-components-device-grid.mjs +2 -2
  63. package/fesm2020/c8y-ngx-components-device-grid.mjs.map +1 -1
  64. package/fesm2020/c8y-ngx-components-loriot-device-registration.mjs +4 -2
  65. package/fesm2020/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
  66. package/fesm2020/c8y-ngx-components-operations-bulk-operations-list.mjs +2 -2
  67. package/fesm2020/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  68. package/fesm2020/c8y-ngx-components-operations-operations-list.mjs +4 -4
  69. package/fesm2020/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  70. package/fesm2020/c8y-ngx-components-register-device.mjs +8 -8
  71. package/fesm2020/c8y-ngx-components-register-device.mjs.map +1 -1
  72. package/fesm2020/c8y-ngx-components-repository-software.mjs +6 -6
  73. package/fesm2020/c8y-ngx-components-repository-software.mjs.map +1 -1
  74. package/fesm2020/c8y-ngx-components-sigfox-device-registration.mjs +2 -2
  75. package/fesm2020/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
  76. package/fesm2020/c8y-ngx-components.mjs +54 -32
  77. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  78. package/locales/locales.pot +6 -9
  79. package/package.json +2 -2
@@ -171,10 +171,10 @@ export class InstalledSoftwareComponent {
171
171
  }
172
172
  }
173
173
  InstalledSoftwareComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: InstalledSoftwareComponent, deps: [{ token: i1.RepositoryService }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
174
- InstalledSoftwareComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: InstalledSoftwareComponent, selector: "c8y-installed-software", inputs: { device: "device", softwareList: "softwareList", deviceSoftwareChanges: "deviceSoftwareChanges", deviceSoftwareChangesOperation: "deviceSoftwareChangesOperation", deviceSoftwareChangesInProgress: "deviceSoftwareChangesInProgress", typesQuery: "typesQuery" }, outputs: { changes: "changes", showSoftwareChanges: "showSoftwareChanges" }, viewQueries: [{ propertyName: "alreadyInstalledWarningTemplate", first: true, predicate: ["alreadyInstalledWarning"], descendants: true, static: true }, { propertyName: "loadingTemplate", first: true, predicate: ["loading"], descendants: true, static: true }, { propertyName: "softwareTypeTemplate", first: true, predicate: ["softwareType"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"d-flex d-col flex-grow\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\" translate>Installed software</div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n class=\"card-block large-padding bg-level-2 p-0\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n <fieldset class=\"card-block large-padding overflow-visible separator-bottom\" *ngIf=\"showFilter\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter installed software\u2026' | translate }}\"\n id=\"filter\"\n placeholder=\"{{ 'Filter installed software\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n <span for=\"filter\" class=\"sr-only\" translate>Filter installed software\u2026</span>\n </div>\n </div>\n <div class=\"col-xs-6\">\n <c8y-software-type\n [required]=\"false\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n [showClearSelectionOption]=\"true\"\n (onSelectSoftware)=\"softwareTypeFilter$.next($event?.softwareType)\"\n ></c8y-software-type>\n </div>\n </div>\n </fieldset>\n\n <fieldset\n id=\"software-list\"\n class=\"flex-grow inner-scroll\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <!-- NOT EMPTY STATE -->\n <c8y-device-software-list\n [device]=\"device\"\n [filterCriteria$]=\"filterCriteria$\"\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n (onListEmpty)=\"showFilter = !$event\"\n class=\"d-block p-l-16 p-r-16\"\n container=\"body\"\n >\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software installed.</strong>\n <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n <!-- NO SEARCH RESULTS STATE -->\n <div class=\"c8y-empty-state c8y-no-results-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software matches your filter criteria.</strong>\n <br />\n <small translate>Try changing your search criteria.</small>\n </p>\n </div>\n </c8y-device-software-list>\n </fieldset>\n </div>\n <!-- INSTALL SOFTWARE-->\n <div\n class=\"card-footer large-padding separator sticky-bottom d-flex j-c-between bg-level-0\"\n [ngClass]=\"{ 'visible-sm visible-xs': !supportsSoftwareOperations }\"\n >\n <button\n *ngIf=\"supportsSoftwareOperations\"\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_INSTALL_SOFTWARE\n }\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n <button\n (click)=\"showSoftwareChanges.emit()\"\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n [title]=\"'Show &quot;Software changes&quot;' | translate\"\n >\n <span translate>Show \"Software changes\"</span>\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n </div>\n</div>\n\n<ng-template #alreadyInstalledWarning let-item let-option=\"option\">\n <i\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: item.body[0].value, version: option.body[0].value }\n \"\n ></i>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"p-relative d-flex m-l-auto\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </div>\n</ng-template>\n\n<ng-template #softwareType>\n <c8y-software-type\n additionalFilter\n [required]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n (onSelectSoftware)=\"search({ softwareType: $event?.softwareType })\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [showClearSelectionOption]=\"true\"\n ></c8y-software-type>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "component", type: i1.SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel"], outputs: ["onSelectSoftware"] }, { kind: "component", type: i6.OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i8.DeviceSoftwareListComponent, selector: "c8y-device-software-list", inputs: ["softwareList", "device", "deviceSoftwareChanges", "filterCriteria$"], outputs: ["update", "remove", "onListEmpty"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
174
+ InstalledSoftwareComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: InstalledSoftwareComponent, selector: "c8y-installed-software", inputs: { device: "device", softwareList: "softwareList", deviceSoftwareChanges: "deviceSoftwareChanges", deviceSoftwareChangesOperation: "deviceSoftwareChangesOperation", deviceSoftwareChangesInProgress: "deviceSoftwareChangesInProgress", typesQuery: "typesQuery" }, outputs: { changes: "changes", showSoftwareChanges: "showSoftwareChanges" }, viewQueries: [{ propertyName: "alreadyInstalledWarningTemplate", first: true, predicate: ["alreadyInstalledWarning"], descendants: true, static: true }, { propertyName: "loadingTemplate", first: true, predicate: ["loading"], descendants: true, static: true }, { propertyName: "softwareTypeTemplate", first: true, predicate: ["softwareType"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"d-flex d-col flex-grow\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\" translate>Installed software</div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n class=\"card-block large-padding bg-level-2 p-0\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n <fieldset class=\"card-block large-padding overflow-visible separator-bottom\" *ngIf=\"showFilter\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <div class=\"input-group input-group-search\">\n <label for=\"filter\" class=\"sr-only\">\n {{ 'Filter installed software\u2026' | translate }}\n </label>\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter installed software\u2026' | translate }}\"\n id=\"filter\"\n placeholder=\"{{ 'Filter installed software\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n <span for=\"filter\" class=\"sr-only\" translate>Filter installed software\u2026</span>\n </div>\n </div>\n <div class=\"col-xs-6\">\n <c8y-software-type\n [required]=\"false\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n [showClearSelectionOption]=\"true\"\n (onSelectSoftware)=\"softwareTypeFilter$.next($event?.softwareType)\"\n ></c8y-software-type>\n </div>\n </div>\n </fieldset>\n\n <fieldset\n id=\"software-list\"\n class=\"flex-grow inner-scroll\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <!-- NOT EMPTY STATE -->\n <c8y-device-software-list\n [device]=\"device\"\n [filterCriteria$]=\"filterCriteria$\"\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n (onListEmpty)=\"showFilter = !$event\"\n class=\"d-block p-l-16 p-r-16\"\n container=\"body\"\n >\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software installed.</strong>\n <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n <!-- NO SEARCH RESULTS STATE -->\n <div class=\"c8y-empty-state c8y-no-results-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software matches your filter criteria.</strong>\n <br />\n <small translate>Try changing your search criteria.</small>\n </p>\n </div>\n </c8y-device-software-list>\n </fieldset>\n </div>\n <!-- INSTALL SOFTWARE-->\n <div\n class=\"card-footer large-padding separator sticky-bottom d-flex j-c-between bg-level-0\"\n [ngClass]=\"{ 'visible-sm visible-xs': !supportsSoftwareOperations }\"\n >\n <button\n *ngIf=\"supportsSoftwareOperations\"\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_INSTALL_SOFTWARE\n }\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n <button\n (click)=\"showSoftwareChanges.emit()\"\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n [title]=\"'Show &quot;Software changes&quot;' | translate\"\n >\n <span translate>Show \"Software changes\"</span>\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n </div>\n</div>\n\n<ng-template #alreadyInstalledWarning let-item let-option=\"option\">\n <i\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: item.body[0].value, version: option.body[0].value }\n \"\n ></i>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"p-relative d-flex m-l-auto\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </div>\n</ng-template>\n\n<ng-template #softwareType>\n <c8y-software-type\n additionalFilter\n [required]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n (onSelectSoftware)=\"search({ softwareType: $event?.softwareType })\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [showClearSelectionOption]=\"true\"\n ></c8y-software-type>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "component", type: i1.SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel"], outputs: ["onSelectSoftware"] }, { kind: "component", type: i6.OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i8.DeviceSoftwareListComponent, selector: "c8y-device-software-list", inputs: ["softwareList", "device", "deviceSoftwareChanges", "filterCriteria$"], outputs: ["update", "remove", "onListEmpty"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
175
175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: InstalledSoftwareComponent, decorators: [{
176
176
  type: Component,
177
- args: [{ selector: 'c8y-installed-software', template: "<div class=\"d-flex d-col flex-grow\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\" translate>Installed software</div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n class=\"card-block large-padding bg-level-2 p-0\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n <fieldset class=\"card-block large-padding overflow-visible separator-bottom\" *ngIf=\"showFilter\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter installed software\u2026' | translate }}\"\n id=\"filter\"\n placeholder=\"{{ 'Filter installed software\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n <span for=\"filter\" class=\"sr-only\" translate>Filter installed software\u2026</span>\n </div>\n </div>\n <div class=\"col-xs-6\">\n <c8y-software-type\n [required]=\"false\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n [showClearSelectionOption]=\"true\"\n (onSelectSoftware)=\"softwareTypeFilter$.next($event?.softwareType)\"\n ></c8y-software-type>\n </div>\n </div>\n </fieldset>\n\n <fieldset\n id=\"software-list\"\n class=\"flex-grow inner-scroll\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <!-- NOT EMPTY STATE -->\n <c8y-device-software-list\n [device]=\"device\"\n [filterCriteria$]=\"filterCriteria$\"\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n (onListEmpty)=\"showFilter = !$event\"\n class=\"d-block p-l-16 p-r-16\"\n container=\"body\"\n >\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software installed.</strong>\n <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n <!-- NO SEARCH RESULTS STATE -->\n <div class=\"c8y-empty-state c8y-no-results-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software matches your filter criteria.</strong>\n <br />\n <small translate>Try changing your search criteria.</small>\n </p>\n </div>\n </c8y-device-software-list>\n </fieldset>\n </div>\n <!-- INSTALL SOFTWARE-->\n <div\n class=\"card-footer large-padding separator sticky-bottom d-flex j-c-between bg-level-0\"\n [ngClass]=\"{ 'visible-sm visible-xs': !supportsSoftwareOperations }\"\n >\n <button\n *ngIf=\"supportsSoftwareOperations\"\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_INSTALL_SOFTWARE\n }\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n <button\n (click)=\"showSoftwareChanges.emit()\"\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n [title]=\"'Show &quot;Software changes&quot;' | translate\"\n >\n <span translate>Show \"Software changes\"</span>\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n </div>\n</div>\n\n<ng-template #alreadyInstalledWarning let-item let-option=\"option\">\n <i\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: item.body[0].value, version: option.body[0].value }\n \"\n ></i>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"p-relative d-flex m-l-auto\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </div>\n</ng-template>\n\n<ng-template #softwareType>\n <c8y-software-type\n additionalFilter\n [required]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n (onSelectSoftware)=\"search({ softwareType: $event?.softwareType })\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [showClearSelectionOption]=\"true\"\n ></c8y-software-type>\n</ng-template>\n" }]
177
+ args: [{ selector: 'c8y-installed-software', template: "<div class=\"d-flex d-col flex-grow\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\" translate>Installed software</div>\n </div>\n <div class=\"flex-grow\">\n <fieldset\n id=\"operation-block\"\n *ngIf=\"deviceSoftwareChangesOperation\"\n class=\"card-block large-padding bg-level-2 p-0\"\n >\n <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n </fieldset>\n <fieldset class=\"card-block large-padding overflow-visible separator-bottom\" *ngIf=\"showFilter\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <div class=\"input-group input-group-search\">\n <label for=\"filter\" class=\"sr-only\">\n {{ 'Filter installed software\u2026' | translate }}\n </label>\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter installed software\u2026' | translate }}\"\n id=\"filter\"\n placeholder=\"{{ 'Filter installed software\u2026' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n <span for=\"filter\" class=\"sr-only\" translate>Filter installed software\u2026</span>\n </div>\n </div>\n <div class=\"col-xs-6\">\n <c8y-software-type\n [required]=\"false\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n [showClearSelectionOption]=\"true\"\n (onSelectSoftware)=\"softwareTypeFilter$.next($event?.softwareType)\"\n ></c8y-software-type>\n </div>\n </div>\n </fieldset>\n\n <fieldset\n id=\"software-list\"\n class=\"flex-grow inner-scroll\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <!-- NOT EMPTY STATE -->\n <c8y-device-software-list\n [device]=\"device\"\n [filterCriteria$]=\"filterCriteria$\"\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n (onListEmpty)=\"showFilter = !$event\"\n class=\"d-block p-l-16 p-r-16\"\n container=\"body\"\n >\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software installed.</strong>\n <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n <!-- NO SEARCH RESULTS STATE -->\n <div class=\"c8y-empty-state c8y-no-results-state text-center\">\n <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n <p>\n <strong translate>No software matches your filter criteria.</strong>\n <br />\n <small translate>Try changing your search criteria.</small>\n </p>\n </div>\n </c8y-device-software-list>\n </fieldset>\n </div>\n <!-- INSTALL SOFTWARE-->\n <div\n class=\"card-footer large-padding separator sticky-bottom d-flex j-c-between bg-level-0\"\n [ngClass]=\"{ 'visible-sm visible-xs': !supportsSoftwareOperations }\"\n >\n <button\n *ngIf=\"supportsSoftwareOperations\"\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_INSTALL_SOFTWARE\n }\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n <button\n (click)=\"showSoftwareChanges.emit()\"\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n [title]=\"'Show &quot;Software changes&quot;' | translate\"\n >\n <span translate>Show \"Software changes\"</span>\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n </div>\n</div>\n\n<ng-template #alreadyInstalledWarning let-item let-option=\"option\">\n <i\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: item.body[0].value, version: option.body[0].value }\n \"\n ></i>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"p-relative d-flex m-l-auto\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </div>\n</ng-template>\n\n<ng-template #softwareType>\n <c8y-software-type\n additionalFilter\n [required]=\"false\"\n [placeholder]=\"'Filter by software type\u2026' | translate\"\n (onSelectSoftware)=\"search({ softwareType: $event?.softwareType })\"\n [emitResultsOnly]=\"true\"\n [showBtnInNotFoundMessage]=\"false\"\n [allowFreeEntries]=\"false\"\n [showClearSelectionOption]=\"true\"\n ></c8y-software-type>\n</ng-template>\n" }]
178
178
  }], ctorParameters: function () { return [{ type: i1.RepositoryService }, { type: i2.BsModalService }]; }, propDecorators: { device: [{
179
179
  type: Input
180
180
  }], softwareList: [{
@@ -201,4 +201,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
201
201
  type: ViewChild,
202
202
  args: ['softwareType', { static: true }]
203
203
  }] } });
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVkLXNvZnR3YXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUvZGV2aWNlLXRhYi9pbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS9kZXZpY2UtdGFiL2luc3RhbGxlZC1zb2Z0d2FyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE4QixXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUNMLE9BQU8sRUFHUCxrQkFBa0IsRUFDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBSUwsa0JBQWtCLEVBQ2xCLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsY0FBYyxFQUNmLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNGLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFNeEIsTUFBTSxPQUFPLDBCQUEwQjtJQWtDckMsWUFBb0IsVUFBNkIsRUFBVSxPQUF1QjtRQUE5RCxlQUFV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cHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIElPcGVyYXRpb24sIFF1ZXJpZXNVdGlsIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgZ2V0dGV4dCxcbiAgSVNlbGVjdE1vZGFsT2JqZWN0LFxuICBJVXBkYXRlSXRlbUV2ZW50LFxuICBNb2RhbFNlbGVjdGlvbk1vZGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBEZXZpY2VTb2Z0d2FyZSxcbiAgRGV2aWNlU29mdHdhcmVDaGFuZ2UsXG4gIEZpbHRlckNyaXRlcmlhLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCxcbiAgUmVwb3NpdG9yeVNlcnZpY2UsXG4gIFJlcG9zaXRvcnlUeXBlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUsIG9mLCBwaXBlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1pbnN0YWxsZWQtc29mdHdhcmUnLFxuICB0ZW1wbGF0ZVVybDogJ2luc3RhbGxlZC1zb2Z0d2FyZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW5zdGFsbGVkU29mdHdhcmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIFBST0RVQ1RfRVhQRVJJRU5DRSA9IFBST0RVQ1RfRVhQRVJJRU5DRTtcbiAgQElucHV0KCkgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgc29mdHdhcmVMaXN0OiBEZXZpY2VTb2Z0d2FyZVtdO1xuICBASW5wdXQoKSBkZXZpY2VTb2Z0d2FyZUNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW107XG4gIEBJbnB1dCgpIGRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgQElucHV0KCkgdHlwZXNRdWVyeTogb2JqZWN0O1xuICBAT3V0cHV0KCkgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4oKTtcbiAgQE91dHB1dCgpIHNob3dTb2Z0d2FyZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnYWxyZWFkeUluc3RhbGxlZFdhcm5pbmcnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBhbHJlYWR5SW5zdGFsbGVkV2FybmluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBhbHJlYWR5SW5zdGFsbGVkTWVzc2FnZSA9IGdldHRleHQoXG4gICAgJ3t7IG5hbWUgfX0gKHYuIHt7IHZlcnNpb24gfX0pIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoaXMgZGV2aWNlJ1xuICApO1xuICBAVmlld0NoaWxkKCdsb2FkaW5nJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgbG9hZGluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NvZnR3YXJlVHlwZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHNvZnR3YXJlVHlwZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGV4dEZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHNvZnR3YXJlVHlwZUZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIGZpbHRlckNyaXRlcmlhJDogT2JzZXJ2YWJsZTxGaWx0ZXJDcml0ZXJpYT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25UeXBlcyA9IFsnYzh5X1NvZnR3YXJlVXBkYXRlJywgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCAnYzh5X1NvZnR3YXJlJ107XG5cbiAgcHJpdmF0ZSBxdWVyaWVzVXRpbDogUXVlcmllc1V0aWw7XG4gIHByaXZhdGUgbW9kYWxTZWFyY2g6IChmaWx0ZXJDcml0ZXJpYTogRmlsdGVyQ3JpdGVyaWEpID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5U2VydmljZSwgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZSkge1xuICAgIHRoaXMuZmlsdGVyQ3JpdGVyaWEkID0gY29tYmluZUxhdGVzdChbdGhpcy50ZXh0RmlsdGVyJCwgdGhpcy5zb2Z0d2FyZVR5cGVGaWx0ZXIkXSkucGlwZShcbiAgICAgIG1hcCgoW3RleHRGaWx0ZXIsIHNvZnR3YXJlVHlwZUZpbHRlcl0pID0+ICh7XG4gICAgICAgIG5hbWU6IHRleHRGaWx0ZXIsXG4gICAgICAgIHNvZnR3YXJlVHlwZTogc29mdHdhcmVUeXBlRmlsdGVyXG4gICAgICB9KSksXG4gICAgICBtYXAoZmlsdGVyQ3JpdGVyaWEgPT5cbiAgICAgICAgIWZpbHRlckNyaXRlcmlhLm5hbWUgJiYgIWZpbHRlckNyaXRlcmlhLnNvZnR3YXJlVHlwZSA/IG51bGwgOiBmaWx0ZXJDcml0ZXJpYVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5xdWVyaWVzVXRpbCA9IG5ldyBRdWVyaWVzVXRpbCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IGdldCh0aGlzLmRldmljZSwgJ2M4eV9TdXBwb3J0ZWRPcGVyYXRpb25zJywgW10pO1xuICAgIHRoaXMuc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnMgPSB0aGlzLm9wZXJhdGlvblR5cGVzLnNvbWUoXG4gICAgICBvcGVyYXRpb25UeXBlID0+IHN1cHBvcnRlZE9wZXJhdGlvbnMuaW5kZXhPZihvcGVyYXRpb25UeXBlKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGluc3RhbGxTb2Z0d2FyZSgpIHtcbiAgICBjb25zdCB7IHJlc3VsdEVtaXR0ZXIsIGNob2ljZUVtaXR0ZXIsIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQgfSA9XG4gICAgICB0aGlzLmRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKHtcbiAgICAgICAgdGl0bGU6IGdldHRleHQoJ0luc3RhbGwgc29mdHdhcmUnKSxcbiAgICAgICAgbGFiZWxzOiB7IG9rOiBnZXR0ZXh0KCdJbnN0YWxsJykgfSxcbiAgICAgICAgc2hvd0FkZGl0aW9uYWxGaWx0ZXI6IHRydWUsXG4gICAgICAgIHJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJDogb2YoW10pLFxuICAgICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJDogbW9kYWwgPT5cbiAgICAgICAgICB0aGlzLmdldEluc3RhbGxhYmxlU29mdHdhcmVMaXN0V2l0aFZlcnNpb25zJChtb2RhbC5jb250ZW50LnNlYXJjaFRlcm0pXG4gICAgICB9KTtcblxuICAgIHJlc3VsdEVtaXR0ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKHNvZnR3YXJlVG9JbnN0YWxsID0+IHtcbiAgICAgIHRoaXMuZW1pdFNvZnR3YXJlSW5zdGFsbChzb2Z0d2FyZVRvSW5zdGFsbCk7XG4gICAgICB0aGlzLnNob3dTb2Z0d2FyZUNoYW5nZXMuZW1pdCgpO1xuICAgIH0pO1xuXG4gICAgY2hvaWNlRW1pdHRlclxuICAgICAgLnBpcGUoXG4gICAgICAgIHRoaXMuaXNTb2Z0d2FyZUluc3RhbGxlZE9uRGV2aWNlUGlwZSh1cGRhdGVJbnN0YWxsYWJsZUxpc3QkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHsgaXRlbSB9KSA9PlxuICAgICAgICB1cGRhdGVJbnN0YWxsYWJsZUxpc3QkLm5leHQoe1xuICAgICAgICAgIG9iamVjdDogaXRlbSxcbiAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy5hbHJlYWR5SW5zdGFsbGVkV2FybmluZ1RlbXBsYXRlLFxuICAgICAgICAgIG1hcHBlcjogb2JqZWN0ID0+IHtcbiAgICAgICAgICAgIG9iamVjdC5pbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlU29mdHdhcmUoc29mdHdhcmVUb1JlbW92ZSkge1xuICAgIGNvbnN0IHsgcmVzdWx0RW1pdHRlciwgY2hvaWNlRW1pdHRlciwgdXBkYXRlSW5zdGFsbGFibGVMaXN0JCB9ID1cbiAgICAgIHRoaXMuZGlzcGxheVNvZnR3YXJlU2VsZWN0TW9kYWwoe1xuICAgICAgICB0aXRsZTogZ2V0dGV4dCgnVXBkYXRlIHNvZnR3YXJlJyksXG4gICAgICAgIGxhYmVsczogeyBvazogZ2V0dGV4dCgnVXBkYXRlJykgfSxcbiAgICAgICAgc2hvd0ZpbHRlcjogZmFsc2UsXG4gICAgICAgIHJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJDogdGhpcy5nZXRTaW5nbGVTb2Z0d2FyZVdpdGhWZXJzaW9ucyQoc29mdHdhcmVUb1JlbW92ZSlcbiAgICAgIH0pO1xuXG4gICAgcmVzdWx0RW1pdHRlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoc29mdHdhcmVUb0luc3RhbGwgPT4ge1xuICAgICAgdGhpcy5lbWl0U29mdHdhcmVJbnN0YWxsKHNvZnR3YXJlVG9JbnN0YWxsKTtcbiAgICAgIHRoaXMuc2hvd1NvZnR3YXJlQ2hhbmdlcy5lbWl0KCk7XG4gICAgfSk7XG5cbiAgICBjaG9pY2VFbWl0dGVyXG4gICAgICAucGlwZShcbiAgICAgICAgdGhpcy5pc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2VQaXBlKHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeyBpdGVtIH0pID0+XG4gICAgICAgIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7XG4gICAgICAgICAgb2JqZWN0OiBpdGVtLFxuICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLmFscmVhZHlJbnN0YWxsZWRXYXJuaW5nVGVtcGxhdGUsXG4gICAgICAgICAgbWFwcGVyOiBvYmplY3QgPT4ge1xuICAgICAgICAgICAgb2JqZWN0Lmluc3RhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICByZW1vdmVTb2Z0d2FyZShzb2Z0d2FyZVRvUmVtb3ZlKSB7XG4gICAgdGhpcy5lbWl0U29mdHdhcmVSZW1vdmFsKFtzb2Z0d2FyZVRvUmVtb3ZlXSk7XG4gIH1cblxuICBnZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQoc2VhcmNoVGVybSQ6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJDcml0ZXJpYT4pIHtcbiAgICBjb25zdCBpbnN0YWxsZWRTb2Z0d2FyZU5hbWVzID0gKHRoaXMuc29mdHdhcmVMaXN0IHx8IFtdKS5tYXAocyA9PiBzLm5hbWUpO1xuICAgIHJldHVybiBzZWFyY2hUZXJtJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hUZXJtID0+XG4gICAgICAgIHRoaXMucmVwb3NpdG9yeS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsIHtcbiAgICAgICAgICBxdWVyeTogc2VhcmNoVGVybS5zb2Z0d2FyZVR5cGVcbiAgICAgICAgICAgID8gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIodGhpcy50eXBlc1F1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgc29mdHdhcmVUeXBlOiBzZWFyY2hUZXJtLnNvZnR3YXJlVHlwZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnR5cGVzUXVlcnksXG4gICAgICAgICAgcGFydGlhbE5hbWU6IHNlYXJjaFRlcm0/Lm5hbWUsXG4gICAgICAgICAgcGFyYW1zOiB7IHBhZ2VTaXplOiAxMDAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgbWFwKHNvZnR3YXJlTGlzdCA9PiB7XG4gICAgICAgIHJldHVybiBzb2Z0d2FyZUxpc3QuZmlsdGVyKHNvZnR3YXJlID0+IHtcbiAgICAgICAgICByZXR1cm4gIWluc3RhbGxlZFNvZnR3YXJlTmFtZXMuaW5jbHVkZXMoc29mdHdhcmUubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBtYXAoc29mdHdhcmVMaXN0ID0+IHRoaXMuYXR0YWNoVmVyc2lvbnMoc29mdHdhcmVMaXN0KSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBnZXRTaW5nbGVTb2Z0d2FyZVdpdGhWZXJzaW9ucyQoc29mdHdhcmU6IERldmljZVNvZnR3YXJlKSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLnJlcG9zaXRvcnkubGlzdFJlcG9zaXRvcnlFbnRyaWVzKFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFLCB7XG4gICAgICAgIHF1ZXJ5OiB7IG5hbWU6IHNvZnR3YXJlLm5hbWUgfVxuICAgICAgfSlcbiAgICApLnBpcGUoXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSxcbiAgICAgIG1hcChzb2Z0d2FyZUxpc3QgPT4gdGhpcy5hdHRhY2hWZXJzaW9ucyhzb2Z0d2FyZUxpc3QpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIGF0dGFjaFZlcnNpb25zKHNvZnR3YXJlTGlzdDogSU1hbmFnZWRPYmplY3RbXSkge1xuICAgIHNvZnR3YXJlTGlzdC5mb3JFYWNoKHNvZnR3YXJlID0+IHtcbiAgICAgIHNvZnR3YXJlLnZlcnNpb25zID0gdGhpcy5yZXBvc2l0b3J5Lmxpc3RCYXNlVmVyc2lvbnMoc29mdHdhcmUpO1xuICAgIH0pO1xuICAgIHJldHVybiBzb2Z0d2FyZUxpc3Q7XG4gIH1cblxuICBkaXNwbGF5U29mdHdhcmVTZWxlY3RNb2RhbChpbml0aWFsU3RhdGVPdmVycmlkZXMpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICByZXBvc2l0b3J5VHlwZTogUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsXG4gICAgICBzdWJUaXRsZTogZ2V0dGV4dCgnQXZhaWxhYmxlIHNvZnR3YXJlcyBtYXRjaGluZyB0aGUgZGV2aWNlIHR5cGUnKSxcbiAgICAgIG1vZGU6IE1vZGFsU2VsZWN0aW9uTW9kZS5NVUxUSSxcbiAgICAgIGljb246ICdjOHktdG9vbHMnLFxuICAgICAgZGlzYWJsZVNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkOiB0aGlzLnNvZnR3YXJlTGlzdCxcbiAgICAgIGFkZGl0aW9uYWxGaWx0ZXJUZW1wbGF0ZTogdGhpcy5zb2Z0d2FyZVR5cGVUZW1wbGF0ZSxcbiAgICAgIC4uLmluaXRpYWxTdGF0ZU92ZXJyaWRlc1xuICAgIH07XG4gICAgY29uc3QgbW9kYWwgPSB0aGlzLmJzTW9kYWwuc2hvdyhSZXBvc2l0b3J5U2VsZWN0TW9kYWxDb21wb25lbnQsIHtcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUsXG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpbml0aWFsU3RhdGVcbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsU3RhdGVPdmVycmlkZXMucmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnNGbiQpIHtcbiAgICAgIG1vZGFsLmNvbnRlbnQucmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnMkID1cbiAgICAgICAgaW5pdGlhbFN0YXRlT3ZlcnJpZGVzLnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zRm4kKG1vZGFsKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vZGFsU2VhcmNoID0gbW9kYWwuY29udGVudC5zZWFyY2guYmluZChtb2RhbC5jb250ZW50KTtcblxuICAgIG1vZGFsLmNvbnRlbnQubG9hZC5uZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdEVtaXR0ZXI6IG1vZGFsLmNvbnRlbnQucmVzdWx0RW1pdHRlcixcbiAgICAgIGNob2ljZUVtaXR0ZXI6IG1vZGFsLmNvbnRlbnQub25DaG9pY2VVcGRhdGVkLFxuICAgICAgdXBkYXRlSW5zdGFsbGFibGVMaXN0JDogbW9kYWwuY29udGVudC51cGRhdGVJbnN0YWxsYWJsZUxpc3QkXG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaChmaWx0ZXJDcml0ZXJpYTogRmlsdGVyQ3JpdGVyaWEpIHtcbiAgICBpZiAodGhpcy5tb2RhbFNlYXJjaCkge1xuICAgICAgdGhpcy5tb2RhbFNlYXJjaChmaWx0ZXJDcml0ZXJpYSk7XG4gICAgfVxuICB9XG5cbiAgZW1pdFNvZnR3YXJlSW5zdGFsbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBhY3Rpb246ICdpbnN0YWxsJyB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlUmVtb3ZhbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBhY3Rpb246ICdkZWxldGUnIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2VQaXBlKHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQ6IFN1YmplY3Q8SVVwZGF0ZUl0ZW1FdmVudDxhbnk+Pikge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGFwKChpdGVtOiBJU2VsZWN0TW9kYWxPYmplY3QpID0+XG4gICAgICAgIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7IG9iamVjdDogaXRlbSwgdGVtcGxhdGU6IHRoaXMubG9hZGluZ1RlbXBsYXRlIH0pXG4gICAgICApLFxuICAgICAgbWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaXRlbSxcbiAgICAgICAgc29mdHdhcmU6IChcbiAgICAgICAgICAoaXRlbS5vcHRpb25zIHx8IFtdKS5maW5kKG9wdGlvbiA9PiBvcHRpb24ub2JqLmlkID09PSAoaXRlbSBhcyBhbnkpLnNlbGVjdGVkSWQpIHx8IHt9XG4gICAgICAgICkub2JqXG4gICAgICB9KSksXG4gICAgICBtZXJnZU1hcCgoeyBpdGVtLCBzb2Z0d2FyZSB9KSA9PlxuICAgICAgICBmcm9tKFxuICAgICAgICAgIHRoaXMucmVwb3NpdG9yeS5pc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2UodGhpcy5kZXZpY2UuaWQsIHNvZnR3YXJlIGFzIERldmljZVNvZnR3YXJlKVxuICAgICAgICApLnBpcGUobWFwKGluc3RhbGxlZCA9PiAoeyBpdGVtLCBpbnN0YWxsZWQgfSkpKVxuICAgICAgKSxcbiAgICAgIHRhcCgoeyBpdGVtIH0pID0+IHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7IG9iamVjdDogaXRlbSB9KSksXG4gICAgICBmaWx0ZXIoKHsgaW5zdGFsbGVkIH0pID0+ICEhaW5zdGFsbGVkKVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgZmxleC1ncm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBsYXJnZS1wYWRkaW5nIHNlcGFyYXRvciBzdGlja3ktdG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIiB0cmFuc2xhdGU+SW5zdGFsbGVkIHNvZnR3YXJlPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93XCI+XG4gICAgPGZpZWxkc2V0XG4gICAgICBpZD1cIm9wZXJhdGlvbi1ibG9ja1wiXG4gICAgICAqbmdJZj1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiXG4gICAgICBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZyBiZy1sZXZlbC0yIHAtMFwiXG4gICAgPlxuICAgICAgPGM4eS1vcGVyYXRpb24tZGV0YWlscyBbb3BlcmF0aW9uXT1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiPjwvYzh5LW9wZXJhdGlvbi1kZXRhaWxzPlxuICAgIDwvZmllbGRzZXQ+XG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiY2FyZC1ibG9jayBsYXJnZS1wYWRkaW5nIG92ZXJmbG93LXZpc2libGUgc2VwYXJhdG9yLWJvdHRvbVwiICpuZ0lmPVwic2hvd0ZpbHRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRmlsdGVyIGluc3RhbGxlZCBzb2Z0d2FyZeKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBpZD1cImZpbHRlclwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ0ZpbHRlciBpbnN0YWxsZWQgc29mdHdhcmXigKYnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwidGV4dEZpbHRlciQgfCBhc3luY1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRGaWx0ZXIkLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCIodGV4dEZpbHRlciQgfCBhc3luYykubGVuZ3RoID09PSAwXCI+PC9pPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgICAgICAgYzh5SWNvbj1cInRpbWVzXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIih0ZXh0RmlsdGVyJCB8IGFzeW5jKS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidGV4dEZpbHRlciQubmV4dCgnJylcIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gZm9yPVwiZmlsdGVyXCIgY2xhc3M9XCJzci1vbmx5XCIgdHJhbnNsYXRlPkZpbHRlciBpbnN0YWxsZWQgc29mdHdhcmXigKY8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgICA8Yzh5LXNvZnR3YXJlLXR5cGVcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZW1pdFJlc3VsdHNPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dCdG5Jbk5vdEZvdW5kTWVzc2FnZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbYWxsb3dGcmVlRW50cmllc109XCJmYWxzZVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0ZpbHRlciBieSBzb2Z0d2FyZSB0eXBl4oCmJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc2hvd0NsZWFyU2VsZWN0aW9uT3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgKG9uU2VsZWN0U29mdHdhcmUpPVwic29mdHdhcmVUeXBlRmlsdGVyJC5uZXh0KCRldmVudD8uc29mdHdhcmVUeXBlKVwiXG4gICAgICAgICAgPjwvYzh5LXNvZnR3YXJlLXR5cGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9maWVsZHNldD5cblxuICAgIDxmaWVsZHNldFxuICAgICAgaWQ9XCJzb2Z0d2FyZS1saXN0XCJcbiAgICAgIGNsYXNzPVwiZmxleC1ncm93IGlubmVyLXNjcm9sbFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzc1wiXG4gICAgPlxuICAgICAgPCEtLSBOT1QgRU1QVFkgU1RBVEUgLS0+XG4gICAgICA8Yzh5LWRldmljZS1zb2Z0d2FyZS1saXN0XG4gICAgICAgIFtkZXZpY2VdPVwiZGV2aWNlXCJcbiAgICAgICAgW2ZpbHRlckNyaXRlcmlhJF09XCJmaWx0ZXJDcml0ZXJpYSRcIlxuICAgICAgICBbc29mdHdhcmVMaXN0XT1cInNvZnR3YXJlTGlzdFwiXG4gICAgICAgIFtkZXZpY2VTb2Z0d2FyZUNoYW5nZXNdPVwiZGV2aWNlU29mdHdhcmVDaGFuZ2VzXCJcbiAgICAgICAgKHVwZGF0ZSk9XCJ1cGRhdGVTb2Z0d2FyZSgkZXZlbnQpXCJcbiAgICAgICAgKHJlbW92ZSk9XCJyZW1vdmVTb2Z0d2FyZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uTGlzdEVtcHR5KT1cInNob3dGaWx0ZXIgPSAhJGV2ZW50XCJcbiAgICAgICAgY2xhc3M9XCJkLWJsb2NrIHAtbC0xNiBwLXItMTZcIlxuICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBFTVBUWSBTVEFURSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoMSBjOHktaWNvbiBjOHktaWNvbi10b29scyBjOHktaWNvbi1kdW9jb2xvclwiPjwvZGl2PlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHN0cm9uZyB0cmFuc2xhdGU+Tm8gc29mdHdhcmUgaW5zdGFsbGVkLjwvc3Ryb25nPlxuICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICA8c21hbGwgdHJhbnNsYXRlPkNsaWNrIGJlbG93IHRvIGluc3RhbGwgc29mdHdhcmUgaW50byB0aGlzIGRldmljZS48L3NtYWxsPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gTk8gU0VBUkNIIFJFU1VMVFMgU1RBVEUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktZW1wdHktc3RhdGUgYzh5LW5vLXJlc3VsdHMtc3RhdGUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaDEgYzh5LWljb24gYzh5LWljb24tdG9vbHMgYzh5LWljb24tZHVvY29sb3JcIj48L2Rpdj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzdHJvbmcgdHJhbnNsYXRlPk5vIHNvZnR3YXJlIG1hdGNoZXMgeW91ciBmaWx0ZXIgY3JpdGVyaWEuPC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxzbWFsbCB0cmFuc2xhdGU+VHJ5IGNoYW5naW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLjwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWRldmljZS1zb2Z0d2FyZS1saXN0PlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZGl2PlxuICA8IS0tIElOU1RBTEwgU09GVFdBUkUtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY2FyZC1mb290ZXIgbGFyZ2UtcGFkZGluZyBzZXBhcmF0b3Igc3RpY2t5LWJvdHRvbSBkLWZsZXggai1jLWJldHdlZW4gYmctbGV2ZWwtMFwiXG4gICAgW25nQ2xhc3NdPVwieyAndmlzaWJsZS1zbSB2aXNpYmxlLXhzJzogIXN1cHBvcnRzU29mdHdhcmVPcGVyYXRpb25zIH1cIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzdXBwb3J0c1NvZnR3YXJlT3BlcmF0aW9uc1wiXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICB0aXRsZT1cInt7ICdJbnN0YWxsIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAoY2xpY2spPVwiaW5zdGFsbFNvZnR3YXJlKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRldmljZVNvZnR3YXJlQ2hhbmdlc0luUHJvZ3Jlc3NcIlxuICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5FVkVOVFMuREVWSUNFX1RBQlwiXG4gICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkNPTVBPTkVOVFMuREVWSUNFX1NPRlRXQVJFX0xJU1QsXG4gICAgICAgIGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkFDVElPTlMuT1BFTl9JTlNUQUxMX1NPRlRXQVJFXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAgICB7eyAnSW5zdGFsbCBzb2Z0d2FyZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwic2hvd1NvZnR3YXJlQ2hhbmdlcy5lbWl0KClcIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLWNsZWFuIHRleHQtcHJpbWFyeSB2aXNpYmxlLXNtIHZpc2libGUteHNcIlxuICAgICAgW3RpdGxlXT1cIidTaG93ICZxdW90O1NvZnR3YXJlIGNoYW5nZXMmcXVvdDsnIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICA8c3BhbiB0cmFuc2xhdGU+U2hvdyBcIlNvZnR3YXJlIGNoYW5nZXNcIjwvc3Bhbj5cbiAgICAgIDxpIGM4eUljb249XCJjaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2FscmVhZHlJbnN0YWxsZWRXYXJuaW5nIGxldC1pdGVtIGxldC1vcHRpb249XCJvcHRpb25cIj5cbiAgPGlcbiAgICBjOHlJY29uPVwid2FybmluZ1wiXG4gICAgY2xhc3M9XCJ0ZXh0LXdhcm5pbmcgYS1zLWNlbnRlclwiXG4gICAgW3Rvb2x0aXBdPVwiXG4gICAgICBhbHJlYWR5SW5zdGFsbGVkTWVzc2FnZVxuICAgICAgICB8IHRyYW5zbGF0ZTogeyBuYW1lOiBpdGVtLmJvZHlbMF0udmFsdWUsIHZlcnNpb246IG9wdGlvbi5ib2R5WzBdLnZhbHVlIH1cbiAgICBcIlxuICA+PC9pPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwicC1yZWxhdGl2ZSBkLWZsZXggbS1sLWF1dG9cIj5cbiAgICA8aSBjbGFzcz1cImljb24tc3BpblwiIGM4eUljb249XCJjaXJjbGUtby1ub3RjaFwiPjwvaT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NvZnR3YXJlVHlwZT5cbiAgPGM4eS1zb2Z0d2FyZS10eXBlXG4gICAgYWRkaXRpb25hbEZpbHRlclxuICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cIidGaWx0ZXIgYnkgc29mdHdhcmUgdHlwZeKApicgfCB0cmFuc2xhdGVcIlxuICAgIChvblNlbGVjdFNvZnR3YXJlKT1cInNlYXJjaCh7IHNvZnR3YXJlVHlwZTogJGV2ZW50Py5zb2Z0d2FyZVR5cGUgfSlcIlxuICAgIFtlbWl0UmVzdWx0c09ubHldPVwidHJ1ZVwiXG4gICAgW3Nob3dCdG5Jbk5vdEZvdW5kTWVzc2FnZV09XCJmYWxzZVwiXG4gICAgW2FsbG93RnJlZUVudHJpZXNdPVwiZmFsc2VcIlxuICAgIFtzaG93Q2xlYXJTZWxlY3Rpb25PcHRpb25dPVwidHJ1ZVwiXG4gID48L2M4eS1zb2Z0d2FyZS10eXBlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVkLXNvZnR3YXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUvZGV2aWNlLXRhYi9pbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS9kZXZpY2UtdGFiL2luc3RhbGxlZC1zb2Z0d2FyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE4QixXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUNMLE9BQU8sRUFHUCxrQkFBa0IsRUFDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBSUwsa0JBQWtCLEVBQ2xCLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsY0FBYyxFQUNmLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNGLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFNeEIsTUFBTSxPQUFPLDBCQUEwQjtJQWtDckMsWUFBb0IsVUFBNkIsRUFBVSxPQUF1QjtRQUE5RCxlQUFV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cHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIElPcGVyYXRpb24sIFF1ZXJpZXNVdGlsIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgZ2V0dGV4dCxcbiAgSVNlbGVjdE1vZGFsT2JqZWN0LFxuICBJVXBkYXRlSXRlbUV2ZW50LFxuICBNb2RhbFNlbGVjdGlvbk1vZGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBEZXZpY2VTb2Z0d2FyZSxcbiAgRGV2aWNlU29mdHdhcmVDaGFuZ2UsXG4gIEZpbHRlckNyaXRlcmlhLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCxcbiAgUmVwb3NpdG9yeVNlcnZpY2UsXG4gIFJlcG9zaXRvcnlUeXBlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUsIG9mLCBwaXBlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1pbnN0YWxsZWQtc29mdHdhcmUnLFxuICB0ZW1wbGF0ZVVybDogJ2luc3RhbGxlZC1zb2Z0d2FyZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW5zdGFsbGVkU29mdHdhcmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIFBST0RVQ1RfRVhQRVJJRU5DRSA9IFBST0RVQ1RfRVhQRVJJRU5DRTtcbiAgQElucHV0KCkgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgc29mdHdhcmVMaXN0OiBEZXZpY2VTb2Z0d2FyZVtdO1xuICBASW5wdXQoKSBkZXZpY2VTb2Z0d2FyZUNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW107XG4gIEBJbnB1dCgpIGRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgQElucHV0KCkgdHlwZXNRdWVyeTogb2JqZWN0O1xuICBAT3V0cHV0KCkgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4oKTtcbiAgQE91dHB1dCgpIHNob3dTb2Z0d2FyZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnYWxyZWFkeUluc3RhbGxlZFdhcm5pbmcnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBhbHJlYWR5SW5zdGFsbGVkV2FybmluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBhbHJlYWR5SW5zdGFsbGVkTWVzc2FnZSA9IGdldHRleHQoXG4gICAgJ3t7IG5hbWUgfX0gKHYuIHt7IHZlcnNpb24gfX0pIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoaXMgZGV2aWNlJ1xuICApO1xuICBAVmlld0NoaWxkKCdsb2FkaW5nJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgbG9hZGluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NvZnR3YXJlVHlwZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHNvZnR3YXJlVHlwZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGV4dEZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHNvZnR3YXJlVHlwZUZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIGZpbHRlckNyaXRlcmlhJDogT2JzZXJ2YWJsZTxGaWx0ZXJDcml0ZXJpYT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25UeXBlcyA9IFsnYzh5X1NvZnR3YXJlVXBkYXRlJywgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCAnYzh5X1NvZnR3YXJlJ107XG5cbiAgcHJpdmF0ZSBxdWVyaWVzVXRpbDogUXVlcmllc1V0aWw7XG4gIHByaXZhdGUgbW9kYWxTZWFyY2g6IChmaWx0ZXJDcml0ZXJpYTogRmlsdGVyQ3JpdGVyaWEpID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5U2VydmljZSwgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZSkge1xuICAgIHRoaXMuZmlsdGVyQ3JpdGVyaWEkID0gY29tYmluZUxhdGVzdChbdGhpcy50ZXh0RmlsdGVyJCwgdGhpcy5zb2Z0d2FyZVR5cGVGaWx0ZXIkXSkucGlwZShcbiAgICAgIG1hcCgoW3RleHRGaWx0ZXIsIHNvZnR3YXJlVHlwZUZpbHRlcl0pID0+ICh7XG4gICAgICAgIG5hbWU6IHRleHRGaWx0ZXIsXG4gICAgICAgIHNvZnR3YXJlVHlwZTogc29mdHdhcmVUeXBlRmlsdGVyXG4gICAgICB9KSksXG4gICAgICBtYXAoZmlsdGVyQ3JpdGVyaWEgPT5cbiAgICAgICAgIWZpbHRlckNyaXRlcmlhLm5hbWUgJiYgIWZpbHRlckNyaXRlcmlhLnNvZnR3YXJlVHlwZSA/IG51bGwgOiBmaWx0ZXJDcml0ZXJpYVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5xdWVyaWVzVXRpbCA9IG5ldyBRdWVyaWVzVXRpbCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IGdldCh0aGlzLmRldmljZSwgJ2M4eV9TdXBwb3J0ZWRPcGVyYXRpb25zJywgW10pO1xuICAgIHRoaXMuc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnMgPSB0aGlzLm9wZXJhdGlvblR5cGVzLnNvbWUoXG4gICAgICBvcGVyYXRpb25UeXBlID0+IHN1cHBvcnRlZE9wZXJhdGlvbnMuaW5kZXhPZihvcGVyYXRpb25UeXBlKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGluc3RhbGxTb2Z0d2FyZSgpIHtcbiAgICBjb25zdCB7IHJlc3VsdEVtaXR0ZXIsIGNob2ljZUVtaXR0ZXIsIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQgfSA9XG4gICAgICB0aGlzLmRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKHtcbiAgICAgICAgdGl0bGU6IGdldHRleHQoJ0luc3RhbGwgc29mdHdhcmUnKSxcbiAgICAgICAgbGFiZWxzOiB7IG9rOiBnZXR0ZXh0KCdJbnN0YWxsJykgfSxcbiAgICAgICAgc2hvd0FkZGl0aW9uYWxGaWx0ZXI6IHRydWUsXG4gICAgICAgIHJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJDogb2YoW10pLFxuICAgICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJDogbW9kYWwgPT5cbiAgICAgICAgICB0aGlzLmdldEluc3RhbGxhYmxlU29mdHdhcmVMaXN0V2l0aFZlcnNpb25zJChtb2RhbC5jb250ZW50LnNlYXJjaFRlcm0pXG4gICAgICB9KTtcblxuICAgIHJlc3VsdEVtaXR0ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKHNvZnR3YXJlVG9JbnN0YWxsID0+IHtcbiAgICAgIHRoaXMuZW1pdFNvZnR3YXJlSW5zdGFsbChzb2Z0d2FyZVRvSW5zdGFsbCk7XG4gICAgICB0aGlzLnNob3dTb2Z0d2FyZUNoYW5nZXMuZW1pdCgpO1xuICAgIH0pO1xuXG4gICAgY2hvaWNlRW1pdHRlclxuICAgICAgLnBpcGUoXG4gICAgICAgIHRoaXMuaXNTb2Z0d2FyZUluc3RhbGxlZE9uRGV2aWNlUGlwZSh1cGRhdGVJbnN0YWxsYWJsZUxpc3QkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHsgaXRlbSB9KSA9PlxuICAgICAgICB1cGRhdGVJbnN0YWxsYWJsZUxpc3QkLm5leHQoe1xuICAgICAgICAgIG9iamVjdDogaXRlbSxcbiAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy5hbHJlYWR5SW5zdGFsbGVkV2FybmluZ1RlbXBsYXRlLFxuICAgICAgICAgIG1hcHBlcjogb2JqZWN0ID0+IHtcbiAgICAgICAgICAgIG9iamVjdC5pbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlU29mdHdhcmUoc29mdHdhcmVUb1JlbW92ZSkge1xuICAgIGNvbnN0IHsgcmVzdWx0RW1pdHRlciwgY2hvaWNlRW1pdHRlciwgdXBkYXRlSW5zdGFsbGFibGVMaXN0JCB9ID1cbiAgICAgIHRoaXMuZGlzcGxheVNvZnR3YXJlU2VsZWN0TW9kYWwoe1xuICAgICAgICB0aXRsZTogZ2V0dGV4dCgnVXBkYXRlIHNvZnR3YXJlJyksXG4gICAgICAgIGxhYmVsczogeyBvazogZ2V0dGV4dCgnVXBkYXRlJykgfSxcbiAgICAgICAgc2hvd0ZpbHRlcjogZmFsc2UsXG4gICAgICAgIHJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJDogdGhpcy5nZXRTaW5nbGVTb2Z0d2FyZVdpdGhWZXJzaW9ucyQoc29mdHdhcmVUb1JlbW92ZSlcbiAgICAgIH0pO1xuXG4gICAgcmVzdWx0RW1pdHRlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoc29mdHdhcmVUb0luc3RhbGwgPT4ge1xuICAgICAgdGhpcy5lbWl0U29mdHdhcmVJbnN0YWxsKHNvZnR3YXJlVG9JbnN0YWxsKTtcbiAgICAgIHRoaXMuc2hvd1NvZnR3YXJlQ2hhbmdlcy5lbWl0KCk7XG4gICAgfSk7XG5cbiAgICBjaG9pY2VFbWl0dGVyXG4gICAgICAucGlwZShcbiAgICAgICAgdGhpcy5pc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2VQaXBlKHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeyBpdGVtIH0pID0+XG4gICAgICAgIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7XG4gICAgICAgICAgb2JqZWN0OiBpdGVtLFxuICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLmFscmVhZHlJbnN0YWxsZWRXYXJuaW5nVGVtcGxhdGUsXG4gICAgICAgICAgbWFwcGVyOiBvYmplY3QgPT4ge1xuICAgICAgICAgICAgb2JqZWN0Lmluc3RhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICByZW1vdmVTb2Z0d2FyZShzb2Z0d2FyZVRvUmVtb3ZlKSB7XG4gICAgdGhpcy5lbWl0U29mdHdhcmVSZW1vdmFsKFtzb2Z0d2FyZVRvUmVtb3ZlXSk7XG4gIH1cblxuICBnZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQoc2VhcmNoVGVybSQ6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJDcml0ZXJpYT4pIHtcbiAgICBjb25zdCBpbnN0YWxsZWRTb2Z0d2FyZU5hbWVzID0gKHRoaXMuc29mdHdhcmVMaXN0IHx8IFtdKS5tYXAocyA9PiBzLm5hbWUpO1xuICAgIHJldHVybiBzZWFyY2hUZXJtJC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hUZXJtID0+XG4gICAgICAgIHRoaXMucmVwb3NpdG9yeS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsIHtcbiAgICAgICAgICBxdWVyeTogc2VhcmNoVGVybS5zb2Z0d2FyZVR5cGVcbiAgICAgICAgICAgID8gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIodGhpcy50eXBlc1F1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgc29mdHdhcmVUeXBlOiBzZWFyY2hUZXJtLnNvZnR3YXJlVHlwZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnR5cGVzUXVlcnksXG4gICAgICAgICAgcGFydGlhbE5hbWU6IHNlYXJjaFRlcm0/Lm5hbWUsXG4gICAgICAgICAgcGFyYW1zOiB7IHBhZ2VTaXplOiAxMDAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgbWFwKHNvZnR3YXJlTGlzdCA9PiB7XG4gICAgICAgIHJldHVybiBzb2Z0d2FyZUxpc3QuZmlsdGVyKHNvZnR3YXJlID0+IHtcbiAgICAgICAgICByZXR1cm4gIWluc3RhbGxlZFNvZnR3YXJlTmFtZXMuaW5jbHVkZXMoc29mdHdhcmUubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBtYXAoc29mdHdhcmVMaXN0ID0+IHRoaXMuYXR0YWNoVmVyc2lvbnMoc29mdHdhcmVMaXN0KSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBnZXRTaW5nbGVTb2Z0d2FyZVdpdGhWZXJzaW9ucyQoc29mdHdhcmU6IERldmljZVNvZnR3YXJlKSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLnJlcG9zaXRvcnkubGlzdFJlcG9zaXRvcnlFbnRyaWVzKFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFLCB7XG4gICAgICAgIHF1ZXJ5OiB7IG5hbWU6IHNvZnR3YXJlLm5hbWUgfVxuICAgICAgfSlcbiAgICApLnBpcGUoXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSxcbiAgICAgIG1hcChzb2Z0d2FyZUxpc3QgPT4gdGhpcy5hdHRhY2hWZXJzaW9ucyhzb2Z0d2FyZUxpc3QpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIGF0dGFjaFZlcnNpb25zKHNvZnR3YXJlTGlzdDogSU1hbmFnZWRPYmplY3RbXSkge1xuICAgIHNvZnR3YXJlTGlzdC5mb3JFYWNoKHNvZnR3YXJlID0+IHtcbiAgICAgIHNvZnR3YXJlLnZlcnNpb25zID0gdGhpcy5yZXBvc2l0b3J5Lmxpc3RCYXNlVmVyc2lvbnMoc29mdHdhcmUpO1xuICAgIH0pO1xuICAgIHJldHVybiBzb2Z0d2FyZUxpc3Q7XG4gIH1cblxuICBkaXNwbGF5U29mdHdhcmVTZWxlY3RNb2RhbChpbml0aWFsU3RhdGVPdmVycmlkZXMpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICByZXBvc2l0b3J5VHlwZTogUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsXG4gICAgICBzdWJUaXRsZTogZ2V0dGV4dCgnQXZhaWxhYmxlIHNvZnR3YXJlcyBtYXRjaGluZyB0aGUgZGV2aWNlIHR5cGUnKSxcbiAgICAgIG1vZGU6IE1vZGFsU2VsZWN0aW9uTW9kZS5NVUxUSSxcbiAgICAgIGljb246ICdjOHktdG9vbHMnLFxuICAgICAgZGlzYWJsZVNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkOiB0aGlzLnNvZnR3YXJlTGlzdCxcbiAgICAgIGFkZGl0aW9uYWxGaWx0ZXJUZW1wbGF0ZTogdGhpcy5zb2Z0d2FyZVR5cGVUZW1wbGF0ZSxcbiAgICAgIC4uLmluaXRpYWxTdGF0ZU92ZXJyaWRlc1xuICAgIH07XG4gICAgY29uc3QgbW9kYWwgPSB0aGlzLmJzTW9kYWwuc2hvdyhSZXBvc2l0b3J5U2VsZWN0TW9kYWxDb21wb25lbnQsIHtcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUsXG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpbml0aWFsU3RhdGVcbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsU3RhdGVPdmVycmlkZXMucmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnNGbiQpIHtcbiAgICAgIG1vZGFsLmNvbnRlbnQucmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnMkID1cbiAgICAgICAgaW5pdGlhbFN0YXRlT3ZlcnJpZGVzLnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zRm4kKG1vZGFsKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vZGFsU2VhcmNoID0gbW9kYWwuY29udGVudC5zZWFyY2guYmluZChtb2RhbC5jb250ZW50KTtcblxuICAgIG1vZGFsLmNvbnRlbnQubG9hZC5uZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdEVtaXR0ZXI6IG1vZGFsLmNvbnRlbnQucmVzdWx0RW1pdHRlcixcbiAgICAgIGNob2ljZUVtaXR0ZXI6IG1vZGFsLmNvbnRlbnQub25DaG9pY2VVcGRhdGVkLFxuICAgICAgdXBkYXRlSW5zdGFsbGFibGVMaXN0JDogbW9kYWwuY29udGVudC51cGRhdGVJbnN0YWxsYWJsZUxpc3QkXG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaChmaWx0ZXJDcml0ZXJpYTogRmlsdGVyQ3JpdGVyaWEpIHtcbiAgICBpZiAodGhpcy5tb2RhbFNlYXJjaCkge1xuICAgICAgdGhpcy5tb2RhbFNlYXJjaChmaWx0ZXJDcml0ZXJpYSk7XG4gICAgfVxuICB9XG5cbiAgZW1pdFNvZnR3YXJlSW5zdGFsbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBhY3Rpb246ICdpbnN0YWxsJyB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlUmVtb3ZhbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KFxuICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBhY3Rpb246ICdkZWxldGUnIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2VQaXBlKHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQ6IFN1YmplY3Q8SVVwZGF0ZUl0ZW1FdmVudDxhbnk+Pikge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGFwKChpdGVtOiBJU2VsZWN0TW9kYWxPYmplY3QpID0+XG4gICAgICAgIHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7IG9iamVjdDogaXRlbSwgdGVtcGxhdGU6IHRoaXMubG9hZGluZ1RlbXBsYXRlIH0pXG4gICAgICApLFxuICAgICAgbWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaXRlbSxcbiAgICAgICAgc29mdHdhcmU6IChcbiAgICAgICAgICAoaXRlbS5vcHRpb25zIHx8IFtdKS5maW5kKG9wdGlvbiA9PiBvcHRpb24ub2JqLmlkID09PSAoaXRlbSBhcyBhbnkpLnNlbGVjdGVkSWQpIHx8IHt9XG4gICAgICAgICkub2JqXG4gICAgICB9KSksXG4gICAgICBtZXJnZU1hcCgoeyBpdGVtLCBzb2Z0d2FyZSB9KSA9PlxuICAgICAgICBmcm9tKFxuICAgICAgICAgIHRoaXMucmVwb3NpdG9yeS5pc1NvZnR3YXJlSW5zdGFsbGVkT25EZXZpY2UodGhpcy5kZXZpY2UuaWQsIHNvZnR3YXJlIGFzIERldmljZVNvZnR3YXJlKVxuICAgICAgICApLnBpcGUobWFwKGluc3RhbGxlZCA9PiAoeyBpdGVtLCBpbnN0YWxsZWQgfSkpKVxuICAgICAgKSxcbiAgICAgIHRhcCgoeyBpdGVtIH0pID0+IHVwZGF0ZUluc3RhbGxhYmxlTGlzdCQubmV4dCh7IG9iamVjdDogaXRlbSB9KSksXG4gICAgICBmaWx0ZXIoKHsgaW5zdGFsbGVkIH0pID0+ICEhaW5zdGFsbGVkKVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgZmxleC1ncm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBsYXJnZS1wYWRkaW5nIHNlcGFyYXRvciBzdGlja3ktdG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIiB0cmFuc2xhdGU+SW5zdGFsbGVkIHNvZnR3YXJlPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93XCI+XG4gICAgPGZpZWxkc2V0XG4gICAgICBpZD1cIm9wZXJhdGlvbi1ibG9ja1wiXG4gICAgICAqbmdJZj1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiXG4gICAgICBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZyBiZy1sZXZlbC0yIHAtMFwiXG4gICAgPlxuICAgICAgPGM4eS1vcGVyYXRpb24tZGV0YWlscyBbb3BlcmF0aW9uXT1cImRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvblwiPjwvYzh5LW9wZXJhdGlvbi1kZXRhaWxzPlxuICAgIDwvZmllbGRzZXQ+XG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiY2FyZC1ibG9jayBsYXJnZS1wYWRkaW5nIG92ZXJmbG93LXZpc2libGUgc2VwYXJhdG9yLWJvdHRvbVwiICpuZ0lmPVwic2hvd0ZpbHRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsdGVyXCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgIHt7ICdGaWx0ZXIgaW5zdGFsbGVkIHNvZnR3YXJl4oCmJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdGaWx0ZXIgaW5zdGFsbGVkIHNvZnR3YXJl4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGlkPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRmlsdGVyIGluc3RhbGxlZCBzb2Z0d2FyZeKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ0ZXh0RmlsdGVyJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGV4dEZpbHRlciQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJzZWFyY2hcIiAqbmdJZj1cIih0ZXh0RmlsdGVyJCB8IGFzeW5jKS5sZW5ndGggPT09IDBcIj48L2k+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCJcbiAgICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiKHRleHRGaWx0ZXIkIHwgYXN5bmMpLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXh0RmlsdGVyJC5uZXh0KCcnKVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBmb3I9XCJmaWx0ZXJcIiBjbGFzcz1cInNyLW9ubHlcIiB0cmFuc2xhdGU+RmlsdGVyIGluc3RhbGxlZCBzb2Z0d2FyZeKApjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNlwiPlxuICAgICAgICAgIDxjOHktc29mdHdhcmUtdHlwZVxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtlbWl0UmVzdWx0c09ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2hvd0J0bkluTm90Rm91bmRNZXNzYWdlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFthbGxvd0ZyZWVFbnRyaWVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRmlsdGVyIGJ5IHNvZnR3YXJlIHR5cGXigKYnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJTZWxlY3Rpb25PcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAob25TZWxlY3RTb2Z0d2FyZSk9XCJzb2Z0d2FyZVR5cGVGaWx0ZXIkLm5leHQoJGV2ZW50Py5zb2Z0d2FyZVR5cGUpXCJcbiAgICAgICAgICA+PC9jOHktc29mdHdhcmUtdHlwZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpZWxkc2V0PlxuXG4gICAgPGZpZWxkc2V0XG4gICAgICBpZD1cInNvZnR3YXJlLWxpc3RcIlxuICAgICAgY2xhc3M9XCJmbGV4LWdyb3cgaW5uZXItc2Nyb2xsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkZXZpY2VTb2Z0d2FyZUNoYW5nZXNJblByb2dyZXNzXCJcbiAgICA+XG4gICAgICA8IS0tIE5PVCBFTVBUWSBTVEFURSAtLT5cbiAgICAgIDxjOHktZGV2aWNlLXNvZnR3YXJlLWxpc3RcbiAgICAgICAgW2RldmljZV09XCJkZXZpY2VcIlxuICAgICAgICBbZmlsdGVyQ3JpdGVyaWEkXT1cImZpbHRlckNyaXRlcmlhJFwiXG4gICAgICAgIFtzb2Z0d2FyZUxpc3RdPVwic29mdHdhcmVMaXN0XCJcbiAgICAgICAgW2RldmljZVNvZnR3YXJlQ2hhbmdlc109XCJkZXZpY2VTb2Z0d2FyZUNoYW5nZXNcIlxuICAgICAgICAodXBkYXRlKT1cInVwZGF0ZVNvZnR3YXJlKCRldmVudClcIlxuICAgICAgICAocmVtb3ZlKT1cInJlbW92ZVNvZnR3YXJlKCRldmVudClcIlxuICAgICAgICAob25MaXN0RW1wdHkpPVwic2hvd0ZpbHRlciA9ICEkZXZlbnRcIlxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC1sLTE2IHAtci0xNlwiXG4gICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEVNUFRZIFNUQVRFIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWVtcHR5LXN0YXRlIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgxIGM4eS1pY29uIGM4eS1pY29uLXRvb2xzIGM4eS1pY29uLWR1b2NvbG9yXCI+PC9kaXY+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8c3Ryb25nIHRyYW5zbGF0ZT5ObyBzb2Z0d2FyZSBpbnN0YWxsZWQuPC9zdHJvbmc+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxzbWFsbCB0cmFuc2xhdGU+Q2xpY2sgYmVsb3cgdG8gaW5zdGFsbCBzb2Z0d2FyZSBpbnRvIHRoaXMgZGV2aWNlLjwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBOTyBTRUFSQ0ggUkVTVUxUUyBTVEFURSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSBjOHktbm8tcmVzdWx0cy1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoMSBjOHktaWNvbiBjOHktaWNvbi10b29scyBjOHktaWNvbi1kdW9jb2xvclwiPjwvZGl2PlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHN0cm9uZyB0cmFuc2xhdGU+Tm8gc29mdHdhcmUgbWF0Y2hlcyB5b3VyIGZpbHRlciBjcml0ZXJpYS48L3N0cm9uZz5cbiAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZT5UcnkgY2hhbmdpbmcgeW91ciBzZWFyY2ggY3JpdGVyaWEuPC9zbWFsbD5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jOHktZGV2aWNlLXNvZnR3YXJlLWxpc3Q+XG4gICAgPC9maWVsZHNldD5cbiAgPC9kaXY+XG4gIDwhLS0gSU5TVEFMTCBTT0ZUV0FSRS0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjYXJkLWZvb3RlciBsYXJnZS1wYWRkaW5nIHNlcGFyYXRvciBzdGlja3ktYm90dG9tIGQtZmxleCBqLWMtYmV0d2VlbiBiZy1sZXZlbC0wXCJcbiAgICBbbmdDbGFzc109XCJ7ICd2aXNpYmxlLXNtIHZpc2libGUteHMnOiAhc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnMgfVwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInN1cHBvcnRzU29mdHdhcmVPcGVyYXRpb25zXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHRpdGxlPVwie3sgJ0luc3RhbGwgc29mdHdhcmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIChjbGljayk9XCJpbnN0YWxsU29mdHdhcmUoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzc1wiXG4gICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgW2FjdGlvbk5hbWVdPVwiUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLkVWRU5UUy5ERVZJQ0VfVEFCXCJcbiAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuU09GVFdBUkUuQ09NUE9ORU5UUy5ERVZJQ0VfU09GVFdBUkVfTElTVCxcbiAgICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuU09GVFdBUkUuQUNUSU9OUy5PUEVOX0lOU1RBTExfU09GVFdBUkVcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgIHt7ICdJbnN0YWxsIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJzaG93U29mdHdhcmVDaGFuZ2VzLmVtaXQoKVwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tY2xlYW4gdGV4dC1wcmltYXJ5IHZpc2libGUtc20gdmlzaWJsZS14c1wiXG4gICAgICBbdGl0bGVdPVwiJ1Nob3cgJnF1b3Q7U29mdHdhcmUgY2hhbmdlcyZxdW90OycgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IFwiU29mdHdhcmUgY2hhbmdlc1wiPC9zcGFuPlxuICAgICAgPGkgYzh5SWNvbj1cImNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjYWxyZWFkeUluc3RhbGxlZFdhcm5pbmcgbGV0LWl0ZW0gbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxuICA8aVxuICAgIGM4eUljb249XCJ3YXJuaW5nXCJcbiAgICBjbGFzcz1cInRleHQtd2FybmluZyBhLXMtY2VudGVyXCJcbiAgICBbdG9vbHRpcF09XCJcbiAgICAgIGFscmVhZHlJbnN0YWxsZWRNZXNzYWdlXG4gICAgICAgIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGl0ZW0uYm9keVswXS52YWx1ZSwgdmVyc2lvbjogb3B0aW9uLmJvZHlbMF0udmFsdWUgfVxuICAgIFwiXG4gID48L2k+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJwLXJlbGF0aXZlIGQtZmxleCBtLWwtYXV0b1wiPlxuICAgIDxpIGNsYXNzPVwiaWNvbi1zcGluXCIgYzh5SWNvbj1cImNpcmNsZS1vLW5vdGNoXCI+PC9pPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc29mdHdhcmVUeXBlPlxuICA8Yzh5LXNvZnR3YXJlLXR5cGVcbiAgICBhZGRpdGlvbmFsRmlsdGVyXG4gICAgW3JlcXVpcmVkXT1cImZhbHNlXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiJ0ZpbHRlciBieSBzb2Z0d2FyZSB0eXBl4oCmJyB8IHRyYW5zbGF0ZVwiXG4gICAgKG9uU2VsZWN0U29mdHdhcmUpPVwic2VhcmNoKHsgc29mdHdhcmVUeXBlOiAkZXZlbnQ/LnNvZnR3YXJlVHlwZSB9KVwiXG4gICAgW2VtaXRSZXN1bHRzT25seV09XCJ0cnVlXCJcbiAgICBbc2hvd0J0bkluTm90Rm91bmRNZXNzYWdlXT1cImZhbHNlXCJcbiAgICBbYWxsb3dGcmVlRW50cmllc109XCJmYWxzZVwiXG4gICAgW3Nob3dDbGVhclNlbGVjdGlvbk9wdGlvbl09XCJ0cnVlXCJcbiAgPjwvYzh5LXNvZnR3YXJlLXR5cGU+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -126,14 +126,14 @@ export class AddSoftwareModalComponent {
126
126
  }
127
127
  }
128
128
  AddSoftwareModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AddSoftwareModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.RepositoryService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Component });
129
- AddSoftwareModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AddSoftwareModalComponent, selector: "c8y-add-software-software-modal", outputs: { saved: "saved" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["softwareForm"], descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate id=\"addSoftwareModalTitle\">Add software</h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"text-medium text-16\" translate>Select or create new software</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addSoftwareModalDescription\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n title=\"{{ 'Add new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-8\"\n >\n {{ 'Add new`software`' | translate }}\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareType\" translate>Software type</label>\n <c8y-software-type\n name=\"softwareType\"\n [(ngModel)]=\"model.softwareType\"\n [disabled]=\"model.selected?.id\"\n ></c8y-software-type>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForSoftwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.ADD_SOFTWARE_MODAL,\n result:\n softwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE_VERSION\n : PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE\n }\"\n >\n {{ 'Add software' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "directive", type: i3.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: i2.SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel"], outputs: ["onSelectSoftware"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
129
+ AddSoftwareModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AddSoftwareModalComponent, selector: "c8y-add-software-software-modal", outputs: { saved: "saved" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["softwareForm"], descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <div class=\"modal-title\" translate id=\"addSoftwareModalTitle\">Add software</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"text-medium text-16\" translate>Select or create new software</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addSoftwareModalDescription\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n title=\"{{ 'Add new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-8\"\n >\n {{ 'Add new`software`' | translate }}\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareType\" translate>Software type</label>\n <c8y-software-type\n name=\"softwareType\"\n [(ngModel)]=\"model.softwareType\"\n [disabled]=\"model.selected?.id\"\n ></c8y-software-type>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForSoftwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.ADD_SOFTWARE_MODAL,\n result:\n softwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE_VERSION\n : PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE\n }\"\n >\n {{ 'Add software' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "directive", type: i3.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: i2.SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel"], outputs: ["onSelectSoftware"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
130
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AddSoftwareModalComponent, decorators: [{
131
131
  type: Component,
132
- args: [{ selector: 'c8y-add-software-software-modal', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate id=\"addSoftwareModalTitle\">Add software</h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"text-medium text-16\" translate>Select or create new software</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addSoftwareModalDescription\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n title=\"{{ 'Add new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-8\"\n >\n {{ 'Add new`software`' | translate }}\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareType\" translate>Software type</label>\n <c8y-software-type\n name=\"softwareType\"\n [(ngModel)]=\"model.softwareType\"\n [disabled]=\"model.selected?.id\"\n ></c8y-software-type>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForSoftwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.ADD_SOFTWARE_MODAL,\n result:\n softwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE_VERSION\n : PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE\n }\"\n >\n {{ 'Add software' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
132
+ args: [{ selector: 'c8y-add-software-software-modal', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <div class=\"modal-title\" translate id=\"addSoftwareModalTitle\">Add software</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"text-medium text-16\" translate>Select or create new software</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addSoftwareModalDescription\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n title=\"{{ 'Add new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-8\"\n >\n {{ 'Add new`software`' | translate }}\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareType\" translate>Software type</label>\n <c8y-software-type\n name=\"softwareType\"\n [(ngModel)]=\"model.softwareType\"\n [disabled]=\"model.selected?.id\"\n ></c8y-software-type>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForSoftwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.ADD_SOFTWARE_MODAL,\n result:\n softwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE_VERSION\n : PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE\n }\"\n >\n {{ 'Add software' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
133
133
  }], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i2.RepositoryService }, { type: i3.AlertService }]; }, propDecorators: { form: [{
134
134
  type: ViewChild,
135
135
  args: ['softwareForm', { static: false }]
136
136
  }], saved: [{
137
137
  type: Output
138
138
  }] } });
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXNvZnR3YXJlLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUvbGlzdC9hZGQtc29mdHdhcmUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS9saXN0L2FkZC1zb2Z0d2FyZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pFLE9BQU8sRUFFTCxrQkFBa0IsRUFFbEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU1wRixNQUFNLE9BQU8seUJBQXlCO0lBNEJwQyxZQUNVLEtBQWlCLEVBQ2pCLGlCQUFvQyxFQUNwQyxLQUFtQjtRQUZuQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQTlCN0IsdUJBQWtCLEdBQUcsa0JB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OztzSEFuSVUseUJBQXlCOzBHQUF6Qix5QkFBeUIsME1DcEJ0QyxvcE1Bd0tBOzJGRHBKYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsaUNBQWlDOzRKQUtHLElBQUk7c0JBQWpELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDbEMsS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCwgUGlja2VkRmlsZXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIE1vZGFsTW9kZWwsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRSxcbiAgUmVwb3NpdG9yeUNhdGVnb3J5LFxuICBSZXBvc2l0b3J5U2VydmljZSxcbiAgUmVwb3NpdG9yeVR5cGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9yZXBvc2l0b3J5L3NoYXJlZCc7XG5pbXBvcnQgeyBhc3NpZ24sIGdldCwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWRkLXNvZnR3YXJlLXNvZnR3YXJlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICdhZGQtc29mdHdhcmUtbW9kYWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFkZFNvZnR3YXJlTW9kYWxDb21wb25lbnQge1xuICBQUk9EVUNUX0VYUEVSSUVOQ0UgPSBQUk9EVUNUX0VYUEVSSUVOQ0U7XG4gIEBWaWV3Q2hpbGQoJ3NvZnR3YXJlRm9ybScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtOiBOZ0Zvcm07XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4oKTtcbiAgb25JbnB1dDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBtb2RlbDogTW9kYWxNb2RlbCA9IHtcbiAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgIHZlcnNpb246IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgIGRldmljZVR5cGU6IHVuZGVmaW5lZCxcbiAgICBzb2Z0d2FyZVR5cGU6IHVuZGVmaW5lZCxcbiAgICBiaW5hcnk6IHtcbiAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgIHVybDogdW5kZWZpbmVkXG4gICAgfVxuICB9O1xuXG4gIHNvZnR3YXJlc1Jlc3VsdDtcbiAgc2F2aW5nID0gZmFsc2U7XG4gIHNvZnR3YXJlUHJlc2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGV4dEZvclNvZnR3YXJlVXJsUG9wb3Zlcjogc3RyaW5nID1cbiAgICBnZXR0ZXh0KGBQYXRoIGZvciBiaW5hcmllcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gZGV2aWNlIGFnZW50IGltcGxlbWVudGF0aW9uLCBmb3IgZXhhbXBsZTpcbiAgICAvc29mdHdhcmUvYmluYXJpZXMvc29mdHdhcmUxLmJpblxuICAgIGh0dHBzOi8vc29mdHdhcmUvYmluYXJ5LzEyM1xuICAgIGZ0cDovL3NvZnR3YXJlL2JpbmFyeS8xMjMudGFyLmd6XG4gIGApO1xuICBwcml2YXRlIGlucHV0U3Vic2NyaXB0aW9uJDogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWw6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5U2VydmljZTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgIHRoaXMubG9hZFNvZnR3YXJlcygpO1xuICB9XG5cbiAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNvZnR3YXJlUHJlc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRTb2Z0d2FyZXMoKSB7XG4gICAgdGhpcy5pbnB1dFN1YnNjcmlwdGlvbiQgPSB0aGlzLm9uSW5wdXRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5zb2Z0d2FyZVByZXNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLmZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHN3aXRjaE1hcChzZWFyY2hTdHIgPT4gdGhpcy5nZXRTb2Z0d2FyZVJlc3VsdChzZWFyY2hTdHIpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICB0aGlzLnNvZnR3YXJlc1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0U29mdHdhcmVSZXN1bHQoc2VhcmNoU3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMucmVwb3NpdG9yeVNlcnZpY2UubGlzdFJlcG9zaXRvcnlFbnRyaWVzKFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFLCB7XG4gICAgICAgIHBhcnRpYWxOYW1lOiBzZWFyY2hTdHIsXG4gICAgICAgIHNraXBMZWdhY3k6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVwb3NpdG9yeVNlcnZpY2VcbiAgICAgIC5jcmVhdGUodGhpcy5tb2RlbCwgUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUpXG4gICAgICAudGhlbihzYXZlZFNvZnR3YXJlID0+IHtcbiAgICAgICAgdGhpcy5zdWNjZXNzTXNnKCk7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZWQubmV4dChzYXZlZFNvZnR3YXJlKTtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZWQuZXJyb3IoZSk7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHN1Y2Nlc3NNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnU29mdHdhcmUgYWRkZWQuJyk7XG4gICAgdGhpcy5hbGVydC5zdWNjZXNzKG1zZyk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgdGhpcy5zYXZlZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pbnB1dFN1YnNjcmlwdGlvbiQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uRmlsZShkcm9wcGVkOiBQaWNrZWRGaWxlcykge1xuICAgIGlmICghaXNVbmRlZmluZWQoZHJvcHBlZC51cmwpKSB7XG4gICAgICB0aGlzLm1vZGVsLmJpbmFyeSA9IHtcbiAgICAgICAgdXJsOiBkcm9wcGVkLnVybFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRyb3BwZWQuZHJvcHBlZEZpbGVzKSB7XG4gICAgICB0aGlzLm1vZGVsLmJpbmFyeSA9IHtcbiAgICAgICAgZmlsZTogZHJvcHBlZC5kcm9wcGVkRmlsZXNbMF0uZmlsZVxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RlbC5iaW5hcnkgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgb25Tb2Z0d2FyZVNlbGVjdChzb2Z0d2FyZTogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBhc3NpZ24odGhpcy5tb2RlbCwge1xuICAgICAgc2VsZWN0ZWQ6IHNvZnR3YXJlLFxuICAgICAgZGVzY3JpcHRpb246IHNvZnR3YXJlLmRlc2NyaXB0aW9uLFxuICAgICAgZGV2aWNlVHlwZTogZ2V0KHNvZnR3YXJlLCAnYzh5X0ZpbHRlci50eXBlJyksXG4gICAgICBzb2Z0d2FyZVR5cGU6IHNvZnR3YXJlXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3cG9ydC1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXJcIj5cbiAgICA8aSBbYzh5SWNvbl09XCInYzh5LXRvb2xzJ1wiPjwvaT5cbiAgICA8aDQgdHJhbnNsYXRlIGlkPVwiYWRkU29mdHdhcmVNb2RhbFRpdGxlXCI+QWRkIHNvZnR3YXJlPC9oND5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b21cIiAqbmdJZj1cIiFzb2Z0d2FyZVByZXNlbGVjdGVkXCI+XG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LTE2XCIgdHJhbnNsYXRlPlNlbGVjdCBvciBjcmVhdGUgbmV3IHNvZnR3YXJlPC9wPlxuICA8L2Rpdj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgI3NvZnR3YXJlRm9ybT1cIm5nRm9ybVwiXG4gICAgKG5nU3VibWl0KT1cInNvZnR3YXJlRm9ybS5mb3JtLnZhbGlkICYmIHNhdmUoKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGlkPVwiYWRkU29mdHdhcmVNb2RhbERlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgW2hpZGRlbl09XCJzb2Z0d2FyZVByZXNlbGVjdGVkXCI+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNvZnR3YXJlTmFtZVwiIHRyYW5zbGF0ZT5Tb2Z0d2FyZTwvbGFiZWw+XG4gICAgICAgICAgICA8Yzh5LXR5cGVhaGVhZFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgbmFtZT1cInNvZnR3YXJlTmFtZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlbGVjdCBvciBlbnRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25JbnB1dC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICAgICAgICBsZXQgc29mdHdhcmUgb2Ygc29mdHdhcmVzUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJztcbiAgICAgICAgICAgICAgICAgIG5vdEZvdW5kOiBub3RGb3VuZFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtbC04IHAtci04IGM4eS1saXN0X19pdGVtLS1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Tb2Z0d2FyZVNlbGVjdChzb2Z0d2FyZSlcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwibW9kZWwuc2VsZWN0ZWQgPT09IHNvZnR3YXJlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICBbdGV4dF09XCJzb2Z0d2FyZS5uYW1lIHx8ICctLSdcIlxuICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwib25JbnB1dCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICA+PC9jOHktaGlnaGxpZ2h0PlxuICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxjOHktbGkgY2xhc3M9XCJiZy1sZXZlbC0yIHAtOFwiICpuZ0lmPVwiKG9uSW5wdXQgfCBhc3luYyk/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ObyBtYXRjaCBmb3VuZC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBuZXdgc29mdHdhcmVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4teHMgbS1sLThcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQWRkIG5ld2Bzb2Z0d2FyZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvYzh5LXR5cGVhaGVhZD5cbiAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNvZnR3YXJlRGVzY3JpcHRpb25cIiB0cmFuc2xhdGU+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwic29mdHdhcmVEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gQ2xvdWQgY29ubmVjdGl2aXR5IHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbC5zZWxlY3RlZD8uaWRcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgZm9yPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCI+XG4gICAgICAgICAgICAgIHt7ICdEZXZpY2UgdHlwZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdJZiB0aGUgZmlsdGVyIGlzIHNldCwgdGhlIHNvZnR3YXJlIHdpbGwgc2hvdyB1cCBmb3IgaW5zdGFsbGF0aW9uIG9ubHkgZm9yIGRldmljZXMgb2YgdGhhdCB0eXBlLiBJZiBubyBmaWx0ZXIgaXMgc2V0LCBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIGRldmljZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiJ3F1ZXN0aW9uLWNpcmNsZS1vJ1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBuYW1lPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXZpY2VUeXBlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gYzh5X0xpbnV4XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsLnNlbGVjdGVkPy5pZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic29mdHdhcmVUeXBlXCIgdHJhbnNsYXRlPlNvZnR3YXJlIHR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPGM4eS1zb2Z0d2FyZS10eXBlXG4gICAgICAgICAgICAgIG5hbWU9XCJzb2Z0d2FyZVR5cGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnNvZnR3YXJlVHlwZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbC5zZWxlY3RlZD8uaWRcIlxuICAgICAgICAgICAgPjwvYzh5LXNvZnR3YXJlLXR5cGU+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzb2Z0d2FyZVZlcnNpb25cIiB0cmFuc2xhdGU+VmVyc2lvbjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInNvZnR3YXJlVmVyc2lvblwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbmFtZT1cInZlcnNpb25cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC52ZXJzaW9uXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IDEuMC4wXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2sgbS10LTQwXCIgdHJhbnNsYXRlPlNvZnR3YXJlIGZpbGU8L2Rpdj5cbiAgICAgICAgICA8Yzh5LWZpbGUtcGlja2VyXG4gICAgICAgICAgICBbbWF4QWxsb3dlZEZpbGVzXT1cIjFcIlxuICAgICAgICAgICAgKG9uRmlsZXNQaWNrZWQpPVwib25GaWxlKCRldmVudClcIlxuICAgICAgICAgICAgW2ZpbGVVcmxQb3BvdmVyXT1cInRleHRGb3JTb2Z0d2FyZVVybFBvcG92ZXJcIlxuICAgICAgICAgID48L2M4eS1maWxlLXBpY2tlcj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzYXZpbmdcIlxuICAgICAgPlxuICAgICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogc2F2aW5nIH1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIXNvZnR3YXJlRm9ybS5mb3JtLnZhbGlkIHx8XG4gICAgICAgICAgc29mdHdhcmVGb3JtLmZvcm0ucHJpc3RpbmUgfHxcbiAgICAgICAgICBzYXZpbmcgfHxcbiAgICAgICAgICAoIW1vZGVsLmJpbmFyeT8udXJsICYmICFtb2RlbC5iaW5hcnk/LmZpbGUpXG4gICAgICAgIFwiXG4gICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5FVkVOVFMuUkVQT1NJVE9SWVwiXG4gICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5DT01QT05FTlRTLkFERF9TT0ZUV0FSRV9NT0RBTCxcbiAgICAgICAgICByZXN1bHQ6XG4gICAgICAgICAgICBzb2Z0d2FyZVByZXNlbGVjdGVkIHx8IG1vZGVsLnNlbGVjdGVkPy5pZFxuICAgICAgICAgICAgICA/IFBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5SRVNVTFRTLkFERF9TT0ZUV0FSRV9WRVJTSU9OXG4gICAgICAgICAgICAgIDogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLlJFU1VMVFMuQUREX1NPRlRXQVJFXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICB7eyAnQWRkIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXNvZnR3YXJlLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUvbGlzdC9hZGQtc29mdHdhcmUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS9saXN0L2FkZC1zb2Z0d2FyZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pFLE9BQU8sRUFFTCxrQkFBa0IsRUFFbEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU1wRixNQUFNLE9BQU8seUJBQXlCO0lBNEJwQyxZQUNVLEtBQWlCLEVBQ2pCLGlCQUFvQyxFQUNwQyxLQUFtQjtRQUZuQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQTlCN0IsdUJBQWtCLEdBQUcsa0JB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OztzSEFuSVUseUJBQXlCOzBHQUF6Qix5QkFBeUIsME1DcEJ0Qyw0cU1Bd0tBOzJGRHBKYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsaUNBQWlDOzRKQUtHLElBQUk7c0JBQWpELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDbEMsS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCwgUGlja2VkRmlsZXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIE1vZGFsTW9kZWwsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRSxcbiAgUmVwb3NpdG9yeUNhdGVnb3J5LFxuICBSZXBvc2l0b3J5U2VydmljZSxcbiAgUmVwb3NpdG9yeVR5cGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9yZXBvc2l0b3J5L3NoYXJlZCc7XG5pbXBvcnQgeyBhc3NpZ24sIGdldCwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWRkLXNvZnR3YXJlLXNvZnR3YXJlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICdhZGQtc29mdHdhcmUtbW9kYWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFkZFNvZnR3YXJlTW9kYWxDb21wb25lbnQge1xuICBQUk9EVUNUX0VYUEVSSUVOQ0UgPSBQUk9EVUNUX0VYUEVSSUVOQ0U7XG4gIEBWaWV3Q2hpbGQoJ3NvZnR3YXJlRm9ybScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtOiBOZ0Zvcm07XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4oKTtcbiAgb25JbnB1dDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBtb2RlbDogTW9kYWxNb2RlbCA9IHtcbiAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgIHZlcnNpb246IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgIGRldmljZVR5cGU6IHVuZGVmaW5lZCxcbiAgICBzb2Z0d2FyZVR5cGU6IHVuZGVmaW5lZCxcbiAgICBiaW5hcnk6IHtcbiAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgIHVybDogdW5kZWZpbmVkXG4gICAgfVxuICB9O1xuXG4gIHNvZnR3YXJlc1Jlc3VsdDtcbiAgc2F2aW5nID0gZmFsc2U7XG4gIHNvZnR3YXJlUHJlc2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGV4dEZvclNvZnR3YXJlVXJsUG9wb3Zlcjogc3RyaW5nID1cbiAgICBnZXR0ZXh0KGBQYXRoIGZvciBiaW5hcmllcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gZGV2aWNlIGFnZW50IGltcGxlbWVudGF0aW9uLCBmb3IgZXhhbXBsZTpcbiAgICAvc29mdHdhcmUvYmluYXJpZXMvc29mdHdhcmUxLmJpblxuICAgIGh0dHBzOi8vc29mdHdhcmUvYmluYXJ5LzEyM1xuICAgIGZ0cDovL3NvZnR3YXJlL2JpbmFyeS8xMjMudGFyLmd6XG4gIGApO1xuICBwcml2YXRlIGlucHV0U3Vic2NyaXB0aW9uJDogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWw6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5U2VydmljZTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgIHRoaXMubG9hZFNvZnR3YXJlcygpO1xuICB9XG5cbiAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNvZnR3YXJlUHJlc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRTb2Z0d2FyZXMoKSB7XG4gICAgdGhpcy5pbnB1dFN1YnNjcmlwdGlvbiQgPSB0aGlzLm9uSW5wdXRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5zb2Z0d2FyZVByZXNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLmZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHN3aXRjaE1hcChzZWFyY2hTdHIgPT4gdGhpcy5nZXRTb2Z0d2FyZVJlc3VsdChzZWFyY2hTdHIpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICB0aGlzLnNvZnR3YXJlc1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0U29mdHdhcmVSZXN1bHQoc2VhcmNoU3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMucmVwb3NpdG9yeVNlcnZpY2UubGlzdFJlcG9zaXRvcnlFbnRyaWVzKFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFLCB7XG4gICAgICAgIHBhcnRpYWxOYW1lOiBzZWFyY2hTdHIsXG4gICAgICAgIHNraXBMZWdhY3k6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVwb3NpdG9yeVNlcnZpY2VcbiAgICAgIC5jcmVhdGUodGhpcy5tb2RlbCwgUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUpXG4gICAgICAudGhlbihzYXZlZFNvZnR3YXJlID0+IHtcbiAgICAgICAgdGhpcy5zdWNjZXNzTXNnKCk7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZWQubmV4dChzYXZlZFNvZnR3YXJlKTtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZWQuZXJyb3IoZSk7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHN1Y2Nlc3NNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnU29mdHdhcmUgYWRkZWQuJyk7XG4gICAgdGhpcy5hbGVydC5zdWNjZXNzKG1zZyk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgdGhpcy5zYXZlZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pbnB1dFN1YnNjcmlwdGlvbiQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uRmlsZShkcm9wcGVkOiBQaWNrZWRGaWxlcykge1xuICAgIGlmICghaXNVbmRlZmluZWQoZHJvcHBlZC51cmwpKSB7XG4gICAgICB0aGlzLm1vZGVsLmJpbmFyeSA9IHtcbiAgICAgICAgdXJsOiBkcm9wcGVkLnVybFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRyb3BwZWQuZHJvcHBlZEZpbGVzKSB7XG4gICAgICB0aGlzLm1vZGVsLmJpbmFyeSA9IHtcbiAgICAgICAgZmlsZTogZHJvcHBlZC5kcm9wcGVkRmlsZXNbMF0uZmlsZVxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RlbC5iaW5hcnkgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgb25Tb2Z0d2FyZVNlbGVjdChzb2Z0d2FyZTogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBhc3NpZ24odGhpcy5tb2RlbCwge1xuICAgICAgc2VsZWN0ZWQ6IHNvZnR3YXJlLFxuICAgICAgZGVzY3JpcHRpb246IHNvZnR3YXJlLmRlc2NyaXB0aW9uLFxuICAgICAgZGV2aWNlVHlwZTogZ2V0KHNvZnR3YXJlLCAnYzh5X0ZpbHRlci50eXBlJyksXG4gICAgICBzb2Z0d2FyZVR5cGU6IHNvZnR3YXJlXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3cG9ydC1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXJcIj5cbiAgICA8aSBbYzh5SWNvbl09XCInYzh5LXRvb2xzJ1wiPjwvaT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtdGl0bGVcIiB0cmFuc2xhdGUgaWQ9XCJhZGRTb2Z0d2FyZU1vZGFsVGl0bGVcIj5BZGQgc29mdHdhcmU8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b21cIiAqbmdJZj1cIiFzb2Z0d2FyZVByZXNlbGVjdGVkXCI+XG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LTE2XCIgdHJhbnNsYXRlPlNlbGVjdCBvciBjcmVhdGUgbmV3IHNvZnR3YXJlPC9wPlxuICA8L2Rpdj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgI3NvZnR3YXJlRm9ybT1cIm5nRm9ybVwiXG4gICAgKG5nU3VibWl0KT1cInNvZnR3YXJlRm9ybS5mb3JtLnZhbGlkICYmIHNhdmUoKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGlkPVwiYWRkU29mdHdhcmVNb2RhbERlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgW2hpZGRlbl09XCJzb2Z0d2FyZVByZXNlbGVjdGVkXCI+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNvZnR3YXJlTmFtZVwiIHRyYW5zbGF0ZT5Tb2Z0d2FyZTwvbGFiZWw+XG4gICAgICAgICAgICA8Yzh5LXR5cGVhaGVhZFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgbmFtZT1cInNvZnR3YXJlTmFtZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlbGVjdCBvciBlbnRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25JbnB1dC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICAgICAgICBsZXQgc29mdHdhcmUgb2Ygc29mdHdhcmVzUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJztcbiAgICAgICAgICAgICAgICAgIG5vdEZvdW5kOiBub3RGb3VuZFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtbC04IHAtci04IGM4eS1saXN0X19pdGVtLS1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Tb2Z0d2FyZVNlbGVjdChzb2Z0d2FyZSlcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwibW9kZWwuc2VsZWN0ZWQgPT09IHNvZnR3YXJlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICBbdGV4dF09XCJzb2Z0d2FyZS5uYW1lIHx8ICctLSdcIlxuICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwib25JbnB1dCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICA+PC9jOHktaGlnaGxpZ2h0PlxuICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxjOHktbGkgY2xhc3M9XCJiZy1sZXZlbC0yIHAtOFwiICpuZ0lmPVwiKG9uSW5wdXQgfCBhc3luYyk/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ObyBtYXRjaCBmb3VuZC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBuZXdgc29mdHdhcmVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4teHMgbS1sLThcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQWRkIG5ld2Bzb2Z0d2FyZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvYzh5LXR5cGVhaGVhZD5cbiAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNvZnR3YXJlRGVzY3JpcHRpb25cIiB0cmFuc2xhdGU+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwic29mdHdhcmVEZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gQ2xvdWQgY29ubmVjdGl2aXR5IHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbC5zZWxlY3RlZD8uaWRcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgZm9yPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCI+XG4gICAgICAgICAgICAgIHt7ICdEZXZpY2UgdHlwZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdJZiB0aGUgZmlsdGVyIGlzIHNldCwgdGhlIHNvZnR3YXJlIHdpbGwgc2hvdyB1cCBmb3IgaW5zdGFsbGF0aW9uIG9ubHkgZm9yIGRldmljZXMgb2YgdGhhdCB0eXBlLiBJZiBubyBmaWx0ZXIgaXMgc2V0LCBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIGRldmljZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiJ3F1ZXN0aW9uLWNpcmNsZS1vJ1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBuYW1lPVwic29mdHdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXZpY2VUeXBlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gYzh5X0xpbnV4XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsLnNlbGVjdGVkPy5pZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic29mdHdhcmVUeXBlXCIgdHJhbnNsYXRlPlNvZnR3YXJlIHR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPGM4eS1zb2Z0d2FyZS10eXBlXG4gICAgICAgICAgICAgIG5hbWU9XCJzb2Z0d2FyZVR5cGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnNvZnR3YXJlVHlwZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbC5zZWxlY3RlZD8uaWRcIlxuICAgICAgICAgICAgPjwvYzh5LXNvZnR3YXJlLXR5cGU+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzb2Z0d2FyZVZlcnNpb25cIiB0cmFuc2xhdGU+VmVyc2lvbjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInNvZnR3YXJlVmVyc2lvblwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbmFtZT1cInZlcnNpb25cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC52ZXJzaW9uXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IDEuMC4wXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2sgbS10LTQwXCIgdHJhbnNsYXRlPlNvZnR3YXJlIGZpbGU8L2Rpdj5cbiAgICAgICAgICA8Yzh5LWZpbGUtcGlja2VyXG4gICAgICAgICAgICBbbWF4QWxsb3dlZEZpbGVzXT1cIjFcIlxuICAgICAgICAgICAgKG9uRmlsZXNQaWNrZWQpPVwib25GaWxlKCRldmVudClcIlxuICAgICAgICAgICAgW2ZpbGVVcmxQb3BvdmVyXT1cInRleHRGb3JTb2Z0d2FyZVVybFBvcG92ZXJcIlxuICAgICAgICAgID48L2M4eS1maWxlLXBpY2tlcj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzYXZpbmdcIlxuICAgICAgPlxuICAgICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogc2F2aW5nIH1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIXNvZnR3YXJlRm9ybS5mb3JtLnZhbGlkIHx8XG4gICAgICAgICAgc29mdHdhcmVGb3JtLmZvcm0ucHJpc3RpbmUgfHxcbiAgICAgICAgICBzYXZpbmcgfHxcbiAgICAgICAgICAoIW1vZGVsLmJpbmFyeT8udXJsICYmICFtb2RlbC5iaW5hcnk/LmZpbGUpXG4gICAgICAgIFwiXG4gICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5FVkVOVFMuUkVQT1NJVE9SWVwiXG4gICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5DT01QT05FTlRTLkFERF9TT0ZUV0FSRV9NT0RBTCxcbiAgICAgICAgICByZXN1bHQ6XG4gICAgICAgICAgICBzb2Z0d2FyZVByZXNlbGVjdGVkIHx8IG1vZGVsLnNlbGVjdGVkPy5pZFxuICAgICAgICAgICAgICA/IFBST0RVQ1RfRVhQRVJJRU5DRS5TT0ZUV0FSRS5SRVNVTFRTLkFERF9TT0ZUV0FSRV9WRVJTSU9OXG4gICAgICAgICAgICAgIDogUFJPRFVDVF9FWFBFUklFTkNFLlNPRlRXQVJFLlJFU1VMVFMuQUREX1NPRlRXQVJFXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICB7eyAnQWRkIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19