1import { d as defineComponent, r as ref, w as watch, o as onMounted, m as openBlock, n as createElementBlock, j as createVNode, x as withCtx, q as normalizeClass, u as unref, D as renderSlot, F as Fragment, y as renderList, p as createBaseVNode, a0 as normalizeStyle, t as toDisplayString, v as createCommentVNode, _ as _export_sfc, a8 as useRouter, c as computed, ad as onBeforeUnmount, A as createBlock, aN as QCard, aM as QCardSection, B as createTextVNode, a5 as QBtn, bv as QDialog, bO as authAPI } from "./index.6f7a794b.js"; 2import { Q as QInnerLoading } from "./QInnerLoading.2dd01826.js"; 3import { u as useQuasar } from "./use-quasar.1ed7d5ca.js"; 4import { Q as QField } from "./QField.83adcbce.js"; 5var QOtp_vue_vue_type_style_index_0_lang = ""; 6var QOtp_vue_vue_type_style_index_1_scoped_true_lang = ""; 7const _hoisted_1$1 = ["disabled", "placeholder", "autofocus"]; 8const _sfc_main$1 = defineComponent({ 9 __name: "QOtp", 10 props: { 11 ...QField.props, 12 num: { 13 type: Number, 14 default: 6 15 }, 16 separator: { 17 type: String, 18 default: "" 19 }, 20 inputStyles: { 21 type: [String, Object] 22 }, 23 fieldClasses: { 24 type: [String, Array] 25 }, 26 inputClasses: { 27 type: [String, Array] 28 }, 29 conditionalClass: { 30 type: Array, 31 default: [] 32 }, 33 autofocus: { 34 type: Boolean, 35 default: false 36 }, 37 placeholder: { 38 type: String, 39 default: " " 40 } 41 }, 42 emits: ["complete", "change"], 43 setup(__props, { expose: __expose, emit: __emit }) { 44 const emit = __emit; 45 const props = __props; 46 const input = ref(null); 47 const activeInput = ref(0); 48 const disabled = ref([...Array(props.num).keys()].map(() => true)); 49 const pin = ref(""); 50 const digits = Array.from({ length: 10 }, (_, i) => i.toString()); 51 function focusAndSelectInput(input2) { 52 input2.focus(); 53 input2.setSelectionRange(0, 0); 54 input2.select(); 55 } 56 function handleOnPaste(event) { 57 var _a; 58 (_a = getInputValueAt(activeInput.value)) == null ? void 0 : _a.blur(); 59 pin.value = event.clipboardData.getData("text/plain").slice(0, props.num - activeInput.value).split("").map((elem) => Number(elem)).filter((elem) => Number.isInteger(elem)).map((value, i) => inputValue(String(value), i)).join(""); 60 return event.preventDefault(); 61 } 62 function inputValue(value, index = activeInput.value) { 63 var _a; 64 return getInputValueAt(index).value = (_a = value[0]) != null ? _a : ""; 65 } 66 function getInputValueAt(key) { 67 return input.value.at(key); 68 } 69 function handleOnChange() { 70 pin.value = getPin(); 71 } 72 function getPin() { 73 let str = ""; 74 for (const { value } of input.value) { 75 str += value; 76 } 77 return str; 78 } 79 function handleOnKeyDown(event) { 80 if (props.loading) { 81 return event.preventDefault(); 82 } 83 const { key, code } = event; 84 if (code === "KeyV") { 85 return; 86 } 87 switch (key) { 88 case "Backspace": { 89 if (activeInput.value === props.num - 1 && getInputValueAt(props.num - 1).value) { 90 return; 91 } 92 inputValue(""); 93 if (activeInput.value > 0) { 94 inputValue("", activeInput.value - 1); 95 } 96 pin.value = getPin(); 97 break; 98 } 99 default: { 100 if ((code.startsWith("Digit") || code.startsWith("Numpad")) && digits.includes(key)) { 101 inputValue(key); 102 pin.value = getPin(); 103 } 104 break; 105 } 106 } 107 event.preventDefault(); 108 } 109 watch( 110 () => pin.value, 111 (newVal, oldVal) => { 112 if (newVal === oldVal) { 113 return; 114 } 115 emit("change", newVal); 116 if (props.num === newVal.length) { 117 emit("complete", newVal); 118 } 119 const value = Math.min(newVal.length, props.num - 1); 120 for (let i = 0; i < disabled.value.length - 1; i++) { 121 disabled.value.splice(i, 1, i !== value); 122 } 123 setTimeout(() => { 124 activeInput.value = value; 125 }); 126 } 127 ); 128 watch( 129 () => activeInput.value, 130 (newVal, oldVal) => { 131 if (oldVal !== newVal && newVal <= props.num - 1) {
132 const elem = getInputValueAt(newVal); 133 if (!elem.disabled) { 134 focusAndSelectInput(elem); 135 } 136 } 137 } 138 ); 139 onMounted(() => { 140 if (props.autofocus) { 141 focusAndSelectInput(getInputValueAt(0)); 142 } 143 disabled.value.splice(disabled.value, 0, false); 144 if (props.modelValue) { 145 for (let i = 0; i < props.modelValue.length; i++) { 146 inputValue(props.modelValue[i], i); 147 } 148 } 149 }); 150 __expose({ 151 blur() { 152 for (let i = 0; i < props.num; i++) { 153 getInputValueAt(i).blur(); 154 } 155 }, 156 focus() { 157 focusAndSelectInput(getInputValueAt(activeInput.value = 0)); 158 }, 159 clear() { 160 for (let i = 0; i < props.num; i++) { 161 inputValue("", i); 162 } 163 pin.value = ""; 164 }, 165 getPin 166 }); 167 return (_ctx, _cache) => { 168 return openBlock(), createElementBlock("div", { 169 onClick: _cache[0] || (_cache[0] = ($event) => focusAndSelectInput(getInputValueAt(activeInput.value))) 170 }, [ 171 createVNode(unref(QField), { 172 class: normalizeClass(["main-field", { 173 "complete": pin.value.length === __props.num 174 }]), 175 "bg-color": "transparent", 176 "model-value": pin.value, 177 disable: props.loading, 178 rules: props.rules, 179 error: props.error, 180 "reactive-rules": props.reactiveRules, 181 "lazy-rules": props.lazyRules, 182 loading: props.loading, 183 "error-message": props.errorMessage, 184 label: props.label, 185 "stack-label": props.stackLabel, 186 "bottom-slots": props.bottomSlots, 187 hint: props.hint, 188 "hide-hint": props.hideHint, 189 prefix: props.prefix, 190 suffix: props.suffix, 191 borderless: true, 192 clearable: false, 193 counter: false, 194 "no-error-icon": true, 195 dense: true 196 }, { 197 default: withCtx(() => [ 198 (openBlock(true), createElementBlock(Fragment, null, renderList(__props.num, (_, i) => { 199 var _a; 200 return openBlock(), createElementBlock(Fragment, { key: i }, [ 201 createVNode(unref(QField), { 202 class: normalizeClass(["otp-field", __props.fieldClasses]), 203 autofocus: __props.autofocus, 204 disable: disabled.value[i], 205 readonly: props.readonly, 206 "label-color": props.labelColor, 207 color: props.color, 208 "bg-color": props.bgColor, 209 dark: props.dark, 210 filled: props.filled, 211 outlined: props.outlined, 212 borderless: props.borderless, 213 standout: props.standout, 214 rounded: props.rounded, 215 square: props.square, 216 dense: props.dense, 217 "item-aligned": props.itemAligned 218 }, { 219 default: withCtx(() => [ 220 createBaseVNode("input", { 221 ref_for: true, 222 ref_key: "input", 223 ref: input, 224 type: "number", 225 inputmode: "tel", 226 min: "0", 227 max: "9", 228 maxlength: "1", 229 pattern: "[0-9]", 230 required: "", 231 title: "", 232 disabled: disabled.value[i], 233 style: normalizeStyle(__props.inputStyles), 234 class: normalizeClass(["otp-input", __props.inputClasses, __props.conditionalClass[i]]), 235 placeholder: __props.placeholder, 236 autofocus: activeInput.value === i, 237 onInput: handleOnChange, 238 onKeydown: handleOnKeyDown, 239 onPaste: handleOnPaste 240 }, null, 46, _hoisted_1$1) 241 ]), 242 _: 2 243 }, 1032, ["class", "autofocus", "disable", "readonly", "label-color", "color", "bg-color", "dark", "filled", "outlined", "borderless", "standout", "rounded", "square", "dense", "item-aligned"]), 244 __props.separator.length && i !== __props.num - 1 ? (openBlock(), createElementBlock("span", { 245 key: 0, 246 class: normalizeClass(["q-mt-auto q-mb-auto non-selectable", "text-" + ((_a = props.color) != null ? _a : "secondary")]) 247 }, toDisplayString(__props.separator), 3)) : createCommentVNode("", true) 248 ], 64); 249 }), 128)), 250 renderSlot(_ctx.$slots, "control", {}, void 0, true) 251 ]), 252 _: 3 253 }, 8, ["class", "model-value", "disable", "rules", "error", "reactive-rules", "lazy-rules", "loading", "error-message", "label", "stack-label", "bottom-slots", "hint", "hide-hint", "prefix", "suffix"]), 254 renderSlot(_ctx.$slots, "footer", {}, void 0, true) 255 ]); 256 }; 257 } 258}); 259var QOtp = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-07759faa"], ["__file", "QOtp.vue"]]); 260var OTPComponent_vue_vue_type_style_index_0_lang = ""; 261const _hoisted_1 = { class: "ibf-h10 q-mt-sm text-grey-6" }; 262const _hoisted_2 = { class: "text-primary" }; 263const _hoisted_3 = { id: "message" }; 264const _hoisted_4 = { key: 0 }; 265const _hoisted_5 = { 266 key: 0, 267 class: "ibf-h10 text-weight-medium text-negative" 268}; 269const _hoisted_6 = { 270 key: 0, 271 class: "text-center" 272}; 273const _hoisted_7 = { 274 key: 1, 275 class: "text-caption text-grey q-mt-md" 276}; 277const _hoisted_8 = { key: 0 };
278const _sfc_main = { 279 __name: "OTPComponent", 280 props: { 281 verifyId: { 282 type: String, 283 default: "" 284 }, 285 sendingMethod: { 286 type: Object, 287 default: () => ({ 288 value: "sms", 289 label: "Phone", 290 icon: "mdi-phone-outline", 291 subtitle: "Verify with signup phone number" 292 }) 293 }, 294 sending_type: { 295 type: String, 296 default: "email" 297 }, 298 redirect: { 299 type: String, 300 default: "login-page" 301 } 302 }, 303 setup(__props, { expose: __expose }) { 304 const router = useRouter(); 305 const props = __props; 306 const $q = useQuasar(); 307 const show = ref(false); 308 const otpSuccess = ref(false); 309 const otpFail = ref(false); 310 const timer = ref(59); 311 let countdown = null; 312 const visible = ref(false); 313 const toggleOTP = () => { 314 show.value = !show.value; 315 if (show.value) 316 startCountdown(); 317 }; 318 const otpInputRef = ref(null); 319 function maskText(value, keepStart = 2, keepEnd = 2, maskChar = "\u2022") { 320 const s = String(value || ""); 321 if (!s) 322 return ""; 323 if (s.length <= keepStart + keepEnd) 324 return s; 325 const midLen = s.length - keepStart - keepEnd; 326 return s.slice(0, keepStart) + maskChar.repeat(midLen) + s.slice(-keepEnd); 327 } 328 const resetOTP = () => { 329 otpSuccess.value = false; 330 otpFail.value = false; 331 }; 332 const verifyCode = async (code) => { 333 visible.value = true; 334 const end_point = props.sending_type === "forget-password" ? "/api/v1/customer/verify-pass-otp" : "/api/v1/customer/verify-otp"; 335 try { 336 const { data } = await authAPI.post(end_point, { 337 verifyId: props.verifyId, 338 type: props.sendingMethod.value, 339 otpCode: parseInt(code) 340 }); 341 if (!data.status) { 342 $q.notify({ 343 message: data.message || "Fail verifying OTP", 344 type: "negative", 345 position: "top-right" 346 }); 347 otpSuccess.value = false; 348 otpFail.value = true; 349 resetTimer(); 350 } else { 351 otpSuccess.value = true; 352 otpFail.value = false; 353 clearInterval(countdown); 354 router.push({ name: props.redirect }); 355 } 356 } catch (error) { 357 $q.notify({ 358 message: error.message || "Verifying OTP Error", 359 type: "negative", 360 position: "top-right" 361 }); 362 } finally { 363 setTimeout(() => { 364 visible.value = false; 365 }, 2e3); 366 } 367 }; 368 const onResendCode = () => { 369 if (timer.value > 0) { 370 return; 371 } 372 resendOTP(); 373 }; 374 const resetTimer = () => { 375 timer.value = 59; 376 startCountdown(); 377 }; 378 const startCountdown = () => { 379 clearInterval(countdown); 380 countdown = setInterval(() => { 381 if (timer.value > 0) { 382 timer.value -= 1; 383 } else { 384 clearInterval(countdown); 385 } 386 }, 1e3); 387 }; 388 const resendOTP = async () => { 389 var _a, _b; 390 visible.value = true; 391 try { 392 const { data } = await authAPI.post( 393 "/api/v1/customer/resend-otp", 394 { 395 verifyId: props.verifyId, 396 type: props.sendingMethod.value, 397 sending_type: props.sending_type === "forget-password" ? 1 : 0 398 }, 399 { withCredentials: true } 400 ); 401 if (!data || !data.status) { 402 $q.notify({ 403 message: (data == null ? void 0 : data.message) || "Resend OTP Failed", 404 type: "negative", 405 position: "top-right" 406 }); 407 } else { 408 $q.notify({ 409 message: data.message || "OTP Resent Successfully", 410 type: "positive", 411 position: "top-right" 412 }); 413 resetTimer(); 414 } 415 } catch (error) { 416 $q.notify({ 417 message: ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.message) || error.message || "Resend OTP Error", 418 type: "negative", 419 position: "top-right" 420 }); 421 } finally { 422 visible.value = false;
423 } 424 }; 425 const otpFieldClasses = computed(() => { 426 if (otpSuccess.value) 427 return "otp-valid otp-disabled"; 428 if (otpFail.value) 429 return "otp-invalid "; 430 return ""; 431 }); 432 __expose({ 433 toggleOTP 434 }); 435 onBeforeUnmount(() => { 436 clearInterval(countdown); 437 }); 438 return (_ctx, _cache) => { 439 return openBlock(), createBlock(QDialog, { 440 modelValue: show.value, 441 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => show.value = $event), 442 persistent: "", 443 "no-shake": "", 444 "backdrop-filter": "blur(4px)" 445 }, { 446 default: withCtx(() => [ 447 createVNode(QCard, { 448 class: "q-pa-sm", 449 style: { "width": "600px", "height": "400px" } 450 }, { 451 default: withCtx(() => [ 452 createVNode(QCardSection, { align: "center" }, { 453 default: withCtx(() => { 454 var _a, _b, _c; 455 return [ 456 _cache[3] || (_cache[3] = createBaseVNode("div", { class: "ibf-h6 text-weight-bold" }, "Enter your Verification Code", -1)), 457 createBaseVNode("div", _hoisted_1, [ 458 _cache[2] || (_cache[2] = createTextVNode(" We sent a code to ", -1)), 459 createBaseVNode("span", _hoisted_2, toDisplayString(((_a = props.sendingMethod) == null ? void 0 : _a.value) === "email" ? maskText(((_b = props.sendingMethod) == null ? void 0 : _b.subtitle) || "--", 2, 10, "\u2022") : maskText(((_c = props.sendingMethod) == null ? void 0 : _c.subtitle) || "--", 4, 2, "\u2022")), 1) 460 ]) 461 ]; 462 }), 463 _: 1 464 }), 465 createVNode(QCardSection, { align: "center" }, { 466 default: withCtx(() => [ 467 !otpSuccess.value ? (openBlock(), createBlock(unref(QOtp), { 468 key: 0, 469 ref_key: "otpInputRef", 470 ref: otpInputRef, 471 "field-classes": "q-mx-xs", 472 "input-styles": "max-width: 42px; height: 55px;", 473 "input-classes": [otpFieldClasses.value, "ibf-h8"], 474 outlined: "", 475 hide: "", 476 "bg-color": "grey-1", 477 onChange: resetOTP, 478 onComplete: verifyCode 479 }, null, 8, ["input-classes"])) : createCommentVNode("", true), 480 createBaseVNode("div", _hoisted_3, [ 481 otpSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_4, [ 482 _cache[4] || (_cache[4] = createBaseVNode("div", { class: "ibf-h10 text-weight-medium text-positive" }, " Verification Successful ", -1)), 483 otpFail.value ? (openBlock(), createElementBlock("div", _hoisted_5, " Verification Failed ")) : createCommentVNode("", true) 484 ])) : createCommentVNode("", true) 485 ]) 486 ]), 487 _: 1 488 }), 489 createVNode(QCardSection, { 490 class: "q-py-xs", 491 align: "center" 492 }, { 493 default: withCtx(() => [ 494 otpSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_6, [ 495 createVNode(QBtn, { 496 color: "primary", 497 icon: "mdi-rocket-launch", 498 label: "Start", 499 onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$router.push({ name: props.redirect })) 500 }) 501 ])) : (openBlock(), createElementBlock("div", _hoisted_7, [ 502 _cache[7] || (_cache[7] = createTextVNode(" Didn't receive the code? ", -1)), 503 createBaseVNode("span", { 504 class: "text-primary", 505 style: normalizeStyle({ 506 cursor: timer.value > 0 ? "not-allowed" : "pointer", 507 color: timer.value > 0 ? "#1976D2" : "primary" 508 }), 509 onClick: onResendCode 510 }, [ 511 _cache[5] || (_cache[5] = createBaseVNode("span", null, "Resend Code", -1)), 512 _cache[6] || (_cache[6] = createTextVNode()), 513 timer.value > 0 ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(timer.value) + "s", 1)) : createCommentVNode("", true) 514 ], 4) 515 ])) 516 ]), 517 _: 1 518 }), 519 createVNode(QInnerLoading, { 520 showing: visible.value, 521 label: "Please wait...", 522 "label-class": "text-teal", 523 "label-style": "font-size: 1.1em" 524 }, null, 8, ["showing"]) 525 ]), 526 _: 1 527 }) 528 ]), 529 _: 1 530 }, 8, ["modelValue"]); 531 }; 532 } 533}; 534var OTPComponent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "OTPComponent.vue"]]); 535export { OTPComponent as O }; 536//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT1RQQ29tcG9uZW50LjE2NTU1MDUxLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyLWFwcC1leHRlbnNpb24tcS1vdHAvc3JjL2NvbXBvbmVudC9RT3RwLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy9hdXRoZW50aWNhdGlvbi9jb21wb25lbnRzL290cC1jb21wb25lbnRzL09UUENvbXBvbmVudC52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IEBjbGljaz1cImZvY3VzQW5kU2VsZWN0SW5wdXQoZ2V0SW5wdXRWYWx1ZUF0KGFjdGl2ZUlucHV0KSlcIj5cbiAgICA8UUZpZWxkXG4gICAgICBjbGFzcz1cIm1haW4tZmllbGRcIlxuICAgICAgOmNsYXNzPVwie1xuICAgICAgICAnY29tcGxldGUnOiBwaW4ubGVuZ3RoID09PSBudW0sXG4gICAgICB9XCJcbiAgICAgIGJnLWNvbG9yPVwidHJhbnNwYXJlbnRcIlxuICAgICAgOm1vZGVsLXZhbHVlPVwicGluXCJcbiAgICAgIDpkaXNhYmxlPVwicHJvcHMubG9hZGluZ1wiXG4gICAgICA6cnVsZXM9XCJwcm9wcy5ydWxlc1wiXG4gICAgICA6ZXJyb3I9XCJwcm9wcy5lcnJvclwiXG4gICAgICA6cmVhY3RpdmUtcnVsZXM9XCJwcm9wcy5yZWFjdGl2ZVJ1bGVzXCJcbiAgICAgIDpsYXp5LXJ1bGVzPVwicHJvcHMubGF6eVJ1bGVzXCJcbiAgICAgIDpsb2FkaW5nPVwicHJvcHMubG9hZGluZ1wiXG4gICAgICA6ZXJyb3ItbWVzc2FnZT1cInByb3BzLmVycm9yTWVzc2FnZVwiXG4gICAgICA6bGFiZWw9XCJwcm9wcy5sYWJlbFwiXG4gICAgICA6c3RhY2stbGFiZWw9XCJwcm9wcy5zdGFja0xhYmVsXCJcbiAgICAgIDpib3R0b20tc2xvdHM9XCJwcm9wcy5ib3R0b21TbG90c1wiXG4gICAgICA6aGludD1cInByb3BzLmhpbnRcIlxuICAgICAgOmhpZGUtaGludD1cInByb3BzLmhpZGVIaW50XCJcbiAgICAgIDpwcmVmaXg9XCJwcm9wcy5wcmVmaXhcIlxuICAgICAgOnN1ZmZpeD1cInByb3BzLnN1ZmZpeFwiXG4gICAgICA6Ym9yZGVybGVzcz1cInRydWVcIlxuICAgICAgOmNsZWFyYWJsZT1cImZhbHNlXCJcbiAgICAgIDpjb3VudGVyPVwiZmFsc2VcIlxuICAgICAgOm5vLWVycm9yLWljb249XCJ0cnVlXCJcbiAgICAgIDpkZW5zZT1cInRydWVcIlxuICAgID5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihfLCBpKSBpbiBudW1cIiA6a2V5PVwiaVwiPlxuICAgICAgICA8UUZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJvdHAtZmllbGRcIlxuICAgICAgICAgIDpjbGFzcz1cImZpZWxkQ2xhc3Nlc1wiXG4gICAgICAgICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgOmRpc2FibGU9XCJkaXNhYmxlZFtpXVwiXG4gICAgICAgICAgOnJlYWRvbmx5PVwicHJvcHMucmVhZG9ubHlcIlxuICAgICAgICAgIDpsYWJlbC1jb2xvcj1cInByb3BzLmxhYmVsQ29sb3JcIlxuICAgICAgICAgIDpjb2xvcj1cInByb3BzLmNvbG9yXCJcbiAgICAgICAgICA6YmctY29sb3I9XCJwcm9wcy5iZ0NvbG9yXCJcbiAgICAgICAgICA6ZGFyaz1cInByb3BzLmRhcmtcIlxuICAgICAgICAgIDpmaWxsZWQ9XCJwcm9wcy5maWxsZWRcIlxuICAgICAgICAgIDpvdXRsaW5lZD1cInByb3BzLm91dGxpbmVkXCJcbiAgICAgICAgICA6Ym9yZGVybGVzcz1cInByb3BzLmJvcmRlcmxlc3NcIlxuICAgICAgICAgIDpzdGFuZG91dD1cInByb3BzLnN0YW5kb3V0XCJcbiAgICAgICAgICA6cm91bmRlZD1cInByb3BzLnJvdW5kZWRcIlxuICAgICAgICAgIDpzcXVhcmU9XCJwcm9wcy5zcXVhcmVcIlxuICAgICAgICAgIDpkZW5zZT1cInByb3BzLmRlbnNlXCJcbiAgICAgICAgICA6aXRlbS1hbGlnbmVkPVwicHJvcHMuaXRlbUFsaWduZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgI
536HJlZj1cImlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGlucHV0bW9kZT1cInRlbFwiXG4gICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICBtYXg9XCI5XCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMVwiXG4gICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XVwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIHRpdGxlPVwiXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRbaV1cIlxuICAgICAgICAgICAgICA6c3R5bGU9XCJpbnB1dFN0eWxlc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cIlsnb3RwLWlucHV0JywgaW5wdXRDbGFzc2VzLCBjb25kaXRpb25hbENsYXNzW2ldXVwiXG4gICAgICAgICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgOmF1dG9mb2N1cz1cImFjdGl2ZUlucHV0ID09PSBpXCJcbiAgICAgICAgICAgICAgQGlucHV0PVwiaGFuZGxlT25DaGFuZ2VcIlxuICAgICAgICAgICAgICBAa2V5ZG93bj1cImhhbmRsZU9uS2V5RG93blwiXG4gICAgICAgICAgICAgIEBwYXN0ZT1cImhhbmRsZU9uUGFzdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L1FGaWVsZD5cbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzZXBhcmF0b3IubGVuZ3RoICYmIGkgIT09IG51bSAtIDFcIj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJxLW10LWF1dG8gcS1tYi1hdXRvIG5vbi1zZWxlY3RhYmxlXCJcbiAgICAgICAgICAgIDpjbGFzcz1cIid0ZXh0LScgKyAocHJvcHMuY29sb3IgPz8gJ3NlY29uZGFyeScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBzZXBhcmF0b3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgICAgPHNsb3QgbmFtZT1cImNvbnRyb2xcIj48L3Nsb3Q+XG4gICAgPC9RRmllbGQ+XG4gICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IFFGaWVsZCB9IGZyb20gJ3F1YXNhcidcbmltcG9ydCB7IG9uTW91bnRlZCwgUHJvcFR5cGUsIHJlZiwgUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsnY29tcGxldGUnLCAnY2hhbmdlJ10pXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgLi4uUUZpZWxkLnByb3BzLFxuICBudW06IHtcbiAgICB0eXBlOiBOdW1iZXIgYXMgUHJvcFR5cGU8bnVtYmVyPixcbiAgICBkZWZhdWx0OiA2LFxuICB9LFxuICBzZXBhcmF0b3I6IHtcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8c3RyaW5nPixcbiAgICBkZWZhdWx0OiAnJyxcbiAgfSxcbiAgaW5wdXRTdHlsZXM6IHtcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdIGFzIFByb3BUeXBlPHN0cmluZyB8IGFueT4sXG4gIH0sXG4gIGZpZWxkQ2xhc3Nlczoge1xuICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5XSBhcyBQcm9wVHlwZTxzdHJpbmdbXSB8IHN0cmluZz4sXG4gIH0sXG4gIGlucHV0Q2xhc3Nlczoge1xuICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5XSBhcyBQcm9wVHlwZTxzdHJpbmdbXSB8IHN0cmluZz4sXG4gIH0sXG4gIGNvbmRpdGlvbmFsQ2xhc3M6IHtcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxzdHJpbmdbXT4sXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gIGF1dG9mb2N1czoge1xuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8Ym9vbGVhbj4sXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHBsYWNlaG9sZGVyOiB7XG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgZGVmYXVsdDogJyAnLFxuICB9LFxufSlcblxuY29uc3QgaW5wdXQgPSByZWY8SFRNTElucHV0RWxlbWVudCB8IG51bGw+KG51bGwpIGFzIFJlZjxIVE1MSW5wdXRFbGVtZW50PlxuY29uc3QgYWN0aXZlSW5wdXQgPSByZWY8bnVtYmVyPigwKVxuY29uc3QgZGlzYWJsZWQgPSByZWY8Ym9vbGVhbltdPihbLi4uQXJyYXkocHJvcHMubnVtKS5rZXlzKCldLm1hcCgoKSA9PiB0cnVlKSlcbmNvbnN0IHBpbiA9IHJlZjxzdHJpbmc+KCcnKVxuXG5jb25zdCBkaWdpdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpKVxuXG5mdW5jdGlvbiBmb2N1c0FuZFNlbGVjdElucHV0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gIGlucHV0LmZvY3VzKClcbiAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMClcbiAgaW5wdXQuc2VsZWN0KClcbn1cbmZ1bmN0aW9uIGhhbmRsZU9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGdldElucHV0VmFsdWVBdChhY3RpdmVJbnB1dC52YWx1ZSk/LmJsdXIoKVxuICBwaW4udmFsdWUgPSBldmVudC5jbGlwYm9hcmREYXRhXG4gICAgLmdldERhdGEoJ3RleHQvcGxhaW4nKVxuICAgIC5zbGljZSgwLCBwcm9wcy5udW0gLSBhY3RpdmVJbnB1dC52YWx1ZSlcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChlbGVtID0+IE51bWJlcihlbGVtKSlcbiAgICAuZmlsdGVyKGVsZW0gPT4gTnVtYmVyLmlzSW50ZWdlcihlbGVtKSlcbiAgICAubWFwKCh2YWx1ZSwgaSkgPT4gaW5wdXRWYWx1ZShTdHJpbmcodmFsdWUpLCBpKSlcbiAgICAuam9pbignJylcbiAgcmV0dXJuIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cbmZ1bmN0aW9uIGlucHV0VmFsdWUodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciA9IGFjdGl2ZUlucHV0LnZhbHVlKSB7XG4gIHJldHVybiBnZXRJbnB1dFZhbHVlQXQoaW5kZXgpLnZhbHVlID0gdmFsdWVbMF0gPz8gJydcbn1cbmZ1bmN0aW9uIGdldElucHV0VmFsdWVBdChrZXk6IG51bWJlcikge1xuICByZXR1cm4gaW5wdXQudmFsdWUuYXQoa2V5KVxufVxuZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoKSB7XG4gIHBpbi52YWx1ZSA9IGdldFBpbigpXG59XG5mdW5jdGlvbiBnZXRQaW4oKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBpbnB1dC52YWx1ZSkge1xuICAgIHN0ciArPSB2YWx1ZVxuICB9XG4gI
536HJldHVybiBzdHJcbn1cbmZ1bmN0aW9uIGhhbmRsZU9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICBpZiAocHJvcHMubG9hZGluZykge1xuICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cbiAgY29uc3QgeyBrZXksIGNvZGUgfSA9IGV2ZW50XG4gIGlmIChjb2RlID09PSAnS2V5VicpIHtcbiAgICByZXR1cm5cbiAgfVxuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ0JhY2tzcGFjZSc6IHtcbiAgICAgIGlmIChhY3RpdmVJbnB1dC52YWx1ZSA9PT0gcHJvcHMubnVtIC0gMSAmJiBnZXRJbnB1dFZhbHVlQXQocHJvcHMubnVtIC0gMSkudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpbnB1dFZhbHVlKCcnKVxuICAgICAgaWYgKGFjdGl2ZUlucHV0LnZhbHVlID4gMCkge1xuICAgICAgICBpbnB1dFZhbHVlKCcnLCBhY3RpdmVJbnB1dC52YWx1ZSAtIDEpXG4gICAgICB9XG4gICAgICBwaW4udmFsdWUgPSBnZXRQaW4oKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKChjb2RlLnN0YXJ0c1dpdGgoJ0RpZ2l0JykgfHwgY29kZS5zdGFydHNXaXRoKCdOdW1wYWQnKSkgJiYgZGlnaXRzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaW5wdXRWYWx1ZShrZXkpXG4gICAgICAgIHBpbi52YWx1ZSA9IGdldFBpbigpXG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG53YXRjaChcbiAgKCkgPT4gcGluLnZhbHVlLFxuICAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBpZiAobmV3VmFsID09PSBvbGRWYWwpIHtcbiAgICAgIHJldHVyblxuICAgI
536H1cbiAgICBlbWl0KCdjaGFuZ2UnLCBuZXdWYWwpXG4gICAgaWYgKHByb3BzLm51bSA9PT0gbmV3VmFsLmxlbmd0aCkge1xuICAgICAgZW1pdCgnY29tcGxldGUnLCBuZXdWYWwpXG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gTWF0aC5taW4obmV3VmFsLmxlbmd0aCwgcHJvcHMubnVtIC0gMSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc2FibGVkLnZhbHVlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgZGlzYWJsZWQudmFsdWUuc3BsaWNlKGksIDEsIGkgIT09IHZhbHVlKVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGFjdGl2ZUlucHV0LnZhbHVlID0gdmFsdWVcbiAgICB9KVxuICB9LFxuKVxud2F0Y2goXG4gICgpID0+IGFjdGl2ZUlucHV0LnZhbHVlLFxuICAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBpZiAob2xkVmFsICE9PSBuZXdWYWwgJiYgbmV3VmFsIDw9IHByb3BzLm51bSAtIDEpIHtcbiAgICAgIGNvbnN0IGVsZW0gPSBnZXRJbnB1dFZhbHVlQXQobmV3VmFsKVxuICAgICAgaWYgKCFlbGVtLmRpc2FibGVkKSB7XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0SW5wdXQoZWxlbSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4pXG5vbk1vdW50ZWQoKCkgPT4ge1xuICBpZiAocHJvcHMuYXV0b2ZvY3VzKSB7XG4gICAgZm9jdXNBbmRTZWxlY3RJbnB1dChnZXRJbnB1dFZhbHVlQXQoMCkpXG4gIH1cbiAgZGlzYWJsZWQudmFsdWUuc3BsaWNlKGRpc2FibGVkLnZhbHVlLCAwLCBmYWxzZSlcbiAgaWYgKHByb3BzLm1vZGVsVmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLm1vZGVsVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlucHV0VmFsdWUocHJvcHMubW9kZWxWYWx1ZVtpXSwgaSlcbiAgICB9XG4gIH1cbn0pXG5kZWZpbmVFeHBvc2Uoe1xuICBibHVyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubnVtOyBpKyspIHtcbiAgICAgIGdldElucHV0VmFsdWVBdChpKS5ibHVyKClcbiAgICB9XG4gIH0sXG4gIGZvY3VzKCkge1xuICAgIGZvY3VzQW5kU2VsZWN0SW5wdXQoZ2V0SW5wdXRWYWx1ZUF0KGFjdGl2ZUlucHV0LnZhbHVlID0gMCkpXG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubnVtOyBpKyspIHtcbiAgICAgIGlucHV0VmFsdWUoJycsIGkpXG4gICAgfVxuICAgIHBpbi52YWx1ZSA9ICcnXG4gIH0sXG4gIGdldFBpbixcbn0pXG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuYm9keS5ib2R5LS1kYXJrIC5vdHAtaW5wdXQge1xuICBjb2xvcjogd2hpdGU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuPC9zdHlsZT5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiIHNjb3BlZD5cbkBtaXhpbiBkZXNpZ24tY29udHJvbCgkY29sb3IpIHtcbiAgOmRlZXAoLnEtZmllbGRfX2NvbnRyb2wpIHtcbiAgICAmOmhvdmVyOjpiZWZvcmUge1xuICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG4gICAgfVxuICAgICYucm93IHtcbiAgICAgIG91dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICB9XG4gICAgJjpoYXMoaW5wdXQ6bm90KDpwbGFjZWhvbGRlci1zaG93bikpIHtcbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG4gICAgICAgIGNvbG9yOiAkY29sb3I7XG4gICAgICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgICAgfVxuICAgIH1cbiAgICAmOjphZnRlciB7XG4gICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgfVxuICAgICY6OmJlZm9yZSB7XG4gICAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICB9XG4gIH1cbn1cbjpkZWVwKC5vdHAtaW5wdXQpIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgbWluLXdpZHRoOiAyNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG91dGxpbmU6IG5vbmU7XG5cbiAgJjppbnZhbGlkLFxuICAmOnZhbGlkLFxuICAmOmFjdGl2ZSxcbiAgJjpmb2N1cy12aXNpYmxlLFxuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6Zm9jdXMtdmlzaWJsZSxcbiAgJjpmb2N1cyxcbiAgJjp0YXJnZXQge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cbiAgJjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgfVxuICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAmOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAmOjpwbGFjZWhvbGRlciB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG59XG46aG9zdCB7XG4gIGxhYmVsIHtcbiAgICBjdXJzb3I6IHRleHQ7XG4gIH1cbn1cbi5tYWluLWZpZWxkIHtcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xuXG4gIDpkZWVwKC5vdHAtZmllbGQpIHtcbiAgICBpbnB1dCxcbiAgICAucS1maWVsZF9fY29udHJvbC1jb250YWluZXIge1xuICAgICAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAucS1maWVsZF9faW5uZXIge1xuICAgICAgY3Vyc29yOiB0ZXh0O1xuICAgIH1cbiAgfVxuICAucS1maWVsZCB7XG4gICAgQGluY2x1ZGUgZGVzaWduLWNvbnRyb2woJHByaW1hcnkpO1xuICB9XG4gICYuY29tcGxldGUge1xuICAgIEBpbmNsdWRlIGRlc2lnbi1jb250cm9sKCRwb3NpdGl2ZSk7XG4gIH1cbiAgJi5xLWZpZWxkLS1lcnJvciB7XG4gICAgQGluY2x1ZGUgZGVzaWduLWNvbnRyb2woJG5lZ2F0aXZlKTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHEtZGlhbG9nIHYtbW9kZWw9XCJzaG93XCIgcGVyc2lzdGVudCBuby1zaGFrZSBiYWNrZHJvcC1maWx0ZXI9XCJibHVyKDRweClcIj5cbiAgICA8cS1jYXJkIGNsYXNzPVwicS1wYS1zbVwiIHN0eWxlPVwid2lkdGg6IDYwMHB4OyBoZWlnaHQ6IDQwMHB4XCI+XG4gICAgICA8cS1jYXJkLXNlY3Rpb24gYWxpZ249XCJjZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImliZi1oNiB0ZXh0LXdlaWdodC1ib2xkXCI+RW50ZXIgeW91ciBWZXJpZmljYXRpb24gQ29kZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWJmLWgxMCBxLW10LXNtIHRleHQtZ3JleS02XCI+XG4gICAgICAgICAgV2Ugc2VudCBhIGNvZGUgdG9cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPnt7XG4gICAgICAgICAgICBwcm9wcy5zZW5kaW5nTWV0aG9kPy52YWx1ZSA9PT0gXCJlbWFpbFwiXG4gICAgICAgICAgICAgID8gbWFza1RleHQocHJvcHMuc2VuZGluZ01ldGhvZD8uc3VidGl0bGUgfHwgXCItLVwiLCAyLCAxMCwgXCLigKJcIilcbiAgICAgICAgICAgICAgOiBtYXNrVGV4dChwcm9wcy5zZW5kaW5nTWV0aG9kPy5zdWJ0aXRsZSB8fCBcIi0tXCIsIDQsIDIsIFwi4oCiXCIpXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBhbGlnbj1cImNlbn
536RlclwiPlxuICAgICAgICA8UU90cFxuICAgICAgICAgIHYtaWY9XCIhb3RwU3VjY2Vzc1wiXG4gICAgICAgICAgcmVmPVwib3RwSW5wdXRSZWZcIlxuICAgICAgICAgIGZpZWxkLWNsYXNzZXM9XCJxLW14LXhzXCJcbiAgICAgICAgICBpbnB1dC1zdHlsZXM9XCJtYXgtd2lkdGg6IDQycHg7IGhlaWdodDogNTVweDtcIlxuICAgICAgICAgIDppbnB1dC1jbGFzc2VzPVwiW290cEZpZWxkQ2xhc3NlcywgJ2liZi1oOCddXCJcbiAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgIGhpZGVcbiAgICAgICAgICBiZy1jb2xvcj1cImdyZXktMVwiXG4gICAgICAgICAgQGNoYW5nZT1cInJlc2V0T1RQXCJcbiAgICAgICAgICBAY29tcGxldGU9XCJ2ZXJpZnlDb2RlXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8ZGl2IGlkPVwibWVzc2FnZVwiPlxuICAgICAgICAgIDxkaXYgdi1pZj1cIm90cFN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpYmYtaDEwIHRleHQtd2VpZ2h0LW1lZGl1bSB0ZXh0LXBvc2l0aXZlXCI+XG4gICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBTdWNjZXNzZnVsXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImliZi1oMTAgdGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtbmVnYXRpdmVcIlxuICAgICAgICAgICAgICB2LWlmPVwib3RwRmFpbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBGYWlsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcHkteHNcIiBhbGlnbj1cImNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIiB2LWlmPVwib3RwU3VjY2Vzc1wiPlxuICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIGljb249XCJtZGktcm9ja2V0LWxhdW5jaFwiXG4gICAgICAgICAgICBsYWJlbD1cIlN0YXJ0XCJcbiAgICAgICAgICAgIEBjbGljaz1cIiRyb3V0ZXIucHVzaCh7IG5hbWU6IHByb3BzLnJlZGlyZWN0IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2FwdGlvbiB0ZXh0LWdyZXkgcS1tdC1tZFwiIHYtZWxzZT5cbiAgICAgICAgICBEaWRuJ3QgcmVjZWl2ZSB0aGUgY29kZT9cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgOnN0eWxlPVwie1xuICAgICAgICAgICAgICBjdXJzb3I6IHRpbWVyID4gMCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgIGNvbG9yOiB0aW1lciA+IDAgPyAnIzE5NzZEMicgOiAncHJpbWFyeScsXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIEBjbGljaz1cIm9uUmVzZW5kQ29kZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+UmVzZW5kIENvZGU8L3NwYW4+IDxzcGFuIHYtaWY9XCJ0aW1lciA+IDBcIj57eyB0aW1lciB9fXM8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDwhLS0gaW5uZXIgbG9hZGluZyAtLT5cbiAgICAgIDxxLWlubmVyLWxvYWRpbmdcbiAgICAgICAgOnNob3dpbmc9XCJ2aXNpYmxlXCJcbiAgICAgICAgbGFiZWw9XCJQbGVhc2Ugd2FpdC4uLlwiXG4gICAgICAgIGxhYmVsLWNsYXNzPVwidGV4dC10ZWFsXCJcbiAgICAgICAgbGFiZWwtc3R5bGU9XCJmb250LXNpemU6IDEuMWVtXCJcbiAgICAgIC8+XG4gICAgPC9xLWNhcmQ+XG4gIDwvcS1kaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgdXNlUXVhc2FyIH0gZnJvbSBcInF1YXNhclwiO1xuaW1wb3J0IFFPdHAgZnJvbSBcInF1YXNhci1hcHAtZXh0ZW5zaW9uLXEtb3RwXCI7XG5pbXBvcnQgeyBhdXRoQVBJIH0gZnJvbSBcInNyYy9ib290L2F4aW9zXCI7XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBvbkJlZm9yZVVubW91bnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VSb3V0ZXIgfSBmcm9tIFwidnVlLXJvdXRlclwiO1xuXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIHZlcmlmeUlkOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IFwiXCIsXG4gIH0sXG5cbiAgc2VuZGluZ01ldGhvZDoge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgdmFsdWU6IFwic21zXCIsXG4gICAgICBsYWJlbDogXCJQaG9uZVwiLFxuICAgICAgaWNvbjogXCJtZGktcGhvbmUtb3V0bGluZVwiLFxuICAgICAgc3VidGl0bGU6IFwiVmVyaWZ5IHdpdGggc2lnbnVwIHBob25lIG51bWJlclwiLFxuICAgIH0pLFxuICB9LFxuXG4gIHNlbmRpbmdfdHlwZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImVtYWlsXCIsXG4gIH0sXG5cbiAgcmVkaXJlY3Q6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogXCJsb2dpbi1wYWdlXCIsXG4gIH0sXG59KTtcblxuY29uc3QgJHEgPSB1c2VRdWFzYXIoKTtcbmNvbnN0IHNob3cgPSByZWYoZmFsc2UpO1xuY29uc3Qgb3RwU3VjY2VzcyA9IHJlZihmYWxzZSk7XG5jb25zdCBvdHBGYWlsID0gcmVmKGZhbHNlKTtcblxuY29uc3QgdGltZXIgPSByZWYoNTkpO1xubGV0IGNvdW50ZG93biA9IG51bGw7XG5cbmNvbnN0IHZpc2libGUgPSByZWYoZmFsc2UpO1xuXG5jb25zdCB0b2dnbGVPVFAgPSAoKSA9PiB7XG4gIHNob3cudmFsdWUgPSAhc2hvdy52YWx1ZTtcbiAgaWYgKHNob3cudmFsdWUpIHN0YXJ0Q291bnRkb3duKCk7XG59O1xuXG5jb25zdCBvdHBJbnB1dFJlZiA9IHJlZihudWxsKTtcblxuZnVuY3Rpb24gbWFza1RleHQodmFsdWUsIGtlZXBTdGFydCA9IDIsIGtlZXBFbmQgPSAyLCBtYXNrQ2hhciA9IFwi4oCiXCIpIHtcbiAgY29uc3QgcyA9IFN0cmluZyh2YWx1ZSB8fCBcIlwiKTtcbiAgaWYgKCFzKSByZXR1cm4gXCJcIjtcbiAgaWYgKHMubGVuZ3RoIDw9IGtlZXBTdGFydCArIGtlZXBFbmQpIHJldHVybi
536BzO1xuICBjb25zdCBtaWRMZW4gPSBzLmxlbmd0aCAtIGtlZXBTdGFydCAtIGtlZXBFbmQ7XG4gIHJldHVybiBzLnNsaWNlKDAsIGtlZXBTdGFydCkgKyBtYXNrQ2hhci5yZXBlYXQobWlkTGVuKSArIHMuc2xpY2UoLWtlZXBFbmQpO1xufVxuXG5jb25zdCBvbk9UUENsZWFyID0gKCkgPT4ge1xuICBvdHBJbnB1dFJlZi52YWx1ZS5jbGVhcigpO1xufTtcblxuY29uc3QgcmVzZXRPVFAgPSAoKSA9PiB7XG4gIG90cFN1Y2Nlc3MudmFsdWUgPSBmYWxzZTtcbiAgb3RwRmFpbC52YWx1ZSA9IGZhbHNlO1xufTtcblxuY29uc3QgdmVyaWZ5Q29kZSA9IGFzeW5jIChjb2RlKSA9PiB7XG4gIHZpc2libGUudmFsdWUgPSB0cnVlOyAvLyBzdGFydCBsb2FkaW5nXG5cbiAgY29uc3QgZW5kX3BvaW50ID1cbiAgICBwcm9wcy5zZW5kaW5nX3R5cGUgPT09IFwiZm9yZ2V0LXBhc3N3b3JkXCJcbiAgICAgID8gXCIvYXBpL3YxL2N1c3RvbWVyL3ZlcmlmeS1wYXNzLW90cFwiXG4gICAgICA6IFwiL2FwaS92MS9jdXN0b21lci92ZXJpZnktb3RwXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhdXRoQVBJLnBvc3QoZW5kX3BvaW50LCB7XG4gICAgICB2ZXJpZnlJZDogcHJvcHMudmVyaWZ5SWQsXG4gICAgICB0eXBlOiBwcm9wcy5zZW5kaW5nTWV0aG9kLnZhbHVlLFxuICAgICAgb3RwQ29kZTogcGFyc2VJbnQoY29kZSksXG4gICAgfSk7XG5cbiAgICBpZiAoIWRhdGEuc3RhdHVzKSB7XG4gICAgICAvLyBmYWlsIE9UUFxuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8IFwiRmFpbCB2ZXJpZnlpbmcgT1RQXCIsXG4gICAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgICB9KTtcblxuICAgICAgb3RwU3VjY2Vzcy52YWx1ZSA9IGZhbHNlO1xuICAgICAgb3RwRmFpbC52YWx1ZSA9IHRydWU7XG5cbiAgICAgIHJlc2V0VGltZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3VjY2VzcyBPVFBcbiAgICAgIG90cFN1Y2Nlc3MudmFsdWUgPSB0cnVlO1xuICAgICAgb3RwRmFpbC52YWx1ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICAgICAgcm91dGVyLnB1c2goeyBuYW1lOiBwcm9wcy5yZWRpcmVjdCB9KTsgLy8gYXV0byBkaXJlY3QgdG8gdGhlIGRlc3RpbmF0aW9uIHBhZ2VcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgJHEubm90aWZ5KHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgXCJWZXJpZnlpbmcgT1RQIEVycm9yXCIsXG4gICAgICB0eXBlOiBcIm5lZ2F0aXZlXCIsXG4gICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHZpc2libGUudmFsdWUgPSBmYWxzZTtcbiAgICB9LCAyMDAwKTtcbiAgfVxufTtcblxuY29uc3Qgb25SZXNlbmRDb2RlID0gKCkgPT4ge1xuICBpZiAodGltZXIudmFsdWUgPiAwKSB7XG4gICAgcmV0dXJuOyAvLyBzdGlsbCB3YWl0aW5nXG4gIH1cblxuICByZXNlbmRPVFAoKTtcbn07XG5cbmNvbnN0IHJlc2V0VGltZXIgPSAoKSA9PiB7XG4gIHRpbWVyLnZhbHVlID0gNTk7XG4gIHN0YXJ0Q291bnRkb3duKCk7XG59O1xuXG5jb25zdCBzdGFydENvdW50ZG93biA9ICgpID0+IHtcbiAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICBjb3VudGRvd24gPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHRpbWVyLnZhbHVlID4gMCkge1xuICAgICAgdGltZXIudmFsdWUgLT0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59O1xuXG5jb25zdCByZXNlbmRPVFAgPSBhc3luYyAoKSA9PiB7XG4gIHZpc2libGUudmFsdWUgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXV0aEFQSS5wb3N0KFxuICAgICAgXCIvYXBpL3YxL2N1c3RvbWVyL3Jlc2VuZC1vdHBcIixcbiAgICAgIHtcbiAgICAgICAgdmVyaWZ5SWQ6IHByb3BzLnZlcmlmeUlkLFxuICAgICAgICB0eXBlOiBwcm9wcy5zZW5kaW5nTWV0aG9kLnZhbHVlLFxuICAgICAgICBzZW5kaW5nX3R5cGU6IHByb3BzLnNlbmRpbmdfdHlwZSA9PT0gXCJmb3JnZXQtcGFzc3dvcmRcIiA/IDEgOiAwLFxuICAgICAgfSxcbiAgICAgIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLnN0YXR1cykge1xuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YT8ubWVzc2FnZSB8fCBcIlJlc2VuZCBPVFAgRmFpbGVkXCIsXG4gICAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8IFwiT1RQIFJlc2VudCBTdWNjZXNzZnVsbHlcIixcbiAgICAgICAgdHlwZTogXCJwb3NpdGl2ZVwiLFxuICAgICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICAgIH0pO1xuICAgICAgcmVzZXRUaW1lcigpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAkcS5ub3RpZnkoe1xuICAgICAgbWVzc2FnZTogZXJyb3IucmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZSB8fCBcIlJlc2VuZCBPVFAgRXJyb3JcIixcbiAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgIHBvc2l0aW9uOiBcInRvcC1yaWdodFwiLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHZpc2libGUudmFsdWUgPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gRHluYW1pY2FsbHkgY29tcHV0ZSBPVFAgaW5wdXQgY2xhc3NlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJlc3VsdFxuY29uc3Qgb3RwRmllbGRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBpZiAob3RwU3VjY2Vzcy52YWx1ZSkgcmV0dXJuIFwib3RwLXZhbGlkIG90cC1kaXNhYmxlZFwiO1xuICBpZiAob3RwRmFpbC52YWx1ZSkgcmV0dXJuIFwib3RwLWludmFsaWQgXCI7XG4gIHJldHVybi
536BcIlwiOyAvLyBEZWZhdWx0IGNsYXNzXG59KTtcblxuZGVmaW5lRXhwb3NlKHtcbiAgdG9nZ2xlT1RQLFxufSk7XG5cbm9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gIGNsZWFySW50ZXJ2YWwoY291bnRkb3duKTtcbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLyogU3R5bGluZyBmb3IgdmFsaWQgYW5kIGludmFsaWQgT1RQIHN0YXRlcyAqL1xuLm90cC12YWxpZCB7XG4gIGJvcmRlcjogMi41cHggc29saWQgZ3JlZW4gIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4ub3RwLWludmFsaWQge1xuICBib3JkZXI6IDIuNXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5vdHAtZGlzYWJsZWQge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiaW5wdXQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2NyZWF0ZVZOb2RlIiwiX3VucmVmIiwiX25vcm1hbGl6ZUNsYXNzIiwiX29wZW5CbG9jayIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX3dpdGhDdHgiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX25vcm1hbGl6ZVN0eWxlIiwiX2hvaXN0ZWRfMSIsIl90b0Rpc3BsYXlTdHJpbmciLCJfY3JlYXRlQ29tbWVudFZOb2RlIiwiX3JlbmRlclNsb3QiLCJfY3JlYXRlQmxvY2siLCIkcm91dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUZBLFVBQU0sT0FBTztBQUNiLFVBQU0sUUFBUTtBQWlDUixVQUFBLFFBQVEsSUFBNkIsSUFBSTtBQUN6QyxVQUFBLGNBQWMsSUFBWSxDQUFDO0FBQ2pDLFVBQU0sV0FBVyxJQUFlLENBQUMsR0FBRyxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQU0sQ0F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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.