1import { Q as QPage } from "./QPage.89183c37.js"; 2import { B as BackBtnPrimary } from "./BackBtnPrimary.eb804f1c.js"; 3import { _ as _export_sfc, m as openBlock, n as createElementBlock, F as Fragment, y as renderList, j as createVNode, x as withCtx, aM as QCardSection, p as createBaseVNode, Q as QIcon, aN as QCard, c2 as useLearningStore, r as ref, c as computed, o as onMounted, w as watch, A as createBlock, t as toDisplayString, q as normalizeClass, B as createTextVNode, v as createCommentVNode, a9 as useUserStore, a5 as QBtn, C as QSeparator, bv as QDialog, b3 as QCardActions, R as Notify, a7 as withDirectives, c0 as vShow, Z as reactive, l as resolveComponent, bY as API_CONFIG } from "./index.6f7a794b.js"; 4import { Q as QSkeleton } from "./QSkeleton.54d5b63a.js"; 5import { Q as QLinearProgress } from "./QLinearProgress.2d0cdd4e.js"; 6import { o as isValid, f as format } from "./format.76edbff1.js"; 7import { Q as QBadge } from "./QBadge.f0332250.js"; 8import { u as useQuasar } from "./use-quasar.1ed7d5ca.js"; 9import "./constants.3aa83b60.js"; 10const _sfc_main$4 = {}; 11const _hoisted_1$4 = { class: "q-gutter-y-md" }; 12const _hoisted_2$4 = { class: "row q-gutter-lg" }; 13const _hoisted_3$3 = { class: "col-12 col-md-auto" }; 14const _hoisted_4$3 = { class: "col-12 col-md" }; 15const _hoisted_5$3 = { class: "row q-gutter-md q-my-xs" }; 16const _hoisted_6$3 = { class: "row items-center" }; 17const _hoisted_7$3 = { class: "row items-center" }; 18const _hoisted_8$2 = { class: "col-12 col-md-auto" }; 19function _sfc_render(_ctx, _cache) { 20 return openBlock(), createElementBlock("section", _hoisted_1$4, [ 21 (openBlock(), createElementBlock(Fragment, null, renderList(3, (i) => { 22 return createVNode(QCard, { 23 square: "", 24 flat: "", 25 bordered: "", 26 key: i 27 }, { 28 default: withCtx(() => [ 29 createVNode(QCardSection, null, { 30 default: withCtx(() => [ 31 createBaseVNode("div", _hoisted_2$4, [ 32 createBaseVNode("div", _hoisted_3$3, [ 33 createVNode(QSkeleton, { 34 height: "150px", 35 width: "150px" 36 }) 37 ]), 38 createBaseVNode("div", _hoisted_4$3, [ 39 createVNode(QSkeleton, { 40 type: "text", 41 width: "90%" 42 }), 43 createVNode(QSkeleton, { 44 type: "text", 45 width: "100px" 46 }), 47 createBaseVNode("div", _hoisted_5$3, [ 48 createBaseVNode("div", _hoisted_6$3, [ 49 createVNode(QIcon, { 50 name: "mdi-earth", 51 color: "grey-6", 52 class: "q-mr-sm", 53 size: "18px" 54 }), 55 createVNode(QSkeleton, { 56 type: "text", 57 width: "100px" 58 }) 59 ]), 60 createBaseVNode("div", _hoisted_7$3, [ 61 createVNode(QIcon, { 62 name: "mdi-checkbox-blank-badge-outline", 63 color: "grey-6", 64 class: "q-mr-sm", 65 size: "18px" 66 }), 67 createVNode(QSkeleton, { 68 type: "text", 69 width: "100px" 70 }) 71 ]) 72 ]) 73 ]), 74 createBaseVNode("div", _hoisted_8$2, [ 75 createVNode(QSkeleton, { 76 type: "circle", 77 width: "130px", 78 height: "130px" 79 }) 80 ]) 81 ]) 82 ]), 83 _: 1 84 }) 85 ]), 86 _: 1 87 }); 88 }), 64)) 89 ]); 90} 91var OrderItemCardSkeleton = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render], ["__file", "OrderItemCardSkeleton.vue"]]); 92var LearningCourseCard_vue_vue_type_style_index_0_scoped_true_lang = ""; 93const _hoisted_1$3 = { class: "row no-wrap q-gutter-x-md items-start" }; 94const _hoisted_2$3 = { class: "learning-course-card__thumb col-auto" }; 95const _hoisted_3$2 = ["src", "alt"]; 96const _hoisted_4$2 = { 97 key: 1, 98 class: "learning-course-card__thumb-fallback" 99}; 100const _hoisted_5$2 = { class: "col" }; 101const _hoisted_6$2 = { 102 class: "text-weight-medium text-dark ibf-h9 q-mb-xs", 103 style: { "line-height": "1.3" } 104}; 105const _hoisted_7$2 = { class: "row q-gutter-xs" }; 106const _hoisted_8$1 = { class: "learning-course-card__footer q-px-md q-pb-md" }; 107const _hoisted_9$1 = { class: "row items-center justify-between q-mb-xs" }; 108const _hoisted_10$1 = { class: "row items-center text-grey-7 ibf-h12" }; 109const _hoisted_11$1 = { 110 key: 0, 111 class: "text-grey-8 ibf-h12 text-weight-medium" 112}; 113const _sfc_main$3 = { 114 __name: "LearningCourseCard", 115 props: { 116 course: { 117 type: Object, 118 required: true 119 } 120 }, 121 emits: ["open"], 122 setup(__props) { 123 const props = __props;
124 const learningStore = useLearningStore(); 125 const features = ref({ 126 assessments: false, 127 training: false, 128 evaluation: false 129 }); 130 const featureItems = computed(() => [ 131 { 132 key: "assessments", 133 label: "Assessments", 134 icon: "mdi-clipboard-text-outline", 135 available: features.value.assessments 136 }, 137 { 138 key: "training", 139 label: "Training Session", 140 icon: "mdi-calendar-clock-outline", 141 available: features.value.training 142 }, 143 { 144 key: "evaluation", 145 label: "Evaluation", 146 icon: "mdi-star-outline", 147 available: features.value.evaluation 148 } 149 ]); 150 const loadFeatures = async () => { 151 var _a; 152 const courseId = (_a = props.course) == null ? void 0 : _a.courseId; 153 if (!courseId) { 154 features.value = { 155 assessments: false, 156 training: false, 157 evaluation: false 158 }; 159 return; 160 } 161 const result = await learningStore.serverFetchCourseFeatureAvailability(courseId); 162 features.value = { 163 assessments: Boolean(result == null ? void 0 : result.assessments), 164 training: Boolean(result == null ? void 0 : result.training), 165 evaluation: Boolean(result == null ? void 0 : result.evaluation) 166 }; 167 }; 168 onMounted(loadFeatures); 169 watch( 170 () => { 171 var _a; 172 return (_a = props.course) == null ? void 0 : _a.courseId; 173 }, 174 () => { 175 loadFeatures(); 176 } 177 ); 178 const progressValue = computed( 179 () => { 180 var _a; 181 return Math.min(100, Math.max(0, Number((_a = props.course) == null ? void 0 : _a.progress) || 0)); 182 } 183 ); 184 const hasElearningInfo = computed(() => { 185 const course = props.course; 186 if (typeof (course == null ? void 0 : course.has_elearning) === "boolean") 187 return course.has_elearning; 188 return Boolean((course == null ? void 0 : course.pk) && (course == null ? void 0 : course.sk) && (course == null ? void 0 : course.version)); 189 }); 190 const formatLastAccessed = (value) => { 191 if (!value) 192 return "-- --"; 193 try { 194 const date = new Date(value); 195 if (!isValid(date)) 196 return "-- --"; 197 return format(date, "dd-MMM-yyyy"); 198 } catch { 199 return "-- --"; 200 } 201 }; 202 const lastAccessedLabel = computed( 203 () => { 204 var _a; 205 return formatLastAccessed((_a = props.course) == null ? void 0 : _a.last_access); 206 } 207 ); 208 return (_ctx, _cache) => { 209 return openBlock(), createBlock(QCard, { 210 flat: "", 211 bordered: "", 212 class: "learning-course-card cursor-pointer", 213 onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("open", __props.course)) 214 }, { 215 default: withCtx(() => [ 216 createVNode(QCardSection, { class: "q-pa-md" }, { 217 default: withCtx(() => [ 218 createBaseVNode("div", _hoisted_1$3, [ 219 createBaseVNode("div", _hoisted_2$3, [ 220 __props.course.thumbnail ? (openBlock(), createElementBlock("img", { 221 key: 0, 222 src: __props.course.thumbnail, 223 alt: __props.course.title, 224 class: "learning-course-card__thumb-img" 225 }, null, 8, _hoisted_3$2)) : (openBlock(), createElementBlock("div", _hoisted_4$2, [ 226 createVNode(QIcon, { 227 name: "mdi-trophy", 228 size: "28px", 229 color: "white" 230 }) 231 ])) 232 ]), 233 createBaseVNode("div", _hoisted_5$2, [ 234 createBaseVNode("div", _hoisted_6$2, toDisplayString(__props.course.title), 1), 235 createBaseVNode("div", _hoisted_7$2, [ 236 (openBlock(true), createElementBlock(Fragment, null, renderList(featureItems.value, (item) => { 237 return openBlock(), createElementBlock("span", { 238 key: item.key, 239 class: normalizeClass(["learning-course-card__feature", { 240 "learning-course-card__feature--available": item.available, 241 "learning-course-card__feature--unavailable": !item.available 242 }]) 243 }, [ 244 createVNode(QIcon, { 245 name: item.icon, 246 size: "12px", 247 class: "q-mr-xs" 248 }, null, 8, ["name"]), 249 createTextVNode(" " + toDisplayString(item.label), 1) 250 ], 2); 251 }), 128)) 252 ]) 253 ]) 254 ]) 255 ]), 256 _: 1 257 }), 258 createBaseVNode("div", _hoisted_8$1, [ 259 createBaseVNode("div", _hoisted_9$1, [ 260 createBaseVNode("div", _hoisted_10$1, [ 261 createVNode(QIcon, { 262 name: "mdi-clock-outline", 263 size: "14px", 264 color: "primary", 265 class: "q-mr-xs" 266 }), 267 createBaseVNode("span", null, "Last accessed " + toDisplayString(lastAccessedLabel.value), 1) 268 ]), 269 hasElearningInfo.value ? (openBlock(), createElementBlock("span", _hoisted_11$1, toDisplayString(progressValue.value) + "%", 1)) : createCommentVNode("", true) 270 ]), 271 hasElearningInfo.value ? (openBlock(), createBlock(QLinearProgress, { 272 key: 0, 273 rounded: "", 274 size: "6px", 275 value: progressValue.value / 100, 276 color: "green", 277 "track-color": "grey-4" 278 }, null, 8, ["value"])) : createCommentVNode("", true) 279 ]) 280 ]), 281 _: 1 282 }); 283 }; 284 } 285}; 286var LearningCourseCard = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-6c9b8e54"], ["__file", "LearningCourseCard.vue"]]); 287var CourseActionsSheet_vue_vue_type_style_index_0_scoped_true_lang = ""; 288var CourseActionsSheet_vue_vue_type_style_index_1_lang = ""; 289const _hoisted_1$2 = { class: "course-actions-sheet__thumb q-mr-md" }; 290const _hoisted_2$2 = ["src", "alt"]; 291const _hoisted_3$1 = { 292 key: 1, 293 class: "course-actions-sheet__thumb-fallback" 294}; 295const _hoisted_4$1 = { 296 class: "col text-weight-medium text-dark ibf-h8 ellipsis", 297 style: { "line-height": "1.35" } 298}; 299const _hoisted_5$1 = { class: "course-actions-sheet__scroll" }; 300const _hoisted_6$1 = { 301 key: 0, 302 class: "q-gutter-y-sm q-mb-lg" 303}; 304const _hoisted_7$1 = { 305 key: 1, 306 class: "q-mb-lg" 307}; 308const _hoisted_8 = { class: "course-actions-sheet__group-label" }; 309const _hoisted_9 = { class: "course-actions-sheet__assessment-list" }; 310const _hoisted_10 = ["disabled", "onClick"]; 311const _hoisted_11 = { class: "col text-left" }; 312const _hoisted_12 = { class: "row items-center q-gutter-x-sm no-wrap" }; 313const _hoisted_13 = { class: "text-weight-medium text-dark" }; 314const _hoisted_14 = { 315 key: 0, 316 class: "text-grey-6 ibf-h12 q-mt-xs" 317}; 318const _hoisted_15 = { 319 key: 1, 320 class: "ibf-h12 q-mt-xs text-positive" 321}; 322const _hoisted_16 = { key: 0 }; 323const _hoisted_17 = { 324 key: 2, 325 class: "ibf-h12 q-mt-xs text-grey-5" 326}; 327const _hoisted_18 = { 328 key: 0, 329 class: "course-actions-sheet__empty text-grey-6 ibf-h12" 330}; 331const _hoisted_19 = { 332 key: 2, 333 class: "q-gutter-y-sm q-mb-lg" 334}; 335const _hoisted_20 = { 336 key: 3, 337 class: "course-actions-sheet__assessment-list q-mb-lg" 338}; 339const _hoisted_21 = ["disabled", "onClick"]; 340const _hoisted_22 = { class: "course-actions-sheet__assessment-icon course-actions-sheet__assessment-icon--training" }; 341const _hoisted_23 = { class: "col text-left" }; 342const _hoisted_24 = { class: "row items-center q-gutter-x-sm" }; 343const _hoisted_25 = { class: "text-weight-medium text-dark" }; 344const _hoisted_26 = { 345 key: 0, 346 class: "text-grey-7 text-weight-regular" 347}; 348const _hoisted_27 = { class: "text-grey-6 ibf-h12 q-mt-xs" }; 349const _hoisted_28 = { 350 key: 0, 351 class: "ibf-h12 q-mt-xs text-positive" 352}; 353const _hoisted_29 = { 354 key: 0, 355 class: "course-actions-sheet__empty text-grey-6 ibf-h12" 356}; 357const _hoisted_30 = { class: "course-actions-sheet__footer" }; 358const _hoisted_31 = { class: "q-gutter-y-sm" }; 359const _hoisted_32 = { class: "iqr-ticket" }; 360const _hoisted_33 = { 361 key: 0, 362 class: "iqr-ticket__course" 363}; 364const _hoisted_34 = { 365 key: 1, 366 class: "iqr-ticket__candidate" 367};
368const _hoisted_35 = ["src"]; 369const _hoisted_36 = { 370 key: 3, 371 class: "iqr-ticket__code-block" 372}; 373const _hoisted_37 = { class: "iqr-ticket__code-value" }; 374const _sfc_main$2 = { 375 __name: "CourseActionsSheet", 376 props: { 377 modelValue: { 378 type: Boolean, 379 default: false 380 }, 381 course: { 382 type: Object, 383 default: null 384 } 385 }, 386 emits: ["update:modelValue", "continue"], 387 setup(__props, { emit: __emit }) { 388 const props = __props; 389 const emit = __emit; 390 const learningStore = useLearningStore(); 391 const userStore = useUserStore(); 392 const $q = useQuasar(); 393 const assessmentsLoading = ref(false); 394 const assessmentsPayload = ref(null); 395 const trainingsLoading = ref(false); 396 const trainingSessions = ref([]); 397 const ticketLoading = ref(false); 398 const ticketDownloadLoading = ref(false); 399 const showTicketDialog = ref(false); 400 const attendanceTicket = ref(null); 401 const materialUrl = computed(() => { 402 var _a; 403 return ((_a = props.course) == null ? void 0 : _a.materialUrl) || null; 404 }); 405 const hasMaterial = computed(() => { 406 var _a; 407 return Boolean(((_a = props.course) == null ? void 0 : _a.hasMaterial) && materialUrl.value); 408 }); 409 const orderItemId = computed(() => { 410 var _a; 411 return ((_a = props.course) == null ? void 0 : _a.orderItemId) || null; 412 }); 413 const canShowAttendanceQr = computed( 414 () => { 415 var _a; 416 return Boolean(orderItemId.value) && Boolean((_a = props.course) == null ? void 0 : _a.payment_status) && !trainingsLoading.value && trainingSessions.value.length > 0; 417 } 418 ); 419 const ticketCode = computed( 420 () => { 421 var _a, _b; 422 return ((_b = (_a = attendanceTicket.value) == null ? void 0 : _a.ticket) == null ? void 0 : _b.ticket_code) || ""; 423 } 424 ); 425 const formatPersonTitle = (rawTitle) => { 426 const value = String(rawTitle || "").trim(); 427 if (!value) 428 return ""; 429 const normalized = value.replace(/\.$/, ""); 430 const upper = normalized.toUpperCase(); 431 if (upper === "H.E" || upper === "HE") 432 return "H.E."; 433 const titled = normalized.charAt(0).toUpperCase() + normalized.slice(1).toLowerCase(); 434 return `${titled}.`; 435 }; 436 const candidateName = computed(() => { 437 var _a, _b, _c, _d, _e; 438 const ticketCandidate = ((_a = attendanceTicket.value) == null ? void 0 : _a.candidate) || {}; 439 const user = userStore.getUser || {}; 440 const title = formatPersonTitle( 441 ticketCandidate.title || user.title || ((_b = props.course) == null ? void 0 : _b.title_name) 442 ); 443 const fromParts = [ 444 ticketCandidate.first_name || user.first_name, 445 ticketCandidate.last_name || user.last_name 446 ].filter(Boolean).join(" ").trim(); 447 const name = fromParts || ticketCandidate.full_name || user.name || user.full_name || ((_c = props.course) == null ? void 0 : _c.student_name) || ((_d = props.course) == null ? void 0 : _d.full_name) || ((_e = props.course) == null ? void 0 : _e.customer_name) || ""; 448 if (!name) 449 return title; 450 return title ? `${title} ${name}` : name; 451 }); 452 const ticketQrPayload = computed(() => { 453 var _a, _b; 454 const qr = (_b = (_a = attendanceTicket.value) == null ? void 0 : _a.ticket) == null ? void 0 : _b.qr_code; 455 if (!qr) 456 return ticketCode.value; 457 if (typeof qr === "string") 458 return qr; 459 try { 460 return JSON.stringify(qr); 461 } catch { 462 return ticketCode.value; 463 } 464 }); 465 const ticketQrImageUrl = computed(() => { 466 if (!ticketQrPayload.value) 467 return ""; 468 return `https://api.qrserver.com/v1/create-qr-code/?size=280x280&data=${encodeURIComponent( 469 ticketQrPayload.value 470 )}`; 471 }); 472 const hasElearningCredentials = computed(() => { 473 const course = props.course; 474 return Boolean((course == null ? void 0 : course.ulid) && (course == null ? void 0 : course.sk) && (course == null ? void 0 : course.version)); 475 }); 476 const isPhysicalOnly = computed(() => { 477 const course = props.course; 478 if (!(course == null ? void 0 : course.payment_status)) 479 return false;
480 if (course.has_elearning === false) 481 return true; 482 return !hasElearningCredentials.value; 483 }); 484 const canContinue = computed( 485 () => { 486 var _a; 487 return Boolean((_a = props.course) == null ? void 0 : _a.payment_status) && hasElearningCredentials.value && !isPhysicalOnly.value; 488 } 489 ); 490 const continueLabel = computed(() => { 491 var _a, _b; 492 const progress = Number((_a = props.course) == null ? void 0 : _a.progress) || 0; 493 if (progress === 100) 494 return "Review Learning"; 495 if (progress > 0 || ((_b = props.course) == null ? void 0 : _b.last_access)) 496 return "Continue Learning"; 497 return "Start Learning"; 498 }); 499 const formatSessionDate = (value) => { 500 if (!value) 501 return "Date TBC"; 502 try { 503 const date = new Date(value); 504 if (!isValid(date)) 505 return String(value); 506 return format(date, "dd-MMM-yyyy"); 507 } catch { 508 return String(value); 509 } 510 }; 511 const formatCompletedAt = (value) => { 512 if (!value) 513 return null; 514 try { 515 const date = new Date(value); 516 if (!isValid(date)) 517 return null; 518 return format(date, "dd-MMM-yyyy"); 519 } catch { 520 return null; 521 } 522 }; 523 const isShownOnMyLearning = (slot) => { 524 var _a; 525 if (!(slot == null ? void 0 : slot.formId)) 526 return false; 527 const moduleId = String((_a = slot.moduleId) != null ? _a : "").trim(); 528 if (moduleId === "") 529 return true; 530 return slot.showOnMyLearning === true; 531 }; 532 const mapAssessmentRow = (assessment, config, index = 0) => { 533 if (!isShownOnMyLearning(assessment)) 534 return null; 535 const completed = Boolean(assessment.completed); 536 const totalScore = assessment.totalScore; 537 const maxScore = assessment.maxScore; 538 let scoreLabel = null; 539 if (completed && totalScore != null && maxScore != null) { 540 scoreLabel = `Score ${totalScore}/${maxScore}`; 541 } 542 const moduleHint = assessment.moduleTitle || null; 543 return { 544 key: `${config.key}-${assessment.moduleId || "course"}-${assessment.formId}-${index}`, 545 kind: config.key, 546 label: config.label, 547 hint: moduleHint || config.hint, 548 icon: config.icon, 549 iconColor: config.iconColor, 550 formId: assessment.formId, 551 title: assessment.title || null, 552 url: assessment.url || null, 553 completed, 554 completedAtLabel: formatCompletedAt(assessment.completedAt), 555 scoreLabel 556 }; 557 }; 558 const slotList = (payload, type) => { 559 if (!payload) 560 return []; 561 const arrays = { 562 pre: payload.preAssessments, 563 post: payload.postAssessments, 564 evaluate: payload.evaluateAssessments 565 }; 566 const list = arrays[type]; 567 if (Array.isArray(list) && list.length > 0) 568 return list; 569 const single = type === "pre" ? payload.preAssessment : type === "post" ? payload.postAssessment : payload.evaluateAssessment; 570 return single ? [single] : []; 571 }; 572 const visibleAssessments = computed(() => { 573 const payload = assessmentsPayload.value; 574 const configs = [ 575 { 576 key: "pre", 577 label: "Pre-Assessment", 578 hint: "Take before learning", 579 icon: "mdi-clipboard-text-outline", 580 iconColor: "primary" 581 }, 582 { 583 key: "post", 584 label: "Post-Assessment", 585 hint: "Take after learning", 586 icon: "mdi-checkbox-marked-outline", 587 iconColor: "secondary" 588 }, 589 { 590 key: "evaluate", 591 label: "Evaluation", 592 hint: "Course feedback", 593 icon: "mdi-star-outline", 594 iconColor: "orange" 595 } 596 ]; 597 return configs.flatMap( 598 (config) => slotList(payload, config.key).map((slot, index) => mapAssessmentRow(slot, config, index)).filter(Boolean) 599 ); 600 }); 601 const KIND_NAME = { 602 pre: "Pre-Assessment", 603 post: "Post-Assessment", 604 evaluate: "Evaluation" 605 }; 606 const GROUP_LABEL = { 607 pre: "Pre-tests", 608 post: "Post-tests", 609 evaluate: "Evaluations" 610 }; 611 function meaningfulFormTitle(title) { 612 const cleaned = String(title || "").trim(); 613 if (!cleaned) 614 return ""; 615 const normalized = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim(); 616 const phrases = /* @__PURE__ */ new Set([ 617 "pre test", 618 "pre assessment", 619 "pretest", 620 "post test", 621 "post assessment", 622 "posttest", 623 "evaluation", 624 "evaluate", 625 "course evaluation", 626 "course feedback" 627 ]); 628 if (phrases.has(normalized(cleaned))) 629 return ""; 630 const parts = cleaned.split(/[:·|]/).map((part) =>
630 part.trim()).filter(Boolean); 631 if (parts.length > 1 && parts.every((part) => phrases.has(normalized(part)))) 632 return ""; 633 return cleaned; 634 } 635 const assessmentGroups = computed(() => { 636 const rows = visibleAssessments.value; 637 return ["pre", "post", "evaluate"].map((kind) => { 638 const items = rows.filter((row) => row.kind === kind); 639 if (!items.length) 640 return null; 641 return { 642 key: kind, 643 label: GROUP_LABEL[kind], 644 items: items.map((row, index) => { 645 const title = meaningfulFormTitle(row.title); 646 if (items.length <= 1) { 647 return { ...row, title: title || null }; 648 } 649 return { 650 ...row, 651 label: title || `${KIND_NAME[kind]} ${index + 1}`, 652 title: null 653 }; 654 }) 655 }; 656 }).filter(Boolean); 657 }); 658 const trainingRows = computed( 659 () => trainingSessions.value.map((session) => { 660 var _a, _b; 661 const isVirtual = String(session.deliveryType || "").toLowerCase() === "virtual"; 662 const isExam = String(session.sessionCategory || "").toLowerCase() === "exam"; 663 const isZoom = isVirtual && Boolean(session.meetingLink); 664 const venueParts = [session.venue, session.room].filter(Boolean); 665 let locationLabel = "Location TBC"; 666 if (isZoom) { 667 locationLabel = "Zoom"; 668 } else if (isVirtual) { 669 locationLabel = "Virtual"; 670 } else if (venueParts.length) { 671 locationLabel = venueParts.join(" \xB7 "); 672 } 673 const attendanceStatus = ((_a = session.attendance) == null ? void 0 : _a.status) || "not_checked_in"; 674 let attendanceLabel = "Not checked in"; 675 let attendanceBadgeColor = "grey-4"; 676 let attendanceBadgeTextColor = "grey-8"; 677 if (attendanceStatus === "checked_in") { 678 attendanceLabel = "Present"; 679 attendanceBadgeColor = "positive"; 680 attendanceBadgeTextColor = "white"; 681 } else if (attendanceStatus === "absent") { 682 attendanceLabel = "Absent"; 683 attendanceBadgeColor = "negative"; 684 attendanceBadgeTextColor = "white"; 685 } 686 let checkedInAtLabel = null; 687 if ((_b = session.attendance) == null ? void 0 : _b.checked_in_at) { 688 try { 689 const checkedAt = new Date(session.attendance.checked_in_at); 690 if (isValid(checkedAt)) { 691 checkedInAtLabel = format(checkedAt, "dd-MMM-yyyy HH:mm"); 692 } 693 } catch { 694 checkedInAtLabel = String(session.attendance.checked_in_at); 695 } 696 } 697 return { 698 id: session.id, 699 dateLabel: formatSessionDate(session.date), 700 time: session.time || null, 701 locationLabel, 702 isVirtual, 703 isExam, 704 isZoom, 705 actionUrl: session.meetingLink || session.mapUrl || null, 706 attendanceLabel, 707 attendanceBadgeColor, 708 attendanceBadgeTextColor, 709 checkedInAtLabel 710 }; 711 }) 712 ); 713 const resetAssessments = () => { 714 assessmentsPayload.value = null; 715 }; 716 const resetTrainings = () => { 717 trainingSessions.value = []; 718 }; 719 const fetchAssessments = async () => { 720 var _a; 721 const courseId = (_a = props.course) == null ? void 0 : _a.courseId; 722 if (!courseId) { 723 resetAssessments(); 724 return; 725 } 726 assessmentsLoading.value = true; 727 try { 728 const result = await learningStore.serverFetchCourseAssessments(courseId); 729 assessmentsPayload.value = result || null; 730 } finally { 731 assessmentsLoading.value = false; 732 } 733 }; 734 const fetchTrainings = async () => { 735 var _a; 736 const courseId = (_a = props.course) == null ? void 0 : _a.courseId; 737 if (!courseId) { 738 resetTrainings(); 739 return; 740 } 741 trainingsLoading.value = true; 742 try { 743 const result = await learningStore.serverFetchCourseTrainings( 744 courseId, 745 orderItemId.value 746 ); 747 trainingSessions.value = result.sessions || []; 748 } finally { 749 trainingsLoading.value = false;
750 } 751 }; 752 const openAttendanceQr = async () => { 753 var _a; 754 if (!orderItemId.value) 755 return; 756 ticketLoading.value = true; 757 try { 758 const result = await learningStore.serverFetchAttendanceTicket( 759 orderItemId.value 760 ); 761 attendanceTicket.value = result; 762 if ((_a = result == null ? void 0 : result.ticket) == null ? void 0 : _a.ticket_code) { 763 showTicketDialog.value = true; 764 } 765 } finally { 766 ticketLoading.value = false; 767 } 768 }; 769 const loadImage = (src) => new Promise((resolve, reject) => { 770 const img = new Image(); 771 img.onload = () => resolve(img); 772 img.onerror = () => reject(new Error("Failed to load ticket image.")); 773 img.src = src; 774 }); 775 const wrapCanvasText = (ctx, text, maxWidth) => { 776 const words = String(text || "").split(/\s+/).filter(Boolean); 777 if (!words.length) 778 return []; 779 const lines = []; 780 let current = words[0]; 781 for (let i = 1; i < words.length; i += 1) { 782 const next = `${current} ${words[i]}`; 783 if (ctx.measureText(next).width <= maxWidth) { 784 current = next; 785 } else { 786 lines.push(current); 787 current = words[i]; 788 } 789 } 790 lines.push(current); 791 return lines.slice(0, 3); 792 }; 793 const downloadIqrTicketJpg = async () => { 794 var _a; 795 if (!ticketQrPayload.value) 796 return; 797 ticketDownloadLoading.value = true; 798 let qrObjectUrl = null; 799 try { 800 const logo = await loadImage("/images/IBF_logo_full_bg.png"); 801 const qrResponse = await fetch( 802 `https://api.qrserver.com/v1/create-qr-code/?size=500x500&data=${encodeURIComponent( 803 ticketQrPayload.value 804 )}` 805 ); 806 if (!qrResponse.ok) 807 throw new Error("Failed to fetch QR image."); 808 const qrBlob = await qrResponse.blob(); 809 qrObjectUrl = URL.createObjectURL(qrBlob); 810 const qr = await loadImage(qrObjectUrl); 811 const width = 720; 812 const padding = 48; 813 const contentWidth = width - padding * 2; 814 const logoMaxW = 280; 815 const logoMaxH = 110; 816 const logoScale = Math.min( 817 logoMaxW / logo.width, 818 logoMaxH / logo.height, 819 1 820 ); 821 const logoW = logo.width * logoScale; 822 const logoH = logo.height * logoScale; 823 const qrSize = 420; 824 const courseTitle = ((_a = props.course) == null ? void 0 : _a.title) || ""; 825 const candidate = candidateName.value || ""; 826 const hint = "Show this QR code to your moderator for check-in."; 827 const measure = document.createElement("canvas").getContext("2d"); 828 measure.font = "bold 22px sans-serif"; 829 const courseLines = courseTitle ? wrapCanvasText(measure, courseTitle, contentWidth) : []; 830 measure.font = "22px sans-serif"; 831 const candidateLines = candidate ? wrapCanvasText(measure, candidate, contentWidth) : []; 832 measure.font = "18px sans-serif"; 833 const hintLines = wrapCanvasText(measure, hint, contentWidth); 834 let height = padding; 835 height += logoH + 28; 836 height += 42; 837 if (courseLines.length) 838 height += courseLines.length * 28 + 12; 839 if (candidateLines.length) 840 height += candidateLines.length * 28 + 16; 841 height += qrSize + 28; 842 if (ticketCode.value) 843 height += 70; 844 height += hintLines.length * 24 + 16; 845 height += padding; 846 const canvas = document.createElement("canvas"); 847 canvas.width = width; 848 canvas.height = height; 849 const ctx = canvas.getContext("2d"); 850 ctx.fillStyle = "#ffffff"; 851 ctx.fillRect(0, 0, width, height); 852 let y = padding; 853 ctx.drawImage(logo, (width - logoW) / 2, y, logoW, logoH); 854 y += logoH + 28; 855 ctx.textAlign = "center"; 856 ctx.fillStyle = "#8f1723"; 857 ctx.font = "bold 36px sans-serif"; 858 ctx.fillText("I-QR Ticket", width / 2, y); 859 y += 42; 860 if (courseLines.length) { 861 ctx.fillStyle = "#333333"; 862 ctx.font = "bold 22px sans-serif";
863 courseLines.forEach((line) => { 864 ctx.fillText(line, width / 2, y); 865 y += 28; 866 }); 867 y += 8; 868 } 869 if (candidateLines.length) { 870 ctx.fillStyle = "#555555"; 871 ctx.font = "22px sans-serif"; 872 candidateLines.forEach((line) => { 873 ctx.fillText(line, width / 2, y); 874 y += 28; 875 }); 876 y += 12; 877 } 878 ctx.drawImage(qr, (width - qrSize) / 2, y, qrSize, qrSize); 879 y += qrSize + 32; 880 if (ticketCode.value) { 881 ctx.fillStyle = "#888888"; 882 ctx.font = "18px sans-serif"; 883 ctx.fillText("Ticket code", width / 2, y); 884 y += 30; 885 ctx.fillStyle = "#8f1723"; 886 ctx.font = "bold 28px sans-serif"; 887 ctx.fillText(String(ticketCode.value), width / 2, y); 888 y += 36; 889 } 890 ctx.fillStyle = "#666666"; 891 ctx.font = "18px sans-serif"; 892 hintLines.forEach((line) => { 893 ctx.fillText(line, width / 2, y); 894 y += 24; 895 }); 896 const dataUrl = canvas.toDataURL("image/jpeg", 0.92); 897 const safeCode = String(ticketCode.value || "ticket").replace(/[^\w.-]+/g, "-").slice(0, 40); 898 const link = document.createElement("a"); 899 link.href = dataUrl; 900 link.download = `I-QR-Ticket-${safeCode}.jpg`; 901 document.body.appendChild(link); 902 link.click(); 903 link.remove(); 904 Notify.create({ 905 type: "positive", 906 message: "I-QR Ticket downloaded.", 907 position: "top-right" 908 }); 909 } catch (error) { 910 Notify.create({ 911 type: "negative", 912 message: (error == null ? void 0 : error.message) || "Failed to download I-QR Ticket.", 913 position: "top-right" 914 }); 915 } finally { 916 if (qrObjectUrl) 917 URL.revokeObjectURL(qrObjectUrl); 918 ticketDownloadLoading.value = false; 919 } 920 }; 921 watch( 922 () => { 923 var _a, _b; 924 return [props.modelValue, (_a = props.course) == null ? void 0 : _a.courseId, (_b = props.course) == null ? void 0 : _b.orderItemId]; 925 }, 926 ([open]) => { 927 if (open && props.course) { 928 fetchAssessments(); 929 fetchTrainings(); 930 } else if (!open) { 931 resetAssessments(); 932 resetTrainings(); 933 attendanceTicket.value = null; 934 showTicketDialog.value = false; 935 } 936 } 937 ); 938 const close = () => emit("update:modelValue", false); 939 const openUrl = (url) => { 940 if (!url) 941 return; 942 window.open(url, "_blank", "noopener,noreferrer"); 943 }; 944 const safeHttpUrl = (url) => { 945 try { 946 const parsed = new URL(url, window.location.origin); 947 if (parsed.protocol !== "http:" && parsed.protocol !== "https:") 948 return null; 949 return parsed.toString(); 950 } catch { 951 return null; 952 } 953 }; 954 const leavesIbfSite = (url) => { 955 try { 956 return new URL(url).origin !== window.location.origin; 957 } catch { 958 return true; 959 } 960 }; 961 const confirmLeaveAndOpen = (url) => { 962 const target = safeHttpUrl(url); 963 if (!target) 964 return; 965 const redirect = () => { 966 window.location.assign(target); 967 }; 968 if (!leavesIbfSite(target)) { 969 redirect(); 970 return; 971 } 972 $q.dialog({ 973 title: "Leave IBF?", 974 message: "You are about to leave the IBF website. If you continue, you will be redirected.", 975 cancel: { 976 label: "Stay", 977 flat: true, 978 color: "primary", 979 noCaps: true 980 }, 981 ok: { 982 label: "Continue", 983 color: "primary", 984 unelevated: true, 985 noCaps: true 986 }, 987 persistent: true 988 }).onOk(redirect); 989 }; 990 const buildAssessmentUrlWithSession = (url) => { 991 var _a, _b, _c, _d; 992 if (!url) 993 return null; 994 const token = userStore.getToken; 995 if (!token) 996 return url; 997 try { 998 const parsedUrl = new URL(url, window.location.origin); 999 const isFormFillPath = /^\/f\/[^/]+/i.test(parsedUrl.pathname || ""); 1000 if (!isFormFillPath) { 1001 return url; 1002 } 1003 parsedUrl.searchParams.set("access_token", token); 1004 const email = ((_a = userStore.getUser) == null ? void 0 : _a.email) || ((_b = userStore.getUser) == null ? void 0 : _b.work_email); 1005 if (email) { 1006 parsedUrl.searchParams.set("email", email); 1007 } 1008 const fullName = [(_c = userStore.getUser) == null ? void 0 : _c.first_name, (_d = userStore.getUser) == null ? void 0 : _d.last_name].filter(
1008Boolean).join(" ").trim(); 1009 if (fullName) { 1010 parsedUrl.searchParams.set("name", fullName); 1011 } 1012 const refreshToken = userStore.getRefreshToken; 1013 if (refreshToken) { 1014 parsedUrl.searchParams.set("refresh_token", refreshToken); 1015 parsedUrl.searchParams.set("expires_in", String(30 * 24 * 60 * 60)); 1016 } 1017 return parsedUrl.toString(); 1018 } catch { 1019 return url; 1020 } 1021 }; 1022 const openAssessmentUrl = (url) => { 1023 openUrl(buildAssessmentUrlWithSession(url)); 1024 }; 1025 const emitContinue = () => { 1026 if (!canContinue.value) 1027 return; 1028 emit("continue", props.course); 1029 }; 1030 return (_ctx, _cache) => { 1031 return openBlock(), createElementBlock(Fragment, null, [ 1032 createVNode(QDialog, { 1033 "model-value": __props.modelValue, 1034 position: "bottom", 1035 "backdrop-filter": "blur(2px)", 1036 "content-class": "course-actions-dialog-content", 1037 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:modelValue", $event)) 1038 }, { 1039 default: withCtx(() => [ 1040 createVNode(QCard, { 1041 flat: "", 1042 class: "course-actions-sheet" 1043 }, { 1044 default: withCtx(() => [ 1045 createVNode(QCardSection, { class: "course-actions-sheet__header row items-center no-wrap" }, { 1046 default: withCtx(() => { 1047 var _a, _b, _c; 1048 return [ 1049 createBaseVNode("div", _hoisted_1$2, [ 1050 ((_a = __props.course) == null ? void 0 : _a.thumbnail) ? (openBlock(), createElementBlock("img", { 1051 key: 0, 1052 src: __props.course.thumbnail, 1053 alt: (_b = __props.course) == null ? void 0 : _b.title, 1054 class: "course-actions-sheet__thumb-img" 1055 }, null, 8, _hoisted_2$2)) : (openBlock(), createElementBlock("div", _hoisted_3$1, [ 1056 createVNode(QIcon, { 1057 name: "mdi-trophy", 1058 size: "22px", 1059 color: "white" 1060 }) 1061 ])) 1062 ]), 1063 createBaseVNode("div", _hoisted_4$1, toDisplayString((_c = __props.course) == null ? void 0 : _c.title), 1), 1064 createVNode(QBtn, { 1065 flat: "", 1066 dense: "", 1067 icon: "mdi-close", 1068 color: "grey-8", 1069 "aria-label": "Close", 1070 class: "q-ml-sm", 1071 onClick: close 1072 }) 1073 ]; 1074 }), 1075 _: 1 1076 }), 1077 createVNode(QSeparator), 1078 createBaseVNode("div", _hoisted_5$1, [ 1079 createVNode(QCardSection, { class: "course-actions-sheet__body" }, { 1080 default: withCtx(() => [ 1081 _cache[5] || (_cache[5] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Assessments", -1)), 1082 assessmentsLoading.value ? (openBlock(), createElementBlock("div", _hoisted_6$1, [ 1083 createVNode(QSkeleton, { 1084 type: "rect", 1085 height: "72px", 1086 square: "" 1087 }), 1088 createVNode(QSkeleton, { 1089 type: "rect", 1090 height: "72px", 1091 square: "" 1092 }) 1093 ])) : (openBlock(), createElementBlock("div", _hoisted_7$1, [ 1094 (openBlock(true), createElementBlock(Fragment, null, renderList(assessmentGroups.value, (group) => { 1095 return openBlock(), createElementBlock("div", { 1096 key: group.key, 1097 class: "course-actions-sheet__group" 1098 }, [ 1099 createBaseVNode("div", _hoisted_8, toDisplayString(group.label), 1), 1100 createBaseVNode("div", _hoisted_9, [ 1101 (openBlock(true), createElementBlock(Fragment, null, renderList(group.items, (item) => { 1102 return openBlock(), createElementBlock("button", { 1103 key: item.key, 1104 type: "button", 1105 class: normalizeClass(["course-actions-sheet__assessment", { 1106 "course-actions-sheet__assessment--completed": item.completed, 1107 "course-actions-sheet__assessment--disabled": !item.url 1108 }]), 1109 disabled: !item.url, 1110 onClick: ($event) => openAssessmentUrl(item.url) 1111 }, [ 1112 createBaseVNode("div", { 1113 class: normalizeClass(["course-actions-sheet__assessment-icon", `course-actions-sheet__assessment-icon--${item.kind}`]) 1114 }, [ 1115 createVNode(QIcon, { 1116 name: item.icon, 1117 size: "20px", 1118 color: item.iconColor 1119 }, null, 8, ["name", "color"]) 1120 ], 2), 1121 createBaseVNode("div", _hoisted_11, [ 1122 createBaseVNode("div", _hoisted_12, [ 1123 createBaseVNode("div", _hoisted_13, toDisplayString(item.label), 1), 1124 item.completed ? (openBlock(), createBlock(QBadge, { 1125 key: 0, 1126 color: "positive", 1127 "text-color": "white", 1128 label: "Completed", 1129 class: "course-actions-sheet__badge" 1130 })) : item.formId ? (openBlock(), createBlock(QBadge, { 1131 key: 1, 1132 color: "grey-4", 1133 "text-color": "grey-8", 1134 label: "Not started", 1135 class: "course-actions-sheet__badge" 1136 })) : createCommentVNode("", true) 1137 ]),
1138 item.title || item.hint ? (openBlock(), createElementBlock("div", _hoisted_14, toDisplayString(item.title || item.hint), 1)) : createCommentVNode("", true), 1139 item.completed && item.completedAtLabel ? (openBlock(), createElementBlock("div", _hoisted_15, [ 1140 createTextVNode(" Completed on " + toDisplayString(item.completedAtLabel) + " ", 1), 1141 item.scoreLabel ? (openBlock(), createElementBlock("span", _hoisted_16, " \xB7 " + toDisplayString(item.scoreLabel), 1)) : createCommentVNode("", true) 1142 ])) : !item.url && item.formId ? (openBlock(), createElementBlock("div", _hoisted_17, " Form link unavailable ")) : createCommentVNode("", true) 1143 ]), 1144 createVNode(QIcon, { 1145 name: item.completed ? "mdi-check-circle" : "mdi-chevron-right", 1146 size: "20px", 1147 color: item.completed ? "positive" : "grey-5" 1148 }, null, 8, ["name", "color"]) 1149 ], 10, _hoisted_10); 1150 }), 128)) 1151 ]) 1152 ]); 1153 }), 128)), 1154 visibleAssessments.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_18, " No assessments available for this course. ")) : createCommentVNode("", true) 1155 ])), 1156 _cache[6] || (_cache[6] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Trainings", -1)), 1157 trainingsLoading.value ? (openBlock(), createElementBlock("div", _hoisted_19, [ 1158 createVNode(QSkeleton, { 1159 type: "rect", 1160 height: "72px", 1161 square: "" 1162 }) 1163 ])) : (openBlock(), createElementBlock("div", _hoisted_20, [ 1164 (openBlock(true), createElementBlock(Fragment, null, renderList(trainingRows.value, (session) => { 1165 return openBlock(), createElementBlock("button", { 1166 key: session.id, 1167 type: "button", 1168 class: normalizeClass(["course-actions-sheet__assessment", { 1169 "course-actions-sheet__assessment--disabled": !session.actionUrl 1170 }]), 1171 disabled: !session.actionUrl, 1172 onClick: ($event) => confirmLeaveAndOpen(session.actionUrl) 1173 }, [ 1174 createBaseVNode("div", _hoisted_22, [ 1175 createVNode(QIcon, { 1176 name: session.isVirtual ? "mdi-video-outline" : "mdi-map-marker-outline", 1177 size: "20px", 1178 color: session.isVirtual ? "secondary" : "primary" 1179 }, null, 8, ["name", "color"]) 1180 ]), 1181 createBaseVNode("div", _hoisted_23, [ 1182 createBaseVNode("div", _hoisted_24, [ 1183 createBaseVNode("div", _hoisted_25, [ 1184 createTextVNode(toDisplayString(session.dateLabel) + " ", 1), 1185 session.time ? (openBlock(), createElementBlock("span", _hoisted_26, " \xB7 " + toDisplayString(session.time), 1)) : createCommentVNode("", true) 1186 ]), 1187 session.isExam ? (openBlock(), createBlock(QBadge, { 1188 key: 0, 1189 color: "deep-orange", 1190 "text-color": "white", 1191 label: "Exam", 1192 class: "course-actions-sheet__badge" 1193 })) : createCommentVNode("", true), 1194 session.isZoom ? (openBlock(), createBlock(QBadge, { 1195 key: 1, 1196 color: "secondary", 1197 "text-color": "white", 1198 label: "Zoom", 1199 class: "course-actions-sheet__badge" 1200 })) : session.isVirtual ? (openBlock(), createBlock(QBadge, { 1201 key: 2, 1202 outline: "", 1203 color: "secondary", 1204 label: "Virtual", 1205 class: "course-actions-sheet__badge" 1206 })) : createCommentVNode("", true), 1207 createVNode(QBadge, { 1208 color: session.attendanceBadgeColor, 1209 "text-color": session.attendanceBadgeTextColor, 1210 label: session.attendanceLabel, 1211 class: "course-actions-sheet__badge" 1212 }, null, 8, ["color", "text-color", "label"]) 1213 ]), 1214 createBaseVNode("div", _hoisted_27, toDisplayString(session.locationLabel), 1), 1215 session.checkedInAtLabel ? (openBlock(), createElementBlock("div", _hoisted_28, " Checked in " + toDisplayString(session.checkedInAtLabel), 1)) : createCommentVNode("", true) 1216 ]),
1217 session.actionUrl ? (openBlock(), createBlock(QIcon, { 1218 key: 0, 1219 name: "mdi-chevron-right", 1220 size: "20px", 1221 color: "grey-5" 1222 })) : createCommentVNode("", true) 1223 ], 10, _hoisted_21); 1224 }), 128)), 1225 trainingRows.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_29, " No local trainings available. ")) : createCommentVNode("", true) 1226 ])) 1227 ]), 1228 _: 1 1229 }) 1230 ]), 1231 createBaseVNode("div", _hoisted_30, [ 1232 createVNode(QSeparator), 1233 createVNode(QCardSection, { class: "course-actions-sheet__footer-body" }, { 1234 default: withCtx(() => [ 1235 _cache[8] || (_cache[8] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Actions", -1)), 1236 createBaseVNode("div", _hoisted_31, [ 1237 canShowAttendanceQr.value ? (openBlock(), createBlock(QBtn, { 1238 key: 0, 1239 unelevated: "", 1240 "no-caps": "", 1241 square: "", 1242 color: "primary", 1243 outline: "", 1244 class: "full-width course-actions-sheet__action-btn", 1245 icon: "mdi-qrcode", 1246 label: "Show I-QR Ticket", 1247 loading: ticketLoading.value, 1248 onClick: openAttendanceQr 1249 }, null, 8, ["loading"])) : createCommentVNode("", true), 1250 isPhysicalOnly.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [ 1251 createVNode(QBtn, { 1252 unelevated: "", 1253 "no-caps": "", 1254 square: "", 1255 color: "grey-4", 1256 "text-color": "grey-8", 1257 class: "full-width course-actions-sheet__action-btn", 1258 icon: "mdi-account-group-outline", 1259 label: "In-person class only", 1260 disable: "" 1261 }), 1262 _cache[7] || (_cache[7] = createBaseVNode("div", { class: "course-actions-sheet__action-remark text-grey-6 ibf-h12" }, " This is a physical / in-person class only. Online learning is not available for this course, so Start Learning is disabled. ", -1)) 1263 ], 64)) : !canContinue.value ? (openBlock(), createBlock(QBtn, { 1264 key: 2, 1265 unelevated: "", 1266 "no-caps": "", 1267 square: "", 1268 color: "grey-4", 1269 "text-color": "grey-8", 1270 class: "full-width course-actions-sheet__action-btn", 1271 icon: "mdi-timeline-clock-outline", 1272 label: "Pending access ...", 1273 disable: "" 1274 })) : (openBlock(), createBlock(QBtn, { 1275 key: 3, 1276 unelevated: "", 1277 "no-caps": "", 1278 square: "", 1279 color: "secondary", 1280 class: "full-width course-actions-sheet__action-btn", 1281 icon: "mdi-play-circle-outline", 1282 label: continueLabel.value, 1283 onClick: emitContinue 1284 }, null, 8, ["label"])), 1285 createVNode(QBtn, { 1286 unelevated: "", 1287 "no-caps": "", 1288 square: "", 1289 color: "primary", 1290 class: "full-width course-actions-sheet__action-btn", 1291 icon: "mdi-download", 1292 label: "Download Training Material", 1293 disable: !hasMaterial.value, 1294 onClick: _cache[0] || (_cache[0] = ($event) => openUrl(materialUrl.value)) 1295 }, null, 8, ["disable"]) 1296 ]) 1297 ]), 1298 _: 1 1299 }) 1300 ]) 1301 ]), 1302 _: 1 1303 }) 1304 ]), 1305 _: 1 1306 }, 8, ["model-value"]), 1307 createVNode(QDialog, { 1308 modelValue: showTicketDialog.value, 1309 "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => showTicketDialog.value = $event), 1310 persistent: "" 1311 }, { 1312 default: withCtx(() => [ 1313 createVNode(QCard, { class: "course-attendance-ticket-card" }, {
1314 default: withCtx(() => [ 1315 createVNode(QCardSection, { class: "row items-center justify-between bg-primary text-white" }, { 1316 default: withCtx(() => [ 1317 _cache[9] || (_cache[9] = createBaseVNode("div", { class: "text-subtitle1 text-weight-bold" }, "I-QR Ticket", -1)), 1318 createVNode(QBtn, { 1319 flat: "", 1320 round: "", 1321 dense: "", 1322 icon: "close", 1323 onClick: _cache[2] || (_cache[2] = ($event) => showTicketDialog.value = false) 1324 }) 1325 ]), 1326 _: 1 1327 }), 1328 createVNode(QCardSection, { class: "q-pa-lg" }, { 1329 default: withCtx(() => { 1330 var _a; 1331 return [ 1332 createBaseVNode("div", _hoisted_32, [ 1333 _cache[11] || (_cache[11] = createBaseVNode("div", { class: "iqr-ticket__logo-wrap" }, [ 1334 createBaseVNode("img", { 1335 src: "/images/IBF_logo_full_bg.png", 1336 alt: "IBF Logo", 1337 class: "iqr-ticket__logo" 1338 }) 1339 ], -1)), 1340 _cache[12] || (_cache[12] = createBaseVNode("div", { class: "iqr-ticket__title" }, "I-QR Ticket", -1)), 1341 ((_a = __props.course) == null ? void 0 : _a.title) ? (openBlock(), createElementBlock("div", _hoisted_33, toDisplayString(__props.course.title), 1)) : createCommentVNode("", true), 1342 candidateName.value ? (openBlock(), createElementBlock("div", _hoisted_34, toDisplayString(candidateName.value), 1)) : createCommentVNode("", true), 1343 ticketQrImageUrl.value ? (openBlock(), createElementBlock("img", { 1344 key: 2, 1345 src: ticketQrImageUrl.value, 1346 alt: "I-QR Ticket QR code", 1347 class: "iqr-ticket__qr" 1348 }, null, 8, _hoisted_35)) : createCommentVNode("", true), 1349 ticketCode.value ? (openBlock(), createElementBlock("div", _hoisted_36, [ 1350 _cache[10] || (_cache[10] = createBaseVNode("div", { class: "iqr-ticket__code-label" }, "Ticket code", -1)), 1351 createBaseVNode("div", _hoisted_37, toDisplayString(ticketCode.value), 1) 1352 ])) : createCommentVNode("", true), 1353 _cache[13] || (_cache[13] = createBaseVNode("div", { class: "iqr-ticket__subtitle" }, " Show this QR code to your moderator for check-in. ", -1)) 1354 ]) 1355 ]; 1356 }), 1357 _: 1 1358 }), 1359 createVNode(QCardActions, { 1360 align: "right", 1361 class: "q-px-md q-pb-md" 1362 }, { 1363 default: withCtx(() => [ 1364 createVNode(QBtn, { 1365 flat: "", 1366 "no-caps": "", 1367 color: "grey-7", 1368 label: "Close", 1369 onClick: _cache[3] || (_cache[3] = ($event) => showTicketDialog.value = false) 1370 }), 1371 createVNode(QBtn, { 1372 unelevated: "", 1373 "no-caps": "", 1374 color: "secondary", 1375 icon: "mdi-download", 1376 label: "Download JPG", 1377 loading: ticketDownloadLoading.value, 1378 disable: !ticketQrImageUrl.value, 1379 onClick: downloadIqrTicketJpg 1380 }, null, 8, ["loading", "disable"]) 1381 ]), 1382 _: 1 1383 }) 1384 ]), 1385 _: 1 1386 }) 1387 ]), 1388 _: 1 1389 }, 8, ["modelValue"]) 1390 ], 64); 1391 }; 1392 } 1393}; 1394var CourseActionsSheet = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-05f7827e"], ["__file", "CourseActionsSheet.vue"]]); 1395var MyLearningModernView_vue_vue_type_style_index_0_scoped_true_lang = ""; 1396const _hoisted_1$1 = { class: "my-learning-modern" }; 1397const _hoisted_2$1 = { class: "my-learning-modern__pill-toggle q-mb-sm" }; 1398const _hoisted_3 = ["onClick"]; 1399const _hoisted_4 = { class: "text-grey-6 ibf-h12 q-py-sm q-mb-sm text-center" }; 1400const _hoisted_5 = { 1401 key: 1, 1402 class: "q-gutter-y-md" 1403}; 1404const _hoisted_6 = { class: "q-mt-md flex flex-center" }; 1405const _hoisted_7 = { 1406 key: 1, 1407 class: "text-caption text-grey-6 q-my-md" 1408}; 1409const _sfc_main$1 = { 1410 __name: "MyLearningModernView", 1411 props: { 1412 tab: { 1413 type: String, 1414 required: true 1415 }, 1416 sections: { 1417 type: Array, 1418 required: true 1419 }, 1420 isLoading: { 1421 type: Boolean, 1422 default: false 1423 }, 1424 isLoadingMore: { 1425 type: Boolean, 1426 default: false 1427 } 1428 }, 1429 emits: ["update:tab", "load-more", "continue"], 1430 setup(__props) { 1431 const sheetOpen = ref(false); 1432 const selectedCourse = ref(null); 1433 const courseCountLabel = (section) => { 1434 var _a, _b, _c; 1435 const loaded = (_b = (_a = section.courses) == null ? void 0 : _a.length) != null ? _b : 0; 1436 const total = Number((_c = section.total) != null ? _c : 0); 1437 return total > loaded ? `${loaded} of ${total} course(s)` : `${loaded} course(s)`; 1438 }; 1439 const openCourseSheet = (course) => { 1440 selectedCourse.value = course; 1441 sheetOpen.value = true; 1442 }; 1443 return (_ctx, _cache) => { 1444 return openBlock(), createElementBlock("div", _hoisted_1$1, [ 1445 createBaseVNode("div", _hoisted_2$1, [ 1446 (openBlock(true), createElementBlock(Fragment, null, renderList(__props.sections, (section) => { 1447 return openBlock(), createElementBlock("button", { 1448 key: section.name, 1449 type: "button", 1450 class: normalizeClass(["my-learning-modern__pill", { "my-learning-modern__pill--active": __props.tab === section.name }]), 1451 onClick: ($event) => _ctx.$emit("update:tab", section.name) 1452 }, toDisplayString(section.label), 11, _hoisted_3); 1453 }), 128)) 1454 ]), 1455 (openBlock(true), createElementBlock(Fragment, null, renderList(__props.sections, (sectionPanel) => { 1456 return withDirectives((openBlock(), createElementBlock("div", { 1457 key: sectionPanel.name 1458 }, [ 1459 createBaseVNode("div", _hoisted_4, toDisplayString(sectionPanel.label) + ": " + toDisplayString(courseCountLabel(sectionPanel)), 1), 1460 __props.isLoading && __props.tab === sectionPanel.name && !sectionPanel.fetched ? (openBlock(), createBlock(OrderItemCardSkeleton, { key: 0 })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ 1461 !sectionPanel.courses || sectionPanel.courses.length === 0 ? (openBlock(), createBlock(QCard, { 1462 key: 0, 1463 flat: "", 1464 class: "ibf-card-1 bg-grey-2" 1465 }, { 1466 default: withCtx(() => [ 1467 createVNode(QCardSection, { class: "flex flex-center ibf-h8 text-grey-6" }, {
1468 default: withCtx(() => [..._cache[2] || (_cache[2] = [ 1469 createTextVNode(" -- No items to display -- ", -1) 1470 ])]), 1471 _: 1 1472 }) 1473 ]), 1474 _: 1 1475 })) : (openBlock(), createElementBlock("div", _hoisted_5, [ 1476 (openBlock(true), createElementBlock(Fragment, null, renderList(sectionPanel.courses, (course) => { 1477 return openBlock(), createBlock(LearningCourseCard, { 1478 key: `${sectionPanel.name}#${course.orderItemId}`, 1479 course, 1480 onOpen: openCourseSheet 1481 }, null, 8, ["course"]); 1482 }), 128)), 1483 createBaseVNode("div", _hoisted_6, [ 1484 sectionPanel.hasMore ? (openBlock(), createBlock(QBtn, { 1485 key: 0, 1486 label: "Load more", 1487 color: "primary", 1488 outline: "", 1489 rounded: "", 1490 loading: __props.isLoadingMore && __props.tab === sectionPanel.name, 1491 onClick: ($event) => _ctx.$emit("load-more", sectionPanel) 1492 }, null, 8, ["loading", "onClick"])) : (openBlock(), createElementBlock("div", _hoisted_7, " You\u2019re all caught up ")) 1493 ]) 1494 ])) 1495 ], 64)) 1496 ])), [ 1497 [vShow, __props.tab === sectionPanel.name] 1498 ]); 1499 }), 128)), 1500 createVNode(CourseActionsSheet, { 1501 modelValue: sheetOpen.value, 1502 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => sheetOpen.value = $event), 1503 course: selectedCourse.value, 1504 onContinue: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("continue", $event)) 1505 }, null, 8, ["modelValue", "course"]) 1506 ]); 1507 }; 1508 } 1509}; 1510var MyLearningModernView = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-0f89d9ac"], ["__file", "MyLearningModernView.vue"]]); 1511function asRecord(value) { 1512 return value && typeof value === "object" && !Array.isArray(value) ? value : {}; 1513} 1514function asRecordArray(value) { 1515 return Array.isArray(value) ? value.map(asRecord).filter((record) => Object.keys(record).length) : []; 1516} 1517function getText(source, keys, fallback = "") { 1518 for (const key of keys) { 1519 const value = source[key]; 1520 if (typeof value === "string" && value.trim()) 1521 return value.trim(); 1522 if (typeof value === "number") 1523 return String(value); 1524 } 1525 return fallback; 1526} 1527function isTruthyFlag(value) { 1528 if (value === true || value === 1 || value === "1") 1529 return true; 1530 if (value === false || value === 0 || value === "0" || value === null || value === void 0) { 1531 return false; 1532 } 1533 if (typeof value === "string") { 1534 return ["true", "yes", "active"].includes(value.toLowerCase()); 1535 } 1536 return Boolean(value); 1537} 1538function isNotExpired(expireDate) { 1539 if (!expireDate) 1540 return true; 1541 const expiry = new Date(expireDate); 1542 if (Number.isNaN(expiry.getTime())) 1543 return true; 1544 const today = new Date(); 1545 today.setHours(0, 0, 0, 0); 1546 return expiry >= today; 1547} 1548function resolveExtraMaterialType(material) { 1549 return material.type === "material" ? "material" : "course_detail"; 1550} 1551function resolveMaterialUrl(url, materialApiBase = "") { 1552 const trimmed = String(url || "").trim(); 1553 if (!trimmed) 1554 return ""; 1555 if (/^https?:\/\//i.test(trimmed)) 1556 return trimmed; 1557 if (trimmed.startsWith("//")) 1558 return `https:${trimmed}`; 1559 const base = String(materialApiBase || "").replace(/\/$/, ""); 1560 if (!base) 1561 return trimmed; 1562 return `${base}/${trimmed.replace(/^\//, "")}`; 1563} 1564function getCurrentCourseMaterial(record, materialApiBase = "", type = "course_detail") { 1565 const materials = asRecordArray(asRecord(record).extra_materials).filter( 1566 (material) => resolveExtraMaterialType(material) === type 1567 ); 1568 const activeMaterials = materials.filter( 1569 (material) => isTruthyFlag(material.is_active) 1570 ); 1571 const current = activeMaterials.find((material) => isTruthyFlag(material.is_current)) || (activeMaterials.length === 1 ? activeMaterials[0] : void 0); 1572 if (!current) 1573 return { url: "", label: "" }; 1574 const expireDate = getText(current, ["expire_date", "expireDate"]); 1575 if (!isNotExpired(expireDate)) 1576 return { url: "", label: "" }; 1577 const rawUrl = getText(current, ["file_url", "fileUrl", "url"]); 1578 if (!rawUrl) 1579 return { url: "", label: "" }; 1580 return { 1581 url: resolveMaterialUrl(rawUrl, materialApiBase), 1582 label: getText( 1583 current,
1584 ["label", "title", "name"], 1585 type === "material" ? "Training Material" : "Course Detail" 1586 ) 1587 }; 1588} 1589var MyLearningPage_vue_vue_type_style_index_0_scoped_true_lang = ""; 1590const _hoisted_1 = { class: "ibf-container-1200 q-pa-md" }; 1591const _hoisted_2 = { class: "my-learning-page__header q-mt-sm q-mb-md" }; 1592const _sfc_main = { 1593 __name: "MyLearningPage", 1594 setup(__props) { 1595 const learningStore = useLearningStore(); 1596 const userStore = useUserStore(); 1597 const appMode = "production"; 1598 const apiEndPoint = API_CONFIG[appMode]; 1599 const materialApiBase = (apiEndPoint == null ? void 0 : apiEndPoint.CM_API_URL) || ""; 1600 const tab = ref("in_progress"); 1601 const isLoading = ref(true); 1602 const isLoadingMore = ref(false); 1603 const searchQuery = ref(""); 1604 const selectedCourseTypes = ref([2, 3, 5]); 1605 const rowsPerPage = ref(5); 1606 const sections = reactive([ 1607 { 1608 name: "in_progress", 1609 label: "In Progress", 1610 icon: "mdi-progress-alert", 1611 courses: [], 1612 fetched: false, 1613 page: 1, 1614 hasMore: true, 1615 totalPages: 1, 1616 total: 0 1617 }, 1618 { 1619 name: "completed", 1620 label: "Completed", 1621 icon: "mdi-check-circle-outline", 1622 courses: [], 1623 fetched: false, 1624 page: 1, 1625 hasMore: true, 1626 totalPages: 1, 1627 total: 0 1628 } 1629 ]); 1630 const fetchCourses = async (status, append = false) => { 1631 var _a; 1632 const section = sections.find((s) => s.name === status); 1633 if (!section) 1634 return; 1635 try { 1636 if (append) { 1637 isLoadingMore.value = true; 1638 } else { 1639 isLoading.value = true; 1640 } 1641 const filters = { 1642 status, 1643 rowsPerPage: rowsPerPage.value, 1644 page: section.page, 1645 course_type: selectedCourseTypes.value, 1646 query: searchQuery.value ? "title" : void 0, 1647 value: searchQuery.value || void 0 1648 }; 1649 const { items, meta } = await learningStore.serverFetchOrderItems(filters); 1650 const formatted = items.map((product) => { 1651 var _a2; 1652 const { record, thumbnail } = product.course || {}; 1653 const { linkage } = record || { linkage: [] }; 1654 const online_material = (linkage || []).find( 1655 (link) => link.version === product.course_version 1656 ) || null; 1657 const ulid = (online_material == null ? void 0 : online_material.ulid) || null; 1658 const sk = (online_material == null ? void 0 : online_material.SK) || product.SK || null; 1659 const pk = product.PK || (online_material == null ? void 0 : online_material.PK) || null; 1660 const version = product.course_version || (online_material == null ? void 0 : online_material.version) || null; 1661 const hasElearning = Boolean(pk && sk && version); 1662 const trainingMaterial = getCurrentCourseMaterial( 1663 record, 1664 materialApiBase, 1665 "material" 1666 ); 1667 return { 1668 is_online_course: Boolean((_a2 = product.course) == null ? void 0 : _a2.is_online_course) && hasElearning, 1669 courseId: product.course.id, 1670 ulid, 1671 pk, 1672 sk, 1673 title: product.course.title, 1674 product_type: product.course.product_type, 1675 core_areas: product.course.core_areas, 1676 duration_text: product.course.duration_text, 1677 thumbnail, 1678 orderItemId: product.id, 1679 progress: product.learning_progress || 0, 1680 version, 1681 has_elearning: hasElearning, 1682 last_access: product.latest_access_at, 1683 last_access_diff: product.latest_access_at_diff, 1684 payment_status: product.payment_status, 1685 materialUrl: trainingMaterial.url, 1686 materialLabel: trainingMaterial.label, 1687 hasMaterial: Boolean(trainingMaterial.url) 1688 }; 1689 }); 1690 if (append) { 1691 section.courses.push(...formatted); 1692 } else { 1693 section.courses = formatted; 1694 } 1695 section.fetched = true; 1696 if (meta) { 1697 section.page = meta.current_page; 1698 section.totalPages = meta.total_pages; 1699 section.total = (_a = meta.total) != null ? _a : section.courses.length; 1700 section.hasMore = meta.current_page < meta.total_pages; 1701 } else { 1702 section.total = section.courses.length; 1703 section.hasMore = false;
1704 } 1705 } finally { 1706 isLoading.value = false; 1707 isLoadingMore.value = false; 1708 } 1709 }; 1710 const loadMore = (section) => { 1711 if (!section || !(section.page < section.totalPages)) 1712 return; 1713 section.page++; 1714 fetchCourses(section.name, true); 1715 }; 1716 watch(tab, (newTab) => { 1717 const section = sections.find((s) => s.name === newTab); 1718 if (section && !section.fetched) { 1719 section.page = 1; 1720 fetchCourses(newTab); 1721 } 1722 }); 1723 watch([searchQuery, selectedCourseTypes], () => { 1724 sections.forEach((section) => { 1725 section.fetched = false; 1726 section.page = 1; 1727 section.courses = []; 1728 section.hasMore = true; 1729 section.total = 0; 1730 }); 1731 fetchCourses(tab.value); 1732 }); 1733 onMounted(() => { 1734 fetchCourses(tab.value); 1735 }); 1736 const continueLearning = (course) => { 1737 if (!(course == null ? void 0 : course.ulid) || !(course == null ? void 0 : course.sk) || !(course == null ? void 0 : course.version)) 1738 return; 1739 const baseUrl = apiEndPoint.E_LEARNING_URL; 1740 const bridgeUrl = `${baseUrl}/auth-bridge?ulid=${course.ulid}&sk=${course.sk}&oi_id=${course.orderItemId}`; 1741 const elearningWin = window.open(bridgeUrl, "_blank"); 1742 const onMessage = (event) => { 1743 try { 1744 if (event.origin === baseUrl && event.data === "ready") { 1745 if (elearningWin && !elearningWin.closed) { 1746 elearningWin.postMessage( 1747 { 1748 token: userStore.getToken, 1749 refreshToken: userStore.getRefreshToken 1750 }, 1751 baseUrl 1752 ); 1753 } 1754 } 1755 } finally { 1756 window.removeEventListener("message", onMessage); 1757 } 1758 }; 1759 try { 1760 window.addEventListener("message", onMessage, { once: true }); 1761 } catch (e) { 1762 window.addEventListener("message", onMessage); 1763 } 1764 }; 1765 return (_ctx, _cache) => { 1766 const _component_q_heading_1 = resolveComponent("q-heading-1"); 1767 return openBlock(), createBlock(QPage, { 1768 padding: "", 1769 class: "my-learning-page my-learning-page--modern" 1770 }, { 1771 default: withCtx(() => [ 1772 createBaseVNode("div", _hoisted_1, [ 1773 createVNode(BackBtnPrimary, { route_name: "dashboard-page" }), 1774 createBaseVNode("div", _hoisted_2, [ 1775 createVNode(_component_q_heading_1, { 1776 icon: "mdi-book-open-variant", 1777 title: "My Learning", 1778 subtitle: "All your courses", 1779 showLine: true 1780 }) 1781 ]), 1782 createVNode(MyLearningModernView, { 1783 tab: tab.value, 1784 sections, 1785 "is-loading": isLoading.value, 1786 "is-loading-more": isLoadingMore.value, 1787 "onUpdate:tab": _cache[0] || (_cache[0] = ($event) => tab.value = $event), 1788 onLoadMore: loadMore, 1789 onContinue: continueLearning 1790 }, null, 8, ["tab", "sections", "is-loading", "is-loading-more"]) 1791 ]) 1792 ]), 1793 _: 1 1794 }); 1795 }; 1796 } 1797}; 1798var MyLearningPage = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-13eb2eb7"], ["__file", "MyLearningPage.vue"]]); 1799export { MyLearningPage as default }; 1800//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlMZWFybmluZ1BhZ2UuZjdiOWI0YzAuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvTGVhcm5pbmdDb3Vyc2VDYXJkLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvQ291cnNlQWN0aW9uc1NoZWV0LnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvTXlMZWFybmluZ01vZGVyblZpZXcudnVlIiwiLi4vLi4vLi4vc3JjL2hlbHBlcnMvbGVhcm5pbmcvY291cnNlTWF0ZXJpYWwuanMiLCIuLi8uLi8uLi9zcmMvcGFnZXMvdXNlci9sZWFybmluZy9NeUxlYXJuaW5nUGFnZS52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8cS1jYXJkIGZsYXQgYm9yZGVyZWQgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZCBjdXJzb3ItcG9pbnRlclwiIEBjbGljaz1cIiRlbWl0KCdvcGVuJywgY291cnNlKVwiPlxuICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcGEtbWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbm8td3JhcCBxLWd1dHRlci14LW1kIGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZF9fdGh1bWIgY29sLWF1dG9cIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICB2LWlmPVwiY291cnNlLnRodW1ibmFpbFwiXG4gICAgICAgICAgICA6c3JjPVwiY291cnNlLnRodW1ibmFpbFwiXG4gICAgICAgICAgICA6YWx0PVwiY291cnNlLnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX3RodW1iLWltZ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImxlYXJuaW5nLWNvdXJzZS1jYXJkX190aHVtYi1mYWxsYmFja1wiPlxuICAgICAgICAgICAgPHEtaWNvbiBuYW1lPVwibWRpLXRyb3BoeVwiIHNpemU9XCIyOHB4XCIgY29sb3I9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtZGFyayBpYmYtaDkgcS1tYi14c1wiIHN0eWxlPVwibGluZS1oZWlnaHQ6IDEuM1wiPlxuICAgICAgICAgICAge3sgY291cnNlLnRpdGxlIH19XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBxLWd1dHRlci14cyB
1800xLW1iLXNtXCI+XG4gICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICB2LWlmPVwicHJvZHVjdFR5cGVMYWJlbFwiXG4gICAgICAgICAgICAgIHJvdW5kZWRcbiAgICAgICAgICAgICAgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZF9fY2hpcCBsZWFybmluZy1jb3Vyc2UtY2FyZF9fY2hpcC0tdHlwZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHByb2R1Y3RUeXBlTGFiZWwgfX1cbiAgICAgICAgICAgIDwvcS1iYWRnZT5cbiAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgIHYtaWY9XCJjb3JlQXJlYUxhYmVsXCJcbiAgICAgICAgICAgICAgcm91bmRlZFxuICAgICAgICAgICAgICBjbGFzcz1cImxlYXJuaW5nLWNvdXJzZS1jYXJkX19jaGlwIGxlYXJuaW5nLWNvdXJzZS1jYXJkX19jaGlwLS1hcmVhXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY29yZUFyZWFMYWJlbCB9fVxuICAgICAgICAgICAgPC9xLWJhZGdlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIC0tPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBxLWd1dHRlci14c1wiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGZlYXR1cmVJdGVtc1wiXG4gICAgICAgICAgICAgIDprZXk9XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX2ZlYXR1cmVcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2xlYXJuaW5nLWNvdXJzZS1jYXJkX19mZWF0dXJlLS1hdmFpbGFibGUnOiBpdGVtLmF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAnbGVhcm5pbmctY291cnNlLWNhcmRfX2ZlYXR1cmUtLXVuYXZhaWxhYmxlJzogIWl0ZW0uYXZhaWxhYmxlLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHEtaWNvbiA6bmFtZT1cIml0ZW0uaWNvblwiIHNpemU9XCIxMnB4XCIgY2xhc3M9XCJxLW1yLXhzXCIgLz5cbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX2Zvb3RlciBxLXB4LW1kIHEtcGItbWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBxLW1iLXhzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHRleHQtZ3JleS03IGliZi1oMTJcIj5cbiAgICAgICAgICA8cS1pY29uIG5hbWU9XCJtZGktY2xvY2stb3V0bGluZVwiIHNpemU9XCIxNHB4XCIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJxLW1yLXhzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5MYXN0IGFjY2Vzc2VkIHt7IGxhc3RBY2Nlc3NlZExhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICB2LWlmPVwiaGFzRWxlYXJuaW5nSW5mb1wiXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyZXktOCBpYmYtaDEyIHRleHQtd2VpZ2h0LW1lZGl1bVwiXG4gICAgICAgID57eyBwcm9ncmVzc1ZhbHVlIH19JTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHEtbGluZWFyLXByb2dyZXNzXG4gICAgICAgIHYtaWY9XCJoYXNFbGVhcm5pbmdJbmZvXCJcbiAgICAgICAgcm91bmRlZFxuICAgICAgICBzaXplPVwiNnB4XCJcbiAgICAgICAgOnZhbHVlPVwicHJvZ3Jlc3NWYWx1ZSAvIDEwMFwiXG4gICAgICAgIGNvbG9yPVwiZ3JlZW5cIlxuICAgICAgICB0cmFjay1jb2xvcj1cImdyZXktNFwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L3EtY2FyZD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBjb21wdXRlZCwgb25Nb3VudGVkLCByZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9ybWF0LCBpc1ZhbGlkIH0gZnJvbSBcImRhdGUtZm5zXCI7XG5pbXBvcnQgeyB1c2VMZWFybmluZ1N0b3JlIH0gZnJvbSBcInNyYy9zdG9yZXMvbGVhcm5pbmctc3RvcmVcIjtcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIGNvdXJzZToge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVFbWl0cyhbXCJvcGVuXCJdKTtcblxuY29uc3QgbGVhcm5pbmdTdG9yZSA9IHVzZUxlYXJuaW5nU3RvcmUoKTtcblxuY29uc3QgZmVhdHVyZXMgPSByZWYoe1xuICBhc3Nlc3NtZW50czogZmFsc2UsXG4gIHRyYWluaW5nOiBmYWxzZSxcbiAgZXZhbHVhdGlvbjogZmFsc2UsXG59KTtcblxuY29uc3QgZmVhdHVyZUl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gW1xuICB7XG4gICAga2V5OiBcImFzc2Vzc21lbnRzXCIsXG4gICAgbGFiZWw6IFwiQXNzZXNzbWVudHNcIixcbiAgICBpY29uOiBcIm1kaS1jbGlwYm9hcmQtdGV4dC1vdXRsaW5lXCIsXG4gICAgYXZhaWxhYmxlOiBmZWF0dXJlcy52YWx1ZS5hc3Nlc3NtZW50cyxcbiAgfSxcbiAge1xuICAgIGtleTogXCJ0cmFpbmluZ1wiLFxuICAgIGxhYmVsOiBcIlRyYWluaW5nIFNlc3Npb25cIixcbiAgICBpY29uOiBcIm1kaS1jYWxlbmRhci1jbG9jay1vdXRsaW5lXCIsXG4gICAgYXZhaWxhYmxlOiBmZWF0dXJlcy52YWx1ZS50cmFpbmluZyxcbiAgfSxcbiAge1xuICAgIGtleTogXCJldmFsdWF0aW9uXCIsXG4gICAgbGFiZWw6IFwiRXZhbHVhdGlvblwiLFxuICAgIGljb246IFwibWRpLXN0YXItb3V0bGluZVwiLFxuICAgIGF2YWlsYWJsZTogZmVhdHVyZXMudmFsdWUuZXZhbHVhdGlvbixcbiAgfSxcbl0pO1xuXG5jb25zdCBsb2FkRmVhdHVyZXMgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvdXJzZUlkID0gcHJvcHMuY291cnNlPy5jb3Vyc2VJZDtcbiAgaWYgKCFjb3Vyc2VJZCkge1xuICAgIGZlYXR1cmVzLnZhbHVlID0ge1xuICAgICAgYXNzZXNzbWVudHM6IGZhbHNlLFxuICAgICAgdHJhaW5pbmc6IGZhbHNlLFxuICAgICAgZXZhbHVhdGlvbjogZmFsc2UsXG4gICAgfTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlRmVhdHVyZUF2YWlsYWJpbGl0eShjb3Vyc2VJZCk7XG4gIGZlYXR1cmVzLnZhbHVlID0ge1xuICAgIGFzc2Vzc21lbnRzOiBCb29sZWFuKHJlc3VsdD8uYXNzZXNzbWVudHMpLFxuICAgIHRyYWluaW5nOiBCb29sZWFuKHJlc3VsdD8udHJhaW5pbmcpLFxuICAgIGV2YWx1YXRpb246IEJvb2xlYW4ocmVzdWx0Py5ldmFsdWF0aW9uKSxcbiAgfTtcbn07XG5cbm9uTW91bnRlZChsb2FkRmVhdHVyZXMpO1xud2F0Y2goXG4gICgpID0+IHByb3BzLmNvdXJzZT8uY291cnNlSWQsXG4gICgpID0+IHtcbiAgICBsb2FkRmVhdHVyZXMoKTtcbiAgfVxuKTtcblxuY29uc3QgcHJvZ3Jlc3NWYWx1ZSA9IGNvbXB1dGVkKCgpID0+XG4gIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgTnVtYmVyKHByb3BzLmNvdXJzZT8ucHJvZ3Jlc3MpIHx8IDApKVxuKTtcblxuLyoqIFByb2dyZXNzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBjb3Vyc2UgaGFzIGxpbmtlZCBlLWxlYXJuaW5nIG1hdGVyaWFsIChwaywgc2ssIHZlcnNpb24pLiAqL1xuY29uc3QgaGFzRWxlYXJuaW5nSW5mbyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgY291cnNlID0gcHJvcHMuY291cnNlO1xuICBpZiAodHlwZW9mIGNvdXJzZT8uaGFzX2VsZWFybmluZyA9PT0gXCJib29sZWFuXCIpIHJldHVybi
1800Bjb3Vyc2UuaGFzX2VsZWFybmluZztcbiAgcmV0dXJuIEJvb2xlYW4oY291cnNlPy5wayAmJiBjb3Vyc2U/LnNrICYmIGNvdXJzZT8udmVyc2lvbik7XG59KTtcblxuY29uc3QgZm9ybWF0TGFzdEFjY2Vzc2VkID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi0tIC0tXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoIWlzVmFsaWQoZGF0ZSkpIHJldHVybiBcIi0tIC0tXCI7XG4gICAgcmV0dXJuIGZvcm1hdChkYXRlLCBcImRkLU1NTS15eXl5XCIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCItLSAtLVwiO1xuICB9XG59O1xuXG5jb25zdCBsYXN0QWNjZXNzZWRMYWJlbCA9IGNvbXB1dGVkKCgpID0+XG4gIGZvcm1hdExhc3RBY2Nlc3NlZChwcm9wcy5jb3Vyc2U/Lmxhc3RfYWNjZXNzKVxuKTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4ubGVhcm5pbmctY291cnNlLWNhcmQge1xuICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICB9XG5cbiAgJl9fdGh1bWIge1xuICAgIHdpZHRoOiA1NnB4O1xuICAgIGhlaWdodDogNTZweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleC1zaHJpbms6IDA7XG4gIH1cblxuICAmX190aHVtYi1pbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gICZfX3RodW1iLWZhbGxiYWNrIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogJHByaW1hcnk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB9XG5cbiAgJl9fZmVhdHVyZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBwYWRkaW5nOiA0cHggMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIG1heC13aWR0aDogMTYwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICAgJi0tYXZhaWxhYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE0MCwgMTA2LCAwLjEyKTtcbiAgICAgIGNvbG9yOiAjMTk4YzZhO1xuICAgIH1cblxuICAgICYtLXVuYXZhaWxhYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2VjZWM7XG4gICAgICBjb2xvcjogIzllOWU5ZTtcbiAgICB9XG4gIH1cblxuICAmX19mb290ZXIge1xuICAgIG1hcmdpbjogMCAxMnB4IDEycHg7XG4gICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHEtZGlhbG9nXG4gICAgOm1vZGVsLXZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgcG9zaXRpb249XCJib3R0b21cIlxuICAgIGJhY2tkcm9wLWZpbHRlcj1cImJsdXIoMnB4KVwiXG4gICAgY29udGVudC1jbGFzcz1cImNvdXJzZS1hY3Rpb25zLWRpYWxvZy1jb250ZW50XCJcbiAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgJGV2ZW50KVwiXG4gID5cbiAgICA8cS1jYXJkIGZsYXQgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldFwiPlxuICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2hlYWRlciByb3cgaXRlbXMtY2VudGVyIG5vLXdyYXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X190aHVtYiBxLW1yLW1kXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgdi1pZj1cImNvdXJzZT8udGh1bWJuYWlsXCJcbiAgICAgICAgICAgIDpzcmM9XCJjb3Vyc2UudGh1bWJuYWlsXCJcbiAgICAgICAgICAgIDphbHQ9XCJjb3Vyc2U/LnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX3RodW1iLWltZ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X190aHVtYi1mYWxsYmFja1wiPlxuICAgICAgICAgICAgPHEtaWNvbiBuYW1lPVwibWRpLXRyb3BoeVwiIHNpemU9XCIyMnB4XCIgY29sb3I9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtZGFyayBpYmYtaDggZWxsaXBzaXNcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxLjM1XCI+XG4gICAgICAgICAge3sgY291cnNlPy50aXRsZSB9fVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cS1idG5cbiAgICAgICAgICBmbGF0XG4gICAgICAgICAgZGVuc2VcbiAgICAgICAgICBpY29uPVwibWRpLWNsb3NlXCJcbiAgICAgICAgICBjb2xvcj1cImdyZXktOFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgICAgICBjbGFzcz1cInEtbWwtc21cIlxuICAgICAgICAgIEBjbGljaz1cImNsb3NlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLXNlcGFyYXRvciAvPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX3Njcm9sbFwiPlxuICAgICAgICA8cS1jYXJkLXNlY3Rpb24gY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fc2VjdGlvbi1sYWJlbFwiPkFzc2Vzc21lbnRzPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJhc3Nlc3NtZW50c0xvYWRpbmdcIiBjbGFzcz1cInEtZ3V0dGVyLXktc20gcS1tYi1sZ1wiPlxuICAgICAgICAgICAgPHEtc2tlbGV0b24gdHlwZT1cInJlY3RcIiBoZWlnaHQ9XCI3MnB4XCIgc3F1YXJlIC8+XG4gICAgICAgICAgICA8cS1za2VsZXRvbiB0eXBlPVwicmVjdFwiIGhlaWdodD1cIjcycHhcIiBzcXVhcmUgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwicS1tYi1sZ1wiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICB2LWZvcj1cImdyb3VwIGluIGFzc2Vzc21lbnRHcm91cHNcIlxuICAgICAgICAgICAgICA6a2V5PVwiZ3JvdXAua2V5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fZ3JvdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2dyb3VwLWxhYmVsXCI+e3sgZ3JvdXAubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LWxpc3RcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGdyb3VwLml0ZW1zXCJcbiAgICAgICAgICAgICAgOmtleT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2NvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LS1jb21wbGV0ZWQnOiBpdGVtLmNvbXBsZXRlZCxcbiAgICAgICAgICAgICAgICAnY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtLWRpc2FibGVkJzogIWl0ZW0udXJsLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiIWl0ZW0udXJsXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwib3BlbkFzc2Vzc21lbnRVcmwoaXRlbS51cmwpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtaWNvblwiXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYGNvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LWljb24tLSR7aXRlbS5raW5kfWBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHEtaWNvbiA6bmFtZT1cIml0ZW0uaWNvblwiIHNpemU9XCIyMHB4XCIgOmNvbG9yPVwiaXRlbS5pY29uQ29sb3JcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHEtZ3V0dGVyLXgtc20gbm8td3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2VpZ2h0LW1lZGl1bSB0ZXh0LWRhcmtcIj57eyBpdGVtLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5jb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInBvc2l0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHEtYmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiaXRlbS5mb3JtSWRcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImdyZXktNFwiXG4gICAgICAgICAgICAgICAgICAgI
1800HRleHQtY29sb3I9XCJncmV5LThcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk5vdCBzdGFydGVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cIml0ZW0udGl0bGUgfHwgaXRlbS5oaW50XCIgY2xhc3M9XCJ0ZXh0LWdyZXktNiBpYmYtaDEyIHEtbXQteHNcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfHwgaXRlbS5oaW50IH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJpdGVtLmNvbXBsZXRlZCAmJiBpdGVtLmNvbXBsZXRlZEF0TGFiZWxcIiBjbGFzcz1cImliZi1oMTIgcS1tdC14cyB0ZXh0LXBvc2l0aXZlXCI+XG4gICAgICAgICAgICAgICAgICBDb21wbGV0ZWQgb24ge3sgaXRlbS5jb21wbGV0ZWRBdExhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiaXRlbS5zY29yZUxhYmVsXCI+IMK3IHt7IGl0ZW0uc2NvcmVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cIiFpdGVtLnVybCAmJiBpdGVtLmZvcm1JZFwiIGNsYXNzPVwiaWJmLWgxMiBxLW10LXhzIHRleHQtZ3JleS01XCI+XG4gICAgICAgICAgICAgICAgICBGb3JtIGxpbmsgdW5hdmFpbGFibGVcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPHEtaWNvblxuICAgICAgICAgICAgICAgIDpuYW1lPVwiaXRlbS5jb21wbGV0ZWQgPyAnbWRpLWNoZWNrLWNpcmNsZScgOiAnbWRpLWNoZXZyb24tcmlnaHQnXCJcbiAgICAgICAgICAgICAgICBzaXplPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgOmNvbG9yPVwiaXRlbS5jb21wbGV0ZWQgPyAncG9zaXRpdmUnIDogJ2dyZXktNSdcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgdi1pZj1cInZpc2libGVBc3Nlc3NtZW50cy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19lbXB0eSB0ZXh0LWdyZXktNiBpYmYtaDEyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgTm8gYXNzZXNzbWVudHMgYXZhaWxhYmxlIGZvciB0aGlzIGNvdXJzZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19zZWN0aW9uLWxhYmVsXCI+VHJhaW5pbmdzPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJ0cmFpbmluZ3NMb2FkaW5nXCIgY2xhc3M9XCJxLWd1dHRlci15LXNtIHEtbWItbGdcIj5cbiAgICAgICAgICAgIDxxLXNrZWxldG9uIHR5cGU9XCJyZWN0XCIgaGVpZ2h0PVwiNzJweFwiIHNxdWFyZSAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYXNzZXNzbWVudC1saXN0IHEtbWItbGdcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdi1mb3I9XCJzZXNzaW9uIGluIHRyYWluaW5nUm93c1wiXG4gICAgICAgICAgICAgIDprZXk9XCJzZXNzaW9uLmlkXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2NvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LS1kaXNhYmxlZCc6ICFzZXNzaW9uLmFjdGlvblVybCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFzZXNzaW9uLmFjdGlvblVybFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImNvbmZpcm1MZWF2ZUFuZE9wZW4oc2Vzc2lvbi5hY3Rpb25VcmwpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtaWNvbiBjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYXNzZXNzbWVudC1pY29uLS10cmFpbmluZ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cS1pY29uXG4gICAgICAgICAgICAgICAgICA6bmFtZT1cInNlc3Npb24uaXNWaXJ0dWFsID8gJ21kaS12aWRlby1vdXRsaW5lJyA6ICdtZGktbWFwLW1hcmtlci1vdXRsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgICA6Y29sb3I9XCJzZXNzaW9uLmlzVmlydHVhbCA/ICdzZWNvbmRhcnknIDogJ3ByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHEtZ3V0dGVyLXgtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdlaWdodC1tZWRpdW0gdGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24uZGF0ZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzZXNzaW9uLnRpbWVcIiBjbGFzcz1cInRleHQtZ3JleS03IHRleHQtd2VpZ2h0LXJlZ3VsYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICDCtyB7eyBzZXNzaW9uLnRpbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5pc0V4YW1cIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImRlZXAtb3JhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJFeGFtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgI
1800HYtaWY9XCJzZXNzaW9uLmlzWm9vbVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJab29tXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cInNlc3Npb24uaXNWaXJ0dWFsXCJcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiVmlydHVhbFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2JhZGdlXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICA6Y29sb3I9XCJzZXNzaW9uLmF0dGVuZGFuY2VCYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgOnRleHQtY29sb3I9XCJzZXNzaW9uLmF0dGVuZGFuY2VCYWRnZVRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIDpsYWJlbD1cInNlc3Npb24uYXR0ZW5kYW5jZUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ncmV5LTYgaWJmLWgxMiBxLW10LXhzXCI+XG4gICAgICAgICAgICAgICAgICB7eyBzZXNzaW9uLmxvY2F0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5jaGVja2VkSW5BdExhYmVsXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWJmLWgxMiBxLW10LXhzIHRleHQtcG9zaXRpdmVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENoZWNrZWQgaW4ge3sgc2Vzc2lvbi5jaGVja2VkSW5BdExhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxxLWljb25cbiAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5hY3Rpb25VcmxcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZGktY2hldnJvbi1yaWdodFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cIjIwcHhcIlxuICAgICAgICAgICAgICAgIGNvbG9yPVwiZ3JleS01XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHYtaWY9XCJ0cmFpbmluZ1Jvd3MubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fZW1wdHkgdGV4dC1ncmV5LTYgaWJmLWgxMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIE5vIGxvY2FsIHRyYWluaW5ncyBhdmFpbGFibGUuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Zvb3RlclwiPlxuICAgICAgICA8cS1zZXBhcmF0b3IgLz5cbiAgICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Zvb3Rlci1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19zZWN0aW9uLWxhYmVsXCI+QWN0aW9uczwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtZ3V0dGVyLXktc21cIj5cbiAgICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgICB2LWlmPVwiY2FuU2hvd0F0dGVuZGFuY2VRclwiXG4gICAgICAgICAgICAgIHVuZWxldmF0ZWRcbiAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICBzcXVhcmVcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICBpY29uPVwibWRpLXFyY29kZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU2hvdyBJLVFSIFRpY2tldFwiXG4gICAgICAgICAgICAgIDpsb2FkaW5nPVwidGlja2V0TG9hZGluZ1wiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm9wZW5BdHRlbmRhbmNlUXJcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc1BoeXNpY2FsT25seVwiPlxuICAgICAgICAgICAgICA8cS1idG5cbiAgICAgICAgICAgICAgICB1bmVsZXZhdGVkXG4gICAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICAgIHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbG9yPVwiZ3JleS00XCJcbiAgICAgICAgICAgICAgICB0ZXh0LWNvbG9yPVwiZ3JleS04XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgIGljb249XCJtZGktYWNjb3VudC1ncm91cC1vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkluLXBlcnNvbiBjbGFzcyBvbmx5XCJcbiAgICAgICAgICAgICAgICBkaXNhYmxlXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYWN0aW9uLXJlbWFyayB0ZXh0LWdyZXktNiBpYmYtaDEyXCI+XG4gICAgICAgICAgICAgICAgVGhpcyBpcyBhIHBoeXNpY2FsIC8gaW4tcGVyc29uIGNsYXNzIG9ubHkuIE9ubGluZSBsZWFybmluZyBpcyBub3RcbiAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLCBzbyBTdGFydCBMZWFybmluZyBpcyBkaXNhYmxlZC5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgICA8cS1idG5cbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiIWNhbkNvbnRpbnVlXCJcbiAgICAgICAgICAgICAgdW5lbGV2YXRlZFxuICAgICAgICAgICAgICBuby1jYXBzXG4gICAgICAgICAgICAgI
1800HNxdWFyZVxuICAgICAgICAgICAgICBjb2xvcj1cImdyZXktNFwiXG4gICAgICAgICAgICAgIHRleHQtY29sb3I9XCJncmV5LThcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICBpY29uPVwibWRpLXRpbWVsaW5lLWNsb2NrLW91dGxpbmVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlBlbmRpbmcgYWNjZXNzIC4uLlwiXG4gICAgICAgICAgICAgIGRpc2FibGVcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgdW5lbGV2YXRlZFxuICAgICAgICAgICAgICBuby1jYXBzXG4gICAgICAgICAgICAgIHNxdWFyZVxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aCBjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgIGljb249XCJtZGktcGxheS1jaXJjbGUtb3V0bGluZVwiXG4gICAgICAgICAgICAgIDpsYWJlbD1cImNvbnRpbnVlTGFiZWxcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJlbWl0Q29udGludWVcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHEtYnRuXG4gICAgICAgICAgICAgIHVuZWxldmF0ZWRcbiAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICBzcXVhcmVcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoIGNvdXJzZS1hY3Rpb25zLXNoZWV0X19hY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgaWNvbj1cIm1kaS1kb3dubG9hZFwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRG93bmxvYWQgVHJhaW5pbmcgTWF0ZXJpYWxcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZT1cIiFoYXNNYXRlcmlhbFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm9wZW5VcmwobWF0ZXJpYWxVcmwpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L3EtY2FyZD5cbiAgPC9xLWRpYWxvZz5cblxuICA8cS1kaWFsb2cgdi1tb2RlbD1cInNob3dUaWNrZXREaWFsb2dcIiBwZXJzaXN0ZW50PlxuICAgIDxxLWNhcmQgY2xhc3M9XCJjb3Vyc2UtYXR0ZW5kYW5jZS10aWNrZXQtY2FyZFwiPlxuICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwicm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYmctcHJpbWFyeSB0ZXh0LXdoaXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YnRpdGxlMSB0ZXh0LXdlaWdodC1ib2xkXCI+SS1RUiBUaWNrZXQ8L2Rpdj5cbiAgICAgICAgPHEtYnRuIGZsYXQgcm91bmQgZGVuc2UgaWNvbj1cImNsb3NlXCIgQGNsaWNrPVwic2hvd1RpY2tldERpYWxvZyA9IGZhbHNlXCIgLz5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcGEtbGdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXFyLXRpY2tldF9fbG9nby13cmFwXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cIi9pbWFnZXMvSUJGX2xvZ29fZnVsbF9iZy5wbmdcIlxuICAgICAgICAgICAgICBhbHQ9XCJJQkYgTG9nb1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXFyLXRpY2tldF9fbG9nb1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRfX3RpdGxlXCI+SS1RUiBUaWNrZXQ8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgdi1pZj1cImNvdXJzZT8udGl0bGVcIiBjbGFzcz1cImlxci10aWNrZXRfX2NvdXJzZVwiPlxuICAgICAgICAgICAge3sgY291cnNlLnRpdGxlIH19XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJjYW5kaWRhdGVOYW1lXCIgY2xhc3M9XCJpcXItdGlja2V0X19jYW5kaWRhdGVcIj5cbiAgICAgICAgICAgIHt7IGNhbmRpZGF0ZU5hbWUgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHYtaWY9XCJ0aWNrZXRRckltYWdlVXJsXCJcbiAgICAgICAgICAgIDpzcmM9XCJ0aWNrZXRRckltYWdlVXJsXCJcbiAgICAgICAgICAgIGFsdD1cIkktUVIgVGlja2V0IFFSIGNvZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpcXItdGlja2V0X19xclwiXG4gICAgICAgICAgLz5cblxuICAgICAgICAgIDxkaXYgdi1pZj1cInRpY2tldENvZGVcIiBjbGFzcz1cImlxci10aWNrZXRfX2NvZGUtYmxvY2tcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcXItdGlja2V0X19jb2RlLWxhYmVsXCI+VGlja2V0IGNvZGU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcXItdGlja2V0X19jb2RlLXZhbHVlXCI+e3sgdGlja2V0Q29kZSB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRfX3N1YnRpdGxlXCI+XG4gICAgICAgICAgICBTaG93IHRoaXMgUVIgY29kZSB0byB5b3VyIG1vZGVyYXRvciBmb3IgY2hlY2staW4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cblxuICAgICAgPHEtY2FyZC1hY3Rpb25zIGFsaWduPVwicmlnaHRcIiBjbGFzcz1cInEtcHgtbWQgcS1wYi1tZFwiPlxuICAgICAgICA8cS1idG5cbiAgICAgICAgICBmbGF0XG4gICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgIGNvbG9yPVwiZ3JleS03XCJcbiAgICAgICAgICBsYWJlbD1cIkNsb3NlXCJcbiAgICAgICAgICBAY2xpY2s9XCJzaG93VGlja2V0RGlhbG9nID0gZmFsc2VcIlxuICAgICAgICAvPlxuICAgICAgICA8cS1idG5cbiAgICAgICAgICB1bmVsZXZhdGVkXG4gICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBpY29uPVwibWRpLWRvd25sb2FkXCJcbiAgICAgICAgICBsYWJlbD1cIkRvd25sb2FkIEpQR1wiXG4gICAgICAgICAgOmxvYWRpbmc9XCJ0aWNrZXREb3dubG9hZExvYWRpbmdcIlxuICAgICAgICAgIDpkaXNhYmxlPVwiIXRpY2tldFFySW1hZ2VVcmxcIlxuICAgICAgICAgIEBjbGljaz1cImRvd25sb2FkSXFyVGlja2V0SnBnXCJcbiAgICAgICAgLz5cbiAgICAgIDwvcS1jYXJkLWFjdGlvbnM+XG4gICAgPC9xLWNhcmQ+XG4gIDwvcS1kaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JtYXQsIGlzVmFsaWQgfSBmcm9tIFwiZGF0ZS1mb
1800nNcIjtcbmltcG9ydCB7IE5vdGlmeSwgdXNlUXVhc2FyIH0gZnJvbSBcInF1YXNhclwiO1xuaW1wb3J0IHsgdXNlTGVhcm5pbmdTdG9yZSB9IGZyb20gXCJzcmMvc3RvcmVzL2xlYXJuaW5nLXN0b3JlXCI7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tIFwic3JjL3N0b3Jlcy91c2VyLXN0b3JlXCI7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgY291cnNlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6IG51bGwsXG4gIH0sXG59KTtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY29udGludWVcIl0pO1xuXG5jb25zdCBsZWFybmluZ1N0b3JlID0gdXNlTGVhcm5pbmdTdG9yZSgpO1xuY29uc3QgdXNlclN0b3JlID0gdXNlVXNlclN0b3JlKCk7XG5jb25zdCAkcSA9IHVzZVF1YXNhcigpO1xuXG5jb25zdCBhc3Nlc3NtZW50c0xvYWRpbmcgPSByZWYoZmFsc2UpO1xuY29uc3QgYXNzZXNzbWVudHNQYXlsb2FkID0gcmVmKG51bGwpO1xuXG5jb25zdCB0cmFpbmluZ3NMb2FkaW5nID0gcmVmKGZhbHNlKTtcbmNvbnN0IHRyYWluaW5nU2Vzc2lvbnMgPSByZWYoW10pO1xuY29uc3QgdGlja2V0TG9hZGluZyA9IHJlZihmYWxzZSk7XG5jb25zdCB0aWNrZXREb3dubG9hZExvYWRpbmcgPSByZWYoZmFsc2UpO1xuY29uc3Qgc2hvd1RpY2tldERpYWxvZyA9IHJlZihmYWxzZSk7XG5jb25zdCBhdHRlbmRhbmNlVGlja2V0ID0gcmVmKG51bGwpO1xuXG5jb25zdCBtYXRlcmlhbFVybCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmNvdXJzZT8ubWF0ZXJpYWxVcmwgfHwgbnVsbCk7XG5jb25zdCBoYXNNYXRlcmlhbCA9IGNvbXB1dGVkKCgpID0+IEJvb2xlYW4ocHJvcHMuY291cnNlPy5oYXNNYXRlcmlhbCAmJiBtYXRlcmlhbFVybC52YWx1ZSkpO1xuY29uc3Qgb3JkZXJJdGVtSWQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5jb3Vyc2U/Lm9yZGVySXRlbUlkIHx8IG51bGwpO1xuXG5jb25zdCBjYW5TaG93QXR0ZW5kYW5jZVFyID0gY29tcHV0ZWQoXG4gICgpID0+XG4gICAgQm9vbGVhbihvcmRlckl0ZW1JZC52YWx1ZSkgJiZcbiAgICBCb29sZWFuKHByb3BzLmNvdXJzZT8ucGF5bWVudF9zdGF0dXMpICYmXG4gICAgIXRyYWluaW5nc0xvYWRpbmcudmFsdWUgJiZcbiAgICB0cmFpbmluZ1Nlc3Npb25zLnZhbHVlLmxlbmd0aCA+IDBcbik7XG5cbmNvbnN0IHRpY2tldENvZGUgPSBjb21wdXRlZChcbiAgKCkgPT4gYXR0ZW5kYW5jZVRpY2tldC52YWx1ZT8udGlja2V0Py50aWNrZXRfY29kZSB8fCBcIlwiXG4pO1xuXG5jb25zdCBmb3JtYXRQZXJzb25UaXRsZSA9IChyYXdUaXRsZSkgPT4ge1xuICBjb25zdCB2YWx1ZSA9IFN0cmluZyhyYXdUaXRsZSB8fCBcIlwiKS50cmltKCk7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlwiO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXC4kLywgXCJcIik7XG4gIGNvbnN0IHVwcGVyID0gbm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAodXBwZXIgPT09IFwiSC5FXCIgfHwgdXBwZXIgPT09IFwiSEVcIikgcmV0dXJuIFwiSC5FLlwiO1xuXG4gIGNvbnN0IHRpdGxlZCA9XG4gICAgbm9ybWFsaXplZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5vcm1hbGl6ZWQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGAke3RpdGxlZH0uYDtcbn07XG5cbmNvbnN0IGNhbmRpZGF0ZU5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IHRpY2tldENhbmRpZGF0ZSA9IGF0dGVuZGFuY2VUaWNrZXQudmFsdWU/LmNhbmRpZGF0ZSB8fCB7fTtcbiAgY29uc3QgdXNlciA9IHVzZXJTdG9yZS5nZXRVc2VyIHx8IHt9O1xuXG4gIGNvbnN0IHRpdGxlID0gZm9ybWF0UGVyc29uVGl0bGUoXG4gICAgdGlja2V0Q2FuZGlkYXRlLnRpdGxlIHx8IHVzZXIudGl0bGUgfHwgcHJvcHMuY291cnNlPy50aXRsZV9uYW1lXG4gICk7XG5cbiAgY29uc3QgZnJvbVBhcnRzID0gW1xuICAgIHRpY2tldENhbmRpZGF0ZS5maXJzdF9uYW1lIHx8IHVzZXIuZmlyc3RfbmFtZSxcbiAgICB0aWNrZXRDYW5kaWRhdGUubGFzdF9uYW1lIHx8IHVzZXIubGFzdF9uYW1lLFxuICBdXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiIFwiKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgbmFtZSA9XG4gICAgZnJvbVBhcnRzIHx8XG4gICAgdGlja2V0Q2FuZGlkYXRlLmZ1bGxfbmFtZSB8fFxuICAgIHVzZXIubmFtZSB8fFxuICAgIHVzZXIuZnVsbF9uYW1lIHx8XG4gICAgcHJvcHMuY291cnNlPy5zdHVkZW50X25hbWUgfHxcbiAgICBwcm9wcy5jb3Vyc2U/LmZ1bGxfbmFtZSB8fFxuICAgIHByb3BzLmNvdXJzZT8uY3VzdG9tZXJfbmFtZSB8fFxuICAgIFwiXCI7XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gdGl0bGU7XG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAke25hbWV9YCA6IG5hbWU7XG59KTtcblxuY29uc3QgdGlja2V0UXJQYXlsb2FkID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBxciA9IGF0dGVuZGFuY2VUaWNrZXQudmFsdWU/LnRpY2tldD8ucXJfY29kZTtcbiAgaWYgKCFxcikgcmV0dXJuIHRpY2tldENvZGUudmFsdWU7XG4gIGlmICh0eXBlb2YgcXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBxcjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdGlja2V0Q29kZS52YWx1ZTtcbiAgfVxufSk7XG5cbmNvbnN0IHRpY2tldFFySW1hZ2VVcmwgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGlmICghdGlja2V0UXJQYXlsb2FkLnZhbHVlKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGBodHRwczovL2FwaS5xcnNlcnZlci5jb20vdjEvY3JlYXRlLXFyLWNvZGUvP3NpemU9MjgweDI4MCZkYXRhPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIHRpY2tldFFyUGF5bG9hZC52YWx1ZVxuICApfWA7XG59KTtcblxuY29uc3QgaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGNvdXJzZSA9IHByb3BzLmNvdXJzZTtcbiAgcmV0dXJuIEJvb2xlYW4oY291cnNlPy51bGlkICYmIGNvdXJzZT8uc2sgJiYgY291cnNlPy52ZXJzaW9uKTtcbn0pO1xuXG4vKiogUGFpZCBjb3Vyc2Ugd2l0aG91dCBsaW5rZWQgZS1sZWFybmluZyBtYXRlcmlhbCAocGh5c2ljYWwgLyBjbGFzc3Jvb20gb25seSkuICovXG5jb25zdCBpc1BoeXNpY2FsT25seSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgY291cnNlID0gcHJvcHMuY291cnNlO1xuICBpZiAoIWNvdXJzZT8ucGF5bWVudF9zdGF0dXMpIHJldHVybi
1800BmYWxzZTtcbiAgaWYgKGNvdXJzZS5oYXNfZWxlYXJuaW5nID09PSBmYWxzZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMudmFsdWU7XG59KTtcblxuY29uc3QgY2FuQ29udGludWUgPSBjb21wdXRlZChcbiAgKCkgPT5cbiAgICBCb29sZWFuKHByb3BzLmNvdXJzZT8ucGF5bWVudF9zdGF0dXMpICYmXG4gICAgaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMudmFsdWUgJiZcbiAgICAhaXNQaHlzaWNhbE9ubHkudmFsdWVcbik7XG5cbmNvbnN0IGNvbnRpbnVlTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IHByb2dyZXNzID0gTnVtYmVyKHByb3BzLmNvdXJzZT8ucHJvZ3Jlc3MpIHx8IDA7XG4gIGlmIChwcm9ncmVzcyA9PT0gMTAwKSByZXR1cm4gXCJSZXZpZXcgTGVhcm5pbmdcIjtcbiAgaWYgKHByb2dyZXNzID4gMCB8fCBwcm9wcy5jb3Vyc2U/Lmxhc3RfYWNjZXNzKSByZXR1cm4gXCJDb250aW51ZSBMZWFybmluZ1wiO1xuICByZXR1cm4gXCJTdGFydCBMZWFybmluZ1wiO1xufSk7XG5cbmNvbnN0IGZvcm1hdFNlc3Npb25EYXRlID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIkRhdGUgVEJDXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoIWlzVmFsaWQoZGF0ZSkpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgXCJkZC1NTU0teXl5eVwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn07XG5cbmNvbnN0IGZvcm1hdENvbXBsZXRlZEF0ID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCFpc1ZhbGlkKGRhdGUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsIFwiZGQtTU1NLXl5eXlcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBpc1Nob3duT25NeUxlYXJuaW5nID0gKHNsb3QpID0+IHtcbiAgaWYgKCFzbG90Py5mb3JtSWQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbW9kdWxlSWQgPSBTdHJpbmcoc2xvdC5tb2R1bGVJZCA/PyBcIlwiKS50cmltKCk7XG4gIC8vIEZvcm0tYnVpbGRlciBjb3Vyc2UtZGlyZWN0IGF0dGFjaCAobm8gbW9kdWxlKSBhbHdheXMgbGlzdHMgb24gTXkgTGVhcm5pbmcuXG4gIGlmIChtb2R1bGVJZCA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBzbG90LnNob3dPbk15TGVhcm5pbmcgPT09IHRydWU7XG59O1xuXG5jb25zdCBtYXBBc3Nlc3NtZW50Um93ID0gKGFzc2Vzc21lbnQsIGNvbmZpZywgaW5kZXggPSAwKSA9PiB7XG4gIGlmICghaXNTaG93bk9uTXlMZWFybmluZyhhc3Nlc3NtZW50KSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY29tcGxldGVkID0gQm9vbGVhbihhc3Nlc3NtZW50LmNvbXBsZXRlZCk7XG4gIGNvbnN0IHRvdGFsU2NvcmUgPSBhc3Nlc3NtZW50LnRvdGFsU2NvcmU7XG4gIGNvbnN0IG1heFNjb3JlID0gYXNzZXNzbWVudC5tYXhTY29yZTtcbiAgbGV0IHNjb3JlTGFiZWwgPSBudWxsO1xuICBpZiAoY29tcGxldGVkICYmIHRvdGFsU2NvcmUgIT0gbnVsbCAmJiBtYXhTY29yZSAhPSBudWxsKSB7XG4gICAgc2NvcmVMYWJlbCA9IGBTY29yZSAke3RvdGFsU2NvcmV9LyR7bWF4U2NvcmV9YDtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUhpbnQgPSBhc3Nlc3NtZW50Lm1vZHVsZVRpdGxlIHx8IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IGAke2NvbmZpZy5rZXl9LSR7YXNzZXNzbWVudC5tb2R1bGVJZCB8fCBcImNvdXJzZVwifS0ke2Fzc2Vzc21lbnQuZm9ybUlkfS0ke2luZGV4fWAsXG4gICAga2luZDogY29uZmlnLmtleSxcbiAgICBsYWJlbDogY29uZmlnLmxhYmVsLFxuICAgIGhpbnQ6IG1vZHVsZUhpbnQgfHwgY29uZmlnLmhpbnQsXG4gICAgaWNvbjogY29uZmlnLmljb24sXG4gICAgaWNvbkNvbG9yOiBjb25maWcuaWNvbkNvbG9yLFxuICAgIGZvcm1JZDogYXNzZXNzbWVudC5mb3JtSWQsXG4gICAgdGl0bGU6IGFzc2Vzc21lbnQudGl0bGUgfHwgbnVsbCxcbiAgICB1cmw6IGFzc2Vzc21lbnQudXJsIHx8IG51bGwsXG4gICAgY29tcGxldGVkLFxuICAgIGNvbXBsZXRlZEF0TGFiZWw6IGZvcm1hdENvbXBsZXRlZEF0KGFzc2Vzc21lbnQuY29tcGxldGVkQXQpLFxuICAgIHNjb3JlTGFiZWwsXG4gIH07XG59O1xuXG5jb25zdCBzbG90TGlzdCA9IChwYXlsb2FkLCB0eXBlKSA9PiB7XG4gIGlmICghcGF5bG9hZCkgcmV0dXJuIFtdO1xuICBjb25zdCBhcnJheXMgPSB7XG4gICAgcHJlOiBwYXlsb2FkLnByZUFzc2Vzc21lbnRzLFxuICAgIHBvc3Q6IHBheWxvYWQucG9zdEFzc2Vzc21lbnRzLFxuICAgIGV2YWx1YXRlOiBwYXlsb2FkLmV2YWx1YXRlQXNzZXNzbWVudHMsXG4gIH07XG4gIGNvbnN0IGxpc3QgPSBhcnJheXNbdHlwZV07XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3QpICYmIGxpc3QubGVuZ3RoID4gMCkgcmV0dXJuIGxpc3Q7XG4gIGNvbnN0IHNpbmdsZSA9XG4gICAgdHlwZSA9PT0gXCJwcmVcIlxuICAgICAgPyBwYXlsb2FkLnByZUFzc2Vzc21lbnRcbiAgICAgIDogdHlwZSA9PT0gXCJwb3N0XCJcbiAgICAgICAgPyBwYXlsb2FkLnBvc3RBc3Nlc3NtZW50XG4gICAgICAgIDogcGF5bG9hZC5ldmFsdWF0ZUFzc2Vzc21lbnQ7XG4gIHJldHVybiBzaW5nbGUgPyBbc2luZ2xlXSA6IFtdO1xufTtcblxuY29uc3QgdmlzaWJsZUFzc2Vzc21lbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gYXNzZXNzbWVudHNQYXlsb2FkLnZhbHVlO1xuICBjb25zdCBjb25maWdzID0gW1xuICAgIHtcbiAgICAgIGtleTogXCJwcmVcIixcbiAgICAgIGxhYmVsOiBcIlByZS1Bc3Nlc3NtZW50XCIsXG4gICAgICBoaW50OiBcIlRha2UgYmVmb3JlIGxlYXJuaW5nXCIsXG4gICAgICBpY29uOiBcIm1kaS1jbGlwYm9hcmQtdGV4dC1vdXRsaW5lXCIsXG4gICAgICBpY29uQ29sb3I6IFwicHJpbWFyeVwiLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiBcInBvc3RcIixcbiAgICAgIGxhYmVsOiBcIlBvc3QtQXNzZXNzbWVudFwiLFxuICAgICAgaGludDogXCJUYWtlIGFmdGVyIGxlYXJuaW5nXCIsXG4gICAgICBpY29uOiBcIm1kaS1jaGVja2JveC1tYXJrZWQtb3V0bGluZVwiLFxuICAgICAgaWNvbkNvbG9yOiBcInNlY29uZGFyeVwiLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiBcImV2YWx1YXRlXCIsXG4gICAgICBsYWJlbDogXCJFdmFsdWF0aW9uXCIsXG4gICAgICBoaW50OiBcIkNvdXJzZSBmZWVkYmFja1wiLFxuICAgICAgaWNvbjogXCJtZGktc3Rhci1vdXRsaW5lXCIsXG4gICAgICBpY29uQ29sb3I6IFwib3JhbmdlXCIsXG4gICAgfSxcbiAgXTtcblxuICByZXR1cm4gY29uZmlncy5mbGF0TWFwKChjb25maWcpID0+XG4gICAgc2xvdExpc3QocGF5bG9hZCwgY29uZmlnLmtleSlcbiAgICAgIC5tYXAoKHNsb3QsIGluZGV4KSA9PiBtYXBBc3Nlc3NtZW50Um93KHNsb3QsIGNvbmZpZywgaW5kZXgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICApO1xufSk7XG5cbmNvbnN0IEtJTk
1800RfTkFNRSA9IHtcbiAgcHJlOiBcIlByZS1Bc3Nlc3NtZW50XCIsXG4gIHBvc3Q6IFwiUG9zdC1Bc3Nlc3NtZW50XCIsXG4gIGV2YWx1YXRlOiBcIkV2YWx1YXRpb25cIixcbn07XG5cbmNvbnN0IEdST1VQX0xBQkVMID0ge1xuICBwcmU6IFwiUHJlLXRlc3RzXCIsXG4gIHBvc3Q6IFwiUG9zdC10ZXN0c1wiLFxuICBldmFsdWF0ZTogXCJFdmFsdWF0aW9uc1wiLFxufTtcblxuZnVuY3Rpb24gbWVhbmluZ2Z1bEZvcm1UaXRsZSh0aXRsZSkge1xuICBjb25zdCBjbGVhbmVkID0gU3RyaW5nKHRpdGxlIHx8IFwiXCIpLnRyaW0oKTtcbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gXCJcIjtcbiAgY29uc3Qgbm9ybWFsaXplZCA9ICh2YWx1ZSkgPT4gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiIFwiKS50cmltKCk7XG4gIGNvbnN0IHBocmFzZXMgPSBuZXcgU2V0KFtcbiAgICBcInByZSB0ZXN0XCIsXG4gICAgXCJwcmUgYXNzZXNzbWVudFwiLFxuICAgIFwicHJldGVzdFwiLFxuICAgIFwicG9zdCB0ZXN0XCIsXG4gICAgXCJwb3N0IGFzc2Vzc21lbnRcIixcbiAgICBcInBvc3R0ZXN0XCIsXG4gICAgXCJldmFsdWF0aW9uXCIsXG4gICAgXCJldmFsdWF0ZVwiLFxuICAgIFwiY291cnNlIGV2YWx1YXRpb25cIixcbiAgICBcImNvdXJzZSBmZWVkYmFja1wiLFxuICBdKTtcbiAgaWYgKHBocmFzZXMuaGFzKG5vcm1hbGl6ZWQoY2xlYW5lZCkpKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgcGFydHMgPSBjbGVhbmVkLnNwbGl0KC9bOsK3fF0vKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxICYmIHBhcnRzLmV2ZXJ5KChwYXJ0KSA9PiBwaHJhc2VzLmhhcyhub3JtYWxpemVkKHBhcnQpKSkpIHJldHVybiBcIlwiO1xuICByZXR1cm4gY2xlYW5lZDtcbn1cblxuY29uc3QgYXNzZXNzbWVudEdyb3VwcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3Qgcm93cyA9IHZpc2libGVBc3Nlc3NtZW50cy52YWx1ZTtcbiAgcmV0dXJuIFtcInByZVwiLCBcInBvc3RcIiwgXCJldmFsdWF0ZVwiXVxuICAgIC5tYXAoKGtpbmQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmtpbmQgPT09IGtpbmQpO1xuICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBraW5kLFxuICAgICAgICBsYWJlbDogR1JPVVBfTEFCRUxba2luZF0sXG4gICAgICAgIGl0ZW1zOiBpdGVtcy5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IG1lYW5pbmdmdWxGb3JtVGl0bGUocm93LnRpdGxlKTtcbiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJvdywgdGl0bGU6IHRpdGxlIHx8IG51bGwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJvdyxcbiAgICAgICAgICAgIGxhYmVsOiB0aXRsZSB8fCBgJHtLSU5EX05BTUVba2luZF19ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufSk7XG5cbmNvbnN0IHRyYWluaW5nUm93cyA9IGNvbXB1dGVkKCgpID0+XG4gIHRyYWluaW5nU2Vzc2lvbnMudmFsdWUubWFwKChzZXNzaW9uKSA9PiB7XG4gICAgY29uc3QgaXNWaXJ0dWFsID0gU3RyaW5nKHNlc3Npb24uZGVsaXZlcnlUeXBlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidmlydHVhbFwiO1xuICAgIGNvbnN0IGlzRXhhbSA9IFN0cmluZyhzZXNzaW9uLnNlc3Npb25DYXRlZ29yeSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpID09PSBcImV4YW1cIjtcbiAgICBjb25zdCBpc1pvb20gPSBpc1ZpcnR1YWwgJiYgQm9vbGVhbihzZXNzaW9uLm1lZXRpbmdMaW5rKTtcblxuICAgIGNvbnN0IHZlbnVlUGFydHMgPSBbc2Vzc2lvbi52ZW51ZSwgc2Vzc2lvbi5yb29tXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxvY2F0aW9uTGFiZWwgPSBcIkxvY2F0aW9uIFRCQ1wiO1xuICAgIGlmIChpc1pvb20pIHtcbiAgICAgIGxvY2F0aW9uTGFiZWwgPSBcIlpvb21cIjtcbiAgICB9IGVsc2UgaWYgKGlzVmlydHVhbCkge1xuICAgICAgbG9jYXRpb25MYWJlbCA9IFwiVmlydHVhbFwiO1xuICAgIH0gZWxzZSBpZiAodmVudWVQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIGxvY2F0aW9uTGFiZWwgPSB2ZW51ZVBhcnRzLmpvaW4oXCIgwrcgXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGVuZGFuY2VTdGF0dXMgPSBzZXNzaW9uLmF0dGVuZGFuY2U/LnN0YXR1cyB8fCBcIm5vdF9jaGVja2VkX2luXCI7XG4gICAgbGV0IGF0dGVuZGFuY2VMYWJlbCA9IFwiTm90IGNoZWNrZWQgaW5cIjtcbiAgICBsZXQgYXR0ZW5kYW5jZUJhZGdlQ29sb3IgPSBcImdyZXktNFwiO1xuICAgIGxldCBhdHRlbmRhbmNlQmFkZ2VUZXh0Q29sb3IgPSBcImdyZXktOFwiO1xuICAgIGlmIChhdHRlbmRhbmNlU3RhdHVzID09PSBcImNoZWNrZWRfaW5cIikge1xuICAgICAgYXR0ZW5kYW5jZUxhYmVsID0gXCJQcmVzZW50XCI7XG4gICAgICBhdHRlbmRhbmNlQmFkZ2VDb2xvciA9IFwicG9zaXRpdmVcIjtcbiAgICAgIGF0dGVuZGFuY2VCYWRnZVRleHRDb2xvciA9IFwid2hpdGVcIjtcbiAgICB9IGVsc2UgaWYgKGF0dGVuZGFuY2VTdGF0dXMgPT09IFwiYWJzZW50XCIpIHtcbiAgICAgIGF0dGVuZGFuY2VMYWJlbCA9IFwiQWJzZW50XCI7XG4gICAgICBhdHRlbmRhbmNlQmFkZ2VDb2xvciA9IFwibmVnYXRpdmVcIjtcbiAgICAgIGF0dGVuZGFuY2VCYWRnZVRleHRDb2xvciA9IFwid2hpdGVcIjtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tlZEluQXRMYWJlbCA9IG51bGw7XG4gICAgaWYgKHNlc3Npb24uYXR0ZW5kYW5jZT8uY2hlY2tlZF9pbl9hdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2hlY2tlZEF0ID0gbmV3IERhdGUoc2Vzc2lvbi5hdHRlbmRhbmNlLmNoZWNrZWRfaW5fYXQpO1xuICAgICAgICBpZiAoaXNWYWxpZC
1800hjaGVja2VkQXQpKSB7XG4gICAgICAgICAgY2hlY2tlZEluQXRMYWJlbCA9IGZvcm1hdChjaGVja2VkQXQsIFwiZGQtTU1NLXl5eXkgSEg6bW1cIik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjaGVja2VkSW5BdExhYmVsID0gU3RyaW5nKHNlc3Npb24uYXR0ZW5kYW5jZS5jaGVja2VkX2luX2F0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNlc3Npb24uaWQsXG4gICAgICBkYXRlTGFiZWw6IGZvcm1hdFNlc3Npb25EYXRlKHNlc3Npb24uZGF0ZSksXG4gICAgICB0aW1lOiBzZXNzaW9uLnRpbWUgfHwgbnVsbCxcbiAgICAgIGxvY2F0aW9uTGFiZWwsXG4gICAgICBpc1ZpcnR1YWwsXG4gICAgICBpc0V4YW0sXG4gICAgICBpc1pvb20sXG4gICAgICBhY3Rpb25Vcmw6IHNlc3Npb24ubWVldGluZ0xpbmsgfHwgc2Vzc2lvbi5tYXBVcmwgfHwgbnVsbCxcbiAgICAgIGF0dGVuZGFuY2VMYWJlbCxcbiAgICAgIGF0dGVuZGFuY2VCYWRnZUNvbG9yLFxuICAgICAgYXR0ZW5kYW5jZUJhZGdlVGV4dENvbG9yLFxuICAgICAgY2hlY2tlZEluQXRMYWJlbCxcbiAgICB9O1xuICB9KVxuKTtcblxuY29uc3QgcmVzZXRBc3Nlc3NtZW50cyA9ICgpID0+IHtcbiAgYXNzZXNzbWVudHNQYXlsb2FkLnZhbHVlID0gbnVsbDtcbn07XG5cbmNvbnN0IHJlc2V0VHJhaW5pbmdzID0gKCkgPT4ge1xuICB0cmFpbmluZ1Nlc3Npb25zLnZhbHVlID0gW107XG59O1xuXG5jb25zdCBmZXRjaEFzc2Vzc21lbnRzID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjb3Vyc2VJZCA9IHByb3BzLmNvdXJzZT8uY291cnNlSWQ7XG4gIGlmICghY291cnNlSWQpIHtcbiAgICByZXNldEFzc2Vzc21lbnRzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXNzZXNzbWVudHNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlQXNzZXNzbWVudHMoY291cnNlSWQpO1xuICAgIGFzc2Vzc21lbnRzUGF5bG9hZC52YWx1ZSA9IHJlc3VsdCB8fCBudWxsO1xuICB9IGZpbmFsbHkge1xuICAgIGFzc2Vzc21lbnRzTG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBmZXRjaFRyYWluaW5ncyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgY291cnNlSWQgPSBwcm9wcy5jb3Vyc2U/LmNvdXJzZUlkO1xuICBpZiAoIWNvdXJzZUlkKSB7XG4gICAgcmVzZXRUcmFpbmluZ3MoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cmFpbmluZ3NMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlVHJhaW5pbmdzKFxuICAgICAgY291cnNlSWQsXG4gICAgICBvcmRlckl0ZW1JZC52YWx1ZVxuICAgICk7XG4gICAgdHJhaW5pbmdTZXNzaW9ucy52YWx1ZSA9IHJlc3VsdC5zZXNzaW9ucyB8fCBbXTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cmFpbmluZ3NMb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IG9wZW5BdHRlbmRhbmNlUXIgPSBhc3luYyAoKSA9PiB7XG4gIGlmICghb3JkZXJJdGVtSWQudmFsdWUpIHJldHVybjtcbiAgdGlja2V0TG9hZGluZy52YWx1ZSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGVhcm5pbmdTdG9yZS5zZXJ2ZXJGZXRjaEF0dGVuZGFuY2VUaWNrZXQoXG4gICAgICBvcmRlckl0ZW1JZC52YWx1ZVxuICAgICk7XG4gICAgYXR0ZW5kYW5jZVRpY2tldC52YWx1ZSA9IHJlc3VsdDtcbiAgICBpZiAocmVzdWx0Py50aWNrZXQ/LnRpY2tldF9jb2RlKSB7XG4gICAgICBzaG93VGlja2V0RGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgdGlja2V0TG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBsb2FkSW1hZ2UgPSAoc3JjKSA9PlxuICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICBpbWcub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aWNrZXQgaW1hZ2UuXCIpKTtcbiAgICBpbWcuc3JjID0gc3JjO1xuICB9KTtcblxuY29uc3Qgd3JhcENhbnZhc1RleHQgPSAoY3R4LCB0ZXh0LCBtYXhXaWR0aCkgPT4ge1xuICBjb25zdCB3b3JkcyA9IFN0cmluZyh0ZXh0IHx8IFwiXCIpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoIXdvcmRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICBjb25zdCBsaW5lcyA9IFtdO1xuICBsZXQgY3VycmVudCA9IHdvcmRzWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHdvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgbmV4dCA9IGAke2N1cnJlbnR9ICR7d29yZHNbaV19YDtcbiAgICBpZiAoY3R4Lm1lYXN1cmVUZXh0KG5leHQpLndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICBjdXJyZW50ID0gbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSB3b3Jkc1tpXTtcbiAgICB9XG4gIH1cbiAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIDMpO1xufTtcblxuY29uc3QgZG93bmxvYWRJcXJUaWNrZXRKcGcgPSBhc3luYyAoKSA9PiB7XG4gIGlmICghdGlja2V0UXJQYXlsb2FkLnZhbHVlKSByZXR1cm47XG5cbiAgdGlja2V0RG93bmxvYWRMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgbGV0IHFyT2JqZWN0VXJsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsb2dvID0gYXdhaXQgbG9hZEltYWdlKFwiL2ltYWdlcy9JQkZfbG9nb19mdWxsX2JnLnBuZ1wiKTtcblxuICAgIGNvbnN0IHFyUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGBodHRwczovL2FwaS5xcnNlcnZlci5jb20vdjEvY3JlYXRlLXFyLWNvZGUvP3NpemU9NTAweDUwMCZkYXRhPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICB0aWNrZXRRclBheWxvYWQudmFsdWVcbiAgICAgICl9YFxuICAgICk7XG4gICAgaWYgKCFxclJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggUVIgaW1hZ2UuXCIpO1xuICAgIGNvbnN0IHFyQmxvYiA9IGF3YWl0IHFyUmVzcG9uc2UuYmxvYigpO1xuICAgIHFyT2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChxckJsb2IpO1xuICAgIGNvbnN0IHFyID0gYXdhaXQgbG9hZEltYWdlKHFyT2JqZWN0VXJsKTtcblxuICAgIGNvbnN0IHdpZHRoID0gNzIwO1xuICAgIGNvbnN0IHBhZGRpbmcgPSA0ODtcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSB3aWR0aCAtIHBhZGRpbmcgKiAyO1xuICAgIGNvbnN0IGxvZ29NYXhXID0gMjgwO1xuICAgIGNvbnN0IGxvZ29NYXhIID0gMTEwO1xuICAgIGNvbnN0IGxvZ29TY2FsZSA9IE1hdGgubWluKFxuICAgICAgbG9nb01heFcgLyBsb2dvLndpZHRoLFxuICAgICAgbG9nb01heEggLyBsb2dvLmhlaWdodCxcbiAgICAgIDFcbiAgICApO
18001xuICAgIGNvbnN0IGxvZ29XID0gbG9nby53aWR0aCAqIGxvZ29TY2FsZTtcbiAgICBjb25zdCBsb2dvSCA9IGxvZ28uaGVpZ2h0ICogbG9nb1NjYWxlO1xuICAgIGNvbnN0IHFyU2l6ZSA9IDQyMDtcbiAgICBjb25zdCBjb3Vyc2VUaXRsZSA9IHByb3BzLmNvdXJzZT8udGl0bGUgfHwgXCJcIjtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBjYW5kaWRhdGVOYW1lLnZhbHVlIHx8IFwiXCI7XG4gICAgY29uc3QgaGludCA9IFwiU2hvdyB0aGlzIFFSIGNvZGUgdG8geW91ciBtb2RlcmF0b3IgZm9yIGNoZWNrLWluLlwiO1xuXG4gICAgY29uc3QgbWVhc3VyZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiYm9sZCAyMnB4IHNhbnMtc2VyaWZcIjtcbiAgICBjb25zdCBjb3Vyc2VMaW5lcyA9IGNvdXJzZVRpdGxlXG4gICAgICA/IHdyYXBDYW52YXNUZXh0KG1lYXN1cmUsIGNvdXJzZVRpdGxlLCBjb250ZW50V2lkdGgpXG4gICAgICA6IFtdO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiMjJweCBzYW5zLXNlcmlmXCI7XG4gICAgY29uc3QgY2FuZGlkYXRlTGluZXMgPSBjYW5kaWRhdGVcbiAgICAgID8gd3JhcENhbnZhc1RleHQobWVhc3VyZSwgY2FuZGlkYXRlLCBjb250ZW50V2lkdGgpXG4gICAgICA6IFtdO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiMThweCBzYW5zLXNlcmlmXCI7XG4gICAgY29uc3QgaGludExpbmVzID0gd3JhcENhbnZhc1RleHQobWVhc3VyZSwgaGludCwgY29udGVudFdpZHRoKTtcblxuICAgIGxldCBoZWlnaHQgPSBwYWRkaW5nO1xuICAgIGhlaWdodCArPSBsb2dvSCArIDI4O1xuICAgIGhlaWdodCArPSA0MjsgLy8gdGl0bGVcbiAgICBpZiAoY291cnNlTGluZXMubGVuZ3RoKSBoZWlnaHQgKz0gY291cnNlTGluZXMubGVuZ3RoICogMjggKyAxMjtcbiAgICBpZiAoY2FuZGlkYXRlTGluZXMubGVuZ3RoKSBoZWlnaHQgKz0gY2FuZGlkYXRlTGluZXMubGVuZ3RoICogMjggKyAxNjtcbiAgICBoZWlnaHQgKz0gcXJTaXplICsgMjg7XG4gICAgaWYgKHRpY2tldENvZGUudmFsdWUpIGhlaWdodCArPSA3MDtcbiAgICBoZWlnaHQgKz0gaGludExpbmVzLmxlbmd0aCAqIDI0ICsgMTY7XG4gICAgaGVpZ2h0ICs9IHBhZGRpbmc7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIGN0eC5maWxsU3R5bGUgPSBcIiNmZmZmZmZcIjtcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBsZXQgeSA9IHBhZGRpbmc7XG4gICAgY3R4LmRyYXdJbWFnZShsb2dvLCAod2lkdGggLSBsb2dvVykgLyAyLCB5LCBsb2dvVywgbG9nb0gpO1xuICAgIHkgKz0gbG9nb0ggKyAyODtcblxuICAgIGN0eC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuICAgIGN0eC5maWxsU3R5bGUgPSBcIiM4ZjE3MjNcIjtcbiAgICBjdHguZm9udCA9IFwiYm9sZCAzNnB4IHNhbnMtc2VyaWZcIjtcbiAgICBjdHguZmlsbFRleHQoXCJJLVFSIFRpY2tldFwiLCB3aWR0aCAvIDIsIHkpO1xuICAgIHkgKz0gNDI7XG5cbiAgICBpZiAoY291cnNlTGluZXMubGVuZ3RoKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjMzMzMzMzXCI7XG4gICAgICBjdHguZm9udCA9IFwiYm9sZCAyMnB4IHNhbnMtc2VyaWZcIjtcbiAgICAgIGNvdXJzZUxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGxpbmUsIHdpZHRoIC8gMiwgeSk7XG4gICAgICAgIHkgKz0gMjg7XG4gICAgICB9KTtcbiAgICAgIHkgKz0gODtcbiAgICB9XG5cbiAgICBpZiAoY2FuZGlkYXRlTGluZXMubGVuZ3RoKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjNTU1NTU1XCI7XG4gICAgICBjdHguZm9udCA9IFwiMjJweCBzYW5zLXNlcmlmXCI7XG4gICAgICBjYW5kaWRhdGVMaW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCB3aWR0aCAvIDIsIHkpO1xuICAgICAgICB5ICs9IDI4O1xuICAgICAgfSk7XG4gICAgICB5ICs9IDEyO1xuICAgIH1cblxuICAgIGN0eC5kcmF3SW1hZ2UocXIsICh3aWR0aCAtIHFyU2l6ZSkgLyAyLCB5LCBxclNpemUsIHFyU2l6ZSk7XG4gICAgeSArPSBxclNpemUgKyAzMjtcblxuICAgIGlmICh0aWNrZXRDb2RlLnZhbHVlKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjODg4ODg4XCI7XG4gICAgICBjdHguZm9udCA9IFwiMThweCBzYW5zLXNlcmlmXCI7XG4gICAgICBjdHguZmlsbFRleHQoXCJUaWNrZXQgY29kZVwiLCB3aWR0aCAvIDIsIHkpO1xuICAgICAgeSArPSAzMDtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBcIiM4ZjE3MjNcIjtcbiAgICAgIGN0eC5mb250ID0gXCJib2xkIDI4cHggc2Fucy1zZXJpZlwiO1xuICAgICAgY3R4LmZpbGxUZXh0KFN0cmluZyh0aWNrZXRDb2RlLnZhbHVlKSwgd2lkdGggLyAyLCB5KTtcbiAgICAgIHkgKz0gMzY7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxTdHlsZSA9IFwiIzY2NjY2NlwiO1xuICAgIGN0eC5mb250ID0gXCIxOHB4IHNhbnMtc2VyaWZcIjtcbiAgICBoaW50TGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY3R4LmZpbGxUZXh0KGxpbmUsIHdpZHRoIC8gMiwgeSk7XG4gICAgICB5ICs9IDI0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9qcGVnXCIsIDAuOTIpO1xuICAgIGNvbnN0IHNhZmVDb2RlID0gU3RyaW5nKHRpY2tldENvZGUudmFsdWUgfHwgXCJ0aWNrZXRcIilcbiAgICAgIC5yZXBsYWNlKC9bXlxcdy4tXSsvZywgXCItXCIpXG4gICAgICAuc2xpY2UoMCwgNDApO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBsaW5rLmhyZWYgPSBkYXRhVXJsO1xuICAgIGxpbmsuZG93bmxvYWQgPSBgSS1RUi1UaWNrZXQtJHtzYWZlQ29kZX0uanBnYDtcbiAgICBkb2
1800N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGxpbmsuY2xpY2soKTtcbiAgICBsaW5rLnJlbW92ZSgpO1xuXG4gICAgTm90aWZ5LmNyZWF0ZSh7XG4gICAgICB0eXBlOiBcInBvc2l0aXZlXCIsXG4gICAgICBtZXNzYWdlOiBcIkktUVIgVGlja2V0IGRvd25sb2FkZWQuXCIsXG4gICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBOb3RpZnkuY3JlYXRlKHtcbiAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGRvd25sb2FkIEktUVIgVGlja2V0LlwiLFxuICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHFyT2JqZWN0VXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHFyT2JqZWN0VXJsKTtcbiAgICB0aWNrZXREb3dubG9hZExvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgfVxufTtcblxud2F0Y2goXG4gICgpID0+IFtwcm9wcy5tb2RlbFZhbHVlLCBwcm9wcy5jb3Vyc2U/LmNvdXJzZUlkLCBwcm9wcy5jb3Vyc2U/Lm9yZGVySXRlbUlkXSxcbiAgKFtvcGVuXSkgPT4ge1xuICAgIGlmIChvcGVuICYmIHByb3BzLmNvdXJzZSkge1xuICAgICAgZmV0Y2hBc3Nlc3NtZW50cygpO1xuICAgICAgZmV0Y2hUcmFpbmluZ3MoKTtcbiAgICB9IGVsc2UgaWYgKCFvcGVuKSB7XG4gICAgICByZXNldEFzc2Vzc21lbnRzKCk7XG4gICAgICByZXNldFRyYWluaW5ncygpO1xuICAgICAgYXR0ZW5kYW5jZVRpY2tldC52YWx1ZSA9IG51bGw7XG4gICAgICBzaG93VGlja2V0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgfVxuICB9XG4pO1xuXG5jb25zdCBjbG9zZSA9ICgpID0+IGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBmYWxzZSk7XG5cbmNvbnN0IG9wZW5VcmwgPSAodXJsKSA9PiB7XG4gIGlmICghdXJsKSByZXR1cm47XG4gIHdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIiwgXCJub29wZW5lcixub3JlZmVycmVyXCIpO1xufTtcblxuY29uc3Qgc2FmZUh0dHBVcmwgPSAodXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09IFwiaHR0cDpcIiAmJiBwYXJzZWQucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGxlYXZlc0liZlNpdGUgPSAodXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKS5vcmlnaW4gIT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5jb25zdCBjb25maXJtTGVhdmVBbmRPcGVuID0gKHVybCkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSBzYWZlSHR0cFVybCh1cmwpO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlZGlyZWN0ID0gKCkgPT4ge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odGFyZ2V0KTtcbiAgfTtcblxuICBpZiAoIWxlYXZlc0liZlNpdGUodGFyZ2V0KSkge1xuICAgIHJlZGlyZWN0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgJHEuZGlhbG9nKHtcbiAgICB0aXRsZTogXCJMZWF2ZSBJQkY/XCIsXG4gICAgbWVzc2FnZTpcbiAgICAgIFwiWW91IGFyZSBhYm91dCB0byBsZWF2ZSB0aGUgSUJGIHdlYnNpdGUuIElmIHlvdSBjb250aW51ZSwgeW91IHdpbGwgYmUgcmVkaXJlY3RlZC5cIixcbiAgICBjYW5jZWw6IHtcbiAgICAgIGxhYmVsOiBcIlN0YXlcIixcbiAgICAgIGZsYXQ6IHRydWUsXG4gICAgICBjb2xvcjogXCJwcmltYXJ5XCIsXG4gICAgICBub0NhcHM6IHRydWUsXG4gICAgfSxcbiAgICBvazoge1xuICAgICAgbGFiZWw6IFwiQ29udGludWVcIixcbiAgICAgIGNvbG9yOiBcInByaW1hcnlcIixcbiAgICAgIHVuZWxldmF0ZWQ6IHRydWUsXG4gICAgICBub0NhcHM6IHRydWUsXG4gICAgfSxcbiAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICB9KS5vbk9rKHJlZGlyZWN0KTtcbn07XG5cbmNvbnN0IGJ1aWxkQXNzZXNzbWVudFVybFdpdGhTZXNzaW9uID0gKHVybCkgPT4ge1xuICBpZiAoIXVybCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG9rZW4gPSB1c2VyU3RvcmUuZ2V0VG9rZW47XG4gIGlmICghdG9rZW4pIHJldHVybiB1cmw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgY29uc3QgaXNGb3JtRmlsbFBhdGggPSAvXlxcL2ZcXC9bXi9dKy9pLnRlc3QocGFyc2VkVXJsLnBhdGhuYW1lIHx8IFwiXCIpO1xuICAgIGlmICghaXNGb3JtRmlsbFBhdGgpIHtcbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJhY2Nlc3NfdG9rZW5cIiwgdG9rZW4pO1xuXG4gICAgY29uc3QgZW1haWwgPSB1c2VyU3RvcmUuZ2V0VXNlcj8uZW1haWwgfHwgdXNlclN0b3JlLmdldFVzZXI/LndvcmtfZW1haWw7XG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcImVtYWlsXCIsIGVtYWlsKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsTmFtZSA9IFt1c2VyU3RvcmUuZ2V0VXNlcj8uZmlyc3RfbmFtZSwgdXNlclN0b3JlLmdldFVzZXI/Lmxhc3RfbmFtZV1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiIFwiKVxuICAgICAgLnRyaW0oKTtcbiAgICBpZiAoZnVsbE5hbWUpIHtcbiAgICAgIHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuc2V0KFwibmFtZVwiLCBmdWxsTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdXNlclN0b3JlLmdldFJlZnJlc2hUb2tlbjtcbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInJlZnJlc2hfdG9rZW5cIiwgcmVmcmVzaFRva2VuKTtcbiAgICAgIHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXhwaXJlc19pblwiLCBTdHJpbmcoMzAgKiAyNCAqIDYwICogNjApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkVXJsLnRvU3RyaW5nKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybi
1800B1cmw7XG4gIH1cbn07XG5cbmNvbnN0IG9wZW5Bc3Nlc3NtZW50VXJsID0gKHVybCkgPT4ge1xuICBvcGVuVXJsKGJ1aWxkQXNzZXNzbWVudFVybFdpdGhTZXNzaW9uKHVybCkpO1xufTtcblxuY29uc3QgZW1pdENvbnRpbnVlID0gKCkgPT4ge1xuICBpZiAoIWNhbkNvbnRpbnVlLnZhbHVlKSByZXR1cm47XG4gIGVtaXQoXCJjb250aW51ZVwiLCBwcm9wcy5jb3Vyc2UpO1xufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4uY291cnNlLWFjdGlvbnMtc2hlZXQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICBtYXgtaGVpZ2h0OiBtaW4oODV2aCwgNzIwcHgpO1xuICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMCAwO1xuICBib3gtc2hhZG93OiAwIC00cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICZfX2hlYWRlciB7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gIH1cblxuICAmX19zY3JvbGwge1xuICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG4gIH1cblxuICAmX19ib2R5IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG5cbiAgJl9fZm9vdGVyIHtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJveC1zaGFkb3c6IDAgLTJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgcGFkZGluZy1ib3R0b206IGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwKTtcbiAgfVxuXG4gICZfX2Zvb3Rlci1ib2R5IHtcbiAgICBwYWRkaW5nOiAxNnB4IDIwcHggMjBweDtcbiAgfVxuXG4gICZfX3RodW1iIHtcbiAgICB3aWR0aDogNDRweDtcbiAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICB9XG5cbiAgJl9fdGh1bWItaW1nIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAmX190aHVtYi1mYWxsYmFjayB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICRwcmltYXJ5O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgfVxuXG4gICZfX3NlY3Rpb24tbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAjNzU3NTc1O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gIH1cblxuICAmX19ncm91cCArICZfX2dyb3VwIHtcbiAgICBtYXJnaW4tdG9wOiAxNHB4O1xuICB9XG5cbiAgJl9fZ3JvdXAtbGFiZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICBjb2xvcjogIzFhMWYzNjtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgfVxuXG4gICZfX2Fzc2Vzc21lbnQtbGlzdCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgfVxuXG4gICZfX2Fzc2Vzc21lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDEycHg7XG4gICAgcGFkZGluZzogMTRweCAxNnB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICB9XG5cbiAgICAmOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7XG4gICAgfVxuXG4gICAgJi0tY29tcGxldGVkIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE0MCwgMTA2LCAwLjA2KTtcbiAgICB9XG5cbiAgICAmLS1kaXNhYmxlZCB7XG4gICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICBvcGFjaXR5OiAwLjg1O1xuICAgIH1cbiAgfVxuXG4gICZfX2JhZGdlIHtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBwYWRkaW5nOiAycHggNnB4O1xuICB9XG5cbiAgJl9fYXNzZXNzbWVudC1pY29uIHtcbiAgICB3aWR0aDogMzZweDtcbiAgICBoZWlnaHQ6IDM2cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgZmxleC1zaHJpbms6IDA7XG5cbiAgICAmLS1wcmUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNDAsIDI1LCAzNywgMC4xKTtcbiAgICB9XG5cbiAgICAmLS1wb3N0IHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgODksIDIzNSwgMC4xKTtcbiAgICB9XG5cbiAgICAmLS1ldmFsdWF0ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTUyLCAwLCAwLjEyKTtcbiAgICB9XG5cbiAgICAmLS10cmFpbmluZyB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1LCAxNDAsIDEwNiwgMC4xKTtcbiAgICB9XG4gIH1cblxuICAmX19lbXB0eSB7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gIH1cblxuICAmX19hY3Rpb24tYnRuIHtcbiAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxuXG4gICZfX2FjdGlvbi1yZW1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgcGFkZGluZzogMCAycHg7XG4gIH1cbn1cbjwvc3R5bGU+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLyogUXVhc2FyIGNhcHMgbWluaW1pemVkIGRpYWxvZyBjb250ZW50IGF0IDU2MHB4IOKAlCBvdmVycmlkZSBmb3IgdGhpcyBzaGVldC4gKi9cbi5xLWRpYWxvZ19faW5uZXItLW1pbmltaXplZCA+IC5jb3Vyc2UtYWN0aW9ucy1kaWFsb2ctY29udGVudCxcbi5xLWRpYWxvZ19faW5uZXItLWJvdHRvbSA+IC5jb3Vyc2UtYWN0aW9ucy1kaWFsb2ctY29udGVudCxcbi5xLWRpYWxvZ19faW5uZXIgPiAuY291cnNlLWFjdGlvbnMtc2hlZXQsXG4uY291cnNlLWFjdGlvbnMtZGlhbG9nLWNvbnRlbnQuY291cnNlLWFjdGlvbnMtc2hlZXQsXG4uY291cnNlLWFjdGlvbnMtZGlhbG9nLWNvbnRlbnQge1xuICB3aWR0aDogbWluKDk2MHB4LCA5MnZ3
1800KSAhaW1wb3J0YW50O1xuICBtYXgtd2lkdGg6IG1pbig5NjBweCwgOTJ2dykgIWltcG9ydGFudDtcbn1cblxuLnEtZGlhbG9nX19pbm5lci0tYm90dG9tIHtcbiAgcGFkZGluZy1sZWZ0OiAxNnB4ICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmctcmlnaHQ6IDE2cHggIWltcG9ydGFudDtcbn1cblxuLmNvdXJzZS1hdHRlbmRhbmNlLXRpY2tldC1jYXJkIHtcbiAgd2lkdGg6IG1pbig0MDBweCwgOTJ2dyk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG59XG5cbi5pcXItdGlja2V0IHtcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA2KTtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgcGFkZGluZzogMjBweCAxNnB4IDI0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmlxci10aWNrZXRfX2xvZ28td3JhcCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4uaXFyLXRpY2tldF9fbG9nbyB7XG4gIHdpZHRoOiAxNTBweDtcbiAgbWF4LXdpZHRoOiA3MCU7XG4gIGhlaWdodDogYXV0bztcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLmlxci10aWNrZXRfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxLjE1cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogIzhmMTcyMztcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cblxuLmlxci10aWNrZXRfX3N1YnRpdGxlIHtcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xuICBjb2xvcjogIzY2NjtcbiAgbWFyZ2luLXRvcDogMTJweDtcbn1cblxuLmlxci10aWNrZXRfX2NvdXJzZSB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogIzMzMztcbiAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICBsaW5lLWhlaWdodDogMS4zNTtcbn1cblxuLmlxci10aWNrZXRfX2NhbmRpZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBjb2xvcjogIzU1NTtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDEuMzU7XG59XG5cbi5pcXItdGlja2V0X19xciB7XG4gIHdpZHRoOiAyMjBweDtcbiAgaGVpZ2h0OiAyMjBweDtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBvYmplY3QtZml0OiBjb250YWluO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICBwYWRkaW5nOiA4cHg7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG59XG5cbi5pcXItdGlja2V0X19jb2RlLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogMTZweDtcbn1cblxuLmlxci10aWNrZXRfX2NvZGUtbGFiZWwge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGNvbG9yOiAjODg4O1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XG5cbi5pcXItdGlja2V0X19jb2RlLXZhbHVlIHtcbiAgZm9udC1zaXplOiAxLjA1cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogIzhmMTcyMztcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm15LWxlYXJuaW5nLW1vZGVyblwiPlxuICAgIDxkaXYgY2xhc3M9XCJteS1sZWFybmluZy1tb2Rlcm5fX3BpbGwtdG9nZ2xlIHEtbWItc21cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdi1mb3I9XCJzZWN0aW9uIGluIHNlY3Rpb25zXCJcbiAgICAgICAgOmtleT1cInNlY3Rpb24ubmFtZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cIm15LWxlYXJuaW5nLW1vZGVybl9fcGlsbFwiXG4gICAgICAgIDpjbGFzcz1cInsgJ215LWxlYXJuaW5nLW1vZGVybl9fcGlsbC0tYWN0aXZlJzogdGFiID09PSBzZWN0aW9uLm5hbWUgfVwiXG4gICAgICAgIEBjbGljaz1cIiRlbWl0KCd1cGRhdGU6dGFiJywgc2VjdGlvbi5uYW1lKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHNlY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBPbmUgcGFuZWwgcGVyIHN0YXR1cyDigJQgc2FtZSBwYXR0ZXJuIGFzIGNsYXNzaWMgKHNlcGFyYXRlIEFQSSArIHBhZ2luYXRpb24pIC0tPlxuICAgIDxkaXZcbiAgICAgIHYtZm9yPVwic2VjdGlvblBhbmVsIGluIHNlY3Rpb25zXCJcbiAgICAgIDprZXk9XCJzZWN0aW9uUGFuZWwubmFtZVwiXG4gICAgICB2LXNob3c9XCJ0YWIgPT09IHNlY3Rpb25QYW5lbC5uYW1lXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ncmV5LTYgaWJmLWgxMiBxLXB5LXNtIHEtbWItc20gdGV4dC1jZW50ZXJcIj5cbiAgICAgICAge3sgc2VjdGlvblBhbmVsLmxhYmVsIH19OiB7eyBjb3Vyc2VDb3VudExhYmVsKHNlY3Rpb25QYW5lbCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8T3JkZXJJdGVtQ2FyZFNrZWxldG9uXG4gICAgICAgIHYtaWY9XCJpc0xvYWRpbmcgJiYgdGFiID09PSBzZWN0aW9uUGFuZWwubmFtZSAmJiAhc2VjdGlvblBhbmVsLmZldGNoZWRcIlxuICAgICAgLz5cblxuICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgICAgPHEtY2FyZFxuICAgICAgICAgIGZsYXRcbiAgICAgICAgICBjbGFzcz1cImliZi1jYXJkLTEgYmctZ3JleS0yXCJcbiAgICAgICAgICB2LWlmPVwiIXNlY3Rpb25QYW5lbC5jb3Vyc2VzIHx8IHNlY3Rpb25QYW5lbC5jb3Vyc2VzLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cS1jYXJkLXNlY3Rpb24gY2xhc3M9XCJmbGV4IGZsZXgtY2VudGVyIGliZi1oOCB0ZXh0LWdyZXktNlwiPlxuICAgICAgICAgICAgLS0gTm8gaXRlbXMgdG8gZGlzcGxheSAtLVxuICAgICAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG4gICAgICAgIDwvcS1jYXJkPlxuXG4gICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwicS1ndXR0ZXIteS1tZFwiPlxuICAgICAgICAgIDxMZWFybmluZ0NvdXJzZUNhcmRcbiAgICAgICAgICAgIHYtZm9yPVwiY291cnNlIGluIHNlY3Rpb25QYW5lbC5jb3Vyc2VzXCJcbiAgICAgICAgICAgIDprZXk9XCJgJHtzZWN0aW9uUGFuZWwubmFtZX0jJHtjb3Vyc2Uub3JkZXJJdGVtSWR9YFwiXG4gICAgICAgICAgICA6Y291cnNlPVwiY291cnNlXCJcbiAgICAgICAgICAgIEBvcGVuPVwib3BlbkNvdXJzZVNoZWV0XCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtbXQtbWQgZmxleCBmbGV4LWNlbnRlclwiPlxuICAgICAgICAgICAgPHEtYnRuXG4gICAgICAgICAgICAgI
1800HYtaWY9XCJzZWN0aW9uUGFuZWwuaGFzTW9yZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTG9hZCBtb3JlXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICByb3VuZGVkXG4gICAgICAgICAgICAgIDpsb2FkaW5nPVwiaXNMb2FkaW5nTW9yZSAmJiB0YWIgPT09IHNlY3Rpb25QYW5lbC5uYW1lXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2xvYWQtbW9yZScsIHNlY3Rpb25QYW5lbClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidGV4dC1jYXB0aW9uIHRleHQtZ3JleS02IHEtbXktbWRcIj5cbiAgICAgICAgICAgICAgWW914oCZcmUgYWxsIGNhdWdodCB1cFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxDb3Vyc2VBY3Rpb25zU2hlZXRcbiAgICAgIHYtbW9kZWw9XCJzaGVldE9wZW5cIlxuICAgICAgOmNvdXJzZT1cInNlbGVjdGVkQ291cnNlXCJcbiAgICAgIEBjb250aW51ZT1cIiRlbWl0KCdjb250aW51ZScsICRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBPcmRlckl0ZW1DYXJkU2tlbGV0b24gZnJvbSBcIi4vT3JkZXJJdGVtQ2FyZFNrZWxldG9uLnZ1ZVwiO1xuaW1wb3J0IExlYXJuaW5nQ291cnNlQ2FyZCBmcm9tIFwiLi9MZWFybmluZ0NvdXJzZUNhcmQudnVlXCI7XG5pbXBvcnQgQ291cnNlQWN0aW9uc1NoZWV0IGZyb20gXCIuL0NvdXJzZUFjdGlvbnNTaGVldC52dWVcIjtcblxuZGVmaW5lUHJvcHMoe1xuICB0YWI6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0sXG4gIHNlY3Rpb25zOiB7XG4gICAgdHlwZTogQXJyYXksXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0sXG4gIGlzTG9hZGluZzoge1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGlzTG9hZGluZ01vcmU6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxufSk7XG5cbmRlZmluZUVtaXRzKFtcInVwZGF0ZTp0YWJcIiwgXCJsb2FkLW1vcmVcIiwgXCJjb250aW51ZVwiXSk7XG5cbmNvbnN0IHNoZWV0T3BlbiA9IHJlZihmYWxzZSk7XG5jb25zdCBzZWxlY3RlZENvdXJzZSA9IHJlZihudWxsKTtcblxuLy8gT25seSA1IHJvd3MgbG9hZCBhdCBhIHRpbWUsIHNvIHRoZSB0YWIgdG90YWwgaXMgdXN1YWxseSBhaGVhZCBvZiB0aGUgdmlzaWJsZSBjYXJkcy5cbmNvbnN0IGNvdXJzZUNvdW50TGFiZWwgPSAoc2VjdGlvbikgPT4ge1xuICBjb25zdCBsb2FkZWQgPSBzZWN0aW9uLmNvdXJzZXM/Lmxlbmd0aCA/PyAwO1xuICBjb25zdCB0b3RhbCA9IE51bWJlcihzZWN0aW9uLnRvdGFsID8/IDApO1xuXG4gIHJldHVybiB0b3RhbCA+IGxvYWRlZCA/IGAke2xvYWRlZH0gb2YgJHt0b3RhbH0gY291cnNlKHMpYCA6IGAke2xvYWRlZH0gY291cnNlKHMpYDtcbn07XG5cbmNvbnN0IG9wZW5Db3Vyc2VTaGVldCA9IChjb3Vyc2UpID0+IHtcbiAgc2VsZWN0ZWRDb3Vyc2UudmFsdWUgPSBjb3Vyc2U7XG4gIHNoZWV0T3Blbi52YWx1ZSA9IHRydWU7XG59O1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQgbGFuZz1cInNjc3NcIj5cbi5teS1sZWFybmluZy1tb2Rlcm4ge1xuICAmX19waWxsLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZWNlY2VjO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBnYXA6IDRweDtcbiAgfVxuXG4gICZfX3BpbGwge1xuICAgIGZsZXg6IDEgMSAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogIzU1NTtcbiAgICBmb250OiBpbmhlcml0O1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHBhZGRpbmc6IDEwcHggMThweDtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZSwgY29sb3IgMC4xNXMgZWFzZTtcblxuICAgICYtLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkc2Vjb25kYXJ5O1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiZnVuY3Rpb24gYXNSZWNvcmQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHt9O1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWUubWFwKGFzUmVjb3JkKS5maWx0ZXIoKHJlY29yZCkgPT4gT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpXG4gICAgOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0VGV4dChzb3VyY2UsIGtleXMsIGZhbGxiYWNrID0gXCJcIikge1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RmxhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IFwiMVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIHZhbHVlID09PSAwIHx8XG4gICAgdmFsdWUgPT09IFwiMFwiIHx8XG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybi
1800BmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtcInRydWVcIiwgXCJ5ZXNcIiwgXCJhY3RpdmVcIl0uaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc05vdEV4cGlyZWQoZXhwaXJlRGF0ZSkge1xuICBpZiAoIWV4cGlyZURhdGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpO1xuICBpZiAoTnVtYmVyLmlzTmFOKGV4cGlyeS5nZXRUaW1lKCkpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZXhwaXJ5ID49IHRvZGF5O1xufVxuXG4vKipcbiAqIExlZ2FjeSBtYXRlcmlhbHMgd2l0aG91dCBhIHR5cGUgd2VyZSB1c2VkIGFzIGNvdXJzZS9wcm9ncmFtIGRldGFpbCBQREZzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRXh0cmFNYXRlcmlhbFR5cGUobWF0ZXJpYWwpIHtcbiAgcmV0dXJuIG1hdGVyaWFsLnR5cGUgPT09IFwibWF0ZXJpYWxcIiA/IFwibWF0ZXJpYWxcIiA6IFwiY291cnNlX2RldGFpbFwiO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTWF0ZXJpYWxVcmwodXJsLCBtYXRlcmlhbEFwaUJhc2UgPSBcIlwiKSB7XG4gIGNvbnN0IHRyaW1tZWQgPSBTdHJpbmcodXJsIHx8IFwiXCIpLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gXCJcIjtcblxuICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCIvL1wiKSkgcmV0dXJuIGBodHRwczoke3RyaW1tZWR9YDtcblxuICBjb25zdCBiYXNlID0gU3RyaW5nKG1hdGVyaWFsQXBpQmFzZSB8fCBcIlwiKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIGlmICghYmFzZSkgcmV0dXJuIHRyaW1tZWQ7XG5cbiAgcmV0dXJuIGAke2Jhc2V9LyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvLywgXCJcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvdXJzZU1hdGVyaWFsKFxuICByZWNvcmQsXG4gIG1hdGVyaWFsQXBpQmFzZSA9IFwiXCIsXG4gIHR5cGUgPSBcImNvdXJzZV9kZXRhaWxcIlxuKSB7XG4gIGNvbnN0IG1hdGVyaWFscyA9IGFzUmVjb3JkQXJyYXkoYXNSZWNvcmQocmVjb3JkKS5leHRyYV9tYXRlcmlhbHMpLmZpbHRlcihcbiAgICAobWF0ZXJpYWwpID0+IHJlc29sdmVFeHRyYU1hdGVyaWFsVHlwZShtYXRlcmlhbCkgPT09IHR5cGVcbiAgKTtcbiAgY29uc3QgYWN0aXZlTWF0ZXJpYWxzID0gbWF0ZXJpYWxzLmZpbHRlcigobWF0ZXJpYWwpID0+XG4gICAgaXNUcnV0aHlGbGFnKG1hdGVyaWFsLmlzX2FjdGl2ZSlcbiAgKTtcblxuICBjb25zdCBjdXJyZW50ID1cbiAgICBhY3RpdmVNYXRlcmlhbHMuZmluZCgobWF0ZXJpYWwpID0+IGlzVHJ1dGh5RmxhZyhtYXRlcmlhbC5pc19jdXJyZW50KSkgfHxcbiAgICAoYWN0aXZlTWF0ZXJpYWxzLmxlbmd0aCA9PT0gMSA/IGFjdGl2ZU1hdGVyaWFsc1swXSA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKCFjdXJyZW50KSByZXR1cm4geyB1cmw6IFwiXCIsIGxhYmVsOiBcIlwiIH07XG5cbiAgY29uc3QgZXhwaXJlRGF0ZSA9IGdldFRleHQoY3VycmVudCwgW1wiZXhwaXJlX2RhdGVcIiwgXCJleHBpcmVEYXRlXCJdKTtcbiAgaWYgKCFpc05vdEV4cGlyZWQoZXhwaXJlRGF0ZSkpIHJldHVybiB7IHVybDogXCJcIiwgbGFiZWw6IFwiXCIgfTtcblxuICBjb25zdCByYXdVcmwgPSBnZXRUZXh0KGN1cnJlbnQsIFtcImZpbGVfdXJsXCIsIFwiZmlsZVVybFwiLCBcInVybFwiXSk7XG4gIGlmICghcmF3VXJsKSByZXR1cm4geyB1cmw6IFwiXCIsIGxhYmVsOiBcIlwiIH07XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IHJlc29sdmVNYXRlcmlhbFVybChyYXdVcmwsIG1hdGVyaWFsQXBpQmFzZSksXG4gICAgbGFiZWw6IGdldFRleHQoXG4gICAgICBjdXJyZW50LFxuICAgICAgW1wibGFiZWxcIiwgXCJ0aXRsZVwiLCBcIm5hbWVcIl0sXG4gICAgICB0eXBlID09PSBcIm1hdGVyaWFsXCIgPyBcIlRyYWluaW5nIE1hdGVyaWFsXCIgOiBcIkNvdXJzZSBEZXRhaWxcIlxuICAgICksXG4gIH07XG59XG5cbmV4cG9ydCB7XG4gIGdldEN1cnJlbnRDb3Vyc2VNYXRlcmlhbCxcbiAgcmVzb2x2ZUV4dHJhTWF0ZXJpYWxUeXBlLFxuICByZXNvbHZlTWF0ZXJpYWxVcmwsXG59O1xuIiwiPHRlbXBsYXRlPlxuICA8cS1wYWdlIHBhZGRpbmcgY2xhc3M9XCJteS1sZWFybmluZy1wYWdlIG15LWxlYXJuaW5nLXBhZ2UtLW1vZGVyblwiPlxuICAgIDxkaXYgY2xhc3M9XCJpYmYtY29udGFpbmVyLTEyMDAgcS1wYS1tZFwiPlxuICAgICAgPEJhY2tCdG5QcmltYXJ5IHJvdXRlX25hbWU9XCJkYXNoYm9hcmQtcGFnZVwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJteS1sZWFybmluZy1wYWdlX19oZWFkZXIgcS1tdC1zbSBxLW1iLW1kXCI+XG4gICAgICAgIDxxLWhlYWRpbmctMVxuICAgICAgICAgIGljb249XCJtZGktYm9vay1vcGVuLXZhcmlhbnRcIlxuICAgICAgICAgIHRpdGxlPVwiTXkgTGVhcm5pbmdcIlxuICAgICAgICAgIHN1YnRpdGxlPVwiQWxsIHlvdXIgY291cnNlc1wiXG4gICAgICAgICAgOnNob3dMaW5lPVwidHJ1ZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPE15TGVhcm5pbmdNb2Rlcm5WaWV3XG4gICAgICAgIDp0YWI9XCJ0YWJcIlxuICAgICAgICA6c2VjdGlvbnM9XCJzZWN0aW9uc1wiXG4gICAgICAgIDppcy1sb2FkaW5nPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgOmlzLWxvYWRpbmctbW9yZT1cImlzTG9hZGluZ01vcmVcIlxuICAgICAgICBAdXBkYXRlOnRhYj1cInRhYiA9ICRldmVudFwiXG4gICAgICAgIEBsb2FkLW1vcmU9XCJsb2FkTW9yZVwiXG4gICAgICAgIEBjb250aW51ZT1cImNvbnRpbnVlTGVhcm5pbmdcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9xLXBhZ2U+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgcmVhY3RpdmUsIHJlZiwgd2F0Y2gsIG9uTW91bnRlZCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBCYWNrQnRuUHJpbWFyeSBmcm9tIFwic3JjL2NvbXBvbmVudHMvdG9vbHMvQmFja0J0blByaW1hcnkudnVlXCI7XG5pbXBvcnQgTXlMZWFybmluZ01vZGVyblZpZXcgZnJvbSBcIi4vY29tcG9uZW50cy9NeUxlYXJuaW5nTW9kZXJuVmlldy52dWVcIjtcbmltcG9ydCB7
1800IHVzZUxlYXJuaW5nU3RvcmUgfSBmcm9tIFwic3JjL3N0b3Jlcy9sZWFybmluZy1zdG9yZVwiO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSBcInNyYy9zdG9yZXMvdXNlci1zdG9yZVwiO1xuaW1wb3J0IEFQSV9DT05GSUcgZnJvbSBcInNyYy9oZWxwZXJzL2FwaS9hcGlDb25maWdcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRDb3Vyc2VNYXRlcmlhbCB9IGZyb20gXCJzcmMvaGVscGVycy9sZWFybmluZy9jb3Vyc2VNYXRlcmlhbFwiO1xuXG5jb25zdCBsZWFybmluZ1N0b3JlID0gdXNlTGVhcm5pbmdTdG9yZSgpO1xuY29uc3QgdXNlclN0b3JlID0gdXNlVXNlclN0b3JlKCk7XG5jb25zdCBhcHBNb2RlID0gcHJvY2Vzcy5lbnYuQVBQX01PREUgfHwgXCJzdGFnaW5nXCI7XG5jb25zdCBhcGlFbmRQb2ludCA9IEFQSV9DT05GSUdbYXBwTW9kZV07XG5jb25zdCBtYXRlcmlhbEFwaUJhc2UgPSBhcGlFbmRQb2ludD8uQ01fQVBJX1VSTCB8fCBcIlwiO1xuXG5jb25zdCB0YWIgPSByZWYoXCJpbl9wcm9ncmVzc1wiKTtcbmNvbnN0IGlzTG9hZGluZyA9IHJlZih0cnVlKTtcbmNvbnN0IGlzTG9hZGluZ01vcmUgPSByZWYoZmFsc2UpO1xuXG5jb25zdCBzZWFyY2hRdWVyeSA9IHJlZihcIlwiKTtcbi8vIGNvdXJzZV90eXBlX2lkOiAyID0gTG9jYWwgQ2VydGlmaWNhdGlvbiwgMyA9IFNob3J0IFRyYWluaW5nIENvdXJzZSwgNSA9IEN1c3RvbWl6ZWRcbmNvbnN0IHNlbGVjdGVkQ291cnNlVHlwZXMgPSByZWYoWzIsIDMsIDVdKTtcbmNvbnN0IHJvd3NQZXJQYWdlID0gcmVmKDUpO1xuXG5jb25zdCBzZWN0aW9ucyA9IHJlYWN0aXZlKFtcbiAge1xuICAgIG5hbWU6IFwiaW5fcHJvZ3Jlc3NcIixcbiAgICBsYWJlbDogXCJJbiBQcm9ncmVzc1wiLFxuICAgIGljb246IFwibWRpLXByb2dyZXNzLWFsZXJ0XCIsXG4gICAgY291cnNlczogW10sXG4gICAgZmV0Y2hlZDogZmFsc2UsXG4gICAgcGFnZTogMSxcbiAgICBoYXNNb3JlOiB0cnVlLFxuICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgdG90YWw6IDAsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNvbXBsZXRlZFwiLFxuICAgIGxhYmVsOiBcIkNvbXBsZXRlZFwiLFxuICAgIGljb246IFwibWRpLWNoZWNrLWNpcmNsZS1vdXRsaW5lXCIsXG4gICAgY291cnNlczogW10sXG4gICAgZmV0Y2hlZDogZmFsc2UsXG4gICAgcGFnZTogMSxcbiAgICBoYXNNb3JlOiB0cnVlLFxuICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgdG90YWw6IDAsXG4gIH0sXG5dKTtcblxuY29uc3QgZmV0Y2hDb3Vyc2VzID0gYXN5bmMgKHN0YXR1cywgYXBwZW5kID0gZmFsc2UpID0+IHtcbiAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gc3RhdHVzKTtcbiAgaWYgKCFzZWN0aW9uKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBpc0xvYWRpbmdNb3JlLnZhbHVlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgc3RhdHVzLCAvLyBcImluX3Byb2dyZXNzXCIgfCBcImNvbXBsZXRlZFwiIOKAlCBzZXBhcmF0ZSBBUEkgZmlsdGVyIHBlciB0YWJcbiAgICAgIHJvd3NQZXJQYWdlOiByb3dzUGVyUGFnZS52YWx1ZSxcbiAgICAgIHBhZ2U6IHNlY3Rpb24ucGFnZSxcbiAgICAgIGNvdXJzZV90eXBlOiBzZWxlY3RlZENvdXJzZVR5cGVzLnZhbHVlLFxuICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnZhbHVlID8gXCJ0aXRsZVwiIDogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHNlYXJjaFF1ZXJ5LnZhbHVlIHx8IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBpdGVtcywgbWV0YSB9ID0gYXdhaXQgbGVhcm5pbmdTdG9yZS5zZXJ2ZXJGZXRjaE9yZGVySXRlbXMoZmlsdGVycyk7XG5cbiAgICAvLyBsaXN0LW9yZGVyLWl0ZW1zIGlzIHBhaWQtb25seSBzZXJ2ZXItc2lkZSwgc28gZXZlcnkgcm93IGl0IHJldHVybnMgaXMgcmVuZGVyZWRcbiAgICAvLyBhbmQgdGhlIHRhYiB0b3RhbCBzdGF5cyBpbiBzdGVwIHdpdGggdGhlIGNhcmRzLlxuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGl0ZW1zXG4gICAgICAubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVjb3JkLCB0aHVtYm5haWwgfSA9IHByb2R1Y3QuY291cnNlIHx8IHt9O1xuICAgICAgICBjb25zdCB7IGxpbmthZ2UgfSA9IHJlY29yZCB8fCB7IGxpbmthZ2U6IFtdIH07XG4gICAgICAgIGNvbnN0IG9ubGluZV9tYXRlcmlhbCA9XG4gICAgICAgICAgKGxpbmthZ2UgfHwgW10pLmZpbmQoXG4gICAgICAgICAgICAobGluaykgPT4gbGluay52ZXJzaW9uID09PSBwcm9kdWN0LmNvdXJzZV92ZXJzaW9uXG4gICAgICAgICAgKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IHVsaWQgPSBvbmxpbmVfbWF0ZXJpYWw/LnVsaWQgfHwgbnVsbDtcbiAgICAgICAgY29uc3Qgc2sgPSBvbmxpbmVfbWF0ZXJpYWw/LlNLIHx8IHByb2R1Y3QuU0sgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgcGsgPSBwcm9kdWN0LlBLIHx8IG9ubGluZV9tYXRlcmlhbD8uUEsgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHByb2R1Y3QuY291cnNlX3ZlcnNpb24gfHwgb25saW5lX21hdGVyaWFsPy52ZXJzaW9uIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGhhc0VsZWFybmluZyA9IEJvb2xlYW4ocGsgJiYgc2sgJiYgdmVyc2lvbik7XG4gICAgICAgIGNvbnN0IHRyYWluaW5nTWF0ZXJpYWwgPSBnZXRDdXJyZW50Q291cnNlTWF0ZXJpYWwoXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIG1hdGVyaWFsQXBpQmFzZSxcbiAgICAgICAgICBcIm1hdGVyaWFsXCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzX29ubGluZV9jb3Vyc2U6IEJvb2xlYW4ocHJvZHVjdC5jb3Vyc2U/LmlzX29ubGluZV9jb3Vyc2UpICYmIGhhc0VsZWFybmluZyxcbiAgICAgICAgICBjb3Vyc2VJZDogcHJvZHVjdC5jb3Vyc2UuaWQsXG4gICAgICAgICAgdWxpZCxcbiAgICAgICAgICBwayxcbiAgICAgICAgICBzayxcbiAgICAgICAgICB0aXRsZTogcHJvZHVjdC5jb3Vyc2UudGl0bGUsXG4gICAgICAgICAgcHJvZHVjdF90eXBlOiBwcm9kdWN0LmNvdXJzZS5wcm9kdWN0X3R5cGUsXG4gICAgICAgICAgY29yZV9hcmVhczogcHJvZHVjdC5jb3Vyc2UuY29yZV9hcmVhcyxcbiAgICAgICAgICBkdXJhdGlvbl90ZXh0OiBwcm9kdWN0LmNvdXJzZS5kdXJhdGlvbl90ZXh0LFxuICAgICAgICAgI
1800HRodW1ibmFpbCxcbiAgICAgICAgICBvcmRlckl0ZW1JZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICBwcm9ncmVzczogcHJvZHVjdC5sZWFybmluZ19wcm9ncmVzcyB8fCAwLFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgaGFzX2VsZWFybmluZzogaGFzRWxlYXJuaW5nLFxuICAgICAgICAgIGxhc3RfYWNjZXNzOiBwcm9kdWN0LmxhdGVzdF9hY2Nlc3NfYXQsXG4gICAgICAgICAgbGFzdF9hY2Nlc3NfZGlmZjogcHJvZHVjdC5sYXRlc3RfYWNjZXNzX2F0X2RpZmYsXG4gICAgICAgICAgcGF5bWVudF9zdGF0dXM6IHByb2R1Y3QucGF5bWVudF9zdGF0dXMsXG4gICAgICAgICAgbWF0ZXJpYWxVcmw6IHRyYWluaW5nTWF0ZXJpYWwudXJsLFxuICAgICAgICAgIG1hdGVyaWFsTGFiZWw6IHRyYWluaW5nTWF0ZXJpYWwubGFiZWwsXG4gICAgICAgICAgaGFzTWF0ZXJpYWw6IEJvb2xlYW4odHJhaW5pbmdNYXRlcmlhbC51cmwpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBzZWN0aW9uLmNvdXJzZXMucHVzaCguLi5mb3JtYXR0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWN0aW9uLmNvdXJzZXMgPSBmb3JtYXR0ZWQ7XG4gICAgfVxuXG4gICAgc2VjdGlvbi5mZXRjaGVkID0gdHJ1ZTtcblxuICAgIGlmIChtZXRhKSB7XG4gICAgICBzZWN0aW9uLnBhZ2UgPSBtZXRhLmN1cnJlbnRfcGFnZTtcbiAgICAgIHNlY3Rpb24udG90YWxQYWdlcyA9IG1ldGEudG90YWxfcGFnZXM7XG4gICAgICBzZWN0aW9uLnRvdGFsID0gbWV0YS50b3RhbCA/PyBzZWN0aW9uLmNvdXJzZXMubGVuZ3RoO1xuICAgICAgc2VjdGlvbi5oYXNNb3JlID0gbWV0YS5jdXJyZW50X3BhZ2UgPCBtZXRhLnRvdGFsX3BhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWN0aW9uLnRvdGFsID0gc2VjdGlvbi5jb3Vyc2VzLmxlbmd0aDtcbiAgICAgIHNlY3Rpb24uaGFzTW9yZSA9IGZhbHNlO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpc0xvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICBpc0xvYWRpbmdNb3JlLnZhbHVlID0gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGxvYWRNb3JlID0gKHNlY3Rpb24pID0+IHtcbiAgaWYgKCFzZWN0aW9uIHx8ICEoc2VjdGlvbi5wYWdlIDwgc2VjdGlvbi50b3RhbFBhZ2VzKSkgcmV0dXJuO1xuICBzZWN0aW9uLnBhZ2UrKztcbiAgZmV0Y2hDb3Vyc2VzKHNlY3Rpb24ubmFtZSwgdHJ1ZSk7XG59O1xuXG4vLyBMYXp5LWxvYWQgZWFjaCBzdGF0dXMgaW5kZXBlbmRlbnRseSAoY2xhc3NpYyBiZWhhdmlvcilcbndhdGNoKHRhYiwgKG5ld1RhYikgPT4ge1xuICBjb25zdCBzZWN0aW9uID0gc2VjdGlvbnMuZmluZCgocykgPT4gcy5uYW1lID09PSBuZXdUYWIpO1xuICBpZiAoc2VjdGlvbiAmJiAhc2VjdGlvbi5mZXRjaGVkKSB7XG4gICAgc2VjdGlvbi5wYWdlID0gMTtcbiAgICBmZXRjaENvdXJzZXMobmV3VGFiKTtcbiAgfVxufSk7XG5cbndhdGNoKFtzZWFyY2hRdWVyeSwgc2VsZWN0ZWRDb3Vyc2VUeXBlc10sICgpID0+IHtcbiAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgIHNlY3Rpb24uZmV0Y2hlZCA9IGZhbHNlO1xuICAgIHNlY3Rpb24ucGFnZSA9IDE7XG4gICAgc2VjdGlvbi5jb3Vyc2VzID0gW107XG4gICAgc2VjdGlvbi5oYXNNb3JlID0gdHJ1ZTtcbiAgICBzZWN0aW9uLnRvdGFsID0gMDtcbiAgfSk7XG4gIGZldGNoQ291cnNlcyh0YWIudmFsdWUpO1xufSk7XG5cbm9uTW91bnRlZCgoKSA9PiB7XG4gIGZldGNoQ291cnNlcyh0YWIudmFsdWUpO1xufSk7XG5cbmNvbnN0IGNvbnRpbnVlTGVhcm5pbmcgPSAoY291cnNlKSA9PiB7XG4gIGlmICghY291cnNlPy51bGlkIHx8ICFjb3Vyc2U/LnNrIHx8ICFjb3Vyc2U/LnZlcnNpb24pIHJldHVybjtcblxuICBjb25zdCBiYXNlVXJsID0gYXBpRW5kUG9pbnQuRV9MRUFSTklOR19VUkwgfHwgXCJodHRwczovL2VsZWFybmluZy5pYmZueHQuY29tXCI7XG4gIGNvbnN0IGJyaWRnZVVybCA9IGAke2Jhc2VVcmx9L2F1dGgtYnJpZGdlP3VsaWQ9JHtjb3Vyc2UudWxpZH0mc2s9JHtjb3Vyc2Uuc2t9Jm9pX2lkPSR7Y291cnNlLm9yZGVySXRlbUlkfWA7XG4gIGNvbnN0IGVsZWFybmluZ1dpbiA9IHdpbmRvdy5vcGVuKGJyaWRnZVVybCwgXCJfYmxhbmtcIik7XG5cbiAgY29uc3Qgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGJhc2VVcmwgJiYgZXZlbnQuZGF0YSA9PT0gXCJyZWFkeVwiKSB7XG4gICAgICAgIGlmIChlbGVhcm5pbmdXaW4gJiYgIWVsZWFybmluZ1dpbi5jbG9zZWQpIHtcbiAgICAgICAgICBlbGVhcm5pbmdXaW4ucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRva2VuOiB1c2VyU3RvcmUuZ2V0VG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdXNlclN0b3JlLmdldFJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiYXNlVXJsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgfVxufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4ubXktbGVhcm5pbmctcGFnZSB7XG4gICYtLW1vZGVybiB7XG4gICAgYmFja2dyb3VuZDogI2Y3ZjRlZjtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgJl9faGVhZGVyIHtcbiAgICA6ZGVlcCgucS1oZWFkaW5nLTEpLFxuICAgIDpkZWVwKC5xLW1iLW1kKSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIl0sIm5hbWVzIjpbIl9jcmVhdGVCbG9jayIsIiRlbWl0IiwiX2NyZWF0ZVZOb2RlIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9ob2lzdGVkXzEiLCJfaG9pc3RlZF8yIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9vcGVuQmxvY2siLCJfaG9pc3RlZF80IiwiX2hvaXN0ZWRfNSIsIl9ob2lzdGVkXzYiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfNyIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX2hvaXN0ZWRfOCIsIl9ob2lzdGVkXzkiLCJfaG9pc3RlZF8xMCIsIl9ob2lzdGVkXzExIiwiX2hvaXN0ZWRfMyIsIl9ub3JtYWxpem
1800VDbGFzcyIsIl9jcmVhdGVUZXh0Vk5vZGUiLCJfYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzRkEsVUFBTSxRQUFRO0FBU2QsVUFBTSxnQkFBZ0IsaUJBQWdCO0FBRXRDLFVBQU0sV0FBVyxJQUFJO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLElBQ2QsQ0FBQztBQUVELFVBQU0sZUFBZSxTQUFTLE1BQU07QUFBQSxNQUNsQztBQUFBLFFBQ0UsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLFFBQ1AsTUFBTTtBQUFBLFFBQ04sV0FBVyxTQUFTLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0Q7QUFBQSxRQUNFLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLFdBQVcsU0FBUyxNQUFNO0FBQUEsTUFDM0I7QUFBQSxNQUNEO0FBQUEsUUFDRSxLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsUUFDUCxNQUFNO0FBQUEsUUFDTixXQUFXLFNBQVMsTUFBTTtBQUFBLE1BQzNCO0FBQUEsSUFDSCxDQUFDO0FBRUQsVUFBTSxlQUFlLFlBQVk7O0FBQy9CLFlBQU0sWUFBVyxXQUFNLFdBQU4sbUJBQWM7QUFDL0IsVUFBSSxDQUFDLFVBQVU7QUFDYixpQkFBUyxRQUFRO0FBQUEsVUFDZixhQUFhO0FBQUEsVUFDYixVQUFVO0FBQUEsVUFDVixZQUFZO0FBQUEsUUFDbEI7QUFDSTtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFNBQVMsTUFBTSxjQUFjLHFDQUFxQyxRQUFRO0FBQ2hGLGVBQVMsUUFBUTtBQUFBLFFBQ2YsYUFBYSxRQUFRLGlDQUFRLFdBQVc7QUFBQSxRQUN4QyxVQUFVLFFBQVEsaUNBQVEsUUFBUTtBQUFBLFFBQ2xDLFlBQVksUU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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.