@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
1,083 lines • 246 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { Component, Inject } from '@angular/core';
import { take } from 'rxjs/operators';
import { ASC, CollectionsUtil, FORM_STATE, TaurusBaseComponent, VdkFormState, VmwToastType } from '@versatiledatakit/shared';
import { ConfirmationModalOptions, DeleteModalOptions } from '../../../../shared/model';
import { CronUtil, DataJobUtil, ErrorUtil, StringUtil } from '../../../../shared/utils';
import { ExtractJobStatusPipe, ParseEpochPipe } from '../../../../shared/pipes';
import { DATA_PIPELINES_CONFIGS, DataJobStatus, JOB_DEPLOYMENT_ID_REQ_PARAM, JOB_DETAILS_DATA_KEY, JOB_DETAILS_REQ_PARAM, JOB_EXECUTIONS_DATA_KEY, JOB_NAME_REQ_PARAM, JOB_STATE_DATA_KEY, JOB_STATE_REQ_PARAM, JOB_STATUS_REQ_PARAM, ORDER_REQ_PARAM, TEAM_NAME_REQ_PARAM } from '../../../../model';
import { TASK_LOAD_JOB_DETAILS, TASK_LOAD_JOB_EXECUTIONS, TASK_LOAD_JOB_STATE, TASK_UPDATE_JOB_DESCRIPTION, TASK_UPDATE_JOB_STATUS } from '../../../../state/tasks';
import { LOAD_JOB_ERROR_CODES } from '../../../../state/error-codes';
import * as i0 from "@angular/core";
import * as i1 from "@versatiledatakit/shared";
import * as i2 from "@angular/router";
import * as i3 from "../../../../services";
import * as i4 from "@angular/forms";
import * as i5 from "@angular/common";
import * as i6 from "../../../../shared/components/status/status-panel/status-panel.component";
import * as i7 from "@clr/angular";
import * as i8 from "../../../../shared/components/executions-timeline/executions-timeline.component";
import * as i9 from "../../../../shared/pipes/extract-job-status.pipe";
import * as i10 from "@yellowspot/ng-truncate";
import * as i11 from "../../../../shared/pipes/format-schedule.pipe";
import * as i12 from "../../../../shared/pipes/parse-next-run.pipe";
import * as i13 from "../../../../shared/pipes/extract-contacts.pipe";
function DataJobDetailsPageComponent_ng_container_2_span_25_Template(rf, ctx) { if (rf & 1) {
const _r27 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "span", 61);
i0.ɵɵtext(1);
i0.ɵɵelement(2, "br");
i0.ɵɵelementStart(3, "button", 62);
i0.ɵɵlistener("click", function DataJobDetailsPageComponent_ng_container_2_span_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r27); const ctx_r26 = i0.ɵɵnextContext(2); return ctx_r26.showFullDescription = false; });
i0.ɵɵtext(4, " show less ");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", ctx_r3.description.value, " ");
} }
function DataJobDetailsPageComponent_ng_container_2_span_26_button_3_Template(rf, ctx) { if (rf & 1) {
const _r30 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 65);
i0.ɵɵlistener("click", function DataJobDetailsPageComponent_ng_container_2_span_26_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r29 = i0.ɵɵnextContext(3); return ctx_r29.showFullDescription = true; });
i0.ɵɵtext(1, " show more ");
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_span_26_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 63);
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "words");
i0.ɵɵtemplate(3, DataJobDetailsPageComponent_ng_container_2_span_26_button_3_Template, 2, 0, "button", 64);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(2, 2, ctx_r4.description.value, ctx_r4.descriptionWordsBeforeTruncate), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", (ctx_r4.description.value == null ? null : ctx_r4.description.value.split(" ").length) > ctx_r4.descriptionWordsBeforeTruncate);
} }
const _c0 = function (a1) { return ["/explore/teams", a1]; };
function DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_38_span_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 69)(1, "a", 70);
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r31 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("routerLink", i0.ɵɵpureFunction1(2, _c0, ctx_r31.team.value));
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r31.team.value);
} }
function DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_38_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "vdk-form-section-container", 66)(1, "div", 67);
i0.ɵɵtext(2, " Owner team ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "div", 9);
i0.ɵɵtemplate(4, DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_38_span_4_Template, 3, 4, "span", 68);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("formState", ctx_r5.readFormState);
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngIf", ctx_r5.team.value);
} }
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_ol_9_li_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li");
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "date");
i0.ɵɵpipe(3, "parseNextRun");
i0.ɵɵelementEnd();
} if (rf & 2) {
const times_r36 = ctx.$implicit;
const ctx_r35 = i0.ɵɵnextContext(5);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind3(2, 1, i0.ɵɵpipeBind2(3, 5, ctx_r35.jobDetails == null ? null : ctx_r35.jobDetails.config == null ? null : ctx_r35.jobDetails.config.schedule == null ? null : ctx_r35.jobDetails.config.schedule.schedule_cron, times_r36), "MMM d, y, hh:mm a", "UTC"), " UTC ");
} }
const _c1 = function () { return [1, 2, 3, 4, 5]; };
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_ol_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "ol");
i0.ɵɵtemplate(1, DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_ol_9_li_1_Template, 4, 8, "li", 72);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", i0.ɵɵpureFunction0(1, _c1));
} }
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_em_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "em");
i0.ɵɵelement(1, "br");
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r34 = i0.ɵɵnextContext(4);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r34.cronError);
} }
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71)(1, "strong");
i0.ɵɵtext(2, "Cron expression");
i0.ɵɵelementEnd();
i0.ɵɵelement(3, "br");
i0.ɵɵtext(4);
i0.ɵɵelement(5, "br")(6, "br");
i0.ɵɵelementStart(7, "strong");
i0.ɵɵtext(8, "Next 5 executions");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(9, DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_ol_9_Template, 2, 2, "ol", 25);
i0.ɵɵtemplate(10, DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_em_10_Template, 3, 1, "em", 25);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r32 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("clrPosition", "left-middle");
i0.ɵɵadvance(4);
i0.ɵɵtextInterpolate1(" ", ctx_r32.jobDetails == null ? null : ctx_r32.jobDetails.config == null ? null : ctx_r32.jobDetails.config.schedule == null ? null : ctx_r32.jobDetails.config.schedule.schedule_cron, " ");
i0.ɵɵadvance(5);
i0.ɵɵproperty("ngIf", !ctx_r32.cronError);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r32.cronError);
} }
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost");
i0.ɵɵtemplate(1, DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_clr_signpost_content_1_Template, 11, 4, "clr-signpost-content", 36);
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_50_Template(rf, ctx) { if (rf & 1) {
const _r38 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "vdk-form-section-container", 73)(1, "div", 29);
i0.ɵɵtext(2, " Change history ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "div", 9)(4, "a", 74);
i0.ɵɵlistener("click", function DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_50_Template_a_click_4_listener($event) { i0.ɵɵrestoreView(_r38); const ctx_r37 = i0.ɵɵnextContext(2); return ctx_r37.navigateToJobChangeHistory($event); });
i0.ɵɵtext(5);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const ctx_r7 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("formState", ctx_r7.readFormState);
i0.ɵɵadvance(4);
i0.ɵɵpropertyInterpolate("href", ctx_r7.changeHistoryConfig.urlTemplate, i0.ɵɵsanitizeUrl);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r7.changeHistoryConfig.urlTemplate, " ");
} }
function DataJobDetailsPageComponent_ng_container_2_div_57_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "em");
i0.ɵɵtext(2, "The data job is not deployed");
i0.ɵɵelementEnd()();
} }
function DataJobDetailsPageComponent_ng_container_2_div_58_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "a", 75);
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r9 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("href", ctx_r9.jobState == null ? null : ctx_r9.jobState.config == null ? null : ctx_r9.jobState.config.sourceUrl, i0.ɵɵsanitizeUrl);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r9.jobState == null ? null : ctx_r9.jobState.config == null ? null : ctx_r9.jobState.config.sourceUrl, " ");
} }
function DataJobDetailsPageComponent_ng_container_2_clr_signpost_content_65_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71);
i0.ɵɵtext(1, " Notifications are used to inform the users about a specific activity. To configure notifications, edit data job's config.ini file and redeploy the data job. ");
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("clrPosition", "left-middle");
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_72_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r40 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r40);
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_72_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 76);
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_ng_container_72_div_2_Template, 3, 1, "div", 72);
i0.ɵɵpipe(3, "slice");
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r11 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(3, 1, i0.ɵɵpipeBind1(4, 5, ctx_r11.jobDetails == null ? null : ctx_r11.jobDetails.config == null ? null : ctx_r11.jobDetails.config.contacts == null ? null : ctx_r11.jobDetails.config.contacts.notified_on_job_deploy), 0, 3));
} }
function DataJobDetailsPageComponent_ng_container_2_div_74_clr_signpost_content_5_li_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r43 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r43);
} }
function DataJobDetailsPageComponent_ng_container_2_div_74_clr_signpost_content_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71)(1, "ul");
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_div_74_clr_signpost_content_5_li_2_Template, 3, 1, "li", 72);
i0.ɵɵpipe(3, "extractContacts");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r41 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("clrPosition", "left-middle");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(3, 2, ctx_r41.jobDetails == null ? null : ctx_r41.jobDetails.config == null ? null : ctx_r41.jobDetails.config.contacts == null ? null : ctx_r41.jobDetails.config.contacts.notified_on_job_deploy));
} }
function DataJobDetailsPageComponent_ng_container_2_div_74_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 77)(1, "clr-signpost")(2, "button", 78);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, DataJobDetailsPageComponent_ng_container_2_div_74_clr_signpost_content_5_Template, 4, 4, "clr-signpost-content", 36);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r12 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ...(+", i0.ɵɵpipeBind1(4, 1, ctx_r12.jobDetails == null ? null : ctx_r12.jobDetails.config == null ? null : ctx_r12.jobDetails.config.contacts == null ? null : ctx_r12.jobDetails.config.contacts.notified_on_job_deploy).length - 3, ") ");
} }
function DataJobDetailsPageComponent_ng_container_2_em_76_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "em");
i0.ɵɵtext(1, " Not configured ");
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_82_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r45 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r45);
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_82_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 76);
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_ng_container_82_div_2_Template, 3, 1, "div", 72);
i0.ɵɵpipe(3, "slice");
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r14 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(3, 1, i0.ɵɵpipeBind1(4, 5, ctx_r14.jobDetails == null ? null : ctx_r14.jobDetails.config == null ? null : ctx_r14.jobDetails.config.contacts == null ? null : ctx_r14.jobDetails.config.contacts.notified_on_job_failure_platform_error), 0, 3));
} }
function DataJobDetailsPageComponent_ng_container_2_div_84_clr_signpost_content_5_li_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r48 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r48);
} }
function DataJobDetailsPageComponent_ng_container_2_div_84_clr_signpost_content_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71)(1, "ul");
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_div_84_clr_signpost_content_5_li_2_Template, 3, 1, "li", 72);
i0.ɵɵpipe(3, "extractContacts");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r46 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("clrPosition", "left-middle");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(3, 2, ctx_r46.jobDetails == null ? null : ctx_r46.jobDetails.config == null ? null : ctx_r46.jobDetails.config.contacts == null ? null : ctx_r46.jobDetails.config.contacts.notified_on_job_failure_platform_error));
} }
function DataJobDetailsPageComponent_ng_container_2_div_84_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 77)(1, "clr-signpost")(2, "button", 78);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, DataJobDetailsPageComponent_ng_container_2_div_84_clr_signpost_content_5_Template, 4, 4, "clr-signpost-content", 36);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r15 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ...(+", i0.ɵɵpipeBind1(4, 1, ctx_r15.jobDetails == null ? null : ctx_r15.jobDetails.config == null ? null : ctx_r15.jobDetails.config.contacts == null ? null : ctx_r15.jobDetails.config.contacts.notified_on_job_failure_platform_error).length - 3, ") ");
} }
function DataJobDetailsPageComponent_ng_container_2_em_86_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "em");
i0.ɵɵtext(1, " Not configured ");
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_92_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r50 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r50);
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_92_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 76);
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_ng_container_92_div_2_Template, 3, 1, "div", 72);
i0.ɵɵpipe(3, "slice");
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r17 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(3, 1, i0.ɵɵpipeBind1(4, 5, ctx_r17.jobDetails == null ? null : ctx_r17.jobDetails.config == null ? null : ctx_r17.jobDetails.config.contacts == null ? null : ctx_r17.jobDetails.config.contacts.notified_on_job_failure_user_error), 0, 3));
} }
function DataJobDetailsPageComponent_ng_container_2_div_94_clr_signpost_content_5_li_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r53 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r53);
} }
function DataJobDetailsPageComponent_ng_container_2_div_94_clr_signpost_content_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71)(1, "ul");
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_div_94_clr_signpost_content_5_li_2_Template, 3, 1, "li", 72);
i0.ɵɵpipe(3, "extractContacts");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r51 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("clrPosition", "left-middle");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(3, 2, ctx_r51.jobDetails == null ? null : ctx_r51.jobDetails.config == null ? null : ctx_r51.jobDetails.config.contacts == null ? null : ctx_r51.jobDetails.config.contacts.notified_on_job_failure_user_error));
} }
function DataJobDetailsPageComponent_ng_container_2_div_94_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 77)(1, "clr-signpost")(2, "button", 78);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, DataJobDetailsPageComponent_ng_container_2_div_94_clr_signpost_content_5_Template, 4, 4, "clr-signpost-content", 36);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r18 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ...(+", i0.ɵɵpipeBind1(4, 1, ctx_r18.jobDetails == null ? null : ctx_r18.jobDetails.config == null ? null : ctx_r18.jobDetails.config.contacts == null ? null : ctx_r18.jobDetails.config.contacts.notified_on_job_failure_user_error).length - 3, ") ");
} }
function DataJobDetailsPageComponent_ng_container_2_em_96_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "em");
i0.ɵɵtext(1, " Not configured ");
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_102_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r55 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r55);
} }
function DataJobDetailsPageComponent_ng_container_2_ng_container_102_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 76);
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_ng_container_102_div_2_Template, 3, 1, "div", 72);
i0.ɵɵpipe(3, "slice");
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r20 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(3, 1, i0.ɵɵpipeBind1(4, 5, ctx_r20.jobDetails == null ? null : ctx_r20.jobDetails.config == null ? null : ctx_r20.jobDetails.config.contacts == null ? null : ctx_r20.jobDetails.config.contacts.notified_on_job_success), 0, 3));
} }
function DataJobDetailsPageComponent_ng_container_2_div_104_clr_signpost_content_5_li_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li")(1, "span");
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const contacts_r58 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(contacts_r58);
} }
function DataJobDetailsPageComponent_ng_container_2_div_104_clr_signpost_content_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-signpost-content", 71)(1, "ul");
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_div_104_clr_signpost_content_5_li_2_Template, 3, 1, "li", 72);
i0.ɵɵpipe(3, "extractContacts");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r56 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("clrPosition", "left-middle");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(3, 2, ctx_r56.jobDetails == null ? null : ctx_r56.jobDetails.config == null ? null : ctx_r56.jobDetails.config.contacts == null ? null : ctx_r56.jobDetails.config.contacts.notified_on_job_success));
} }
function DataJobDetailsPageComponent_ng_container_2_div_104_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 77)(1, "clr-signpost")(2, "button", 78);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "extractContacts");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(5, DataJobDetailsPageComponent_ng_container_2_div_104_clr_signpost_content_5_Template, 4, 4, "clr-signpost-content", 36);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r21 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ...(+", i0.ɵɵpipeBind1(4, 1, ctx_r21.jobDetails == null ? null : ctx_r21.jobDetails.config == null ? null : ctx_r21.jobDetails.config.contacts == null ? null : ctx_r21.jobDetails.config.contacts.notified_on_job_success).length - 3, ") ");
} }
function DataJobDetailsPageComponent_ng_container_2_em_106_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "em");
i0.ɵɵtext(1, " Not configured ");
i0.ɵɵelementEnd();
} }
function DataJobDetailsPageComponent_ng_container_2_div_135_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵelement(1, "br");
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3, " We couldn't find any executions, but you can always schedule one! ");
i0.ɵɵelementEnd()();
} }
function DataJobDetailsPageComponent_ng_container_2_lib_executions_timeline_136_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "lib-executions-timeline", 79);
i0.ɵɵpipe(1, "extractJobStatus");
} if (rf & 2) {
const ctx_r24 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("jobExecutions", ctx_r24.jobExecutions)("showErrorMessage", true)("next", i0.ɵɵpipeBind1(1, 3, ctx_r24.jobState == null ? null : ctx_r24.jobState.deployments) === "Enabled" ? ctx_r24.next : null);
} }
function DataJobDetailsPageComponent_ng_container_2_div_137_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 56)(1, "div", 80);
i0.ɵɵtext(2, "Loading executions...");
i0.ɵɵelementEnd()();
} }
function DataJobDetailsPageComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
const _r60 = i0.ɵɵgetCurrentView();
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "div", 4)(2, "div", 5)(3, "form", 6)(4, "vdk-form-section-container", 7);
i0.ɵɵlistener("submitForm", function DataJobDetailsPageComponent_ng_container_2_Template_vdk_form_section_container_submitForm_4_listener($event) { i0.ɵɵrestoreView(_r60); const ctx_r59 = i0.ɵɵnextContext(); return ctx_r59.submitForm($event); })("sectionStateChange", function DataJobDetailsPageComponent_ng_container_2_Template_vdk_form_section_container_sectionStateChange_4_listener($event) { i0.ɵɵrestoreView(_r60); const ctx_r61 = i0.ɵɵnextContext(); return ctx_r61.sectionStateChange($event); });
i0.ɵɵpipe(5, "extractJobStatus");
i0.ɵɵelementStart(6, "div", 8);
i0.ɵɵtext(7, " Status ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "div", 9);
i0.ɵɵelement(9, "lib-status-panel", 10);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(10, "div", 11)(11, "clr-radio-container", 12)(12, "clr-radio-wrapper");
i0.ɵɵelement(13, "input", 13);
i0.ɵɵelementStart(14, "label");
i0.ɵɵtext(15, "Enabled");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(16, "clr-radio-wrapper");
i0.ɵɵelement(17, "input", 14);
i0.ɵɵelementStart(18, "label");
i0.ɵɵtext(19, "Disabled");
i0.ɵɵelementEnd()();
i0.ɵɵelement(20, "input", 15);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(21, "vdk-form-section-container", 16);
i0.ɵɵlistener("submitForm", function DataJobDetailsPageComponent_ng_container_2_Template_vdk_form_section_container_submitForm_21_listener($event) { i0.ɵɵrestoreView(_r60); const ctx_r62 = i0.ɵɵnextContext(); return ctx_r62.submitForm($event); })("sectionStateChange", function DataJobDetailsPageComponent_ng_container_2_Template_vdk_form_section_container_sectionStateChange_21_listener($event) { i0.ɵɵrestoreView(_r60); const ctx_r63 = i0.ɵɵnextContext(); return ctx_r63.sectionStateChange($event); });
i0.ɵɵelementStart(22, "div", 8);
i0.ɵɵtext(23, " Description ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(24, "div", 9);
i0.ɵɵtemplate(25, DataJobDetailsPageComponent_ng_container_2_span_25_Template, 5, 1, "span", 17);
i0.ɵɵtemplate(26, DataJobDetailsPageComponent_ng_container_2_span_26_Template, 4, 5, "span", 18);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(27, "div", 11)(28, "clr-textarea-container")(29, "textarea", 19);
i0.ɵɵtext(30);
i0.ɵɵelementEnd();
i0.ɵɵelement(31, "input", 15);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(32, "vdk-form-section-container", 20)(33, "div", 21);
i0.ɵɵtext(34, " Python version ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(35, "div", 9)(36, "span");
i0.ɵɵtext(37);
i0.ɵɵelementEnd()()();
i0.ɵɵtemplate(38, DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_38_Template, 5, 2, "vdk-form-section-container", 22);
i0.ɵɵelementStart(39, "vdk-form-section-container", 23)(40, "div", 21);
i0.ɵɵtext(41, " Schedule (in UTC) ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(42, "div", 24);
i0.ɵɵtext(43);
i0.ɵɵpipe(44, "formatSchedule");
i0.ɵɵtemplate(45, DataJobDetailsPageComponent_ng_container_2_clr_signpost_45_Template, 2, 0, "clr-signpost", 25);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(46, "div", 11)(47, "clr-textarea-container");
i0.ɵɵelement(48, "input", 26)(49, "input", 15);
i0.ɵɵelementEnd()()();
i0.ɵɵtemplate(50, DataJobDetailsPageComponent_ng_container_2_vdk_form_section_container_50_Template, 6, 3, "vdk-form-section-container", 27);
i0.ɵɵelementStart(51, "vdk-form-section-container", 28)(52, "div", 29);
i0.ɵɵtext(53, " Source location ");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(54, "div", 9)(55, "div", 30);
i0.ɵɵpipe(56, "extractJobStatus");
i0.ɵɵtemplate(57, DataJobDetailsPageComponent_ng_container_2_div_57_Template, 3, 0, "div", 31);
i0.ɵɵtemplate(58, DataJobDetailsPageComponent_ng_container_2_div_58_Template, 3, 2, "div", 32);
i0.ɵɵelementEnd()()()()();
i0.ɵɵelementStart(59, "div", 33)(60, "form", 6)(61, "vdk-form-section-container", 34)(62, "div", 35);
i0.ɵɵtext(63, " Notifications ");
i0.ɵɵelementStart(64, "clr-signpost");
i0.ɵɵtemplate(65, DataJobDetailsPageComponent_ng_container_2_clr_signpost_content_65_Template, 2, 1, "clr-signpost-content", 36);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(66, "div", 9)(67, "div", 37)(68, "span", 38);
i0.ɵɵtext(69, "On Job Deployed");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(70, "div", 39)(71, "div", 40);
i0.ɵɵtemplate(72, DataJobDetailsPageComponent_ng_container_2_ng_container_72_Template, 5, 7, "ng-container", 25);
i0.ɵɵpipe(73, "extractContacts");
i0.ɵɵtemplate(74, DataJobDetailsPageComponent_ng_container_2_div_74_Template, 6, 3, "div", 41);
i0.ɵɵpipe(75, "extractContacts");
i0.ɵɵtemplate(76, DataJobDetailsPageComponent_ng_container_2_em_76_Template, 2, 0, "em", 25);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(77, "div", 37)(78, "label", 42);
i0.ɵɵtext(79, "On Platform Error");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(80, "div", 39)(81, "div", 43);
i0.ɵɵtemplate(82, DataJobDetailsPageComponent_ng_container_2_ng_container_82_Template, 5, 7, "ng-container", 25);
i0.ɵɵpipe(83, "extractContacts");
i0.ɵɵtemplate(84, DataJobDetailsPageComponent_ng_container_2_div_84_Template, 6, 3, "div", 41);
i0.ɵɵpipe(85, "extractContacts");
i0.ɵɵtemplate(86, DataJobDetailsPageComponent_ng_container_2_em_86_Template, 2, 0, "em", 25);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(87, "div", 37)(88, "label", 44);
i0.ɵɵtext(89, "On User Error");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(90, "div", 39)(91, "div", 45);
i0.ɵɵtemplate(92, DataJobDetailsPageComponent_ng_container_2_ng_container_92_Template, 5, 7, "ng-container", 25);
i0.ɵɵpipe(93, "extractContacts");
i0.ɵɵtemplate(94, DataJobDetailsPageComponent_ng_container_2_div_94_Template, 6, 3, "div", 41);
i0.ɵɵpipe(95, "extractContacts");
i0.ɵɵtemplate(96, DataJobDetailsPageComponent_ng_container_2_em_96_Template, 2, 0, "em", 25);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(97, "div", 37)(98, "label", 46);
i0.ɵɵtext(99, "On Job Success");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(100, "div", 39)(101, "div", 47);
i0.ɵɵtemplate(102, DataJobDetailsPageComponent_ng_container_2_ng_container_102_Template, 5, 7, "ng-container", 25);
i0.ɵɵpipe(103, "extractContacts");
i0.ɵɵtemplate(104, DataJobDetailsPageComponent_ng_container_2_div_104_Template, 6, 3, "div", 41);
i0.ɵɵpipe(105, "extractContacts");
i0.ɵɵtemplate(106, DataJobDetailsPageComponent_ng_container_2_em_106_Template, 2, 0, "em", 25);
i0.ɵɵelementEnd()()()();
i0.ɵɵelementStart(107, "div", 11)(108, "clr-textarea-container")(109, "label", 48);
i0.ɵɵtext(110, "On Job deploy");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(111, "textarea", 49);
i0.ɵɵtext(112);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(113, "clr-textarea-container")(114, "label", 50);
i0.ɵɵtext(115, "On Job Platform error");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(116, "textarea", 51);
i0.ɵɵtext(117);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(118, "clr-textarea-container")(119, "label", 52);
i0.ɵɵtext(120, "On User error");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(121, "textarea", 53);
i0.ɵɵtext(122);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(123, "clr-textarea-container")(124, "label", 54);
i0.ɵɵtext(125, "On Job success");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(126, "textarea", 55);
i0.ɵɵtext(127);
i0.ɵɵelementEnd()();
i0.ɵɵelement(128, "input", 15);
i0.ɵɵelementEnd()()()()();
i0.ɵɵelementStart(129, "div", 4)(130, "div", 56)(131, "h5");
i0.ɵɵtext(132, " Last 5 Executions ");
i0.ɵɵelementStart(133, "button", 57);
i0.ɵɵlistener("click", function DataJobDetailsPageComponent_ng_container_2_Template_button_click_133_listener() { i0.ɵɵrestoreView(_r60); const ctx_r64 = i0.ɵɵnextContext(); return ctx_r64.loadJobExecutions(); });
i0.ɵɵelement(134, "clr-icon", 58);
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(135, DataJobDetailsPageComponent_ng_container_2_div_135_Template, 4, 0, "div", 25);
i0.ɵɵtemplate(136, DataJobDetailsPageComponent_ng_container_2_lib_executions_timeline_136_Template, 2, 5, "lib-executions-timeline", 59);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(137, DataJobDetailsPageComponent_ng_container_2_div_137_Template, 3, 0, "div", 60);
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(3);
i0.ɵɵproperty("formGroup", ctx_r0.tmForm);
i0.ɵɵadvance(1);
i0.ɵɵproperty("isSubmitEnabled", ctx_r0.isStatusSubmitEnabled())("formState", i0.ɵɵpipeBind1(5, 44, ctx_r0.jobState == null ? null : ctx_r0.jobState.deployments) === "Not Deployed" ? ctx_r0.readFormState : ctx_r0.formState)("canEditSection", ctx_r0.canEditSection);
i0.ɵɵadvance(5);
i0.ɵɵproperty("jobDeployments", ctx_r0.jobState == null ? null : ctx_r0.jobState.deployments);
i0.ɵɵadvance(12);
i0.ɵɵproperty("isSubmitEnabled", ctx_r0.isDescriptionSubmitEnabled())("formState", ctx_r0.loadingInProgress ? ctx_r0.readFormState : ctx_r0.formState)("canEditSection", ctx_r0.canEditSection);
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngIf", ctx_r0.showFullDescription && ctx_r0.description.value);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r0.showFullDescription && ctx_r0.description.value);
i0.ɵɵadvance(4);
i0.ɵɵtextInterpolate(ctx_r0.description.value);
i0.ɵɵadvance(2);
i0.ɵɵproperty("formState", ctx_r0.readFormState);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate1("", ctx_r0.jobPythonVersion.value, " ");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.shouldShowTeamsSection);
i0.ɵɵadvance(1);
i0.ɵɵproperty("formState", ctx_r0.readFormState);
i0.ɵɵadvance(4);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(44, 46, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.schedule == null ? null : ctx_r0.jobDetails.config.schedule.schedule_cron, "Not scheduled"), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.schedule == null ? null : ctx_r0.jobDetails.config.schedule.schedule_cron);
i0.ɵɵadvance(3);
i0.ɵɵpropertyInterpolate("value", ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.schedule == null ? null : ctx_r0.jobDetails.config.schedule.schedule_cron);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.shouldShowChangeHistorySection && ctx_r0.changeHistoryConfig && !!ctx_r0.jobState);
i0.ɵɵadvance(1);
i0.ɵɵproperty("formState", ctx_r0.readFormState);
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngSwitch", i0.ɵɵpipeBind1(56, 49, ctx_r0.jobState == null ? null : ctx_r0.jobState.deployments));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngSwitchCase", ctx_r0.dataJobStatusEnum.NOT_DEPLOYED);
i0.ɵɵadvance(3);
i0.ɵɵproperty("formGroup", ctx_r0.tmForm);
i0.ɵɵadvance(1);
i0.ɵɵproperty("formState", ctx_r0.readFormState);
i0.ɵɵadvance(11);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(73, 51, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_deploy).length > 0);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(75, 53, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_deploy).length > 3);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.showNoNotificationsLabel(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_deploy));
i0.ɵɵadvance(6);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(83, 55, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_platform_error).length > 0);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(85, 57, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_platform_error).length > 3);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.showNoNotificationsLabel(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_platform_error));
i0.ɵɵadvance(6);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(93, 59, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_user_error).length > 0);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(95, 61, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_user_error).length > 3);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.showNoNotificationsLabel(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_user_error));
i0.ɵɵadvance(6);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(103, 63, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_success).length > 0);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(105, 65, ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_success).length > 3);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r0.showNoNotificationsLabel(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_success));
i0.ɵɵadvance(6);
i0.ɵɵtextInterpolate(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_deploy);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_platform_error);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_failure_user_error);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(ctx_r0.jobDetails == null ? null : ctx_r0.jobDetails.config == null ? null : ctx_r0.jobDetails.config.contacts == null ? null : ctx_r0.jobDetails.config.contacts.notified_on_job_success);
i0.ɵɵadvance(6);
i0.ɵɵproperty("disabled", ctx_r0.isJobRunning());
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", !ctx_r0.loadingExecutions && !ctx_r0.jobExecutions.length && !ctx_r0.next);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r0.loadingExecutions);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.loadingExecutions);
} }
function DataJobDetailsPageComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "shared-placeholder", 81);
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵproperty("plural", true)("errorsQueue", ctx_r2.errors.records)("listenForErrorPatterns", ctx_r2.listenForErrorPatterns);
} }
export class DataJobDetailsPageComponent extends TaurusBaseComponent {
constructor(componentService, navigationService, activatedRoute, router, routerService, dataJobsService, dataJobsApiService, formBuilder, toastService, errorHandlerService, urlOpenerService, dataPipelinesModuleConfig) {
super(componentService, navigationService, activatedRoute);
this.router = router;
this.routerService = routerService;
this.dataJobsService = dataJobsService;
this.dataJobsApiService = dataJobsApiService;
this.formBuilder = formBuilder;
this.toastService = toastService;
this.errorHandlerService = errorHandlerService;
this.urlOpenerService = urlOpenerService;
this.dataPipelinesModuleConfig = dataPipelinesModuleConfig;
this.uuid = 'DataJobDetailsPageComponent';
this.dataJobStatusEnum = DataJobStatus;
this.jobExecutions = [];
this.isJobEditable = false;
/**
* ** Flag instruct whether template to show team section.
*/
this.shouldShowTeamsSection = false;
/**
* ** Flag instruct whether template to show change history section.
*/
this.shouldShowChangeHistorySection = false;
this.cronError = null;
this.loadingExecutions = true;
this.loadingInProgress = true;
this.allowExecutionsByDeployment = false;
this.canEditSection = true;
this.showFullDescription = false;
this.descriptionWordsBeforeTruncate = 12;
/**
* ** Array of error code patterns that component should listen for in errors store.
*/
this.listenForErrorPatterns = [LOAD_JOB_ERROR_CODES[TASK_LOAD_JOB_STATE].All, LOAD_JOB_ERROR_CODES[TASK_LOAD_JOB_DETAILS].All];
/**
* ** Flag that indicates there is jobs executions load error.
*/
this.isComponentInErrorState = false;
this.formState = new VdkFormState(FORM_STATE.VIEW);
this.readFormState = new VdkFormState(FORM_STATE.VIEW);
this.editableFormState = new VdkFormState(FORM_STATE.CAN_EDIT);
this.confirmationOptions = new ConfirmationModalOptions();
this.deleteOptions = new DeleteModalOptions();
this.executeNowOptions = new ConfirmationModalOptions();
this._initForm();
}
get name() {
return this.tmForm.get('name');
}
get team() {
return this.tmForm.get('team');
}
get status() {
return this.tmForm.get('status');
}
get description() {
return this.tmForm.get('description');
}
get jobPythonVersion() {
return this.tmForm.get('jobPythonVersion');
}
isDescriptionSubmitEnabled() {
return this._isFormSubmitEnabled() && this.description.value !== this.jobDetails.description;
}
isStatusSubmitEnabled() {
return this._isFormSubmitEnabled() && this.status.value !== ExtractJobStatusPipe.transform(this.jobState?.deployments);
}
isJobRunning() {
return DataJobUtil.isJobRunning(this.jobExecutions);
}
showNoNotificationsLabel(notifications) {
return !notifications || notifications.length < 1;
}
sectionStateChange(sectionState) {
if (sectionState.state === FORM_STATE.CAN_EDIT) {
switch (sectionState.emittingSection) {
case 'status':
this.status.setValue(ExtractJobStatusPipe.transform(this.jobState?.deployments));
break;
case 'description':
this.description.setValue(this.jobDetails.description);
break;
default:
break;
}
this.canEditSection = true;
}
else if (sectionState.state === FORM_STATE.SUBMIT) {
this.submitForm(sectionState);
}
else if (sectionState.state === FORM_STATE.EDIT) {
this.canEditSection = false;
}
}
submitForm(event) {
if (event.emittingSection === 'description' && this.isDescriptionSubmitEnabled()) {
this._doSubmitDescriptionUpdate();
}
if (event.emittingSection === 'status' && this.isStatusSubmitEnabled()) {
this._doSubmitStatusUpdate();
}
}
editOperationEnded() {
this.formState = new VdkFormState(FORM_STATE.CAN_EDIT);
this.canEditSection = true;
}
loadJobExecutions() {
this.dataJobsService.loadJobExecutions(this.model);
}
redirectToHealthStatus() {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.router.navigateByUrl(StringUtil.stringFormat(this.dataPipelinesModuleConfig.healthStatusUrl, this.jobDetails.job_name)).then();
}
/**
* ** Intercepts click on change history link and show confirmation.
*/
navigateToJobChangeHistory($event) {
$event.preventDefault();
$event.stopImmediatePropagation();
this.urlOpenerService
.open(this.changeHistoryConfig.urlTemplate, '_blank', {
title: this.changeHistoryConfig.confirmationTitle,
messageComponent: this.changeHistoryConfig.confirmationMessageComponent,
closable: true,
optionDoNotShowFutureConfirmation: true,
confirmBtnModel: {
text: 'Proceed',
iconShape: 'pop-out',
iconPosition: 'right'
}
})
.then((_value) => {
// No-op.
})
.catch((_reason) => {
// No-op.
});
}
/**
* @inheritDoc
*/
onModelInit() {
this.routerService
.getState()
.pipe(take(1))
.subscribe((routeState) => this._initialize(routeState));
}
/**
* @inheritDoc
*/
onModelLoad(model, task) {
if (task === TASK_LOAD_JOB_EXECUTIONS) {
this.loadingExecutions = false;
}
else if (task === TASK_LOAD_JOB_DETAILS) {
this.loadingInProgress = false;
}
}
/**
* @inheritDoc
*/
onModelChange(model, task) {
if (task === TASK_LOAD_JOB_STATE) {
this.jobState = model.getComponentState().data.get(JOB_STATE_DATA_KEY);
this._initializeNextRunDate();
this.allowExecutionsByDeployment = ExtractJobStatusPipe.transform(this.jobState?.deployments) !== DataJobStatus.NOT_DEPLOYED;
this.cronError = CronUtil.getNextExecutionErrors(this.jobState?.config?.schedule?.scheduleCron);
return;
}
if (task === TASK_LOAD_JOB_DETAILS) {
this.jobDetails = model.getComponentState().data.get(JOB_DETAILS_DATA_KEY);
this._updateForm();
return;
}
if (task === TASK_LOAD_JOB_EXECUTIONS) {
const executions = model.getComponentState().data.get(JOB_EXECUTIONS_DATA_KEY);
if (executions) {
this.dataJobsService.notifyForJobExecutions([...executions]);
// eslint-disable-next-line @typescript-eslint/unbound-method
const runningExecution = executions.find(DataJobUtil.isJobRunningPredicate);
if (runningExecution) {
this.dataJobsService.notifyForRunningJobExecutionId(runningExecution.id);
}
}
return;
}
if (task === TASK_UPDATE_JOB_DESCRIPTION) {
this.toastService.show({
type: VmwToastType.INFO,
title: `Description update completed`,
description: `Data job "${this.jobName}" description successfully updated`
});
this.jobDetails = model.getComponentState().data.get(JOB_DETAILS_DATA_KEY);
this.editOperationEnded();
return;
}
if (task === TASK_UPDATE_JOB_STATUS) {
this.toastService.show({
type: VmwToastType.INFO,
title: `Status update completed`,
description: `Data job "${this.jobName}" successfully ` + `${!this._extractJobDeployment()?.enabled ? 'enabled' : 'disabled'}`
});
this.jobState = model.getComponentState().data.get(JOB_STATE_DATA_KEY);
this.editOperationEnded();
}
}
/**
* @inheritDoc
*/
onModelError(model, task, newErrorRecords) {
newErrorRecords.forEach((errorRecord) => {
const error = ErrorUtil.extractError(errorRecord.error);
let errorHandlerConfig;
switch (task) {
case TASK_LOAD_JOB_DETAILS:
this._resetJobDetails();
break;
case TASK_LOAD_JOB_EXECUTIONS:
// No-op.
break;
case TASK_LOAD_JOB_STATE:
// No-op.
break;
case TASK_UPDATE_JOB_DESCRIPTION:
errorHandlerConfig = {
title: 'Description update failed'
};
this.editOperationEnded();
break;
case TASK_UPDATE_JOB_STATUS:
errorHandlerConfig = {
title: 'Status update failed'
};
this.editOperationEnded();
break;
default:
// No-op.
}
this.errorHandlerService.processError(error, errorHandlerConfig);
});
}
/**
* @inheritDoc
*/
ngOnInit() {
// attach listener to ErrorStore and listen for Errors change
this.errors.onChange((store) => {
// if there is record for listened error code patterns set component in error state
this.isComponentInErrorState = store.hasCodePattern(...this.listenForErrorPatterns);
});
super.ngOnInit();
this._initializeNextRunDate();
}
_initialize(state) {
const teamParamKey = state.getData('teamParamKey');
this.teamName = state.getParam(teamParamKey);
if (CollectionsUtil.isNil(teamParamKey) || CollectionsUtil.isNil(this.teamName)) {
this._subscribeForImplicitTeam();
}
const jobParamKey = state.getData('jobParamKey');
this.jobName = state.getParam(jobParamKey);
this.isJobEditable = !!state.getData('editable');
if (this.isJobEditable) {
this.formState = this.editableFormState;
}
if (this.dataPipelinesModuleConfig) {
this._initializePageFeatureFlags(state);
this._initializeChangeHistoryConfig();
}
this._subscribeForExecutions();
this.dataJobsService.loadJob(this.model
.withRequestParam(TEAM_NAME_REQ_PARAM, this.teamName)
.withRequestParam(JOB_NAME_REQ_PARAM, this.jobName)
.withRequestParam(ORDER_REQ_PARAM, {
property: 'startTime',
direction: ASC
}));
}
_subscribeForImplicitTeam() {
this.dataJobsService
.getNotifiedForTeamImplicitly()
.pipe(take(1))
.subscribe((teamName) => (this.teamName = teamName));
}
_extractJobDeployment() {
if (!this.jobState?.deployments) {
return null;
}
return this.jobState?.deployments[this.jobState?.deployments.length - 1];
}
_isFormSubmitEnabled() {
return !this.tmForm?.pristine && this.tmForm?.valid;
}
_initForm() {
this.tmForm = this.formBuilder.group({
name: '',
team: '',
status: '',
description: '',
jobPythonVersion: ''
});
}
_updateForm() {
this.tmForm.setValue({
name: this.jobDetails.job_name,
team: this.jobDetails.team,
status: ExtractJobStatusPipe.transform(this.jobState?.deployments),
description: this.jobDetails.description,
jobPythonVersion: this.jobState?.deployments && this.jobState?.deployments[0] ? this.jobState?.deployments[0]?.jobPythonVersion : ''
});
}
_doSubmitDescriptionUpdate() {
const jobDetailsUpdated = {
...this.jobDetails,
description: this.description.value
};
this.dataJobsService.updateJob(this.model
.withRequestParam(TEAM_NAME_REQ_PARAM, jobDetailsUpdated.team)
.withRequestParam(JOB_NAME_REQ_PARAM, jobDetailsUpdated.job_name)
.withRequestParam(JOB_DETAILS_REQ_PARAM, jobDetailsUpdated), TASK_UPDATE_JOB_DESCRIPTION);
}
_doSubmitStatusUpdate() {
const jobDeployment = this._extractJobDeployment();
if (!jobDeployment) {
console.log('Status update will not be performed for job with no deployments.');
return;
}
const jobState = {
...this.jobState,
deployments: [
{
...this.jobState.deployments[0],
enabled: this.status.value === DataJobStatus.ENABLED
},
...this.jobState.deployments.slice(1)
]
};
this.dataJobsService.updateJob(this.model
.withRequestParam(TEAM_NAME_REQ_PARAM, this.jobDetails.team)
.withRequestParam(JOB_NAME_REQ_PARAM, this.jobDetails.job_name)
.withRequestParam(JOB_DEPLOYMENT_ID_REQ_PARAM, jobDeployment.id)
.withRequestParam(JOB_STATUS_REQ_PARAM, this.status.value === DataJobStatus.ENABLED)
.withRequestParam(JOB_STATE_REQ_PARAM, jobState), TASK_UPDATE_JOB_STATUS);
}
_initializeNextRunDate() {
this.next = ParseEpochPipe.transform(this.jobState?.config?.schedule?.nextRunEpochSeconds);
}
_initializePageFeatureFlags(state) {
if (state.getData('context') === 'explore') {
if (this.dataPipelinesModuleConfig.exploreConfig) {
this.shouldShowTeamsSection = this.dataPipelinesModuleConfig.exploreConfig.showTeamSectionInJobDetails;
this.shouldShowChangeHistorySection = this.dataPipelinesModuleConfig.exploreConfig.showChangeHistorySectionInJobDetails;
}
}
else {
if (this.dataPipelinesModuleConfig.manageConfig) {
this.shouldShowTeamsSection = this.dataPipelinesModuleConfig.manageConfig.showTeamSectionInJobDetails;
this.shouldShowChangeHistorySection = this.dataPipelinesModuleConfig.manageConfig.showChangeHistorySectionInJobDetails;
}
}
}
_initializeChangeHistoryConfig() {
if (!this.shouldShowChangeHistorySection ||
!this.dataPipelinesModuleConfig.changeHistory ||
!this.dataPipelinesModuleConfig.changeHistory.urlTemplate ||
!this.dataPipelinesModuleConfig.changeHistory.confirmationTitle) {
return;
}
this.changeHistoryConfig = {
...this.dataPipelinesModuleConfig.changeHistory,
urlTemplate: CollectionsUtil.interpolateString(this.dataPipelinesModuleConfig.changeHistory.urlTemplate, {
searchValue: '%data_job_name%',
replaceValue: this.jobName
})
};
}
_subscribeForExecutions() {
this.subscriptions.push(this.dataJobsService.getNotifiedForJobExecutions().subscribe((executions) => {
this.jobExecutions = executions;
}));
}
_resetJobDetails() {
if (!this.jobDetails) {
this.jobDetails = {};
}
}
}
DataJobDetailsPageComponent.ɵfac = function DataJobDetailsPageComponent_Factory(t) { return new (t || DataJobDetailsPageComponent)(i0.ɵɵdirectiveInject(i1.ComponentService), i0.ɵɵdirectiveInject(i1.NavigationService), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i1.RouterService), i0.ɵɵdirectiveInject(i3.DataJobsService), i0.ɵɵdirectiveInject(i3.DataJobsApiService), i0.ɵɵdirectiveInject(i4.FormBuilder), i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i1.ErrorHandlerService), i0.ɵɵdirectiveInject(i1.UrlOpenerService), i0.ɵɵdirectiveInject(DATA_PIPELINES_CONFIGS)); };
DataJobDetailsPageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataJobDetailsPageComponent, selectors: [["lib-data-job-details-page"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 2, consts: [["id", "data-job-details-page", 1, "page-container", "data-pipelines-job__details-page"], [1, "data-pipelines-job__details-body"], [4, "ngIf", "ngIfElse"], ["errorTemplate", ""], [1, "clr-row"], [1, "clr-col-6"], [1, "clr-form", 2, "padding-top", "0", 3, "formGroup"], ["data-cy", "data-pipelines-data-job-details-status", "sectionName", "status", 1, "p-header-section", 3, "isSubmitEnabled", "formState", "canEditSection", "submitForm", "sectionStateChange"], [1, "section-title", 2, "width", "2.8rem"], [1, "form-section-readonly"], [3, "jobDeployments"], [1, "form-section-edit"], ["clrInline", ""], ["clrRadio", "", "checked", "", "type", "radio", "name", "status", "value", "Enabled", "formControlName", "status", "data-cy", "data-pipelines-data-job-details-status-enable"], ["clrRadio", "", "type", "radio", "name", "status", "value", "Disabled", "formControlName", "status", "data-cy", "data-pipelines-data-job-details-status-disable"], ["type", "submit", 1, "modal-submit"], ["data-cy", "data-pipelines-data-job-details-description", "sectionName", "description", 1, "p-header-section", 3, "isSubmitEnabled", "formState", "canEditSection", "submitForm", "sectionStateChange"], ["data-cy", "description-show-less", 4, "ngIf"], ["data-cy", "data-pipelines-job-details-description", 4, "ngIf"], ["clrTextarea", "", "formControlName", "description", "name", "description", 1, "w-100"], ["data-cy", "data-pipelines-data-job-details-python-version", "sectionName", "jobPythonVersion", 1, "p-header-section", 3, "formState"], [1, "section-title", 2, "width", "7rem"], ["data-cy", "team-form-field", "class", "p-header-section", "sectionName", "team", 3, "formState", 4, "ngIf"], ["data-cy", "data-pipelines-data-job-details-schedule", "sectionName", "schedule", 1, "p-header-section", 3, "formState"], ["data-cy", "data-pipelines-job-details-schedule", 1, "form-section-readonly"], [4, "ngIf"], ["type", "text", "clrTextarea", "", "name", "schedule", 1, "w-100", 3, "value"], ["class", "p-header-section", "sectionName", "change_history", 3, "formState", 4, "ngIf"], ["sectionName", "source_url", 1, "p-header-section", 3, "formState"], [1, "section-title", 2, "width", "5.5rem"], [3, "ngSwitch"], [4, "ngSwitchCase"], [4, "ngSwitchDefault"], [1, "clr-col-6", "data-pipelines-job__section--border-none"], [1, "p-header-section", 3, "formState"], [1, "section-title", 2, "width", "6.2rem"], [3, "clrPosition", 4, "clrIfOpen"], [1, "clr-form-control"], ["for", "onJobDeployed", 1, "clr-control-label"], [1, "clr-control-container"], ["id", "onJobDeployed", "data-cy", "data-pipelines-job-details-on-deployed", 1, "data-pipelines-job__contacts-container"], ["class", "data-pipelines-job__contacts-list-signpost-container", 4, "ngIf"], ["for", "onPlatformError", 1, "clr-control-label"], ["id", "onPlatformError", "data-cy", "data-pipelines-job-details-on-platform-error", 1, "data-pipelines-job__contacts-container"], ["for", "onUserError", 1, "clr-control-label"], ["id", "onUserError", "data-cy", "data-pipelines-job-details-on-user-error", 1, "data-pipelines-job__contacts-container"], ["for", "onJobSuccess", 1, "clr-control-label"], ["id", "onJobSuccess", "data-cy", "data-pipelines-job-details-on-success", 1, "data-pipelines-job__contacts-container"], ["for", "onPlatformErrorTextArea"], ["id", "onPlatformErrorTextArea", "clrTextarea", "", "name", "onPlatformErrorTextArea", 1, "w-100"], ["for", "onJobDeployTextArea"], ["id", "onJobDeployTextArea", "clrTextarea", "", "name", "onJobDeployTextArea", 1, "w-100"], ["for", "onUserErrorTextArea"], ["id", "onUserErrorTextArea", "clrTextarea", "", "name", "onUserErrorTextArea", 1, "w-100"], ["for", "onJobSuccessTextArea"], ["id", "onJobSuccessTextArea", "clrTextarea", "", "name", "onJobSuccessTextArea", 1, "w-100"], [1, "clr-col-12"], ["title", "Refresh execution info", 1, "btn", "btn-link", "btn-sm", 2, "display", "contents", 3, "disabled", "click"], ["size", "23", "shape", "refresh"], [3, "jobExecutions", "showErrorMessage", "next", 4, "ngIf"], ["class", "clr-col-12", 4, "ngIf"], ["data-cy", "description-show-less"], [1, "btn", "btn-link", "btn-sm", "btn-show-more", 3, "click"], ["data-cy", "data-pipelines-job-details-description"], ["class", "btn btn-link btn-sm btn-show-more", "data-cy", "description-show-more", 3, "click", 4, "ngIf"], ["data-cy", "description-show-more", 1, "btn", "btn-link", "btn-sm", "btn-show-more", 3, "click"], ["data-cy", "team-form-field", "sectionName", "team", 1, "p-header-section", 3, "formState"], [1, "section-title", 2, "width", "4.8rem"], ["data-cy", "data-pipelines-job-details-team", "class", "label label-light-blue tag", 3, "routerLink", 4, "ngIf"], ["data-cy", "data-pipelines-job-details-team", 1, "label", "label-light-blue", "tag", 3, "routerLink"], [1, "label-link", "label-link-suppress-decoration"], [3, "clrPosition"], [4, "ngFor", "ngForOf"], ["sectionName", "change_history", 1, "p-header-section", 3, "formState"], ["target", "_blank", "rel", "noopener", 1, "label-link", 3, "href", "click"], ["target", "_blank", "rel", "noopener", 1, "label-link", 3, "href"], [1, "data-pipelines-job__contacts-list-container"], [1, "data-pipelines-job__contacts-list-signpost-container"], ["clrSignpostTrigger", "", 1, "btn", "btn-link"], [3, "jobExecutions", "showErrorMessage", "next"], [1, "loading-title"], ["errorContext", "Data Job Details", 3, "plural", "errorsQueue", "listenForErrorPatterns"]], template: function DataJobDetailsPageComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
i0.ɵɵtemplate(2, DataJobDetailsPageComponent_ng_container_2_Template, 138, 67, "ng-container", 2);
i0.ɵɵtemplate(3, DataJobDetailsPageComponent_ng_template_3_Template, 1, 3, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const _r1 = i0.ɵɵreference(4);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", !ctx.isComponentInErrorState)("ngIfElse", _r1);
} }, directives: [i5.NgIf, i4.ɵNgNoValidate, i4.NgControlStatusGroup, i4.FormGroupDirective, i1.VdkFormSectionContainerComponent, i6.StatusPanelComponent, i7.ClrRadioContainer, i7.ClrRadioWrapper, i4.RadioControlValueAccessor, i4.DefaultValueAccessor, i7.ClrRadio, i4.NgControlStatus, i4.FormControlName, i7.ClrLabel, i7.ClrTextareaContainer, i7.ClrTextarea, i2.RouterLink, i7.ClrSignpost, i7.ClrIfOpen, i7.ClrSignpostContent, i5.NgForOf, i5.NgSwitch, i5.NgSwitchCase, i5.NgSwitchDefault, i7.ClrSignpostTrigger, i7.ClrIconCustomTag, i8.ExecutionsTimelineComponent, i1.PlaceholderComponent], pipes: [i9.ExtractJobStatusPipe, i10.TruncateWordsPipe, i11.FormatSchedulePipe, i5.DatePipe, i12.ParseNextRunPipe, i13.ExtractContactsPipe, i5.SlicePipe], styles: ["hr[_ngcontent-%COMP%]{border:0;height:1px;background:#8f9ba3}.label-link[_ngcontent-%COMP%]{cursor:pointer}.label-link-suppress-decoration[_ngcontent-%COMP%]:hover{text-decoration:none} .edit-column-modal .modal-header{padding:0!important} .clr-timeline-horizontal{padding-top:0!important}.status-icon-enabled[_ngcontent-%COMP%]{color:#5aa220}.clr-col-6[_ngcontent-%COMP%]{border-right:1px solid #999999}.placeholder-error-label[_ngcontent-%COMP%]{color:gray}.grid-column-details[_ngcontent-%COMP%]{display:grid;height:100%;grid-template:\"a a a b b b\" auto \"c c c c c c\" auto \"d d d d d d\" auto \"f f f f f f\" auto/1fr 1fr 1fr 1fr 1fr 1fr}.grid-column-details[_ngcontent-%COMP%] .grid-area-a[_ngcontent-%COMP%]{grid-area:a}.grid-column-details[_ngcontent-%COMP%] .grid-area-b[_ngcontent-%COMP%]{grid-area:b}.grid-column-details[_ngcontent-%COMP%] .grid-area-c[_ngcontent-%COMP%]{grid-area:c}.grid-column-details[_ngcontent-%COMP%] .grid-area-d[_ngcontent-%COMP%]{grid-area:d}.grid-column-details[_ngcontent-%COMP%] .grid-area-e[_ngcontent-%COMP%]{grid-area:e}.grid-column-details[_ngcontent-%COMP%] .grid-area-f[_ngcontent-%COMP%]{grid-area:f}.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}.btn-show-more[_ngcontent-%COMP%]{padding:0!important}[_nghost-%COMP%]{display:flex;flex-direction:column;flex:1 1 auto}.data-pipelines-job__details-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1 1 auto}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1 1 auto;margin-bottom:1rem}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .form-section-readonly[_ngcontent-%COMP%]{word-break:break-word}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__section--border-none[_ngcontent-%COMP%]{border:none}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%]{display:flex;align-items:center}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%] .data-pipelines-job__contacts-list-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%] .data-pipelines-job__contacts-list-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:inline-flex;margin-right:.3rem}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%] .data-pipelines-job__contacts-list-container[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]:last-child{margin-right:0}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%] .data-pipelines-job__contacts-list-signpost-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center}.data-pipelines-job__details-page[_ngcontent-%COMP%] .data-pipelines-job__details-body[_ngcontent-%COMP%] .data-pipelines-job__contacts-container[_ngcontent-%COMP%] .data-pipelines-job__contacts-list-signpost-container[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{list-style-type:none}"] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobDetailsPageComponent, [{
type: Component,
args: [{ selector: 'lib-data-job-details-page', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<!-- eslint-disable @angular-eslint/template/no-call-expression,@angular-eslint/template/cyclomatic-complexity -->\n\n<div\n id=\"data-job-details-page\"\n class=\"page-container data-pipelines-job__details-page\"\n>\n <div class=\"data-pipelines-job__details-body\">\n <ng-container *ngIf=\"!isComponentInErrorState; else errorTemplate\">\n <div class=\"clr-row\">\n <div class=\"clr-col-6\">\n <form\n [formGroup]=\"tmForm\"\n class=\"clr-form\"\n style=\"padding-top: 0\"\n >\n <vdk-form-section-container\n data-cy=\"data-pipelines-data-job-details-status\"\n class=\"p-header-section\"\n [isSubmitEnabled]=\"isStatusSubmitEnabled()\"\n [formState]=\"\n (jobState?.deployments | extractJobStatus) ===\n 'Not Deployed'\n ? readFormState\n : formState\n \"\n sectionName=\"status\"\n [canEditSection]=\"canEditSection\"\n (submitForm)=\"submitForm($event)\"\n (sectionStateChange)=\"sectionStateChange($event)\"\n >\n <div class=\"section-title\" style=\"width: 2.8rem\">\n Status\n </div>\n\n <div class=\"form-section-readonly\">\n <lib-status-panel\n [jobDeployments]=\"jobState?.deployments\"\n ></lib-status-panel>\n </div>\n\n <div class=\"form-section-edit\">\n <clr-radio-container clrInline>\n <clr-radio-wrapper>\n <input\n clrRadio\n checked\n type=\"radio\"\n name=\"status\"\n value=\"Enabled\"\n formControlName=\"status\"\n data-cy=\"data-pipelines-data-job-details-status-enable\"\n />\n <label>Enabled</label>\n </clr-radio-wrapper>\n <clr-radio-wrapper>\n <input\n clrRadio\n type=\"radio\"\n name=\"status\"\n value=\"Disabled\"\n formControlName=\"status\"\n data-cy=\"data-pipelines-data-job-details-status-disable\"\n />\n <label>Disabled</label>\n </clr-radio-wrapper>\n <input class=\"modal-submit\" type=\"submit\" />\n </clr-radio-container>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n data-cy=\"data-pipelines-data-job-details-description\"\n class=\"p-header-section\"\n [isSubmitEnabled]=\"isDescriptionSubmitEnabled()\"\n [formState]=\"\n loadingInProgress ? readFormState : formState\n \"\n sectionName=\"description\"\n [canEditSection]=\"canEditSection\"\n (submitForm)=\"submitForm($event)\"\n (sectionStateChange)=\"sectionStateChange($event)\"\n >\n <div class=\"section-title\" style=\"width: 2.8rem\">\n Description\n </div>\n\n <div class=\"form-section-readonly\">\n <span\n *ngIf=\"\n showFullDescription && description.value\n \"\n data-cy=\"description-show-less\"\n >{{ description.value }} <br />\n <button\n class=\"btn btn-link btn-sm btn-show-more\"\n (click)=\"showFullDescription = false\"\n >\n show less\n </button>\n </span>\n\n <span\n *ngIf=\"\n !showFullDescription &&\n description.value\n \"\n data-cy=\"data-pipelines-job-details-description\"\n >{{ description.value | words :\n descriptionWordsBeforeTruncate }}\n <button\n *ngIf=\"\n description.value?.split(' ')\n .length >\n descriptionWordsBeforeTruncate\n \"\n class=\"btn btn-link btn-sm btn-show-more\"\n data-cy=\"description-show-more\"\n (click)=\"showFullDescription = true\"\n >\n show more\n </button>\n </span>\n </div>\n\n <div class=\"form-section-edit\">\n <clr-textarea-container>\n <textarea\n clrTextarea\n class=\"w-100\"\n formControlName=\"description\"\n name=\"description\"\n >\n{{ description.value }}</textarea\n >\n <input class=\"modal-submit\" type=\"submit\" />\n </clr-textarea-container>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n data-cy=\"data-pipelines-data-job-details-python-version\"\n class=\"p-header-section\"\n sectionName=\"jobPythonVersion\"\n [formState]=\"readFormState\"\n >\n <div class=\"section-title\" style=\"width: 7rem\">\n Python version\n </div>\n\n <div class=\"form-section-readonly\">\n <span>{{ jobPythonVersion.value }} </span>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n *ngIf=\"shouldShowTeamsSection\"\n data-cy=\"team-form-field\"\n class=\"p-header-section\"\n sectionName=\"team\"\n [formState]=\"readFormState\"\n >\n <div class=\"section-title\" style=\"width: 4.8rem\">\n Owner team\n </div>\n <div class=\"form-section-readonly\">\n <span\n *ngIf=\"team.value\"\n data-cy=\"data-pipelines-job-details-team\"\n class=\"label label-light-blue tag\"\n [routerLink]=\"[\n '/explore/teams',\n team.value\n ]\"\n >\n <a\n class=\"label-link label-link-suppress-decoration\"\n >{{ team.value }}</a\n >\n </span>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n data-cy=\"data-pipelines-data-job-details-schedule\"\n class=\"p-header-section\"\n [formState]=\"readFormState\"\n sectionName=\"schedule\"\n >\n <div class=\"section-title\" style=\"width: 7rem\">\n Schedule (in UTC)\n </div>\n <div\n class=\"form-section-readonly\"\n data-cy=\"data-pipelines-job-details-schedule\"\n >\n {{ jobDetails?.config?.schedule?.schedule_cron |\n formatSchedule : \"Not scheduled\" }}\n\n <clr-signpost\n *ngIf=\"\n jobDetails?.config?.schedule\n ?.schedule_cron\n \"\n >\n <clr-signpost-content\n [clrPosition]=\"'left-middle'\"\n *clrIfOpen\n >\n <strong>Cron expression</strong><br />\n {{ jobDetails?.config?.schedule\n ?.schedule_cron }}\n <br />\n <br />\n <strong>Next 5 executions</strong>\n <ol *ngIf=\"!cronError\">\n <li\n *ngFor=\"\n let times of [1, 2, 3, 4, 5]\n \"\n >\n {{ jobDetails?.config?.schedule\n ?.schedule_cron | parseNextRun :\n times | date : \"MMM d, y, hh:mm\n a\" : \"UTC\" }} UTC\n </li>\n </ol>\n <em *ngIf=\"cronError\"\n ><br />{{ cronError }}</em\n >\n </clr-signpost-content>\n </clr-signpost>\n </div>\n\n <div class=\"form-section-edit\">\n <clr-textarea-container>\n <input\n type=\"text\"\n class=\"w-100\"\n clrTextarea\n name=\"schedule\"\n value=\"{{\n jobDetails?.config?.schedule\n ?.schedule_cron\n }}\"\n />\n <input class=\"modal-submit\" type=\"submit\" />\n </clr-textarea-container>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n *ngIf=\"shouldShowChangeHistorySection && changeHistoryConfig && !!jobState\"\n class=\"p-header-section\"\n [formState]=\"readFormState\"\n sectionName=\"change_history\"\n >\n <div class=\"section-title\" style=\"width: 5.5rem\">\n Change history\n </div>\n <div class=\"form-section-readonly\">\n <a\n class=\"label-link\"\n href=\"{{ changeHistoryConfig.urlTemplate }}\"\n target=\"_blank\"\n rel=\"noopener\"\n (click)=\"navigateToJobChangeHistory($event)\"\n >\n {{ changeHistoryConfig.urlTemplate }}\n </a>\n </div>\n </vdk-form-section-container>\n\n <vdk-form-section-container\n class=\"p-header-section\"\n [formState]=\"readFormState\"\n sectionName=\"source_url\"\n >\n <div class=\"section-title\" style=\"width: 5.5rem\">\n Source location\n </div>\n <div class=\"form-section-readonly\">\n <div\n [ngSwitch]=\"\n jobState?.deployments | extractJobStatus\n \"\n >\n <div\n *ngSwitchCase=\"\n dataJobStatusEnum.NOT_DEPLOYED\n \"\n >\n <em>The data job is not deployed</em>\n </div>\n <div *ngSwitchDefault>\n <a\n class=\"label-link\"\n href=\"{{\n jobState?.config?.sourceUrl\n }}\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n {{ jobState?.config?.sourceUrl }}\n </a>\n </div>\n </div>\n </div>\n </vdk-form-section-container>\n </form>\n </div>\n <div class=\"clr-col-6 data-pipelines-job__section--border-none\">\n <form\n [formGroup]=\"tmForm\"\n class=\"clr-form\"\n style=\"padding-top: 0\"\n >\n <vdk-form-section-container\n class=\"p-header-section\"\n [formState]=\"readFormState\"\n >\n <div class=\"section-title\" style=\"width: 6.2rem\">\n Notifications\n <clr-signpost>\n <clr-signpost-content\n [clrPosition]=\"'left-middle'\"\n *clrIfOpen\n >\n Notifications are used to inform the\n users about a specific activity. To\n configure notifications, edit data job's\n config.ini file and redeploy the data\n job.\n </clr-signpost-content>\n </clr-signpost>\n </div>\n\n <div class=\"form-section-readonly\">\n <div class=\"clr-form-control\">\n <span\n for=\"onJobDeployed\"\n class=\"clr-control-label\"\n >On Job Deployed</span\n >\n <div class=\"clr-control-container\">\n <div\n id=\"onJobDeployed\"\n class=\"data-pipelines-job__contacts-container\"\n data-cy=\"data-pipelines-job-details-on-deployed\"\n >\n <ng-container\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_deploy\n | extractContacts\n ).length > 0\n \"\n >\n <div\n class=\"data-pipelines-job__contacts-list-container\"\n >\n <div\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_deploy\n | extractContacts\n | slice : 0 : 3\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </div>\n </div>\n </ng-container>\n <div\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_deploy\n | extractContacts\n ).length > 3\n \"\n class=\"data-pipelines-job__contacts-list-signpost-container\"\n >\n <clr-signpost>\n <button\n class=\"btn btn-link\"\n clrSignpostTrigger\n >\n ...(+{{ (jobDetails\n ?.config?.contacts\n ?.notified_on_job_deploy\n | extractContacts\n ).length - 3 }})\n </button>\n <clr-signpost-content\n [clrPosition]=\"\n 'left-middle'\n \"\n *clrIfOpen\n >\n <ul>\n <li\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_deploy\n | extractContacts\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </li>\n </ul>\n </clr-signpost-content>\n </clr-signpost>\n </div>\n <em\n *ngIf=\"\n showNoNotificationsLabel(\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_deploy\n )\n \"\n >\n Not configured\n </em>\n </div>\n </div>\n </div>\n <div class=\"clr-form-control\">\n <label\n for=\"onPlatformError\"\n class=\"clr-control-label\"\n >On Platform Error</label\n >\n <div class=\"clr-control-container\">\n <div\n id=\"onPlatformError\"\n class=\"data-pipelines-job__contacts-container\"\n data-cy=\"data-pipelines-job-details-on-platform-error\"\n >\n <ng-container\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_platform_error\n | extractContacts\n ).length > 0\n \"\n >\n <div\n class=\"data-pipelines-job__contacts-list-container\"\n >\n <div\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_failure_platform_error\n | extractContacts\n | slice : 0 : 3\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </div>\n </div>\n </ng-container>\n <div\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_platform_error\n | extractContacts\n ).length > 3\n \"\n class=\"data-pipelines-job__contacts-list-signpost-container\"\n >\n <clr-signpost>\n <button\n class=\"btn btn-link\"\n clrSignpostTrigger\n >\n ...(+{{ (jobDetails\n ?.config?.contacts\n ?.notified_on_job_failure_platform_error\n | extractContacts\n ).length - 3 }})\n </button>\n <clr-signpost-content\n [clrPosition]=\"\n 'left-middle'\n \"\n *clrIfOpen\n >\n <ul>\n <li\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_failure_platform_error\n | extractContacts\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </li>\n </ul>\n </clr-signpost-content>\n </clr-signpost>\n </div>\n <em\n *ngIf=\"\n showNoNotificationsLabel(\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_platform_error\n )\n \"\n >\n Not configured\n </em>\n </div>\n </div>\n </div>\n <div class=\"clr-form-control\">\n <label\n for=\"onUserError\"\n class=\"clr-control-label\"\n >On User Error</label\n >\n <div class=\"clr-control-container\">\n <div\n id=\"onUserError\"\n class=\"data-pipelines-job__contacts-container\"\n data-cy=\"data-pipelines-job-details-on-user-error\"\n >\n <ng-container\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_user_error\n | extractContacts\n ).length > 0\n \"\n >\n <div\n class=\"data-pipelines-job__contacts-list-container\"\n >\n <div\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_failure_user_error\n | extractContacts\n | slice : 0 : 3\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </div>\n </div>\n </ng-container>\n <div\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_user_error\n | extractContacts\n ).length > 3\n \"\n class=\"data-pipelines-job__contacts-list-signpost-container\"\n >\n <clr-signpost>\n <button\n class=\"btn btn-link\"\n clrSignpostTrigger\n >\n ...(+{{ (jobDetails\n ?.config?.contacts\n ?.notified_on_job_failure_user_error\n | extractContacts\n ).length - 3 }})\n </button>\n <clr-signpost-content\n [clrPosition]=\"\n 'left-middle'\n \"\n *clrIfOpen\n >\n <ul>\n <li\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_failure_user_error\n | extractContacts\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </li>\n </ul>\n </clr-signpost-content>\n </clr-signpost>\n </div>\n <em\n *ngIf=\"\n showNoNotificationsLabel(\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_failure_user_error\n )\n \"\n >\n Not configured\n </em>\n </div>\n </div>\n </div>\n <div class=\"clr-form-control\">\n <label\n for=\"onJobSuccess\"\n class=\"clr-control-label\"\n >On Job Success</label\n >\n <div class=\"clr-control-container\">\n <div\n id=\"onJobSuccess\"\n class=\"data-pipelines-job__contacts-container\"\n data-cy=\"data-pipelines-job-details-on-success\"\n >\n <ng-container\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_success\n | extractContacts\n ).length > 0\n \"\n >\n <div\n class=\"data-pipelines-job__contacts-list-container\"\n >\n <div\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_success\n | extractContacts\n | slice : 0 : 3\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </div>\n </div>\n </ng-container>\n <div\n *ngIf=\"\n (\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_success\n | extractContacts\n ).length > 3\n \"\n class=\"data-pipelines-job__contacts-list-signpost-container\"\n >\n <clr-signpost>\n <button\n class=\"btn btn-link\"\n clrSignpostTrigger\n >\n ...(+{{ (jobDetails\n ?.config?.contacts\n ?.notified_on_job_success\n | extractContacts\n ).length - 3 }})\n </button>\n <clr-signpost-content\n [clrPosition]=\"\n 'left-middle'\n \"\n *clrIfOpen\n >\n <ul>\n <li\n *ngFor=\"\n let contacts of jobDetails\n ?.config\n ?.contacts\n ?.notified_on_job_success\n | extractContacts\n \"\n >\n <span\n >{{ contacts\n }}</span\n >\n </li>\n </ul>\n </clr-signpost-content>\n </clr-signpost>\n </div>\n <em\n *ngIf=\"\n showNoNotificationsLabel(\n jobDetails?.config\n ?.contacts\n ?.notified_on_job_success\n )\n \"\n >\n Not configured\n </em>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-section-edit\">\n <clr-textarea-container>\n <label for=\"onPlatformErrorTextArea\"\n >On Job deploy</label\n >\n <textarea\n id=\"onPlatformErrorTextArea\"\n class=\"w-100\"\n clrTextarea\n name=\"onPlatformErrorTextArea\"\n >\n{{\n jobDetails?.config?.contacts\n ?.notified_on_job_deploy\n }}</textarea\n >\n </clr-textarea-container>\n <clr-textarea-container>\n <label for=\"onJobDeployTextArea\"\n >On Job Platform error</label\n >\n <textarea\n id=\"onJobDeployTextArea\"\n class=\"w-100\"\n clrTextarea\n name=\"onJobDeployTextArea\"\n >\n{{\n jobDetails?.config?.contacts\n ?.notified_on_job_failure_platform_error\n }}</textarea\n >\n </clr-textarea-container>\n <clr-textarea-container>\n <label for=\"onUserErrorTextArea\"\n >On User error</label\n >\n <textarea\n id=\"onUserErrorTextArea\"\n class=\"w-100\"\n clrTextarea\n name=\"onUserErrorTextArea\"\n >\n{{\n jobDetails?.config?.contacts\n ?.notified_on_job_failure_user_error\n }}</textarea\n >\n </clr-textarea-container>\n <clr-textarea-container>\n <label for=\"onJobSuccessTextArea\"\n >On Job success</label\n >\n <textarea\n id=\"onJobSuccessTextArea\"\n class=\"w-100\"\n clrTextarea\n name=\"onJobSuccessTextArea\"\n >\n{{\n jobDetails?.config?.contacts\n ?.notified_on_job_success\n }}</textarea\n >\n </clr-textarea-container>\n <input class=\"modal-submit\" type=\"submit\" />\n </div>\n </vdk-form-section-container>\n </form>\n </div>\n </div>\n\n <div class=\"clr-row\">\n <div class=\"clr-col-12\">\n <h5>\n Last 5 Executions\n <button\n style=\"display: contents\"\n class=\"btn btn-link btn-sm\"\n (click)=\"loadJobExecutions()\"\n title=\"Refresh execution info\"\n [disabled]=\"isJobRunning()\"\n >\n <clr-icon size=\"23\" shape=\"refresh\"></clr-icon>\n </button>\n </h5>\n <div\n *ngIf=\"\n !loadingExecutions && !jobExecutions.length && !next\n \"\n >\n <br />\n <span>\n We couldn't find any executions, but you can always\n schedule one!\n </span>\n </div>\n <lib-executions-timeline\n *ngIf=\"!loadingExecutions\"\n [jobExecutions]=\"jobExecutions\"\n [showErrorMessage]=\"true\"\n [next]=\"\n (jobState?.deployments | extractJobStatus) ===\n 'Enabled'\n ? next\n : null\n \"\n ></lib-executions-timeline>\n </div>\n <div *ngIf=\"loadingExecutions\" class=\"clr-col-12\">\n <div class=\"loading-title\">Loading executions...</div>\n </div>\n </div>\n </ng-container>\n\n <ng-template #errorTemplate>\n <shared-placeholder\n errorContext=\"Data Job Details\"\n [plural]=\"true\"\n [errorsQueue]=\"errors.records\"\n [listenForErrorPatterns]=\"listenForErrorPatterns\"\n >\n </shared-placeholder>\n </ng-template>\n </div>\n</div>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */hr{border:0;height:1px;background:#8f9ba3}.label-link{cursor:pointer}.label-link-suppress-decoration:hover{text-decoration:none}::ng-deep .edit-column-modal .modal-header{padding:0!important}::ng-deep .clr-timeline-horizontal{padding-top:0!important}.status-icon-enabled{color:#5aa220}.clr-col-6{border-right:1px solid #999999}.placeholder-error-label{color:gray}.grid-column-details{display:grid;height:100%;grid-template:\"a a a b b b\" auto \"c c c c c c\" auto \"d d d d d d\" auto \"f f f f f f\" auto/1fr 1fr 1fr 1fr 1fr 1fr}.grid-column-details .grid-area-a{grid-area:a}.grid-column-details .grid-area-b{grid-area:b}.grid-column-details .grid-area-c{grid-area:c}.grid-column-details .grid-area-d{grid-area:d}.grid-column-details .grid-area-e{grid-area:e}.grid-column-details .grid-area-f{grid-area:f}.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}.btn-show-more{padding:0!important}:host{display:flex;flex-direction:column;flex:1 1 auto}.data-pipelines-job__details-page{display:flex;flex-direction:column;flex:1 1 auto}.data-pipelines-job__details-page .data-pipelines-job__details-body{display:flex;flex-direction:column;flex:1 1 auto;margin-bottom:1rem}.data-pipelines-job__details-page .data-pipelines-job__details-body .form-section-readonly{word-break:break-word}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__section--border-none{border:none}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container{display:flex;align-items:center}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container .data-pipelines-job__contacts-list-container{display:inline-flex;align-items:center}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container .data-pipelines-job__contacts-list-container>div{display:inline-flex;margin-right:.3rem}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container .data-pipelines-job__contacts-list-container>div:last-child{margin-right:0}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container .data-pipelines-job__contacts-list-signpost-container{display:inline-flex;align-items:center}.data-pipelines-job__details-page .data-pipelines-job__details-body .data-pipelines-job__contacts-container .data-pipelines-job__contacts-list-signpost-container ul{list-style-type:none}\n"] }]
}], function () { return [{ type: i1.ComponentService }, { type: i1.NavigationService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i1.RouterService }, { type: i3.DataJobsService }, { type: i3.DataJobsApiService }, { type: i4.FormBuilder }, { type: i1.ToastService }, { type: i1.ErrorHandlerService }, { type: i1.UrlOpenerService }, { type: undefined, decorators: [{
type: Inject,
args: [DATA_PIPELINES_CONFIGS]
}] }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2ItZGV0YWlscy1wYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEtcGlwZWxpbmVzL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWpvYi9wYWdlcy9kZXRhaWxzL2RhdGEtam9iLWRldGFpbHMtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1qb2IvcGFnZXMvZGV0YWlscy9kYXRhLWpvYi1kZXRhaWxzLXBhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sRUFDSCxHQUFHLEVBQ0gsZUFBZSxFQU1mLFVBQVUsRUFRVixtQkFBbUIsRUFHbkIsWUFBWSxFQUNaLFlBQVksRUFDZixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhGLE9BQU8sRUFDSCxzQkFBc0IsRUFNdEIsYUFBYSxFQUViLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsZUFBZSxF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Q0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN4RSxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7O3NHQTVmUSwyQkFBMkIsNmRBaUd4QixzQkFBc0I7OEVBakd6QiwyQkFBMkI7UUNyRXhDLDhCQUdDLGFBQUE7UUFFTyxpR0F5MUJlO1FBRWYsNkhBUWM7UUFDbEIsaUJBQU0sRUFBQTs7O1FBcDJCYSxlQUFnQztRQUFoQyxtREFBZ0MsaUJBQUE7O3VGRGdFMUMsMkJBQTJCO2NBTHZDLFNBQVM7MkJBQ0ksMkJBQTJCOztzQkFxR2hDLE1BQU07dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEFTQyxcbiAgICBDb2xsZWN0aW9uc1V0aWwsXG4gICAgQ29tcG9uZW50TW9kZWwsXG4gICAgQ29tcG9uZW50U2VydmljZSxcbiAgICBFcnJvckhhbmRsZXJDb25maWcsXG4gICAgRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgICBFcnJvclJlY29yZCxcbiAgICBGT1JNX1NUQVRFLFxuICAgIE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgIE9uVGF1cnVzTW9kZWxDaGFuZ2UsXG4gICAgT25UYXVydXNNb2RlbEVycm9yLFxuICAgIE9uVGF1cnVzTW9kZWxJbml0LFxuICAgIE9uVGF1cnVzTW9kZWxMb2FkLFxuICAgIFJvdXRlclNlcnZpY2UsXG4gICAgUm91dGVTdGF0ZSxcbiAgICBUYXVydXNCYXNlQ29tcG9uZW50LFxuICAgIFRvYXN0U2VydmljZSxcbiAgICBVcmxPcGVuZXJTZXJ2aWNlLFxuICAgIFZka0Zvcm1TdGF0ZSxcbiAgICBWbXdUb2FzdFR5cGVcbn0gZnJvbSAnQHZlcnNhdGlsZWRhdGFraXQvc2hhcmVkJztcblxuaW1wb3J0IHsgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zLCBEZWxldGVNb2RhbE9wdGlvbnMsIE1vZGFsT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9tb2RlbCc7XG5pbXBvcnQgeyBDcm9uVXRpbCwgRGF0YUpvYlV0aWwsIEVycm9yVXRpbCwgU3RyaW5nVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC91dGlscyc7XG5pbXBvcnQgeyBFeHRyYWN0Sm9iU3RhdHVzUGlwZSwgUGFyc2VFcG9jaFBpcGUgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcGlwZXMnO1xuXG5pbXBvcnQge1xuICAgIERBVEFfUElQRUxJTkVTX0NPTkZJR1MsXG4gICAgRGF0YUpvYixcbiAgICBEYXRhSm9iRGVwbG95bWVudCxcbiAgICBEYXRhSm9iRGV0YWlscyxcbiAgICBEYXRhSm9iRXhlY3V0aW9uT3JkZXIsXG4gICAgRGF0YUpvYkV4ZWN1dGlvbnMsXG4gICAgRGF0YUpvYlN0YXR1cyxcbiAgICBEYXRhUGlwZWxpbmVzQ29uZmlnLFxuICAgIEpPQl9ERVBMT1lNRU5UX0lEX1JFUV9QQVJBTSxcbiAgICBKT0JfREVUQUlMU19EQVRBX0tFWSxcbiAgICBKT0JfREVUQUlMU19SRVFfUEFSQU0sXG4gICAgSk9CX0VYRUNVVElPTlNfREFUQV9LRVksXG4gICAgSk9CX05BTUVfUkVRX1BBUkFNLFxuICAgIEpPQl9TVEFURV9EQVRBX0tFWSxcbiAgICBKT0JfU1RBVEVfUkVRX1BBUkFNLFxuICAgIEpPQl9TVEFUVVNfUkVRX1BBUkFNLFxuICAgIE9SREVSX1JFUV9QQVJBTSxcbiAgICBURUFNX05BTUVfUkVRX1BBUkFNXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVsJztcblxuaW1wb3J0IHtcbiAgICBUQVNLX0xPQURfSk9CX0RFVEFJTFMsXG4gICAgVEFTS19MT0FEX0pPQl9FWEVDVVRJT05TLFxuICAgIFRBU0tfTE9BRF9KT0JfU1RBVEUsXG4gICAgVEFTS19VUERBVEVfSk9CX0RFU0NSSVBUSU9OLFxuICAgIFRBU0tfVVBEQVRFX0pPQl9TVEFUVVNcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3RhdGUvdGFza3MnO1xuXG5pbXBvcnQgeyBMT0FEX0pPQl9FUlJPUl9DT0RFUyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0YXRlL2Vycm9yLWNvZGVzJztcblxuaW1wb3J0IHsgRGF0YUpvYnNBcGlTZXJ2aWNlLCBEYXRhSm9ic1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWRhdGEtam9iLWRldGFpbHMtcGFnZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtam9iLWRldGFpbHMtcGFnZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0YS1qb2ItZGV0YWlscy1wYWdlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUpvYkRldGFpbHNQYWdlQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBUYXVydXNCYXNlQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uVGF1cnVzTW9kZWxJbml0LCBPblRhdXJ1c01vZGVsTG9hZCwgT25UYXVydXNNb2RlbENoYW5nZSwgT25UYXVydXNNb2RlbEVycm9yXG57XG4gICAgcmVhZG9ubHkgdXVpZCA9ICdEYXRhSm9iRGV0YWlsc1BhZ2VDb21wb25lbnQnO1xuXG4gICAgZGF0YUpvYlN0YXR1c0VudW0gPSBEYXRhSm9iU3RhdHVzO1xuXG4gICAgam9iTmFtZTogc3RyaW5nO1xuICAgIHRlYW1OYW1lOiBzdHJpbmc7XG4gICAgam9iU3RhdGU6IERhdGFKb2I7XG4gICAgam9iRGV0YWlsczogRGF0YUpvYkRldGFpbHM7XG4gICAgam9iRXhlY3V0aW9uczogRGF0YUpvYkV4ZWN1dGlvbnMgPSBbXTtcblxuICAgIGlzSm9iRWRpdGFibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqICoqIEZsYWcgaW5zdHJ1Y3Qgd2hldGhlciB0ZW1wbGF0ZSB0byBzaG93IHRlYW0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBzaG91bGRTaG93VGVhbXNTZWN0aW9uID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiAqKiBGbGFnIGluc3RydWN0IHdoZXRoZXIgdGVtcGxhdGUgdG8gc2hvdyBjaGFuZ2UgaGlzdG9yeSBzZWN0aW9uLlxuICAgICAqL1xuICAgIHNob3VsZFNob3dDaGFuZ2VIaXN0b3J5U2VjdGlvbiA9IGZhbHNlO1xuXG4gICAgY3JvbkVycm9yOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgbmV4dDogRGF0ZTtcblxuICAgIGxvYWRpbmdFeGVjdXRpb25zID0gdHJ1ZTtcbiAgICBsb2FkaW5nSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgYWxsb3dFeGVjdXRpb25zQnlEZXBsb3ltZW50ID0gZmFsc2U7XG5cbiAgICB0bUZvcm06IEZvcm1Hcm91cDtcbiAgICBmb3JtU3RhdGU6IFZka0Zvcm1TdGF0ZTtcbiAgICByZWFkRm9ybVN0YXRlOiBWZGtGb3JtU3RhdGU7XG4gICAgZWRpdGFibGVGb3JtU3RhdGU6IFZka0Zvcm1TdGF0ZTtcblxuICAgIGNhbkVkaXRTZWN0aW9uID0gdHJ1ZTtcblxuICAgIGNvbGxlY3Rvck9wdGlvbnM6IE1vZGFsT3B0aW9ucztcbiAgICBjb25maXJtYXRpb25PcHRpb25zOiBNb2RhbE9wdGlvbnM7XG4gICAgZGVsZXRlT3B0aW9uczogTW9kYWxPcHRpb25zO1xuICAgIGV4ZWN1dGVOb3dPcHRpb25zOiBNb2RhbE9wdGlvbnM7XG5cbiAgICBzaG93RnVsbERlc2NyaXB0aW9uID0gZmFsc2U7XG5cbiAgICBkZXNjcmlwdGlvbldvcmRzQmVmb3JlVHJ1bmNhdGUgPSAxMjtcblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50bUZvcm0uZ2V0KCduYW1lJyk7XG4gICAgfVxuXG4gICAgZ2V0IHRlYW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRtRm9ybS5nZXQoJ3RlYW0nKTtcbiAgICB9XG5cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50bUZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRtRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk7XG4gICAgfVxuXG4gICAgZ2V0IGpvYlB5dGhvblZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRtRm9ybS5nZXQoJ2pvYlB5dGhvblZlcnNpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBBcnJheSBvZiBlcnJvciBjb2RlIHBhdHRlcm5zIHRoYXQgY29tcG9uZW50IHNob3VsZCBsaXN0ZW4gZm9yIGluIGVycm9ycyBzdG9yZS5cbiAgICAgKi9cbiAgICBsaXN0ZW5Gb3JFcnJvclBhdHRlcm5zOiBzdHJpbmdbXSA9IFtMT0FEX0pPQl9FUlJPUl9DT0RFU1tUQVNLX0xPQURfSk9CX1NUQVRFXS5BbGwsIExPQURfSk9CX0VSUk9SX0NPREVTW1RBU0tfTE9BRF9KT0JfREVUQUlMU10uQWxsXTtcblxuICAgIC8qKlxuICAgICAqICoqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlcmUgaXMgam9icyBleGVjdXRpb25zIGxvYWQgZXJyb3IuXG4gICAgICovXG4gICAgaXNDb21wb25lbnRJbkVycm9yU3RhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqICoqIERhdGEgSm9iIENoYW5nZSBoaXN0b3J5IGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgY2hhbmdlSGlzdG9yeUNvbmZpZzogRGF0YVBpcGVsaW5lc0NvbmZpZ1snY2hhbmdlSGlzdG9yeSddO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudFNlcnZpY2U6IENvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlclNlcnZpY2U6IFJvdXRlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YUpvYnNTZXJ2aWNlOiBEYXRhSm9ic1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YUpvYnNBcGlTZXJ2aWNlOiBEYXRhSm9ic0FwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9ySGFuZGxlclNlcnZpY2U6IEVycm9ySGFuZGxlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsT3BlbmVyU2VydmljZTogVXJsT3BlbmVyU2VydmljZSxcbiAgICAgICAgQEluamVjdChEQVRBX1BJUEVMSU5FU19DT05GSUdTKVxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZzogRGF0YVBpcGVsaW5lc0NvbmZpZ1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgYWN0aXZhdGVkUm91dGUpO1xuXG4gICAgICAgIHRoaXMuZm9ybVN0YXRlID0gbmV3IFZka0Zvcm1TdGF0ZShGT1JNX1NUQVRFLlZJRVcpO1xuICAgICAgICB0aGlzLnJlYWRGb3JtU3RhdGUgPSBuZXcgVmRrRm9ybVN0YXRlKEZPUk1fU1RBVEUuVklFVyk7XG4gICAgICAgIHRoaXMuZWRpdGFibGVGb3JtU3RhdGUgPSBuZXcgVmRrRm9ybVN0YXRlKEZPUk1fU1RBVEUuQ0FOX0VESVQpO1xuXG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uT3B0aW9ucyA9IG5ldyBDb25maXJtYXRpb25Nb2RhbE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5kZWxldGVPcHRpb25zID0gbmV3IERlbGV0ZU1vZGFsT3B0aW9ucygpO1xuICAgICAgICB0aGlzLmV4ZWN1dGVOb3dPcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xuXG4gICAgICAgIHRoaXMuX2luaXRGb3JtKCk7XG4gICAgfVxuXG4gICAgaXNEZXNjcmlwdGlvblN1Ym1pdEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Zvcm1TdWJtaXRFbmFibGVkKCkgJiYgdGhpcy5kZXNjcmlwdGlvbi52YWx1ZSAhPT0gdGhpcy5qb2JEZXRhaWxzLmRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGlzU3RhdHVzU3VibWl0RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRm9ybVN1Ym1pdEVuYWJsZWQoKSAmJiB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gRXh0cmFjdEpvYlN0YXR1c1BpcGUudHJhbnNmb3JtKHRoaXMuam9iU3RhdGU/LmRlcGxveW1lbnRzKTtcbiAgICB9XG5cbiAgICBpc0pvYlJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEYXRhSm9iVXRpbC5pc0pvYlJ1bm5pbmcodGhpcy5qb2JFeGVjdXRpb25zKTtcbiAgICB9XG5cbiAgICBzaG93Tm9Ob3RpZmljYXRpb25zTGFiZWwobm90aWZpY2F0aW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFub3RpZmljYXRpb25zIHx8IG5vdGlmaWNhdGlvbnMubGVuZ3RoIDwgMTtcbiAgICB9XG5cbiAgICBzZWN0aW9uU3RhdGVDaGFuZ2Uoc2VjdGlvblN0YXRlOiBWZGtGb3JtU3RhdGUpIHtcbiAgICAgICAgaWYgKHNlY3Rpb25TdGF0ZS5zdGF0ZSA9PT0gRk9STV9TVEFURS5DQU5fRURJVCkge1xuICAgICAgICAgICAgc3dpdGNoIChzZWN0aW9uU3RhdGUuZW1pdHRpbmdTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMuc2V0VmFsdWUoRXh0cmFjdEpvYlN0YXR1c1BpcGUudHJhbnNmb3JtKHRoaXMuam9iU3RhdGU/LmRlcGxveW1lbnRzKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbi5zZXRWYWx1ZSh0aGlzLmpvYkRldGFpbHMuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FuRWRpdFNlY3Rpb24gPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY3Rpb25TdGF0ZS5zdGF0ZSA9PT0gRk9STV9TVEFURS5TVUJNSVQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybShzZWN0aW9uU3RhdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY3Rpb25TdGF0ZS5zdGF0ZSA9PT0gRk9STV9TVEFURS5FRElUKSB7XG4gICAgICAgICAgICB0aGlzLmNhbkVkaXRTZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKGV2ZW50OiBWZGtGb3JtU3RhdGUpIHtcbiAgICAgICAgaWYgKGV2ZW50LmVtaXR0aW5nU2VjdGlvbiA9PT0gJ2Rlc2NyaXB0aW9uJyAmJiB0aGlzLmlzRGVzY3JpcHRpb25TdWJtaXRFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvU3VibWl0RGVzY3JpcHRpb25VcGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5lbWl0dGluZ1NlY3Rpb24gPT09ICdzdGF0dXMnICYmIHRoaXMuaXNTdGF0dXNTdWJtaXRFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvU3VibWl0U3RhdHVzVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlZGl0T3BlcmF0aW9uRW5kZWQoKSB7XG4gICAgICAgIHRoaXMuZm9ybVN0YXRlID0gbmV3IFZka0Zvcm1TdGF0ZShGT1JNX1NUQVRFLkNBTl9FRElUKTtcbiAgICAgICAgdGhpcy5jYW5FZGl0U2VjdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgbG9hZEpvYkV4ZWN1dGlvbnMoKSB7XG4gICAgICAgIHRoaXMuZGF0YUpvYnNTZXJ2aWNlLmxvYWRKb2JFeGVjdXRpb25zKHRoaXMubW9kZWwpO1xuICAgIH1cblxuICAgIHJlZGlyZWN0VG9IZWFsdGhTdGF0dXMoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChTdHJpbmdVdGlsLnN0cmluZ0Zvcm1hdCh0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcuaGVhbHRoU3RhdHVzVXJsLCB0aGlzLmpvYkRldGFpbHMuam9iX25hbWUpKS50aGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogSW50ZXJjZXB0cyBjbGljayBvbiBjaGFuZ2UgaGlzdG9yeSBsaW5rIGFuZCBzaG93IGNvbmZpcm1hdGlvbi5cbiAgICAgKi9cbiAgICBuYXZpZ2F0ZVRvSm9iQ2hhbmdlSGlzdG9yeSgkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLnVybE9wZW5lclNlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuKHRoaXMuY2hhbmdlSGlzdG9yeUNvbmZpZy51cmxUZW1wbGF0ZSwgJ19ibGFuaycsIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jaGFuZ2VIaXN0b3J5Q29uZmlnLmNvbmZpcm1hdGlvblRpdGxlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VDb21wb25lbnQ6IHRoaXMuY2hhbmdlSGlzdG9yeUNvbmZpZy5jb25maXJtYXRpb25NZXNzYWdlQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbkRvTm90U2hvd0Z1dHVyZUNvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maXJtQnRuTW9kZWw6IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Byb2NlZWQnLFxuICAgICAgICAgICAgICAgICAgICBpY29uU2hhcGU6ICdwb3Atb3V0JyxcbiAgICAgICAgICAgICAgICAgICAgaWNvblBvc2l0aW9uOiAncmlnaHQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBOby1vcC5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKF9yZWFzb24pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBOby1vcC5cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb25Nb2RlbEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVyU2VydmljZVxuICAgICAgICAgICAgLmdldFN0YXRlKClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0ZVN0YXRlKSA9PiB0aGlzLl9pbml0aWFsaXplKHJvdXRlU3RhdGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIG9uTW9kZWxMb2FkKG1vZGVsOiBDb21wb25lbnRNb2RlbCwgdGFzazogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXNrID09PSBUQVNLX0xPQURfSk9CX0VYRUNVVElPTlMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0V4ZWN1dGlvbnMgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXNrID09PSBUQVNLX0xPQURfSk9CX0RFVEFJTFMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb25Nb2RlbENoYW5nZShtb2RlbDogQ29tcG9uZW50TW9kZWwsIHRhc2s6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGFzayA9PT0gVEFTS19MT0FEX0pPQl9TVEFURSkge1xuICAgICAgICAgICAgdGhpcy5qb2JTdGF0ZSA9IG1vZGVsLmdldENvbXBvbmVudFN0YXRlKCkuZGF0YS5nZXQoSk9CX1NUQVRFX0RBVEFfS0VZKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVOZXh0UnVuRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hbGxvd0V4ZWN1dGlvbnNCeURlcGxveW1lbnQgPSBFeHRyYWN0Sm9iU3RhdHVzUGlwZS50cmFuc2Zvcm0odGhpcy5qb2JTdGF0ZT8uZGVwbG95bWVudHMpICE9PSBEYXRhSm9iU3RhdHVzLk5PVF9ERVBMT1lFRDtcbiAgICAgICAgICAgIHRoaXMuY3JvbkVycm9yID0gQ3JvblV0aWwuZ2V0TmV4dEV4ZWN1dGlvbkVycm9ycyh0aGlzLmpvYlN0YXRlPy5jb25maWc/LnNjaGVkdWxlPy5zY2hlZHVsZUNyb24pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzayA9PT0gVEFTS19MT0FEX0pPQl9ERVRBSUxTKSB7XG4gICAgICAgICAgICB0aGlzLmpvYkRldGFpbHMgPSBtb2RlbC5nZXRDb21wb25lbnRTdGF0ZSgpLmRhdGEuZ2V0KEpPQl9ERVRBSUxTX0RBVEFfS0VZKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZvcm0oKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2sgPT09IFRBU0tfTE9BRF9KT0JfRVhFQ1VUSU9OUykge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uczogRGF0YUpvYkV4ZWN1dGlvbnMgPSBtb2RlbC5nZXRDb21wb25lbnRTdGF0ZSgpLmRhdGEuZ2V0KEpPQl9FWEVDVVRJT05TX0RBVEFfS0VZKTtcblxuICAgICAgICAgICAgaWYgKGV4ZWN1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFKb2JzU2VydmljZS5ub3RpZnlGb3JKb2JFeGVjdXRpb25zKFsuLi5leGVjdXRpb25zXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgICAgICAgICAgICAgY29uc3QgcnVubmluZ0V4ZWN1dGlvbiA9IGV4ZWN1dGlvbnMuZmluZChEYXRhSm9iVXRpbC5pc0pvYlJ1bm5pbmdQcmVkaWNhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nRXhlY3V0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUpvYnNTZXJ2aWNlLm5vdGlmeUZvclJ1bm5pbmdKb2JFeGVjdXRpb25JZChydW5uaW5nRXhlY3V0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXNrID09PSBUQVNLX1VQREFURV9KT0JfREVTQ1JJUFRJT04pIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgIHR5cGU6IFZtd1RvYXN0VHlwZS5JTkZPLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBgRGVzY3JpcHRpb24gdXBkYXRlIGNvbXBsZXRlZGAsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBEYXRhIGpvYiBcIiR7dGhpcy5qb2JOYW1lfVwiIGRlc2NyaXB0aW9uIHN1Y2Nlc3NmdWxseSB1cGRhdGVkYFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuam9iRGV0YWlscyA9IG1vZGVsLmdldENvbXBvbmVudFN0YXRlKCkuZGF0YS5nZXQoSk9CX0RFVEFJTFNfREFUQV9LRVkpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRPcGVyYXRpb25FbmRlZCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzayA9PT0gVEFTS19VUERBVEVfSk9CX1NUQVRVUykge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgdHlwZTogVm13VG9hc3RUeXBlLklORk8sXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBTdGF0dXMgdXBkYXRlIGNvbXBsZXRlZGAsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAgIGBEYXRhIGpvYiBcIiR7dGhpcy5qb2JOYW1lfVwiIHN1Y2Nlc3NmdWxseSBgICsgYCR7IXRoaXMuX2V4dHJhY3RKb2JEZXBsb3ltZW50KCk/LmVuYWJsZWQgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmpvYlN0YXRlID0gbW9kZWwuZ2V0Q29tcG9uZW50U3RhdGUoKS5kYXRhLmdldChKT0JfU1RBVEVfREFUQV9LRVkpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRPcGVyYXRpb25FbmRlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBvbk1vZGVsRXJyb3IobW9kZWw6IENvbXBvbmVudE1vZGVsLCB0YXNrOiBzdHJpbmcsIG5ld0Vycm9yUmVjb3JkczogRXJyb3JSZWNvcmRbXSk6IHZvaWQge1xuICAgICAgICBuZXdFcnJvclJlY29yZHMuZm9yRWFjaCgoZXJyb3JSZWNvcmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRXJyb3JVdGlsLmV4dHJhY3RFcnJvcihlcnJvclJlY29yZC5lcnJvcik7XG5cbiAgICAgICAgICAgIGxldCBlcnJvckhhbmRsZXJDb25maWc6IEVycm9ySGFuZGxlckNvbmZpZztcblxuICAgICAgICAgICAgc3dpdGNoICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUQVNLX0xPQURfSk9CX0RFVEFJTFM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0Sm9iRGV0YWlscygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRBU0tfTE9BRF9KT0JfRVhFQ1VUSU9OUzpcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8tb3AuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVEFTS19MT0FEX0pPQl9TVEFURTpcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8tb3AuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVEFTS19VUERBVEVfSk9CX0RFU0NSSVBUSU9OOlxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0Rlc2NyaXB0aW9uIHVwZGF0ZSBmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdE9wZXJhdGlvbkVuZGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVEFTS19VUERBVEVfSk9CX1NUQVRVUzpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdTdGF0dXMgdXBkYXRlIGZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0T3BlcmF0aW9uRW5kZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBOby1vcC5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXJTZXJ2aWNlLnByb2Nlc3NFcnJvcihlcnJvciwgZXJyb3JIYW5kbGVyQ29uZmlnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gYXR0YWNoIGxpc3RlbmVyIHRvIEVycm9yU3RvcmUgYW5kIGxpc3RlbiBmb3IgRXJyb3JzIGNoYW5nZVxuICAgICAgICB0aGlzLmVycm9ycy5vbkNoYW5nZSgoc3RvcmUpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIHJlY29yZCBmb3IgbGlzdGVuZWQgZXJyb3IgY29kZSBwYXR0ZXJucyBzZXQgY29tcG9uZW50IGluIGVycm9yIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmlzQ29tcG9uZW50SW5FcnJvclN0YXRlID0gc3RvcmUuaGFzQ29kZVBhdHRlcm4oLi4udGhpcy5saXN0ZW5Gb3JFcnJvclBhdHRlcm5zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICB0aGlzLl9pbml0aWFsaXplTmV4dFJ1bkRhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0aWFsaXplKHN0YXRlOiBSb3V0ZVN0YXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRlYW1QYXJhbUtleSA9IHN0YXRlLmdldERhdGE8c3RyaW5nPigndGVhbVBhcmFtS2V5Jyk7XG4gICAgICAgIHRoaXMudGVhbU5hbWUgPSBzdGF0ZS5nZXRQYXJhbSh0ZWFtUGFyYW1LZXkpO1xuXG4gICAgICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNOaWwodGVhbVBhcmFtS2V5KSB8fCBDb2xsZWN0aW9uc1V0aWwuaXNOaWwodGhpcy50ZWFtTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZUZvckltcGxpY2l0VGVhbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgam9iUGFyYW1LZXkgPSBzdGF0ZS5nZXREYXRhPHN0cmluZz4oJ2pvYlBhcmFtS2V5Jyk7XG4gICAgICAgIHRoaXMuam9iTmFtZSA9IHN0YXRlLmdldFBhcmFtKGpvYlBhcmFtS2V5KTtcblxuICAgICAgICB0aGlzLmlzSm9iRWRpdGFibGUgPSAhIXN0YXRlLmdldERhdGE8Ym9vbGVhbj4oJ2VkaXRhYmxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNKb2JFZGl0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3RhdGUgPSB0aGlzLmVkaXRhYmxlRm9ybVN0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVBhZ2VGZWF0dXJlRmxhZ3Moc3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUNoYW5nZUhpc3RvcnlDb25maWcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZUZvckV4ZWN1dGlvbnMoKTtcblxuICAgICAgICB0aGlzLmRhdGFKb2JzU2VydmljZS5sb2FkSm9iKFxuICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICAgICAgIC53aXRoUmVxdWVzdFBhcmFtKFRFQU1fTkFNRV9SRVFfUEFSQU0sIHRoaXMudGVhbU5hbWUpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oSk9CX05BTUVfUkVRX1BBUkFNLCB0aGlzLmpvYk5hbWUpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oT1JERVJfUkVRX1BBUkFNLCB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnc3RhcnRUaW1lJyxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBBU0NcbiAgICAgICAgICAgICAgICB9IGFzIERhdGFKb2JFeGVjdXRpb25PcmRlcilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdWJzY3JpYmVGb3JJbXBsaWNpdFRlYW0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YUpvYnNTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Tm90aWZpZWRGb3JUZWFtSW1wbGljaXRseSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodGVhbU5hbWUpID0+ICh0aGlzLnRlYW1OYW1lID0gdGVhbU5hbWUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9leHRyYWN0Sm9iRGVwbG95bWVudCgpOiBEYXRhSm9iRGVwbG95bWVudCB7XG4gICAgICAgIGlmICghdGhpcy5qb2JTdGF0ZT8uZGVwbG95bWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmpvYlN0YXRlPy5kZXBsb3ltZW50c1t0aGlzLmpvYlN0YXRlPy5kZXBsb3ltZW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0Zvcm1TdWJtaXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudG1Gb3JtPy5wcmlzdGluZSAmJiB0aGlzLnRtRm9ybT8udmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdEZvcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG1Gb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgIHRlYW06ICcnLFxuICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIGpvYlB5dGhvblZlcnNpb246ICcnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUZvcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG1Gb3JtLnNldFZhbHVlKHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuam9iRGV0YWlscy5qb2JfbmFtZSxcbiAgICAgICAgICAgIHRlYW06IHRoaXMuam9iRGV0YWlscy50ZWFtLFxuICAgICAgICAgICAgc3RhdHVzOiBFeHRyYWN0Sm9iU3RhdHVzUGlwZS50cmFuc2Zvcm0odGhpcy5qb2JTdGF0ZT8uZGVwbG95bWVudHMpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuam9iRGV0YWlscy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGpvYlB5dGhvblZlcnNpb246XG4gICAgICAgICAgICAgICAgdGhpcy5qb2JTdGF0ZT8uZGVwbG95bWVudHMgJiYgdGhpcy5qb2JTdGF0ZT8uZGVwbG95bWVudHNbMF0gPyB0aGlzLmpvYlN0YXRlPy5kZXBsb3ltZW50c1swXT8uam9iUHl0aG9uVmVyc2lvbiA6ICcnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RvU3VibWl0RGVzY3JpcHRpb25VcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGpvYkRldGFpbHNVcGRhdGVkOiBEYXRhSm9iRGV0YWlscyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuam9iRGV0YWlscyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLnZhbHVlIGFzIHN0cmluZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGF0YUpvYnNTZXJ2aWNlLnVwZGF0ZUpvYihcbiAgICAgICAgICAgIHRoaXMubW9kZWxcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShURUFNX05BTUVfUkVRX1BBUkFNLCBqb2JEZXRhaWxzVXBkYXRlZC50ZWFtKVxuICAgICAgICAgICAgICAgIC53aXRoUmVxdWVzdFBhcmFtKEpPQl9OQU1FX1JFUV9QQVJBTSwgam9iRGV0YWlsc1VwZGF0ZWQuam9iX25hbWUpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oSk9CX0RFVEFJTFNfUkVRX1BBUkFNLCBqb2JEZXRhaWxzVXBkYXRlZCksXG4gICAgICAgICAgICBUQVNLX1VQREFURV9KT0JfREVTQ1JJUFRJT05cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kb1N1Ym1pdFN0YXR1c1VwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgam9iRGVwbG95bWVudCA9IHRoaXMuX2V4dHJhY3RKb2JEZXBsb3ltZW50KCk7XG5cbiAgICAgICAgaWYgKCFqb2JEZXBsb3ltZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU3RhdHVzIHVwZGF0ZSB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgZm9yIGpvYiB3aXRoIG5vIGRlcGxveW1lbnRzLicpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqb2JTdGF0ZTogRGF0YUpvYiA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuam9iU3RhdGUsXG4gICAgICAgICAgICBkZXBsb3ltZW50czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5qb2JTdGF0ZS5kZXBsb3ltZW50c1swXSxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5zdGF0dXMudmFsdWUgPT09IERhdGFKb2JTdGF0dXMuRU5BQkxFRFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4udGhpcy5qb2JTdGF0ZS5kZXBsb3ltZW50cy5zbGljZSgxKVxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGF0YUpvYnNTZXJ2aWNlLnVwZGF0ZUpvYihcbiAgICAgICAgICAgIHRoaXMubW9kZWxcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShURUFNX05BTUVfUkVRX1BBUkFNLCB0aGlzLmpvYkRldGFpbHMudGVhbSlcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShKT0JfTkFNRV9SRVFfUEFSQU0sIHRoaXMuam9iRGV0YWlscy5qb2JfbmFtZSlcbiAgICAgICAgICAgICAgICAud2l0aFJlcXVlc3RQYXJhbShKT0JfREVQTE9ZTUVOVF9JRF9SRVFfUEFSQU0sIGpvYkRlcGxveW1lbnQuaWQpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oSk9CX1NUQVRVU19SRVFfUEFSQU0sIHRoaXMuc3RhdHVzLnZhbHVlID09PSBEYXRhSm9iU3RhdHVzLkVOQUJMRUQpXG4gICAgICAgICAgICAgICAgLndpdGhSZXF1ZXN0UGFyYW0oSk9CX1NUQVRFX1JFUV9QQVJBTSwgam9iU3RhdGUpLFxuICAgICAgICAgICAgVEFTS19VUERBVEVfSk9CX1NUQVRVU1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVOZXh0UnVuRGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gUGFyc2VFcG9jaFBpcGUudHJhbnNmb3JtKHRoaXMuam9iU3RhdGU/LmNvbmZpZz8uc2NoZWR1bGU/Lm5leHRSdW5FcG9jaFNlY29uZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVQYWdlRmVhdHVyZUZsYWdzKHN0YXRlOiBSb3V0ZVN0YXRlKTogdm9pZCB7XG4gICAgICAgIGlmIChzdGF0ZS5nZXREYXRhPCdleHBsb3JlJyB8ICdtYW5hZ2UnPignY29udGV4dCcpID09PSAnZXhwbG9yZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcuZXhwbG9yZUNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvd1RlYW1zU2VjdGlvbiA9IHRoaXMuZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZy5leHBsb3JlQ29uZmlnLnNob3dUZWFtU2VjdGlvbkluSm9iRGV0YWlscztcbiAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFNob3dDaGFuZ2VIaXN0b3J5U2VjdGlvbiA9IHRoaXMuZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZy5leHBsb3JlQ29uZmlnLnNob3dDaGFuZ2VIaXN0b3J5U2VjdGlvbkluSm9iRGV0YWlscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcubWFuYWdlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTaG93VGVhbXNTZWN0aW9uID0gdGhpcy5kYXRhUGlwZWxpbmVzTW9kdWxlQ29uZmlnLm1hbmFnZUNvbmZpZy5zaG93VGVhbVNlY3Rpb25JbkpvYkRldGFpbHM7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTaG93Q2hhbmdlSGlzdG9yeVNlY3Rpb24gPSB0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcubWFuYWdlQ29uZmlnLnNob3dDaGFuZ2VIaXN0b3J5U2VjdGlvbkluSm9iRGV0YWlscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVDaGFuZ2VIaXN0b3J5Q29uZmlnKCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5zaG91bGRTaG93Q2hhbmdlSGlzdG9yeVNlY3Rpb24gfHxcbiAgICAgICAgICAgICF0aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcuY2hhbmdlSGlzdG9yeSB8fFxuICAgICAgICAgICAgIXRoaXMuZGF0YVBpcGVsaW5lc01vZHVsZUNvbmZpZy5jaGFuZ2VIaXN0b3J5LnVybFRlbXBsYXRlIHx8XG4gICAgICAgICAgICAhdGhpcy5kYXRhUGlwZWxpbmVzTW9kdWxlQ29uZmlnLmNoYW5nZUhpc3RvcnkuY29uZmlybWF0aW9uVGl0bGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZUhpc3RvcnlDb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmRhdGFQaXBlbGluZXNNb2R1bGVDb25maWcuY2hhbmdlSGlzdG9yeSxcbiAgICAgICAgICAgIHVybFRlbXBsYXRlOiBDb2xsZWN0aW9uc1V0aWwuaW50ZXJwb2xhdGVTdHJpbmcodGhpcy5kYXRhUGlwZWxpbmVzTW9kdWxlQ29uZmlnLmNoYW5nZUhpc3RvcnkudXJsVGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZTogJyVkYXRhX2pvYl9uYW1lJScsXG4gICAgICAgICAgICAgICAgcmVwbGFjZVZhbHVlOiB0aGlzLmpvYk5hbWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlRm9yRXhlY3V0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmRhdGFKb2JzU2VydmljZS5nZXROb3RpZmllZEZvckpvYkV4ZWN1dGlvbnMoKS5zdWJzY3JpYmUoKGV4ZWN1dGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmpvYkV4ZWN1dGlvbnMgPSBleGVjdXRpb25zO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldEpvYkRldGFpbHMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5qb2JEZXRhaWxzKSB7XG4gICAgICAgICAgICB0aGlzLmpvYkRldGFpbHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjwhLS1cbiAgIH4gQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICAgfiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAtLT5cblxuPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvbm8tY2FsbC1leHByZXNzaW9uLEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jeWNsb21hdGljLWNvbXBsZXhpdHkgLS0+XG5cbjxkaXZcbiAgICBpZD1cImRhdGEtam9iLWRldGFpbHMtcGFnZVwiXG4gICAgY2xhc3M9XCJwYWdlLWNvbnRhaW5lciBkYXRhLXBpcGVsaW5lcy1qb2JfX2RldGFpbHMtcGFnZVwiXG4+XG4gICAgPGRpdiBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fZGV0YWlscy1ib2R5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDb21wb25lbnRJbkVycm9yU3RhdGU7IGVsc2UgZXJyb3JUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLWNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cInRtRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsci1mb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy10b3A6IDBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtZGF0YS1qb2ItZGV0YWlscy1zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1oZWFkZXItc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzU3VibWl0RW5hYmxlZF09XCJpc1N0YXR1c1N1Ym1pdEVuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1TdGF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvYlN0YXRlPy5kZXBsb3ltZW50cyB8IGV4dHJhY3RKb2JTdGF0dXMpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm90IERlcGxveWVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZWFkRm9ybVN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1TdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbk5hbWU9XCJzdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5FZGl0U2VjdGlvbl09XCJjYW5FZGl0U2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Ym1pdEZvcm0pPVwic3VibWl0Rm9ybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvblN0YXRlQ2hhbmdlKT1cInNlY3Rpb25TdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZVwiIHN0eWxlPVwid2lkdGg6IDIuOHJlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24tcmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1zdGF0dXMtcGFuZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtqb2JEZXBsb3ltZW50c109XCJqb2JTdGF0ZT8uZGVwbG95bWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9saWItc3RhdHVzLXBhbmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbi1lZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItcmFkaW8tY29udGFpbmVyIGNscklubGluZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItcmFkaW8td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyUmFkaW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtcGlwZWxpbmVzLWRhdGEtam9iLWRldGFpbHMtc3RhdHVzLWVuYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RW5hYmxlZDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1yYWRpby13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1yYWRpby13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHJSYWRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1kYXRhLWpvYi1kZXRhaWxzLXN0YXR1cy1kaXNhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EaXNhYmxlZDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1yYWRpby13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kYWwtc3VibWl0XCIgdHlwZT1cInN1Ym1pdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXJhZGlvLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx2ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1kYXRhLWpvYi1kZXRhaWxzLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaGVhZGVyLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1N1Ym1pdEVuYWJsZWRdPVwiaXNEZXNjcmlwdGlvblN1Ym1pdEVuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1TdGF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0luUHJvZ3Jlc3MgPyByZWFkRm9ybVN0YXRlIDogZm9ybVN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdFNlY3Rpb25dPVwiY2FuRWRpdFNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJtaXRGb3JtKT1cInN1Ym1pdEZvcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb25TdGF0ZUNoYW5nZSk9XCJzZWN0aW9uU3RhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIiBzdHlsZT1cIndpZHRoOiAyLjhyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24tcmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Z1bGxEZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkZXNjcmlwdGlvbi1zaG93LWxlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGRlc2NyaXB0aW9uLnZhbHVlIH19IDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBidG4tc2hvdy1tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0Z1bGxEZXNjcmlwdGlvbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93IGxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNob3dGdWxsRGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1qb2ItZGV0YWlscy1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgZGVzY3JpcHRpb24udmFsdWUgfCB3b3JkcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbldvcmRzQmVmb3JlVHJ1bmNhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi52YWx1ZT8uc3BsaXQoJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uV29yZHNCZWZvcmVUcnVuY2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIGJ0bi1zaG93LW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkZXNjcmlwdGlvbi1zaG93LW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RnVsbERlc2NyaXB0aW9uID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyBtb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbi1lZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItdGV4dGFyZWEtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyVGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbnt7IGRlc2NyaXB0aW9uLnZhbHVlIH19PC90ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kYWwtc3VibWl0XCIgdHlwZT1cInN1Ym1pdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx2ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1kYXRhLWpvYi1kZXRhaWxzLXB5dGhvbi12ZXJzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaGVhZGVyLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lPVwiam9iUHl0aG9uVmVyc2lvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1TdGF0ZV09XCJyZWFkRm9ybVN0YXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZVwiIHN0eWxlPVwid2lkdGg6IDdyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24tcmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgam9iUHl0aG9uVmVyc2lvbi52YWx1ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Zkay1mb3JtLXNlY3Rpb24tY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3VsZFNob3dUZWFtc1NlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ0ZWFtLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1oZWFkZXItc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbk5hbWU9XCJ0ZWFtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybVN0YXRlXT1cInJlYWRGb3JtU3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogNC44cmVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyIHRlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uLXJlYWRvbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRlYW0udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtcGlwZWxpbmVzLWpvYi1kZXRhaWxzLXRlYW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbCBsYWJlbC1saWdodC1ibHVlIHRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9leHBsb3JlL3RlYW1zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxhYmVsLWxpbmsgbGFiZWwtbGluay1zdXBwcmVzcy1kZWNvcmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgdGVhbS52YWx1ZSB9fTwvYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Zkay1mb3JtLXNlY3Rpb24tY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtZGF0YS1qb2ItZGV0YWlscy1zY2hlZHVsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWhlYWRlci1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybVN0YXRlXT1cInJlYWRGb3JtU3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lPVwic2NoZWR1bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogN3JlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZSAoaW4gVVRDKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXNlY3Rpb24tcmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtam9iLWRldGFpbHMtc2NoZWR1bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgam9iRGV0YWlscz8uY29uZmlnPy5zY2hlZHVsZT8uc2NoZWR1bGVfY3JvbiB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFNjaGVkdWxlIDogXCJOb3Qgc2NoZWR1bGVkXCIgfX1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZz8uc2NoZWR1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5zY2hlZHVsZV9jcm9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xyUG9zaXRpb25dPVwiJ2xlZnQtbWlkZGxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNscklmT3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+Q3JvbiBleHByZXNzaW9uPC9zdHJvbmc+PGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgam9iRGV0YWlscz8uY29uZmlnPy5zY2hlZHVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uc2NoZWR1bGVfY3JvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+TmV4dCA1IGV4ZWN1dGlvbnM8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b2wgKm5nSWY9XCIhY3JvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVzIG9mIFsxLCAyLCAzLCA0LCA1XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgam9iRGV0YWlscz8uY29uZmlnPy5zY2hlZHVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5zY2hlZHVsZV9jcm9uIHwgcGFyc2VOZXh0UnVuIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIHwgZGF0ZSA6IFwiTU1NIGQsIHksIGhoOm1tXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhXCIgOiBcIlVUQ1wiIH19IFVUQ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtICpuZ0lmPVwiY3JvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxiciAvPnt7IGNyb25FcnJvciB9fTwvZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24tZWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHJUZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJzY2hlZHVsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWc/LnNjaGVkdWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnNjaGVkdWxlX2Nyb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kYWwtc3VibWl0XCIgdHlwZT1cInN1Ym1pdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx2ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvdWxkU2hvd0NoYW5nZUhpc3RvcnlTZWN0aW9uICYmIGNoYW5nZUhpc3RvcnlDb25maWcgJiYgISFqb2JTdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWhlYWRlci1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybVN0YXRlXT1cInJlYWRGb3JtU3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lPVwiY2hhbmdlX2hpc3RvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogNS41cmVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBoaXN0b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbi1yZWFkb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7eyBjaGFuZ2VIaXN0b3J5Q29uZmlnLnVybFRlbXBsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVUb0pvYkNoYW5nZUhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoYW5nZUhpc3RvcnlDb25maWcudXJsVGVtcGxhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC92ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHZkay1mb3JtLXNlY3Rpb24tY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWhlYWRlci1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybVN0YXRlXT1cInJlYWRGb3JtU3RhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lPVwic291cmNlX3VybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIiBzdHlsZT1cIndpZHRoOiA1LjVyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbi1yZWFkb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iU3RhdGU/LmRlcGxveW1lbnRzIHwgZXh0cmFjdEpvYlN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUpvYlN0YXR1c0VudW0uTk9UX0RFUExPWUVEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0+VGhlIGRhdGEgam9iIGlzIG5vdCBkZXBsb3llZDwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxhYmVsLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwie3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYlN0YXRlPy5jb25maWc/LnNvdXJjZVVybFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGpvYlN0YXRlPy5jb25maWc/LnNvdXJjZVVybCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLWNvbC02IGRhdGEtcGlwZWxpbmVzLWpvYl9fc2VjdGlvbi0tYm9yZGVyLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwidG1Gb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xyLWZvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXRvcDogMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx2ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1oZWFkZXItc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1TdGF0ZV09XCJyZWFkRm9ybVN0YXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10aXRsZVwiIHN0eWxlPVwid2lkdGg6IDYuMnJlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItc2lnbnBvc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xyUG9zaXRpb25dPVwiJ2xlZnQtbWlkZGxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNscklmT3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMgYXJlIHVzZWQgdG8gaW5mb3JtIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzIGFib3V0IGEgc3BlY2lmaWMgYWN0aXZpdHkuIFRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlIG5vdGlmaWNhdGlvbnMsIGVkaXQgZGF0YSBqb2Inc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5pbmkgZmlsZSBhbmQgcmVkZXBsb3kgdGhlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24tcmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1mb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwib25Kb2JEZXBsb3llZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbHItY29udHJvbC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPk9uIEpvYiBEZXBsb3llZDwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJvbkpvYkRlcGxveWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRhLXBpcGVsaW5lcy1qb2JfX2NvbnRhY3RzLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLXBpcGVsaW5lcy1qb2ItZGV0YWlscy1vbi1kZXBsb3llZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlscz8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9kZXBsb3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0Q29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFjdHMgb2Ygam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2RlcGxveVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZSA6IDAgOiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2RlcGxveVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dHJhY3RDb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoID4gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0YS1waXBlbGluZXMtam9iX19jb250YWN0cy1saXN0LXNpZ25wb3N0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItc2lnbnBvc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsclNpZ25wb3N0VHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKCt7eyAoam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbmZpZz8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZGVwbG95XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoIC0gMyB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsclBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQtbWlkZGxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2xySWZPcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRhY3RzIG9mIGpvYkRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9kZXBsb3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXNpZ25wb3N0LWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Tm9Ob3RpZmljYXRpb25zTGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZGVwbG95XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1mb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cIm9uUGxhdGZvcm1FcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbHItY29udHJvbC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPk9uIFBsYXRmb3JtIEVycm9yPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJvblBsYXRmb3JtRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtcGlwZWxpbmVzLWpvYi1kZXRhaWxzLW9uLXBsYXRmb3JtLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2ZhaWx1cmVfcGxhdGZvcm1fZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0Q29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFjdHMgb2Ygam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2ZhaWx1cmVfcGxhdGZvcm1fZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dHJhY3RDb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2UgOiAwIDogM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBjb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlscz8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3BsYXRmb3JtX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGggPiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRhLXBpcGVsaW5lcy1qb2JfX2NvbnRhY3RzLWxpc3Qtc2lnbnBvc3QtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyU2lnbnBvc3RUcmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oK3t7IChqb2JEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3BsYXRmb3JtX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoIC0gMyB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsclBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQtbWlkZGxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2xySWZPcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRhY3RzIG9mIGpvYkRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3BsYXRmb3JtX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dHJhY3RDb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbHItc2lnbnBvc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05vTm90aWZpY2F0aW9uc0xhYmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2ZhaWx1cmVfcGxhdGZvcm1fZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLWZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwib25Vc2VyRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xyLWNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5PbiBVc2VyIEVycm9yPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJvblVzZXJFcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0YS1waXBlbGluZXMtam9iX19jb250YWN0cy1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1waXBlbGluZXMtam9iLWRldGFpbHMtb24tdXNlci1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlscz8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3VzZXJfZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0Q29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFjdHMgb2Ygam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2ZhaWx1cmVfdXNlcl9lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZSA6IDAgOiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX2ZhaWx1cmVfdXNlcl9lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dHJhY3RDb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoID4gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0YS1waXBlbGluZXMtam9iX19jb250YWN0cy1saXN0LXNpZ25wb3N0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItc2lnbnBvc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsclNpZ25wb3N0VHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKCt7eyAoam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbmZpZz8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZmFpbHVyZV91c2VyX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoIC0gMyB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0LWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsclBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQtbWlkZGxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2xySWZPcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRhY3RzIG9mIGpvYkRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3VzZXJfZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXNpZ25wb3N0LWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Tm9Ob3RpZmljYXRpb25zTGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZmFpbHVyZV91c2VyX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1mb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cIm9uSm9iU3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbHItY29udHJvbC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPk9uIEpvYiBTdWNjZXNzPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJvbkpvYlN1Y2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtcGlwZWxpbmVzLWpvYi1kZXRhaWxzLW9uLXN1Y2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2Jfc3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dHJhY3RDb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0YS1waXBlbGluZXMtam9iX19jb250YWN0cy1saXN0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250YWN0cyBvZiBqb2JEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2Jfc3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZSA6IDAgOiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX3N1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0Q29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGEtcGlwZWxpbmVzLWpvYl9fY29udGFjdHMtbGlzdC1zaWducG9zdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLXNpZ25wb3N0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHJTaWducG9zdFRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLigre3sgKGpvYkRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb25maWc/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX3N1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0Q29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGggLSAzIH19KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItc2lnbnBvc3QtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xyUG9zaXRpb25dPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVmdC1taWRkbGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbHJJZk9wZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFjdHMgb2Ygam9iRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX3N1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0cmFjdENvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXNpZ25wb3N0LWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nsci1zaWducG9zdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Tm9Ob3RpZmljYXRpb25zTGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2Jfc3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uLWVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci10ZXh0YXJlYS1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwib25QbGF0Zm9ybUVycm9yVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5PbiBKb2IgZGVwbG95PC9sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJvblBsYXRmb3JtRXJyb3JUZXh0QXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyVGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib25QbGF0Zm9ybUVycm9yVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxue3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlscz8uY29uZmlnPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZGVwbG95XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3RleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci10ZXh0YXJlYS1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwib25Kb2JEZXBsb3lUZXh0QXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPk9uIEpvYiBQbGF0Zm9ybSBlcnJvcjwvbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwib25Kb2JEZXBsb3lUZXh0QXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyVGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib25Kb2JEZXBsb3lUZXh0QXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JEZXRhaWxzPy5jb25maWc/LmNvbnRhY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm5vdGlmaWVkX29uX2pvYl9mYWlsdXJlX3BsYXRmb3JtX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3RleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci10ZXh0YXJlYS1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwib25Vc2VyRXJyb3JUZXh0QXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPk9uIFVzZXIgZXJyb3I8L2xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm9uVXNlckVycm9yVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsclRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm9uVXNlckVycm9yVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxue3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlscz8uY29uZmlnPy5jb250YWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5ub3RpZmllZF9vbl9qb2JfZmFpbHVyZV91c2VyX2Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3RleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xyLXRleHRhcmVhLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci10ZXh0YXJlYS1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwib25Kb2JTdWNjZXNzVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5PbiBKb2Igc3VjY2VzczwvbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwib25Kb2JTdWNjZXNzVGV4dEFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsclRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm9uSm9iU3VjY2Vzc1RleHRBcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbHM/LmNvbmZpZz8uY29udGFjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubm90aWZpZWRfb25fam9iX3N1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvdGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbHItdGV4dGFyZWEtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtb2RhbC1zdWJtaXRcIiB0eXBlPVwic3VibWl0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmRrLWZvcm0tc2VjdGlvbi1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbHItY29sLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNT5cbiAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgNSBFeGVjdXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEpvYkV4ZWN1dGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZWZyZXNoIGV4ZWN1dGlvbiBpbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNKb2JSdW5uaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaXplPVwiMjNcIiBzaGFwZT1cInJlZnJlc2hcIj48L2Nsci1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxvYWRpbmdFeGVjdXRpb25zICYmICFqb2JFeGVjdXRpb25zLmxlbmd0aCAmJiAhbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSBjb3VsZG4ndCBmaW5kIGFueSBleGVjdXRpb25zLCBidXQgeW91IGNhbiBhbHdheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBvbmUhXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGliLWV4ZWN1dGlvbnMtdGltZWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxvYWRpbmdFeGVjdXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtqb2JFeGVjdXRpb25zXT1cImpvYkV4ZWN1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dFcnJvck1lc3NhZ2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoam9iU3RhdGU/LmRlcGxveW1lbnRzIHwgZXh0cmFjdEpvYlN0YXR1cykgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VuYWJsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1leGVjdXRpb25zLXRpbWVsaW5lPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nRXhlY3V0aW9uc1wiIGNsYXNzPVwiY2xyLWNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10aXRsZVwiPkxvYWRpbmcgZXhlY3V0aW9ucy4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZXJyb3JUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxzaGFyZWQtcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBlcnJvckNvbnRleHQ9XCJEYXRhIEpvYiBEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbcGx1cmFsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlcnJvcnNRdWV1ZV09XCJlcnJvcnMucmVjb3Jkc1wiXG4gICAgICAgICAgICAgICAgW2xpc3RlbkZvckVycm9yUGF0dGVybnNdPVwibGlzdGVuRm9yRXJyb3JQYXR0ZXJuc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NoYXJlZC1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19