UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

48 lines 16 kB
import { Component, inject } from '@angular/core'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { CoreModule, gettext } from '@c8y/ngx-components'; import { merge, of } from 'rxjs'; import { map } from 'rxjs/operators'; import { ReportDashboardModule, ReportDashboardService } from '@c8y/ngx-components/report-dashboard'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; export class SendAsWidgetToReportModal { constructor() { this.reports = []; this.result = new Promise((resolve, reject) => { this._resolve = resolve; this._reject = reject; }); this.labels = { cancel: gettext('Cancel'), ok: gettext('Send') }; this.reportDashboardService = inject(ReportDashboardService); } async ngOnInit() { this.reports = (await this.reportDashboardService.listReports({ pageSize: 2000 })).data; if (this.reports.length > 0) { this.form = this.initForm(); } this.numberOfSelectedReports$ = merge(this.form.valueChanges, of(this.form.value)).pipe(map(value => Object.values(value).filter(Boolean).length)); } save() { this._resolve(this.form.value); } cancel() { this._reject(); } initForm() { const controls = this.reports.reduce((acc, report) => ({ ...acc, [report.id]: new FormControl(false) }), {}); return new FormGroup(controls); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendAsWidgetToReportModal, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SendAsWidgetToReportModal, isStandalone: true, selector: "c8y-apply-branding-to-app-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Send as widget to reports' | translate\"\n [disabled]=\"!form || form.invalid\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"labels\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"c8y-reports\"></span>\n </ng-container>\n\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedReports$ | async as numberOfReports; else noSelectedReports\"\n translate\n [translateParams]=\"{ numberOfReports: numberOfReports }\"\n ngNonBindable\n >\n {{ numberOfReports }} reports selected for widget\n </p>\n <ng-template #noSelectedReports>\n <p\n class=\"text-center text-medium\"\n translate\n >\n Select one or more reports to send the Data points graph widget with the current configuration\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let report of reports\">\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + report.id\"\n [formControlName]=\"report.id\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0\">\n <i c8yIcon=\"{{ report.icon }}\"></i>\n </c8y-li-icon>\n <div class=\"text-truncate\" title=\"{{report.name}}\">{{ report.name }}</div>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"reports.length === 0\"\n ></c8y-ui-empty-state>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: i2.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "ngmodule", type: ReportDashboardModule }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendAsWidgetToReportModal, decorators: [{ type: Component, args: [{ selector: 'c8y-apply-branding-to-app-modal', standalone: true, imports: [ReactiveFormsModule, CoreModule, ReportDashboardModule], template: "<c8y-modal\n [title]=\"'Send as widget to reports' | translate\"\n [disabled]=\"!form || form.invalid\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"labels\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"c8y-reports\"></span>\n </ng-container>\n\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedReports$ | async as numberOfReports; else noSelectedReports\"\n translate\n [translateParams]=\"{ numberOfReports: numberOfReports }\"\n ngNonBindable\n >\n {{ numberOfReports }} reports selected for widget\n </p>\n <ng-template #noSelectedReports>\n <p\n class=\"text-center text-medium\"\n translate\n >\n Select one or more reports to send the Data points graph widget with the current configuration\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let report of reports\">\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + report.id\"\n [formControlName]=\"report.id\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0\">\n <i c8yIcon=\"{{ report.icon }}\"></i>\n </c8y-li-icon>\n <div class=\"text-truncate\" title=\"{{report.name}}\">{{ report.name }}</div>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"reports.length === 0\"\n ></c8y-ui-empty-state>\n</c8y-modal>\n" }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hcy13aWRnZXQtdG8tcmVwb3J0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludC1leHBsb3Jlci92aWV3L3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC9zZW5kLWFzLXdpZGdldC10by1yZXBvcnQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50LWV4cGxvcmVyL3ZpZXcvc2VuZC1hcy13aWRnZXQtdG8tcmVwb3J0LW1vZGFsL3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFlLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBUTlDLE1BQU0sT0FBTyx5QkFBeUI7SUFOdEM7UUFPRSxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUcvQixXQUFNLEdBQUcsSUFBSSxPQUFPLENBQTRDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2xGLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsV0FBTSxHQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2pFLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0tBNEJqRTtJQXpCQyxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDTyxRQUFRO1FBQ2QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2xDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixHQUFHLEdBQUc7WUFDTixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDOytHQXBDVSx5QkFBeUI7bUdBQXpCLHlCQUF5QiwyRkNoQnRDLG91REF1REEsMkNEekNZLG1CQUFtQixtbEJBQUUsVUFBVSxpL0NBQUUscUJBQXFCOzs0RkFFckQseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNFLGlDQUFpQyxjQUUvQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVNb2R1bGUsIGdldHRleHQsIE1vZGFsTGFiZWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIFJlcG9ydERhc2hib2FyZE1vZHVsZSxcbiAgUmVwb3J0RGFzaGJvYXJkU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9ydC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXBwbHktYnJhbmRpbmctdG8tYXBwLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbmQtYXMtd2lkZ2V0LXRvLXJlcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb3JlTW9kdWxlLCBSZXBvcnREYXNoYm9hcmRNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFNlbmRBc1dpZGdldFRvUmVwb3J0TW9kYWwge1xuICByZXBvcnRzOiBJTWFuYWdlZE9iamVjdFtdID0gW107XG4gIG51bWJlck9mU2VsZWN0ZWRSZXBvcnRzJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBmb3JtOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmluaXRGb3JtPjtcbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5pbml0Rm9ybT5bJ3ZhbHVlJ10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gIH0pO1xuICBsYWJlbHM6IE1vZGFsTGFiZWxzID0geyBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpLCBvazogZ2V0dGV4dCgnU2VuZCcpIH07XG4gIHByaXZhdGUgcmVwb3J0RGFzaGJvYXJkU2VydmljZSA9IGluamVjdChSZXBvcnREYXNoYm9hcmRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHZhbHVlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmluaXRGb3JtPlsndmFsdWUnXSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlcG9ydHMgPSAoYXdhaXQgdGhpcy5yZXBvcnREYXNoYm9hcmRTZXJ2aWNlLmxpc3RSZXBvcnRzKHsgcGFnZVNpemU6IDIwMDAgfSkpLmRhdGE7XG4gICAgaWYgKHRoaXMucmVwb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0gPSB0aGlzLmluaXRGb3JtKCk7XG4gICAgfVxuICAgIHRoaXMubnVtYmVyT2ZTZWxlY3RlZFJlcG9ydHMkID0gbWVyZ2UodGhpcy5mb3JtLnZhbHVlQ2hhbmdlcywgb2YodGhpcy5mb3JtLnZhbHVlKSkucGlwZShcbiAgICAgIG1hcCh2YWx1ZSA9PiBPYmplY3QudmFsdWVzKHZhbHVlKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoKVxuICAgICk7XG4gIH1cbiAgc2F2ZSgpIHtcbiAgICB0aGlzLl9yZXNvbHZlKHRoaXMuZm9ybS52YWx1ZSk7XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX3JlamVjdCgpO1xuICB9XG4gIHByaXZhdGUgaW5pdEZvcm0oKTogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4ge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5yZXBvcnRzLnJlZHVjZShcbiAgICAgIChhY2MsIHJlcG9ydCkgPT4gKHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbcmVwb3J0LmlkXTogbmV3IEZvcm1Db250cm9sKGZhbHNlKVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMpO1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCInU2VuZCBhcyB3aWRnZXQgdG8gcmVwb3J0cycgfCB0cmFuc2xhdGVcIlxuICBbZGlzYWJsZWRdPVwiIWZvcm0gfHwgZm9ybS5pbnZhbGlkXCJcbiAgW2hlYWRlckNsYXNzZXNdPVwiJ2RpYWxvZy1oZWFkZXInXCJcbiAgKG9uRGlzbWlzcyk9XCJjYW5jZWwoKVwiXG4gIChvbkNsb3NlKT1cInNhdmUoKVwiXG4gIFtsYWJlbHNdPVwibGFiZWxzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciBjOHktbW9kYWwtdGl0bGU+XG4gICAgPHNwYW4gYzh5SWNvbj1cImM4eS1yZXBvcnRzXCI+PC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICBjbGFzcz1cIm0tYi0wIG5vLWJvcmRlci1sYXN0XCJcbiAgICAqbmdJZj1cImZvcm1cIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gID5cbiAgICA8Yzh5LWxpPlxuICAgICAgPHBcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW1lZGl1bVwiXG4gICAgICAgICpuZ0lmPVwibnVtYmVyT2ZTZWxlY3RlZFJlcG9ydHMkIHwgYXN5bmMgYXMgbnVtYmVyT2ZSZXBvcnRzOyBlbHNlIG5vU2VsZWN0ZWRSZXBvcnRzXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBudW1iZXJPZlJlcG9ydHM6IG51bWJlck9mUmVwb3J0cyB9XCJcbiAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgPlxuICAgICAgICB7eyBudW1iZXJPZlJlcG9ydHMgfX0gcmVwb3J0cyBzZWxlY3RlZCBmb3Igd2lkZ2V0XG4gICAgICA8L3A+XG4gICAgICA8bmctdGVtcGxhdGUgI25vU2VsZWN0ZWRSZXBvcnRzPlxuICAgICAgICA8cFxuICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tZWRpdW1cIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgU2VsZWN0IG9uZSBvciBtb3JlIHJlcG9ydHMgdG8gc2VuZCB0aGUgRGF0YSBwb2ludHMgZ3JhcGggd2lkZ2V0IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgICAgICA8L3A+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYzh5LWxpPlxuICAgIDxjOHktbGkgKm5nRm9yPVwibGV0IHJlcG9ydCBvZiByZXBvcnRzXCI+XG4gICAgICA8Yzh5LWxpLWNoZWNrYm94XG4gICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2JyYW5kaW5nLWFwcGx5LWJyYW5kaW5nLXRvLWFwcC1jaGVja2JveC0nICsgcmVwb3J0LmlkXCJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJyZXBvcnQuaWRcIlxuICAgICAgPjwvYzh5LWxpLWNoZWNrYm94PlxuICAgICAgPGM4eS1saS1pY29uIGNsYXNzPVwicC1sLTBcIj5cbiAgICAgICAgPGkgYzh5SWNvbj1cInt7IHJlcG9ydC5pY29uIH19XCI+PC9pPlxuICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7e3JlcG9ydC5uYW1lfX1cIj57eyByZXBvcnQubmFtZSB9fTwvZGl2PlxuICAgIDwvYzh5LWxpPlxuICA8L2M4eS1saXN0LWdyb3VwPlxuXG4gIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICBbaWNvbl09XCInYzh5LXJlcG9ydHMnXCJcbiAgICBbdGl0bGVdPVwiJ1RoZXJlIGFyZSBubyByZXBvcnRzIGRlZmluZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3N1YnRpdGxlXT1cIidBZGQgYSByZXBvcnQgZmlyc3QuJyB8IHRyYW5zbGF0ZVwiXG4gICAgKm5nSWY9XCJyZXBvcnRzLmxlbmd0aCA9PT0gMFwiXG4gID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbjwvYzh5LW1vZGFsPlxuIl19