UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

29 lines 29.8 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@angular/common"; import * as i3 from "ngx-bootstrap/popover"; export class OperationListItemDetailsComponent { constructor() { this.showFailedOperation = new EventEmitter(); } scrollToRetriedFromOperation(failedOperationId) { this.showFailedOperation.emit(failedOperationId); } openBulkOperationDetails(bulkOperationId) { this.bulkOperationModalDetailsService.openDetails(bulkOperationId); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OperationListItemDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: OperationListItemDetailsComponent, selector: "c8y-operation-li-details", inputs: { operation: "operation", bulkOperationModalDetailsService: "bulkOperationModalDetailsService" }, outputs: { showFailedOperation: "showFailedOperation" }, ngImport: i0, template: "<div class=\"row d-flex-md fit-h\">\n <div class=\"col-md-4 m-b-auto\">\n <div\n class=\"legend form-block\"\n translate\n >\n Details\n </div>\n <ul class=\"list-unstyled small\">\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.startDate\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Start date\n </label>\n <span class=\"m-l-auto\">{{ operation.startDate | c8yDate }}</span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.bulkOperationId\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Bulk operation\n </label>\n <div class=\"m-l-auto text-right text-truncate\">\n <a\n class=\"interact\"\n (click)=\"openBulkOperationDetails(operation.bulkOperationId)\"\n >\n {{ 'See details' | translate }}\n </a>\n </div>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.creationRamp\"\n >\n <label class=\"small m-0\">\n {{ 'Delay' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Delay before sending the operation to the next device.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n <span\n class=\"m-l-auto\"\n [ngPlural]=\"operation.creationRamp\"\n >\n <ng-template ngPluralCase=\"=1\">\n {{ operation.creationRamp }}\n <span translate>second</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n {{ operation.creationRamp }}\n <span translate>seconds</span>\n </ng-template>\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom\">\n <label\n class=\"small m-0\"\n translate\n >\n Status\n </label>\n <span class=\"m-l-auto text-uppercase\">\n @if (operation.operationPrototype) {\n {{ operation.generalStatus.toString() | translate }}\n } @else if (operation.status) {\n {{ operation.status?.toString() | translate }}\n }\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.failureReason\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Failure reason\n </label>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.failureReason | translate }}\"\n >\n {{ operation.failureReason | translate }}\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.result || operation.progress\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Result\n </label>\n <div\n class=\"d-flex flex-grow m-l-auto j-c-end\"\n *ngIf=\"operation.progress; else singleOpResult\"\n >\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.successful > 0\"\n >\n <i\n class=\"text-success m-r-4\"\n c8yIcon=\"check-circle\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n bulkOperationsCountSuccessful: operation.progress.successful\n }\"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.failed > 0\"\n >\n <i\n class=\"text-danger m-r-4\"\n c8yIcon=\"warning\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountFailed: operation.progress.failed }\"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.executing > 0\"\n >\n <i\n class=\"m-r-4 text-info\"\n c8yIcon=\"refresh\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountExecuting: operation.progress.executing }\"\n >\n {{ bulkOperationsCountExecuting }} executing\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.pending > 0\"\n >\n <i\n class=\"m-r-4 text-info\"\n c8yIcon=\"clock-o\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountPending: operation.progress.pending }\"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </div>\n </div>\n <ng-template #singleOpResult>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.result }}\"\n >\n {{ operation.result }}\n </span>\n </ng-template>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.failedParentId\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Retried from\n </label>\n <span class=\"m-l-auto\">\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Scroll to parent operation.' | translate }}\"\n type=\"button\"\n (click)=\"scrollToRetriedFromOperation(operation.failedParentId)\"\n >\n {{ operation.failedParentId }}\n </button>\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.note || operation.description\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Description\n </label>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.note ? operation.note : (operation.description | translate) }}\"\n >\n {{ operation.note ? operation.note : (operation.description | translate) }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-8 fit-h d-flex d-col\">\n <div\n class=\"legend form-block\"\n translate\n >\n Operation\n </div>\n <pre class=\"inner-scroll p-8 m-b-0 text-pre-normal\">\n <code>{{ operation.operationPrototype || operation | json }}</code>\n </pre>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i2.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "directive", type: i3.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OperationListItemDetailsComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-operation-li-details', template: "<div class=\"row d-flex-md fit-h\">\n <div class=\"col-md-4 m-b-auto\">\n <div\n class=\"legend form-block\"\n translate\n >\n Details\n </div>\n <ul class=\"list-unstyled small\">\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.startDate\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Start date\n </label>\n <span class=\"m-l-auto\">{{ operation.startDate | c8yDate }}</span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.bulkOperationId\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Bulk operation\n </label>\n <div class=\"m-l-auto text-right text-truncate\">\n <a\n class=\"interact\"\n (click)=\"openBulkOperationDetails(operation.bulkOperationId)\"\n >\n {{ 'See details' | translate }}\n </a>\n </div>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.creationRamp\"\n >\n <label class=\"small m-0\">\n {{ 'Delay' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Delay before sending the operation to the next device.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n <span\n class=\"m-l-auto\"\n [ngPlural]=\"operation.creationRamp\"\n >\n <ng-template ngPluralCase=\"=1\">\n {{ operation.creationRamp }}\n <span translate>second</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n {{ operation.creationRamp }}\n <span translate>seconds</span>\n </ng-template>\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom\">\n <label\n class=\"small m-0\"\n translate\n >\n Status\n </label>\n <span class=\"m-l-auto text-uppercase\">\n @if (operation.operationPrototype) {\n {{ operation.generalStatus.toString() | translate }}\n } @else if (operation.status) {\n {{ operation.status?.toString() | translate }}\n }\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.failureReason\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Failure reason\n </label>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.failureReason | translate }}\"\n >\n {{ operation.failureReason | translate }}\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.result || operation.progress\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Result\n </label>\n <div\n class=\"d-flex flex-grow m-l-auto j-c-end\"\n *ngIf=\"operation.progress; else singleOpResult\"\n >\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.successful > 0\"\n >\n <i\n class=\"text-success m-r-4\"\n c8yIcon=\"check-circle\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n bulkOperationsCountSuccessful: operation.progress.successful\n }\"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.failed > 0\"\n >\n <i\n class=\"text-danger m-r-4\"\n c8yIcon=\"warning\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountFailed: operation.progress.failed }\"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.executing > 0\"\n >\n <i\n class=\"m-r-4 text-info\"\n c8yIcon=\"refresh\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountExecuting: operation.progress.executing }\"\n >\n {{ bulkOperationsCountExecuting }} executing\n </span>\n </div>\n <div\n class=\"icon-flex m-l-auto m-r-8\"\n *ngIf=\"operation.progress.pending > 0\"\n >\n <i\n class=\"m-r-4 text-info\"\n c8yIcon=\"clock-o\"\n ></i>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ bulkOperationsCountPending: operation.progress.pending }\"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </div>\n </div>\n <ng-template #singleOpResult>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.result }}\"\n >\n {{ operation.result }}\n </span>\n </ng-template>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.failedParentId\"\n >\n <label\n class=\"small m-0\"\n translate\n >\n Retried from\n </label>\n <span class=\"m-l-auto\">\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Scroll to parent operation.' | translate }}\"\n type=\"button\"\n (click)=\"scrollToRetriedFromOperation(operation.failedParentId)\"\n >\n {{ operation.failedParentId }}\n </button>\n </span>\n </li>\n <li\n class=\"p-t-4 p-b-4 d-flex separator-bottom\"\n *ngIf=\"operation.note || operation.description\"\n >\n <label\n class=\"small m-b-auto\"\n translate\n >\n Description\n </label>\n <span\n class=\"inner-scroll p-l-16 m-b-0 m-l-auto text-truncate-wrap\"\n title=\"{{ operation.note ? operation.note : (operation.description | translate) }}\"\n >\n {{ operation.note ? operation.note : (operation.description | translate) }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-8 fit-h d-flex d-col\">\n <div\n class=\"legend form-block\"\n translate\n >\n Operation\n </div>\n <pre class=\"inner-scroll p-8 m-b-0 text-pre-normal\">\n <code>{{ operation.operationPrototype || operation | json }}</code>\n </pre>\n </div>\n</div>\n" }] }], propDecorators: { operation: [{ type: Input }], bulkOperationModalDetailsService: [{ type: Input }], showFailedOperation: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25zLWxpc3QtaXRlbS1kZXRhaWxzL29wZXJhdGlvbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL29wZXJhdGlvbnMvb3BlcmF0aW9ucy1saXN0LWl0ZW0tZGV0YWlscy9vcGVyYXRpb24tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2RSxNQUFNLE9BQU8saUNBQWlDO0lBSjlDO1FBZVksd0JBQW1CLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7S0FTMUU7SUFQQyw0QkFBNEIsQ0FBQyxpQkFBaUI7UUFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxlQUFlO1FBQ3RDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDckUsQ0FBQzsrR0FuQlUsaUNBQWlDO21HQUFqQyxpQ0FBaUMsbU9DUjlDLDh3T0FvUEE7OzRGRDVPYSxpQ0FBaUM7a0JBSjdDLFNBQVM7K0JBQ0UsMEJBQTBCOzhCQUtwQyxTQUFTO3NCQURSLEtBQUs7Z0JBU04sZ0NBQWdDO3NCQUQvQixLQUFLO2dCQUVJLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uLCBJT3BlcmF0aW9uQnVsayB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJ1bGtPcGVyYXRpb25Nb2RhbERldGFpbHNTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL2J1bGstb3BlcmF0aW9uLW1vZGFsLWRldGFpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktb3BlcmF0aW9uLWxpLWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vb3BlcmF0aW9uLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbkxpc3RJdGVtRGV0YWlsc0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogKElPcGVyYXRpb24gfCBJT3BlcmF0aW9uQnVsaykgJiB7XG4gICAgYnVsa09wZXJhdGlvbklkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGZhaWx1cmVSZWFzb24/OiBzdHJpbmc7XG4gICAgcmVzdWx0PzogYW55O1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB9O1xuXG4gIEBJbnB1dCgpXG4gIGJ1bGtPcGVyYXRpb25Nb2RhbERldGFpbHNTZXJ2aWNlOiBCdWxrT3BlcmF0aW9uTW9kYWxEZXRhaWxzU2VydmljZTtcbiAgQE91dHB1dCgpIHNob3dGYWlsZWRPcGVyYXRpb246IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNjcm9sbFRvUmV0cmllZEZyb21PcGVyYXRpb24oZmFpbGVkT3BlcmF0aW9uSWQpIHtcbiAgICB0aGlzLnNob3dGYWlsZWRPcGVyYXRpb24uZW1pdChmYWlsZWRPcGVyYXRpb25JZCk7XG4gIH1cblxuICBvcGVuQnVsa09wZXJhdGlvbkRldGFpbHMoYnVsa09wZXJhdGlvbklkKSB7XG4gICAgdGhpcy5idWxrT3BlcmF0aW9uTW9kYWxEZXRhaWxzU2VydmljZS5vcGVuRGV0YWlscyhidWxrT3BlcmF0aW9uSWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93IGQtZmxleC1tZCBmaXQtaFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgbS1iLWF1dG9cIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIERldGFpbHNcbiAgICA8L2Rpdj5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHNtYWxsXCI+XG4gICAgICA8bGlcbiAgICAgICAgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbVwiXG4gICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLnN0YXJ0RGF0ZVwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIGNsYXNzPVwic21hbGwgbS0wXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIFN0YXJ0IGRhdGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0b1wiPnt7IG9wZXJhdGlvbi5zdGFydERhdGUgfCBjOHlEYXRlIH19PC9zcGFuPlxuICAgICAgPC9saT5cbiAgICAgIDxsaVxuICAgICAgICBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tXCJcbiAgICAgICAgKm5nSWY9XCJvcGVyYXRpb24uYnVsa09wZXJhdGlvbklkXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJzbWFsbCBtLWItYXV0b1wiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBCdWxrIG9wZXJhdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG8gdGV4dC1yaWdodCB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5CdWxrT3BlcmF0aW9uRGV0YWlscyhvcGVyYXRpb24uYnVsa09wZXJhdGlvbklkKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ1NlZSBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgICAgPGxpXG4gICAgICAgIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b21cIlxuICAgICAgICAqbmdJZj1cIm9wZXJhdGlvbi5jcmVhdGlvblJhbXBcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLTBcIj5cbiAgICAgICAgICB7eyAnRGVsYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgcG9wb3Zlcj1cInt7ICdEZWxheSBiZWZvcmUgc2VuZGluZyB0aGUgb3BlcmF0aW9uIHRvIHRoZSBuZXh0IGRldmljZS4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJtLWwtYXV0b1wiXG4gICAgICAgICAgW25nUGx1cmFsXT1cIm9wZXJhdGlvbi5jcmVhdGlvblJhbXBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0xXCI+XG4gICAgICAgICAgICB7eyBvcGVyYXRpb24uY3JlYXRpb25SYW1wIH19XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+c2Vjb25kPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+XG4gICAgICAgICAgICB7eyBvcGVyYXRpb24uY3JlYXRpb25SYW1wIH19XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+c2Vjb25kczwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJzbWFsbCBtLTBcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgU3RhdHVzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC11cHBlcmNhc2VcIj5cbiAgICAgICAgICBAaWYgKG9wZXJhdGlvbi5vcGVyYXRpb25Qcm90b3R5cGUpIHtcbiAgICAgICAgICAgIHt7IG9wZXJhdGlvbi5nZW5lcmFsU3RhdHVzLnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICB9IEBlbHNlIGlmIChvcGVyYXRpb24uc3RhdHVzKSB7XG4gICAgICAgICAgICB7eyBvcGVyYXRpb24uc3RhdHVzPy50b1N0cmluZygpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2xpPlxuICAgICAgPGxpXG4gICAgICAgIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b21cIlxuICAgICAgICAqbmdJZj1cIm9wZXJhdGlvbi5mYWlsdXJlUmVhc29uXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJzbWFsbCBtLTBcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgRmFpbHVyZSByZWFzb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImlubmVyLXNjcm9sbCBwLWwtMTYgbS1iLTAgbS1sLWF1dG8gdGV4dC10cnVuY2F0ZS13cmFwXCJcbiAgICAgICAgICB0aXRsZT1cInt7IG9wZXJhdGlvbi5mYWlsdXJlUmVhc29uIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IG9wZXJhdGlvbi5mYWlsdXJlUmVhc29uIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGlcbiAgICAgICAgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbVwiXG4gICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLnJlc3VsdCB8fCBvcGVyYXRpb24ucHJvZ3Jlc3NcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cInNtYWxsIG0tYi1hdXRvXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIFJlc3VsdFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1ncm93IG0tbC1hdXRvIGotYy1lbmRcIlxuICAgICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLnByb2dyZXNzOyBlbHNlIHNpbmdsZU9wUmVzdWx0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1mbGV4IG0tbC1hdXRvIG0tci04XCJcbiAgICAgICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLnByb2dyZXNzLnN1Y2Nlc3NmdWwgPiAwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc3VjY2VzcyBtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJjaGVjay1jaXJjbGVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwie1xuICAgICAgICAgICAgICAgIGJ1bGtPcGVyYXRpb25zQ291bnRTdWNjZXNzZnVsOiBvcGVyYXRpb24ucHJvZ3Jlc3Muc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgYnVsa09wZXJhdGlvbnNDb3VudFN1Y2Nlc3NmdWwgfX0gc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1mbGV4IG0tbC1hdXRvIG0tci04XCJcbiAgICAgICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLnByb2dyZXNzLmZhaWxlZCA+IDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXIgbS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwid2FybmluZ1wiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGJ1bGtPcGVyYXRpb25zQ291bnRGYWlsZWQ6IG9wZXJhdGlvbi5wcm9ncmVzcy5mYWlsZWQgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGJ1bGtPcGVyYXRpb25zQ291bnRGYWlsZWQgfX0gZmFpbGVkXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJpY29uLWZsZXggbS1sLWF1dG8gbS1yLThcIlxuICAgICAgICAgICAgKm5nSWY9XCJvcGVyYXRpb24ucHJvZ3Jlc3MuZXhlY3V0aW5nID4gMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNCB0ZXh0LWluZm9cIlxuICAgICAgICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGJ1bGtPcGVyYXRpb25zQ291bnRFeGVjdXRpbmc6IG9wZXJhdGlvbi5wcm9ncmVzcy5leGVjdXRpbmcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGJ1bGtPcGVyYXRpb25zQ291bnRFeGVjdXRpbmcgfX0gZXhlY3V0aW5nXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJpY29uLWZsZXggbS1sLWF1dG8gbS1yLThcIlxuICAgICAgICAgICAgKm5nSWY9XCJvcGVyYXRpb24ucHJvZ3Jlc3MucGVuZGluZyA+IDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTQgdGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImNsb2NrLW9cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBidWxrT3BlcmF0aW9uc0NvdW50UGVuZGluZzogb3BlcmF0aW9uLnByb2dyZXNzLnBlbmRpbmcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGJ1bGtPcGVyYXRpb25zQ291bnRQZW5kaW5nIH19IHBlbmRpbmdcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlT3BSZXN1bHQ+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwiaW5uZXItc2Nyb2xsIHAtbC0xNiBtLWItMCBtLWwtYXV0byB0ZXh0LXRydW5jYXRlLXdyYXBcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyBvcGVyYXRpb24ucmVzdWx0IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBvcGVyYXRpb24ucmVzdWx0IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9saT5cbiAgICAgIDxsaVxuICAgICAgICBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tXCJcbiAgICAgICAgKm5nSWY9XCJvcGVyYXRpb24uZmFpbGVkUGFyZW50SWRcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cInNtYWxsIG0tMFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBSZXRyaWVkIGZyb21cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14c1wiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdTY3JvbGwgdG8gcGFyZW50IG9wZXJhdGlvbi4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNjcm9sbFRvUmV0cmllZEZyb21PcGVyYXRpb24ob3BlcmF0aW9uLmZhaWxlZFBhcmVudElkKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgb3BlcmF0aW9uLmZhaWxlZFBhcmVudElkIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGlcbiAgICAgICAgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbVwiXG4gICAgICAgICpuZ0lmPVwib3BlcmF0aW9uLm5vdGUgfHwgb3BlcmF0aW9uLmRlc2NyaXB0aW9uXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJzbWFsbCBtLWItYXV0b1wiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiaW5uZXItc2Nyb2xsIHAtbC0xNiBtLWItMCBtLWwtYXV0byB0ZXh0LXRydW5jYXRlLXdyYXBcIlxuICAgICAgICAgIHRpdGxlPVwie3sgb3BlcmF0aW9uLm5vdGUgPyBvcGVyYXRpb24ubm90ZSA6IChvcGVyYXRpb24uZGVzY3JpcHRpb24gfCB0cmFuc2xhdGUpIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IG9wZXJhdGlvbi5ub3RlID8gb3BlcmF0aW9uLm5vdGUgOiAob3BlcmF0aW9uLmRlc2NyaXB0aW9uIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggZml0LWggZC1mbGV4IGQtY29sXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiXG4gICAgICB0cmFuc2xhdGVcbiAgICA+XG4gICAgICBPcGVyYXRpb25cbiAgICA8L2Rpdj5cbiAgICA8cHJlIGNsYXNzPVwiaW5uZXItc2Nyb2xsIHAtOCBtLWItMCB0ZXh0LXByZS1ub3JtYWxcIj5cbiAgICAgIDxjb2RlPnt7IG9wZXJhdGlvbi5vcGVyYXRpb25Qcm90b3R5cGUgfHwgb3BlcmF0aW9uIHwganNvbiB9fTwvY29kZT5cbiAgICA8L3ByZT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==