@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
265 lines • 45.4 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
import { DATA_PIPELINES_CONFIGS, DataJobExecutionStatus, DataJobExecutionType } from '../../../model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@clr/angular";
import * as i3 from "ngx-timeago";
import * as i4 from "@yellowspot/ng-truncate";
import * as i5 from "../../pipes/format-delta.pipe";
function ExecutionsTimelineComponent_li_1_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 21);
i0.ɵɵpipe(1, "date");
} if (rf & 2) {
const execution_r2 = i0.ɵɵnextContext().$implicit;
i0.ɵɵproperty("date", execution_r2.startTime)("live", true);
i0.ɵɵattribute("title", "Started " + i0.ɵɵpipeBind3(1, 3, execution_r2.startTime, "MMM d, y, hh:mm a", "UTC") + " UTC");
} }
function ExecutionsTimelineComponent_li_1_clr_icon_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 22);
} }
function ExecutionsTimelineComponent_li_1_clr_spinner_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-spinner", 23);
i0.ɵɵtext(1, "Executing... ");
i0.ɵɵelementEnd();
} }
function ExecutionsTimelineComponent_li_1_clr_icon_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 24);
} }
function ExecutionsTimelineComponent_li_1_clr_icon_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 25);
} }
function ExecutionsTimelineComponent_li_1_clr_icon_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 26);
} }
function ExecutionsTimelineComponent_li_1_clr_icon_7_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 27);
} }
function ExecutionsTimelineComponent_li_1_clr_icon_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 28);
} }
function ExecutionsTimelineComponent_li_1_clr_icon_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "clr-icon", 29);
} }
function ExecutionsTimelineComponent_li_1_span_16_span_1_Template(rf, ctx) { if (rf & 1) {
const _r20 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵelementStart(2, "button", 30);
i0.ɵɵlistener("click", function ExecutionsTimelineComponent_li_1_span_16_span_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r20); const i_r3 = i0.ɵɵnextContext(2).index; const ctx_r19 = i0.ɵɵnextContext(); return (ctx_r19.showExecutionFullMessage[i_r3] = false); });
i0.ɵɵtext(3, " show less ");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const execution_r2 = i0.ɵɵnextContext(2).$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", execution_r2.message, " ");
} }
function ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template(rf, ctx) { if (rf & 1) {
const _r25 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 30);
i0.ɵɵlistener("click", function ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const i_r3 = i0.ɵɵnextContext(3).index; const ctx_r24 = i0.ɵɵnextContext(); return (ctx_r24.showExecutionFullMessage[i_r3] = true); });
i0.ɵɵtext(1, " show more ");
i0.ɵɵelementEnd();
} }
function ExecutionsTimelineComponent_li_1_span_16_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "words");
i0.ɵɵtemplate(3, ExecutionsTimelineComponent_li_1_span_16_span_2_button_3_Template, 2, 0, "button", 31);
i0.ɵɵelementEnd();
} if (rf & 2) {
const execution_r2 = i0.ɵɵnextContext(2).$implicit;
const ctx_r18 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(2, 2, execution_r2.message, ctx_r18.messageWordsBeforeTruncate), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", (execution_r2.message == null ? null : execution_r2.message.split(" ").length) > ctx_r18.messageWordsBeforeTruncate);
} }
function ExecutionsTimelineComponent_li_1_span_16_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtemplate(1, ExecutionsTimelineComponent_li_1_span_16_span_1_Template, 4, 1, "span", 17);
i0.ɵɵtemplate(2, ExecutionsTimelineComponent_li_1_span_16_span_2_Template, 4, 5, "span", 17);
i0.ɵɵelement(3, "br");
i0.ɵɵelementEnd();
} if (rf & 2) {
const i_r3 = i0.ɵɵnextContext().index;
const ctx_r13 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r13.showExecutionFullMessage[i_r3]);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r13.showExecutionFullMessage[i_r3]);
} }
function ExecutionsTimelineComponent_li_1_div_23_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 16)(1, "a", 32);
i0.ɵɵelement(2, "clr-icon", 33);
i0.ɵɵelementStart(3, "span");
i0.ɵɵtext(4, " Logs");
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const execution_r2 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵattribute("href", execution_r2.logsUrl, i0.ɵɵsanitizeUrl);
} }
function ExecutionsTimelineComponent_li_1_span_24_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 34);
i0.ɵɵtext(1, "Manual");
i0.ɵɵelementEnd();
} if (rf & 2) {
const execution_r2 = i0.ɵɵnextContext().$implicit;
const ctx_r15 = i0.ɵɵnextContext();
i0.ɵɵpropertyInterpolate1("title", "'", ctx_r15.getManualExecutedByTitle(execution_r2), "'");
} }
function ExecutionsTimelineComponent_li_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li", 3);
i0.ɵɵtemplate(1, ExecutionsTimelineComponent_li_1_div_1_Template, 2, 7, "div", 4);
i0.ɵɵtemplate(2, ExecutionsTimelineComponent_li_1_clr_icon_2_Template, 1, 0, "clr-icon", 5);
i0.ɵɵtemplate(3, ExecutionsTimelineComponent_li_1_clr_spinner_3_Template, 2, 0, "clr-spinner", 6);
i0.ɵɵtemplate(4, ExecutionsTimelineComponent_li_1_clr_icon_4_Template, 1, 0, "clr-icon", 7);
i0.ɵɵtemplate(5, ExecutionsTimelineComponent_li_1_clr_icon_5_Template, 1, 0, "clr-icon", 8);
i0.ɵɵtemplate(6, ExecutionsTimelineComponent_li_1_clr_icon_6_Template, 1, 0, "clr-icon", 9);
i0.ɵɵtemplate(7, ExecutionsTimelineComponent_li_1_clr_icon_7_Template, 1, 0, "clr-icon", 10);
i0.ɵɵtemplate(8, ExecutionsTimelineComponent_li_1_clr_icon_8_Template, 1, 0, "clr-icon", 11);
i0.ɵɵtemplate(9, ExecutionsTimelineComponent_li_1_clr_icon_9_Template, 1, 0, "clr-icon", 12);
i0.ɵɵelementStart(10, "div", 13)(11, "span", 14);
i0.ɵɵtext(12);
i0.ɵɵpipe(13, "titlecase");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(14, "div", 15)(15, "div", 16);
i0.ɵɵtemplate(16, ExecutionsTimelineComponent_li_1_span_16_Template, 4, 2, "span", 17);
i0.ɵɵelementStart(17, "span");
i0.ɵɵtext(18, "Duration: ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(19, "span", 18);
i0.ɵɵpipe(20, "date");
i0.ɵɵtext(21);
i0.ɵɵpipe(22, "formatDelta");
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(23, ExecutionsTimelineComponent_li_1_div_23_Template, 5, 1, "div", 19);
i0.ɵɵtemplate(24, ExecutionsTimelineComponent_li_1_span_24_Template, 2, 1, "span", 20);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const execution_r2 = ctx.$implicit;
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵattribute("data-cy", execution_r2.id);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.startTime);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.SUBMITTED);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.RUNNING);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.FINISHED || execution_r2.status === ctx_r0.dataJobExecutionStatus.SUCCEEDED);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.CANCELLED);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.SKIPPED);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.FAILED);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.USER_ERROR);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", execution_r2.status === ctx_r0.dataJobExecutionStatus.PLATFORM_ERROR);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 16, execution_r2.status ? execution_r2.status.replace("_", " ") : execution_r2.status));
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngIf", ctx_r0.showErrorMessage && ctx_r0.isJobStatusSuitableForMessageTooltip(execution_r2) && ctx_r0.isJobMessageDifferentFromStatus(execution_r2));
i0.ɵɵadvance(3);
i0.ɵɵattribute("title", execution_r2.endTime ? "Ended " + i0.ɵɵpipeBind3(20, 18, execution_r2.endTime, "MMM d, y, hh:mm a", "UTC") + " UTC" : "");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(22, 22, execution_r2));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", execution_r2 == null ? null : execution_r2.logsUrl);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.isExecutionManual(execution_r2));
} }
function ExecutionsTimelineComponent_li_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li", 3);
i0.ɵɵelement(1, "div", 35);
i0.ɵɵpipe(2, "date");
i0.ɵɵelement(3, "clr-icon", 36);
i0.ɵɵelementStart(4, "div", 13)(5, "span", 14);
i0.ɵɵtext(6, "Scheduled");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(7, "span", 15);
i0.ɵɵtext(8);
i0.ɵɵpipe(9, "date");
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("date", ctx_r1.next)("live", true);
i0.ɵɵattribute("title", i0.ɵɵpipeBind3(2, 4, ctx_r1.next, "MMM d, y, hh:mm a", "UTC") + " UTC");
i0.ɵɵadvance(7);
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind3(9, 8, ctx_r1.next, "MMM d, y, hh:mm a", "UTC"), " UTC");
} }
export class ExecutionsTimelineComponent {
constructor(dataPipelinesModuleConfig) {
this.dataPipelinesModuleConfig = dataPipelinesModuleConfig;
this.jobExecutions = [];
this.next = null;
this.showErrorMessage = false;
this.messageWordsBeforeTruncate = 50;
this.dataJobExecutionStatus = DataJobExecutionStatus;
}
ngOnInit() {
this.showExecutionFullMessage = new Array(this.jobExecutions.length).fill(false);
}
/**
* ** NgFor elements tracking function.
*/
trackByFn(index, execution) {
return `${index}|${execution.id}`;
}
isExecutionManual(execution) {
return execution?.type === DataJobExecutionType.MANUAL;
}
getManualExecutedByTitle(execution) {
if (!execution || !execution.startedBy || !execution.startedBy.startsWith('manual/')) {
// execution has no info abot user provided
return ExecutionsTimelineComponent.manualRunNoUser;
}
const user = execution.startedBy.replace('manual/', '');
return `${ExecutionsTimelineComponent.manualRunKnownUser} ${user}`;
}
isJobStatusSuitableForMessageTooltip(execution) {
return (execution.status === DataJobExecutionStatus.PLATFORM_ERROR ||
execution.status === DataJobExecutionStatus.USER_ERROR ||
execution.status === DataJobExecutionStatus.SKIPPED);
}
isJobMessageDifferentFromStatus(execution) {
const message = execution.message?.toLowerCase();
return message !== 'user error' && message !== 'platform error' && message !== 'skipped' && message !== '';
}
}
ExecutionsTimelineComponent.manualRunKnownUser = 'This job is triggered manually by user';
ExecutionsTimelineComponent.manualRunNoUser = 'This job is triggered manually, but there is no info about the user';
ExecutionsTimelineComponent.ɵfac = function ExecutionsTimelineComponent_Factory(t) { return new (t || ExecutionsTimelineComponent)(i0.ɵɵdirectiveInject(DATA_PIPELINES_CONFIGS)); };
ExecutionsTimelineComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionsTimelineComponent, selectors: [["lib-executions-timeline"]], inputs: { jobExecutions: "jobExecutions", next: "next", showErrorMessage: "showErrorMessage" }, decls: 4, vars: 6, consts: [[1, "clr-timeline", "clr-timeline-horizontal"], ["class", "clr-timeline-step", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "clr-timeline-step", 4, "ngIf"], [1, "clr-timeline-step"], ["class", "clr-timeline-step-header clr-timeline__step-header--underline-dotted", "data-cy", "data-pipelines-executions-timeline-started", "timeago", "", 3, "date", "live", 4, "ngIf"], ["shape", "hourglass", "aria-label", "Submitted execution", 4, "ngIf"], ["aria-label", "In progress", "clrMedium", "", 4, "ngIf"], ["shape", "success-standard", "aria-label", "Successful execution", 4, "ngIf"], ["shape", "times-circle", "aria-label", "Canceled execution", 4, "ngIf"], ["shape", "circle-arrow", "dir", "right", "aria-label", "Skipped execution", 4, "ngIf"], ["shape", "error-standard", "aria-label", "Failed execution", 4, "ngIf"], ["class", "is-danger", "shape", "error-standard", "aria-label", "User Error", 4, "ngIf"], ["class", "is-warning", "shape", "error-standard", "aria-label", "Platform Error", 4, "ngIf"], [1, "clr-timeline-step-body"], [1, "clr-timeline-step-title"], [1, "clr-timeline-step-description"], [1, "clr-timeline__element--display-block"], [4, "ngIf"], ["data-cy", "data-pipelines-executions-timeline-ended", 1, "clr-timeline__duration-tag"], ["class", "clr-timeline__element--display-block", 4, "ngIf"], ["class", "label manual-execution-label label-info", "data-cy", "data-pipelines-executions-timeline-manual-start", 3, "title", 4, "ngIf"], ["data-cy", "data-pipelines-executions-timeline-started", "timeago", "", 1, "clr-timeline-step-header", "clr-timeline__step-header--underline-dotted", 3, "date", "live"], ["shape", "hourglass", "aria-label", "Submitted execution"], ["aria-label", "In progress", "clrMedium", ""], ["shape", "success-standard", "aria-label", "Successful execution"], ["shape", "times-circle", "aria-label", "Canceled execution"], ["shape", "circle-arrow", "dir", "right", "aria-label", "Skipped execution"], ["shape", "error-standard", "aria-label", "Failed execution"], ["shape", "error-standard", "aria-label", "User Error", 1, "is-danger"], ["shape", "error-standard", "aria-label", "Platform Error", 1, "is-warning"], [1, "btn", "btn-link", "btn-sm", "btn-show-more", 3, "click"], ["class", "btn btn-link btn-sm btn-show-more", 3, "click", 4, "ngIf"], ["title", "Check logs from VMware Log Insight", "rel", "noopener", "target", "_blank", 1, "label-link"], ["shape", "pop-out", "size", "12", 1, "clr-timeline__log-link"], ["data-cy", "data-pipelines-executions-timeline-manual-start", 1, "label", "manual-execution-label", "label-info", 3, "title"], ["data-cy", "data-pipelines-executions-timeline-started", "timeago", "", 1, "clr-timeline-step-header", 2, "text-decoration", "underline", "text-decoration-style", "dotted", 3, "date", "live"], ["shape", "event"]], template: function ExecutionsTimelineComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "ul", 0);
i0.ɵɵtemplate(1, ExecutionsTimelineComponent_li_1_Template, 25, 24, "li", 1);
i0.ɵɵpipe(2, "slice");
i0.ɵɵtemplate(3, ExecutionsTimelineComponent_li_3_Template, 10, 12, "li", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(2, 3, ctx.jobExecutions, ctx.jobExecutions.length > 5 ? ctx.jobExecutions.length - 5 : 0))("ngForTrackBy", ctx.trackByFn);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.next);
} }, directives: [i1.NgForOf, i2.ClrDatagridItemsTrackBy, i1.NgIf, i3.TimeagoDirective, i2.ClrIconCustomTag, i2.ClrSpinner], pipes: [i1.SlicePipe, i1.DatePipe, i1.TitleCasePipe, i4.TruncateWordsPipe, i5.FormatDeltaPipe], styles: [".clr-timeline-step[_ngcontent-%COMP%] clr-icon[shape=success-standard][_ngcontent-%COMP%]{color:var(--clr-timeline-success-step-color, #5eb715)}.clr-timeline-step[_ngcontent-%COMP%] clr-icon[shape=error-standard][_ngcontent-%COMP%]{color:var(--clr-timeline-error-step-color, #c21d00)}.clr-timeline-step[_ngcontent-%COMP%] clr-icon[_ngcontent-%COMP%]{height:1.8rem;width:1.8rem;min-height:1.8rem;min-width:1.8rem}.clr-timeline-horizontal[_ngcontent-%COMP%]{padding-top:35px}.manual-execution-label[_ngcontent-%COMP%]{margin-top:5px}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__step-header--underline-dotted[_ngcontent-%COMP%]{text-decoration:underline;text-decoration-style:dotted}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__log-link[_ngcontent-%COMP%]{min-height:0!important;min-width:0!important}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__element--display-block[_ngcontent-%COMP%]{display:block;width:200px}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__element--display-block[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{word-break:break-word}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__element--display-block[_ngcontent-%COMP%] span[_ngcontent-%COMP%] .btn-show-more[_ngcontent-%COMP%]{padding:0;margin:0}.clr-timeline[_ngcontent-%COMP%] .clr-timeline__duration-tag[_ngcontent-%COMP%]{font-weight:700;text-decoration:underline}"], changeDetection: 0 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionsTimelineComponent, [{
type: Component,
args: [{ selector: 'lib-executions-timeline', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<!-- eslint-disable @angular-eslint/template/no-call-expression -->\n\n<ul class=\"clr-timeline clr-timeline-horizontal\">\n <li\n *ngFor=\"\n let execution of jobExecutions\n | slice\n : (jobExecutions.length > 5 ? jobExecutions.length - 5 : 0);\n trackBy: trackByFn; index as i\n \"\n class=\"clr-timeline-step\"\n [attr.data-cy]=\"execution.id\"\n >\n <div\n *ngIf=\"execution.startTime\"\n class=\"clr-timeline-step-header clr-timeline__step-header--underline-dotted\"\n data-cy=\"data-pipelines-executions-timeline-started\"\n timeago\n [date]=\"execution.startTime\"\n [live]=\"true\"\n [attr.title]=\"\n 'Started ' +\n (execution.startTime | date : 'MMM d, y, hh:mm a' : 'UTC') +\n ' UTC'\n \"\n ></div>\n\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.SUBMITTED\"\n shape=\"hourglass\"\n aria-label=\"Submitted execution\"\n ></clr-icon>\n <clr-spinner\n *ngIf=\"execution.status === dataJobExecutionStatus.RUNNING\"\n aria-label=\"In progress\"\n clrMedium\n >Executing...\n </clr-spinner>\n <clr-icon\n *ngIf=\"\n execution.status === dataJobExecutionStatus.FINISHED ||\n execution.status === dataJobExecutionStatus.SUCCEEDED\n \"\n shape=\"success-standard\"\n aria-label=\"Successful execution\"\n ></clr-icon>\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.CANCELLED\"\n shape=\"times-circle\"\n aria-label=\"Canceled execution\"\n ></clr-icon>\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.SKIPPED\"\n shape=\"circle-arrow\"\n dir=\"right\"\n aria-label=\"Skipped execution\"\n ></clr-icon>\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.FAILED\"\n shape=\"error-standard\"\n aria-label=\"Failed execution\"\n ></clr-icon>\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.USER_ERROR\"\n class=\"is-danger\"\n shape=\"error-standard\"\n aria-label=\"User Error\"\n ></clr-icon>\n <clr-icon\n *ngIf=\"execution.status === dataJobExecutionStatus.PLATFORM_ERROR\"\n class=\"is-warning\"\n shape=\"error-standard\"\n aria-label=\"Platform Error\"\n ></clr-icon>\n\n <div class=\"clr-timeline-step-body\">\n <span class=\"clr-timeline-step-title\"\n >{{ (execution.status ? execution.status.replace(\"_\", \" \") :\n execution.status ) | titlecase }}</span\n >\n\n <div class=\"clr-timeline-step-description\">\n <div class=\"clr-timeline__element--display-block\">\n <span\n *ngIf=\"showErrorMessage && isJobStatusSuitableForMessageTooltip(execution) && isJobMessageDifferentFromStatus(execution)\"\n >\n <span *ngIf=\" showExecutionFullMessage[i]\"\n >{{ execution.message }}\n <button\n class=\"btn btn-link btn-sm btn-show-more\"\n (click)=\" showExecutionFullMessage[i] = false\"\n >\n show less\n </button>\n </span>\n\n <span *ngIf=\"!showExecutionFullMessage[i]\"\n >{{ execution.message | words :\n messageWordsBeforeTruncate }}\n <button\n *ngIf=\"\n execution.message?.split(' ')\n .length >\n messageWordsBeforeTruncate\n \"\n class=\"btn btn-link btn-sm btn-show-more\"\n (click)=\" showExecutionFullMessage[i] = true\"\n >\n show more\n </button>\n </span>\n <br />\n </span>\n <span>Duration: </span>\n <span\n class=\"clr-timeline__duration-tag\"\n data-cy=\"data-pipelines-executions-timeline-ended\"\n [attr.title]=\"\n execution.endTime\n ? 'Ended ' +\n (execution.endTime\n | date : 'MMM d, y, hh:mm a' : 'UTC') +\n ' UTC'\n : ''\n \"\n >{{ execution | formatDelta }}</span\n >\n </div>\n\n <div\n *ngIf=\"execution?.logsUrl\"\n class=\"clr-timeline__element--display-block\"\n >\n <a\n class=\"label-link\"\n title=\"Check logs from VMware Log Insight\"\n rel=\"noopener\"\n target=\"_blank\"\n [attr.href]=\"execution.logsUrl\"\n >\n <clr-icon\n class=\"clr-timeline__log-link\"\n shape=\"pop-out\"\n size=\"12\"\n ></clr-icon>\n\n <span> Logs</span>\n </a>\n </div>\n\n <span\n *ngIf=\"isExecutionManual(execution)\"\n class=\"label manual-execution-label label-info\"\n title=\"'{{ getManualExecutedByTitle(execution) }}'\"\n data-cy=\"data-pipelines-executions-timeline-manual-start\"\n >Manual</span\n >\n </div>\n </div>\n </li>\n\n <!-- Next Scheduled execution -->\n <li *ngIf=\"next\" class=\"clr-timeline-step\">\n <div\n class=\"clr-timeline-step-header\"\n style=\"text-decoration: underline; text-decoration-style: dotted\"\n data-cy=\"data-pipelines-executions-timeline-started\"\n timeago\n [attr.title]=\"(next | date : 'MMM d, y, hh:mm a' : 'UTC') + ' UTC'\"\n [date]=\"next\"\n [live]=\"true\"\n ></div>\n\n <clr-icon shape=\"event\"></clr-icon>\n\n <div class=\"clr-timeline-step-body\">\n <span class=\"clr-timeline-step-title\">Scheduled</span>\n <span class=\"clr-timeline-step-description\"\n >{{ next | date : \"MMM d, y, hh:mm a\" : \"UTC\" }} UTC</span\n >\n </div>\n </li>\n</ul>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.clr-timeline-step clr-icon[shape=success-standard]{color:var(--clr-timeline-success-step-color, #5eb715)}.clr-timeline-step clr-icon[shape=error-standard]{color:var(--clr-timeline-error-step-color, #c21d00)}.clr-timeline-step clr-icon{height:1.8rem;width:1.8rem;min-height:1.8rem;min-width:1.8rem}.clr-timeline-horizontal{padding-top:35px}.manual-execution-label{margin-top:5px}.clr-timeline .clr-timeline__step-header--underline-dotted{text-decoration:underline;text-decoration-style:dotted}.clr-timeline .clr-timeline__log-link{min-height:0!important;min-width:0!important}.clr-timeline .clr-timeline__element--display-block{display:block;width:200px}.clr-timeline .clr-timeline__element--display-block span{word-break:break-word}.clr-timeline .clr-timeline__element--display-block span .btn-show-more{padding:0;margin:0}.clr-timeline .clr-timeline__duration-tag{font-weight:700;text-decoration:underline}\n"] }]
}], function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DATA_PIPELINES_CONFIGS]
}] }]; }, { jobExecutions: [{
type: Input
}], next: [{
type: Input
}], showErrorMessage: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9ucy10aW1lbGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL2V4ZWN1dGlvbnMtdGltZWxpbmUvZXhlY3V0aW9ucy10aW1lbGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL2V4ZWN1dGlvbnMtdGltZWxpbmUvZXhlY3V0aW9ucy10aW1lbGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUNILHNCQUFzQixFQUd0QixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBRXZCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0lDSWhCLDBCQVlPOzs7O0lBUEgsNkNBQTRCLGNBQUE7SUFFNUIsdUhBSUM7OztJQUdMLCtCQUlZOzs7SUFDWix1Q0FJSztJQUFBLDZCQUNMO0lBQUEsaUJBQWM7OztJQUNkLCtCQU9ZOzs7SUFDWiwrQkFJWTs7O0lBQ1osK0JBS1k7OztJQUNaLCtCQUlZOzs7SUFDWiwrQkFLWTs7O0lBQ1osK0JBS1k7Ozs7SUFhSSw0QkFDSztJQUFBLFlBQ0Q7SUFBQSxrQ0FHQztJQURHLDBRQUF5QyxLQUFLLEtBQUE7SUFFOUMsMkJBQ0o7SUFBQSxpQkFBUyxFQUFBOzs7SUFOUixlQUNEO0lBREMsb0RBQ0Q7Ozs7SUFXQSxrQ0FRQztJQURHLG1SQUF5QyxJQUFJLEtBQUE7SUFFN0MsMkJBQ0o7SUFBQSxpQkFBUzs7O0lBYmIsNEJBQ0s7SUFBQSxZQUVEOztJQUFBLHVHQVVTO0lBQ2Is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QUFNO3VCQUFDLHNCQUFzQjt3QkFUekIsYUFBYTtrQkFBckIsS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIERBVEFfUElQRUxJTkVTX0NPTkZJR1MsXG4gICAgRGF0YUpvYkV4ZWN1dGlvbixcbiAgICBEYXRhSm9iRXhlY3V0aW9ucyxcbiAgICBEYXRhSm9iRXhlY3V0aW9uU3RhdHVzLFxuICAgIERhdGFKb2JFeGVjdXRpb25UeXBlLFxuICAgIERhdGFQaXBlbGluZXNDb25maWdcbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1leGVjdXRpb25zLXRpbWVsaW5lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXhlY3V0aW9ucy10aW1lbGluZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZXhlY3V0aW9ucy10aW1lbGluZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvbnNUaW1lbGluZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgc3RhdGljIG1hbnVhbFJ1bktub3duVXNlciA9ICdUaGlzIGpvYiBpcyB0cmlnZ2VyZWQgbWFudWFsbHkgYnkgdXNlcic7XG4gICAgc3RhdGljIG1hbnVhbFJ1bk5vVXNlciA9ICdUaGlzIGpvYiBpcyB0cmlnZ2VyZWQgbWFudWFsbHksIGJ1dCB0aGVyZSBpcyBubyBpbmZvIGFib3V0IHRoZSB1c2VyJztcblxuICAgIEBJbnB1dCgpIGpvYkV4ZWN1dGlvbnM6IERhdGFKb2JFeGVjdXRpb25zID0gW107XG4gICAgQElucHV0KCkgbmV4dDogRGF0ZSA9IG51bGw7XG4gICAgQElucHV0KCkgc2hvd0Vycm9yTWVzc2FnZSA9IGZhbHNlO1xuICAgIHNob3dFeGVjdXRpb25GdWxsTWVzc2FnZTogYm9vbGVhbltdO1xuXG4gICAgbWVzc2FnZVdvcmRzQmVmb3JlVHJ1bmNhdGUgPSA1MDtcbiAgICBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzID0gRGF0YUpvYkV4ZWN1dGlvblN0YXR1cztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERBVEFfUElQRUxJTkVTX0NPTkZJR1MpXG4gICAgICAgIHB1YmxpYyBkYXRhUGlwZWxpbmVzTW9kdWxlQ29uZmlnOiBEYXRhUGlwZWxpbmVzQ29uZmlnXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0V4ZWN1dGlvbkZ1bGxNZXNzYWdlID0gbmV3IEFycmF5KHRoaXMuam9iRXhlY3V0aW9ucy5sZW5ndGgpLmZpbGwoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIE5nRm9yIGVsZW1lbnRzIHRyYWNraW5nIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBleGVjdXRpb246IERhdGFKb2JFeGVjdXRpb24pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7aW5kZXh9fCR7ZXhlY3V0aW9uLmlkfWA7XG4gICAgfVxuXG4gICAgaXNFeGVjdXRpb25NYW51YWwoZXhlY3V0aW9uOiBEYXRhSm9iRXhlY3V0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBleGVjdXRpb24/LnR5cGUgPT09IERhdGFKb2JFeGVjdXRpb25UeXBlLk1BTlVBTDtcbiAgICB9XG5cbiAgICBnZXRNYW51YWxFeGVjdXRlZEJ5VGl0bGUoZXhlY3V0aW9uOiBEYXRhSm9iRXhlY3V0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFleGVjdXRpb24gfHwgIWV4ZWN1dGlvbi5zdGFydGVkQnkgfHwgIWV4ZWN1dGlvbi5zdGFydGVkQnkuc3RhcnRzV2l0aCgnbWFudWFsLycpKSB7XG4gICAgICAgICAgICAvLyBleGVjdXRpb24gaGFzIG5vIGluZm8gYWJvdCB1c2VyIHByb3ZpZGVkXG4gICAgICAgICAgICByZXR1cm4gRXhlY3V0aW9uc1RpbWVsaW5lQ29tcG9uZW50Lm1hbnVhbFJ1bk5vVXNlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXIgPSBleGVjdXRpb24uc3RhcnRlZEJ5LnJlcGxhY2UoJ21hbnVhbC8nLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke0V4ZWN1dGlvbnNUaW1lbGluZUNvbXBvbmVudC5tYW51YWxSdW5Lbm93blVzZXJ9ICR7dXNlcn1gO1xuICAgIH1cblxuICAgIGlzSm9iU3RhdHVzU3VpdGFibGVGb3JNZXNzYWdlVG9vbHRpcChleGVjdXRpb246IERhdGFKb2JFeGVjdXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGV4ZWN1dGlvbi5zdGF0dXMgPT09IERhdGFKb2JFeGVjdXRpb25TdGF0dXMuUExBVEZPUk1fRVJST1IgfHxcbiAgICAgICAgICAgIGV4ZWN1dGlvbi5zdGF0dXMgPT09IERhdGFKb2JFeGVjdXRpb25TdGF0dXMuVVNFUl9FUlJPUiB8fFxuICAgICAgICAgICAgZXhlY3V0aW9uLnN0YXR1cyA9PT0gRGF0YUpvYkV4ZWN1dGlvblN0YXR1cy5TS0lQUEVEXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNKb2JNZXNzYWdlRGlmZmVyZW50RnJvbVN0YXR1cyhleGVjdXRpb246IERhdGFKb2JFeGVjdXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV4ZWN1dGlvbi5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZSAhPT0gJ3VzZXIgZXJyb3InICYmIG1lc3NhZ2UgIT09ICdwbGF0Zm9ybSBlcnJvcicgJiYgbWVzc2FnZSAhPT0gJ3NraXBwZWQnICYmIG1lc3NhZ2UgIT09ICcnO1xuICAgIH1cbn1cbiIsIjwhLS1cbiAgIH4gQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICAgfiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAtLT5cblxuPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvbm8tY2FsbC1leHByZXNzaW9uIC0tPlxuXG48dWwgY2xhc3M9XCJjbHItdGltZWxpbmUgY2xyLXRpbWVsaW5lLWhvcml6b250YWxcIj5cbiAgICA8bGlcbiAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZXhlY3V0aW9uIG9mIGpvYkV4ZWN1dGlvbnNcbiAgICAgICAgICAgICAgICB8IHNsaWNlXG4gICAgICAgICAgICAgICAgICAgIDogKGpvYkV4ZWN1dGlvbnMubGVuZ3RoID4gNSA/IGpvYkV4ZWN1dGlvbnMubGVuZ3RoIC0gNSA6IDApO1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUZuOyBpbmRleCBhcyBpXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwiY2xyLXRpbWVsaW5lLXN0ZXBcIlxuICAgICAgICBbYXR0ci5kYXRhLWN5XT1cImV4ZWN1dGlvbi5pZFwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImV4ZWN1dGlvbi5zdGFydFRpbWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjbHItdGltZWxpbmUtc3RlcC1oZWFkZXIgY2xyLXRpbWVsaW5lX19zdGVwLWhlYWRlci0tdW5kZXJsaW5lLWRvdHRlZFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtZXhlY3V0aW9ucy10aW1lbGluZS1zdGFydGVkXCJcbiAgICAgICAgICAgIHRpbWVhZ29cbiAgICAgICAgICAgIFtkYXRlXT1cImV4ZWN1dGlvbi5zdGFydFRpbWVcIlxuICAgICAgICAgICAgW2xpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAnU3RhcnRlZCAnICtcbiAgICAgICAgICAgICAgICAoZXhlY3V0aW9uLnN0YXJ0VGltZSB8IGRhdGUgOiAnTU1NIGQsIHksIGhoOm1tIGEnIDogJ1VUQycpICtcbiAgICAgICAgICAgICAgICAnIFVUQydcbiAgICAgICAgICAgIFwiXG4gICAgICAgID48L2Rpdj5cblxuICAgICAgICA8Y2xyLWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiZXhlY3V0aW9uLnN0YXR1cyA9PT0gZGF0YUpvYkV4ZWN1dGlvblN0YXR1cy5TVUJNSVRURURcIlxuICAgICAgICAgICAgc2hhcGU9XCJob3VyZ2xhc3NcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN1Ym1pdHRlZCBleGVjdXRpb25cIlxuICAgICAgICA+PC9jbHItaWNvbj5cbiAgICAgICAgPGNsci1zcGlubmVyXG4gICAgICAgICAgICAqbmdJZj1cImV4ZWN1dGlvbi5zdGF0dXMgPT09IGRhdGFKb2JFeGVjdXRpb25TdGF0dXMuUlVOTklOR1wiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiSW4gcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgY2xyTWVkaXVtXG4gICAgICAgICAgICA+RXhlY3V0aW5nLi4uXG4gICAgICAgIDwvY2xyLXNwaW5uZXI+XG4gICAgICAgIDxjbHItaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBleGVjdXRpb24uc3RhdHVzID09PSBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzLkZJTklTSEVEIHx8XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uLnN0YXR1cyA9PT0gZGF0YUpvYkV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERURcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBzaGFwZT1cInN1Y2Nlc3Mtc3RhbmRhcmRcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN1Y2Nlc3NmdWwgZXhlY3V0aW9uXCJcbiAgICAgICAgPjwvY2xyLWljb24+XG4gICAgICAgIDxjbHItaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzLkNBTkNFTExFRFwiXG4gICAgICAgICAgICBzaGFwZT1cInRpbWVzLWNpcmNsZVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FuY2VsZWQgZXhlY3V0aW9uXCJcbiAgICAgICAgPjwvY2xyLWljb24+XG4gICAgICAgIDxjbHItaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzLlNLSVBQRURcIlxuICAgICAgICAgICAgc2hhcGU9XCJjaXJjbGUtYXJyb3dcIlxuICAgICAgICAgICAgZGlyPVwicmlnaHRcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNraXBwZWQgZXhlY3V0aW9uXCJcbiAgICAgICAgPjwvY2xyLWljb24+XG4gICAgICAgIDxjbHItaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzLkZBSUxFRFwiXG4gICAgICAgICAgICBzaGFwZT1cImVycm9yLXN0YW5kYXJkXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGYWlsZWQgZXhlY3V0aW9uXCJcbiAgICAgICAgPjwvY2xyLWljb24+XG4gICAgICAgIDxjbHItaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSBkYXRhSm9iRXhlY3V0aW9uU3RhdHVzLlVTRVJfRVJST1JcIlxuICAgICAgICAgICAgY2xhc3M9XCJpcy1kYW5nZXJcIlxuICAgICAgICAgICAgc2hhcGU9XCJlcnJvci1zdGFuZGFyZFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiVXNlciBFcnJvclwiXG4gICAgICAgID48L2Nsci1pY29uPlxuICAgICAgICA8Y2xyLWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiZXhlY3V0aW9uLnN0YXR1cyA9PT0gZGF0YUpvYkV4ZWN1dGlvblN0YXR1cy5QTEFURk9STV9FUlJPUlwiXG4gICAgICAgICAgICBjbGFzcz1cImlzLXdhcm5pbmdcIlxuICAgICAgICAgICAgc2hhcGU9XCJlcnJvci1zdGFuZGFyZFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGxhdGZvcm0gRXJyb3JcIlxuICAgICAgICA+PC9jbHItaWNvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXRpbWVsaW5lLXN0ZXAtYm9keVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbHItdGltZWxpbmUtc3RlcC10aXRsZVwiXG4gICAgICAgICAgICAgICAgPnt7IChleGVjdXRpb24uc3RhdHVzID8gZXhlY3V0aW9uLnN0YXR1cy5yZXBsYWNlKFwiX1wiLCBcIiBcIikgOlxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbi5zdGF0dXMgKSB8IHRpdGxlY2FzZSB9fTwvc3BhblxuICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXRpbWVsaW5lLXN0ZXAtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXRpbWVsaW5lX19lbGVtZW50LS1kaXNwbGF5LWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvck1lc3NhZ2UgJiYgaXNKb2JTdGF0dXNTdWl0YWJsZUZvck1lc3NhZ2VUb29sdGlwKGV4ZWN1dGlvbikgJiYgaXNKb2JNZXNzYWdlRGlmZmVyZW50RnJvbVN0YXR1cyhleGVjdXRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIgc2hvd0V4ZWN1dGlvbkZ1bGxNZXNzYWdlW2ldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgZXhlY3V0aW9uLm1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBidG4tc2hvdy1tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiBzaG93RXhlY3V0aW9uRnVsbE1lc3NhZ2VbaV0gPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93IGxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2hvd0V4ZWN1dGlvbkZ1bGxNZXNzYWdlW2ldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgZXhlY3V0aW9uLm1lc3NhZ2UgfCB3b3JkcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVdvcmRzQmVmb3JlVHJ1bmNhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbi5tZXNzYWdlPy5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVdvcmRzQmVmb3JlVHJ1bmNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gYnRuLXNob3ctbW9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIgc2hvd0V4ZWN1dGlvbkZ1bGxNZXNzYWdlW2ldID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93IG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkR1cmF0aW9uOiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsci10aW1lbGluZV9fZHVyYXRpb24tdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1leGVjdXRpb25zLXRpbWVsaW5lLWVuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbi5lbmRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0VuZGVkICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGVjdXRpb24uZW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGUgOiAnTU1NIGQsIHksIGhoOm1tIGEnIDogJ1VUQycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFVUQydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID57eyBleGVjdXRpb24gfCBmb3JtYXREZWx0YSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhlY3V0aW9uPy5sb2dzVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbHItdGltZWxpbmVfX2VsZW1lbnQtLWRpc3BsYXktYmxvY2tcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNoZWNrIGxvZ3MgZnJvbSBWTXdhcmUgTG9nIEluc2lnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZXhlY3V0aW9uLmxvZ3NVcmxcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsci10aW1lbGluZV9fbG9nLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPVwicG9wLW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2Nsci1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gTG9nczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0V4ZWN1dGlvbk1hbnVhbChleGVjdXRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbCBtYW51YWwtZXhlY3V0aW9uLWxhYmVsIGxhYmVsLWluZm9cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIid7eyBnZXRNYW51YWxFeGVjdXRlZEJ5VGl0bGUoZXhlY3V0aW9uKSB9fSdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtZXhlY3V0aW9ucy10aW1lbGluZS1tYW51YWwtc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICA+TWFudWFsPC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbGk+XG5cbiAgICA8IS0tIE5leHQgU2NoZWR1bGVkIGV4ZWN1dGlvbiAtLT5cbiAgICA8bGkgKm5nSWY9XCJuZXh0XCIgY2xhc3M9XCJjbHItdGltZWxpbmUtc3RlcFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNsci10aW1lbGluZS1zdGVwLWhlYWRlclwiXG4gICAgICAgICAgICBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtZXhlY3V0aW9ucy10aW1lbGluZS1zdGFydGVkXCJcbiAgICAgICAgICAgIHRpbWVhZ29cbiAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIihuZXh0IHwgZGF0ZSA6ICdNTU0gZCwgeSwgaGg6bW0gYScgOiAnVVRDJykgKyAnIFVUQydcIlxuICAgICAgICAgICAgW2RhdGVdPVwibmV4dFwiXG4gICAgICAgICAgICBbbGl2ZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImV2ZW50XCI+PC9jbHItaWNvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXRpbWVsaW5lLXN0ZXAtYm9keVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbHItdGltZWxpbmUtc3RlcC10aXRsZVwiPlNjaGVkdWxlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xyLXRpbWVsaW5lLXN0ZXAtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgID57eyBuZXh0IHwgZGF0ZSA6IFwiTU1NIGQsIHksIGhoOm1tIGFcIiA6IFwiVVRDXCIgfX0gVVRDPC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbGk+XG48L3VsPlxuIl19