{"id":24715,"date":"2026-08-19T03:12:21","date_gmt":"2026-08-19T03:12:21","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24715"},"modified":"2026-08-19T03:18:46","modified_gmt":"2026-08-19T03:18:46","slug":"thread-engagement-length-check-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/thread-engagement-length-check-calculator\/","title":{"rendered":"Thread Engagement Length Check Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Thread Engagement Length Check Calculator<\/strong> is a practical engineering tool designed to determine whether the engagement length of a threaded connection is sufficient for safe load transfer. By considering thread diameter, pitch, material strength, applied load, and safety factor, it helps engineers calculate the required engagement length and evaluate thread stripping risks. The Thread Engagement Length Check Calculator supports fastener design, bolt selection, and mechanical connection verification while helping improve joint reliability and prevent premature thread failure.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <meta name=\"description\" content=\"Thread Engagement Length Check Calculator for mechanical engineers. Calculate required thread engagement, thread shear area, bolt tensile capacity, and thread stripping risk. Bolt Thread Engagement Calculator with metric and imperial units.\" \/>\n  <title>Thread Engagement Length Check Calculator | Bolt Thread Engagement &amp; Stripping Strength<\/title>\n  <style>\n    body:has(> #telc-root:only-child) { margin: 0; padding: 0; background: #e8eef4; }\n  <\/style>\n<\/head>\n<body>\n<!--\n  WordPress embed: copy the entire #telc-root div into a Custom HTML block.\n  Paste in Code Editor mode. All CSS\/JS is scoped under #telc-root.\n-->\n<div id=\"telc-root\">\n<style id=\"telc-calc-styles\">\n#telc-root {\n  all: revert;\n  --telc-bg: transparent;\n  --telc-surface: #ffffff;\n  --telc-surface-2: #f4f7fa;\n  --telc-ink: #0f172a;\n  --telc-muted: #64748b;\n  --telc-line: #d4dde8;\n  --telc-accent: #0369a1;\n  --telc-steel: #1e293b;\n  --telc-ok: #059669;\n  --telc-warn: #d97706;\n  --telc-risk: #dc2626;\n  --telc-radius: 10px;\n  --telc-shadow: 0 1px 3px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);\n  --telc-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n  --telc-sans: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;\n  box-sizing: border-box;\n  display: block;\n  isolation: isolate;\n  contain: layout style;\n  font-family: var(--telc-sans);\n  font-size: 15px;\n  line-height: 1.5;\n  color: var(--telc-ink);\n  background: var(--telc-bg);\n  width: 1000px;\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 1.25rem 1rem 2rem;\n  text-align: left;\n}\n#telc-root *, #telc-root *::before, #telc-root *::after { box-sizing: border-box; }\n#telc-root h1, #telc-root h2, #telc-root h3, #telc-root p, #telc-root ul, #telc-root li,\n#telc-root section, #telc-root header, #telc-root div, #telc-root span, #telc-root strong {\n  margin: 0; padding: 0; border: none; background: none; font: inherit; color: inherit; text-decoration: none;\n}\n#telc-root button, #telc-root input, #telc-root select, #telc-root textarea, #telc-root label {\n  font: inherit; color: inherit; margin: 0; max-width: none;\n}\n#telc-root button { cursor: pointer; background: transparent; border: none; appearance: none; }\n#telc-root svg { display: block; max-width: 100%; height: auto; }\n#telc-root sub, #telc-root sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#telc-root sub { bottom: -0.2em; }\n#telc-root sup { top: -0.45em; }\n#telc-root strong { font-weight: 700; }\n#telc-root .telc-hidden { display: none !important; }\n#telc-root .telc-layout { display: flex; flex-direction: column; gap: 1.15rem; }\n#telc-root .telc-card {\n  background: var(--telc-surface); border: 1px solid var(--telc-line);\n  border-radius: var(--telc-radius); box-shadow: var(--telc-shadow); overflow: visible;\n}\n#telc-root .telc-card-h {\n  display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; flex-wrap: wrap;\n  padding: 0.72rem 1rem; background: linear-gradient(180deg, #f8fafc, #f1f5f9);\n  border-bottom: 1px solid var(--telc-line);\n}\n#telc-root .telc-card-h h2 {\n  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--telc-steel);\n}\n#telc-root .telc-card-b { padding: 0.95rem 1rem 1.1rem; }\n#telc-root .telc-section {\n  font-size: 0.78rem; font-weight: 700; margin: 1.05rem 0 0.65rem; padding-bottom: 0.3rem;\n  border-bottom: 1px dashed var(--telc-line); display: flex; align-items: center; gap: 0.45rem;\n}\n#telc-root .telc-section:first-child { margin-top: 0; }\n#telc-root .telc-badge {\n  width: 1.35rem; height: 1.35rem; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center;\n  background: linear-gradient(135deg, #0f172a, #334155); color: #fff; font-size: 0.65rem; font-weight: 700;\n}\n#telc-root .telc-grid { display: grid; gap: 0.7rem 0.75rem; }\n#telc-root .telc-g-2 { grid-template-columns: 1fr 1fr; }\n#telc-root .telc-g-3 { grid-template-columns: 1fr 1fr 1fr; }\n@media (max-width: 640px) {\n  #telc-root .telc-g-2, #telc-root .telc-g-3 { grid-template-columns: 1fr; }\n}\n#telc-root label.telc-fld { display: flex; flex-direction: column; gap: 0.28rem; min-width: 0; }\n#telc-root label.telc-fld > span.telc-lbl {\n  font-size: 0.75rem; font-weight: 600; color: #334155; display: flex; align-items: center; gap: 0.3rem; flex-wrap: wrap;\n}\n#telc-root input[type=\"number\"], #telc-root input[type=\"text\"] {\n  width: 100%; border: 1px solid #cbd5e1; border-radius: 8px; padding: 0.5rem 0.7rem;\n  font-size: 0.8125rem; background: #fff; font-family: var(--telc-mono);\n}\n#telc-root input[type=\"number\"]::-webkit-outer-spin-button, #telc-root input[type=\"number\"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n#telc-root input[type=\"number\"] { -moz-appearance: textfield; appearance: textfield; }\n#telc-root select {\n  width: 100%; min-height: 2.45rem; padding: 0.48rem 2rem 0.48rem 0.7rem;\n  border: 1px solid #cbd5e1; border-radius: 8px; background: #fff; font-size: 0.8125rem; font-family: var(--telc-mono);\n}\n#telc-root input:focus, #telc-root select:focus { outline: 2px solid #38bdf8; border-color: #0ea5e9; }\n#telc-root input:disabled, #telc-root input[readonly] { background: #f8fafc; }\n#telc-root input.telc-invalid { border-color: #ef4444; background: #fef2f2; }\n#telc-root .telc-err { font-size: 0.68rem; color: var(--telc-risk); min-height: 0.85rem; }\n#telc-root .telc-input-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem; align-items: stretch; }\n#telc-root .telc-unit-pill {\n  display: inline-flex; align-items: center; justify-content: center; min-width: 3.4rem; padding: 0 0.55rem;\n  border: 1px solid #cbd5e1; border-radius: 8px; background: #f8fafc; color: var(--telc-muted);\n  font-size: 0.72rem; font-weight: 600; font-family: var(--telc-mono);\n}\n#telc-root .telc-check { display: flex; align-items: center; gap: 0.45rem; font-size: 0.75rem; color: #334155; margin-top: 0.15rem; }\n#telc-root .telc-check input { width: 0.95rem; height: 0.95rem; accent-color: #0284c7; }\n#telc-root .telc-tools { display: flex; align-items: center; gap: 0.5rem; margin-left: auto; }\n#telc-root .telc-unit-switch {\n  display: inline-flex; gap: 2px; padding: 3px; border-radius: 8px; background: #0f172a; border: 1px solid #1e293b;\n}\n#telc-root .telc-unit-switch .telc-unit-btn {\n  padding: 0.4rem 0.85rem; border-radius: 6px; background: transparent; color: #cbd5e1;\n  font-size: 0.8125rem; font-weight: 500; cursor: pointer;\n}\n#telc-root .telc-unit-switch .telc-unit-btn.telc-is-active { background: #0ea5e9; color: #fff; font-weight: 600; }\n#telc-root .telc-reset-btn {\n  padding: 0.4rem 0.85rem; border-radius: 6px; border: 1px solid #d1d5db; background: #fff; font-size: 0.8125rem;\n}\n#telc-root .telc-chip-row { display: flex; flex-wrap: wrap; gap: 0.35rem; }\n#telc-root .telc-chip {\n  padding: 0.32rem 0.55rem; border-radius: 6px; border: 1px solid #cbd5e1; background: #fff;\n  font-size: 0.72rem; font-weight: 600; font-family: var(--telc-mono); cursor: pointer;\n}\n#telc-root .telc-chip.telc-is-active { background: #0284c7; color: #fff; border-color: #0284c7; }\n#telc-root .telc-note {\n  font-size: 0.72rem; color: var(--telc-muted); background: var(--telc-surface-2);\n  border: 1px solid var(--telc-line); border-radius: 8px; padding: 0.5rem 0.65rem; line-height: 1.45;\n}\n#telc-root .telc-actions {\n  display: flex; justify-content: center; gap: 0.65rem; margin-top: 1.15rem; padding-top: 0.9rem; border-top: 1px solid var(--telc-line);\n}\n#telc-root #telcBtnCalculate.telc-calc-btn {\n  min-width: 220px; padding: 0.85rem 2.5rem; border-radius: 10px; border: none;\n  background: #0077c2; color: #fff; font-size: 1rem; font-weight: 700; cursor: pointer;\n}\n#telc-root #telcBtnCalculate.telc-calc-btn:hover { background: #0066a8; }\n#telc-root .telc-tip {\n  position: relative; display: inline-flex; align-items: center; justify-content: center;\n  width: 0.95rem; height: 0.95rem; border-radius: 999px; background: #e2e8f0; color: #475569;\n  font-size: 0.62rem; font-weight: 700; cursor: help;\n}\n#telc-root .telc-tip-box {\n  display: none; position: absolute; left: 50%; bottom: calc(100% + 8px); transform: translateX(-50%);\n  width: 16.5rem; padding: 0.55rem 0.65rem; border-radius: 8px; z-index: 20;\n  background: #0f172a; color: #e2e8f0; font-size: 0.7rem; font-weight: 400; line-height: 1.4; text-align: left;\n}\n#telc-root .telc-tip:hover .telc-tip-box, #telc-root .telc-tip:focus .telc-tip-box { display: block; }\n#telc-root .telc-banner {\n  border-radius: 10px; padding: 0.85rem 1rem; color: #fff; margin-bottom: 0.85rem;\n  display: flex; align-items: flex-start; gap: 0.75rem;\n}\n#telc-root .telc-banner .telc-dot { width: 0.7rem; height: 0.7rem; border-radius: 999px; background: #fff; flex-shrink: 0; margin-top: 0.28rem; }\n#telc-root .telc-banner-kicker { font-size: 0.65rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.85; }\n#telc-root .telc-banner-title { font-size: 1.15rem; font-weight: 750; margin: 0.1rem 0 0.2rem; }\n#telc-root .telc-banner-note { font-size: 0.75rem; opacity: 0.92; line-height: 1.45; }\n#telc-root .telc-banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#telc-root .telc-banner-caution { background: linear-gradient(90deg, #854d0e, #a16207); }\n#telc-root .telc-banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#telc-root .telc-hero { display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem; margin-bottom: 0.75rem; }\n@media (max-width: 520px) { #telc-root .telc-hero { grid-template-columns: 1fr; } }\n#telc-root .telc-hero-card {\n  border: 1px solid var(--telc-line); border-radius: 10px; padding: 0.8rem 0.85rem;\n  background: linear-gradient(180deg, #fff, #f8fafc);\n}\n#telc-root .telc-hero-card.telc-is-accent { border-color: #7dd3fc; background: linear-gradient(180deg, #f0f9ff, #fff); }\n#telc-root .telc-hero-k { font-size: 0.65rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--telc-muted); }\n#telc-root .telc-hero-v { font-family: var(--telc-mono); font-size: 1.35rem; font-weight: 700; margin-top: 0.2rem; }\n#telc-root .telc-hero-u { font-size: 0.7rem; color: var(--telc-muted); margin-top: 0.15rem; }\n#telc-root .telc-viz { display: grid; grid-template-columns: 180px 1fr; gap: 0.75rem; align-items: center; margin-bottom: 0.75rem; }\n@media (max-width: 640px) { #telc-root .telc-viz { grid-template-columns: 1fr; } }\n#telc-root .telc-sch-wrap {\n  border: 1px solid var(--telc-line); border-radius: 10px; padding: 0.45rem; background: linear-gradient(180deg, #f8fafc, #fff);\n}\n#telc-root .telc-schematic .telc-sch-bolt { fill: #64748b; stroke: #334155; }\n#telc-root .telc-schematic .telc-sch-nut { fill: #cbd5e1; stroke: #94a3b8; }\n#telc-root .telc-schematic .telc-sch-eng-act { fill: rgba(14, 165, 233, 0.35); stroke: #0284c7; stroke-width: 1.2; }\n#telc-root .telc-schematic .telc-sch-eng-req { fill: none; stroke: #059669; stroke-width: 1.5; stroke-dasharray: 4 3; }\n#telc-root .telc-schematic .telc-sch-eng-rec { fill: none; stroke: #d97706; stroke-width: 1; stroke-dasharray: 2 2; }\n#telc-root .telc-schematic .telc-sch-label { fill: #334155; font-size: 10px; font-family: var(--telc-sans); }\n#telc-root .telc-schematic[data-status=\"ok\"] .telc-sch-eng-act { fill: rgba(5, 150, 105, 0.35); stroke: #059669; }\n#telc-root .telc-schematic[data-status=\"caution\"] .telc-sch-eng-act { fill: rgba(217, 119, 6, 0.35); stroke: #d97706; }\n#telc-root .telc-schematic[data-status=\"risk\"] .telc-sch-eng-act { fill: rgba(220, 38, 38, 0.35); stroke: #dc2626; }\n#telc-root .telc-gauge-row {\n  display: grid; grid-template-columns: 150px 1fr; gap: 0.75rem; align-items: center;\n  border: 1px solid var(--telc-line); border-radius: 10px; padding: 0.55rem 0.75rem; background: #fff;\n}\n@media (max-width: 520px) { #telc-root .telc-gauge-row { grid-template-columns: 1fr; } }\n#telc-root .telc-ratio { margin-bottom: 0.75rem; }\n#telc-root .telc-ratio-head { display: flex; justify-content: space-between; font-size: 0.72rem; margin-bottom: 0.35rem; }\n#telc-root .telc-ratio-track { position: relative; height: 14px; border-radius: 999px; background: #e2e8f0; overflow: hidden; }\n#telc-root .telc-ratio-mark { position: absolute; left: 66.67%; top: 0; bottom: 0; width: 2px; background: #059669; z-index: 2; }\n#telc-root .telc-ratio-fill {\n  position: absolute; left: 0; top: 0; bottom: 0; width: 0;\n  background: linear-gradient(90deg, #0284c7, #0369a1); border-radius: 999px; transition: width 0.25s ease;\n}\n#telc-root .telc-ratio-fill.telc-is-ok { background: linear-gradient(90deg, #059669, #047857); }\n#telc-root .telc-ratio-fill.telc-is-caution { background: linear-gradient(90deg, #d97706, #b45309); }\n#telc-root .telc-ratio-fill.telc-is-risk { background: linear-gradient(90deg, #dc2626, #b91c1c); }\n#telc-root .telc-chart {\n  border: 1px solid var(--telc-line); border-radius: 10px; padding: 0.7rem 0.8rem; background: #fff; margin-bottom: 0.75rem;\n}\n#telc-root .telc-chart-title { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--telc-muted); margin-bottom: 0.55rem; }\n#telc-root .telc-bar-row { display: grid; grid-template-columns: 7.5rem 1fr auto; gap: 0.45rem; align-items: center; margin-top: 0.4rem; }\n#telc-root .telc-bar-k { font-size: 0.7rem; color: #334155; }\n#telc-root .telc-bar-track { height: 10px; background: #e2e8f0; border-radius: 999px; overflow: hidden; }\n#telc-root .telc-bar-fill { height: 100%; width: 0; border-radius: 999px; background: #0284c7; transition: width 0.25s ease; }\n#telc-root .telc-bar-thread { background: #0ea5e9; }\n#telc-root .telc-bar-ext { background: #64748b; }\n#telc-root .telc-bar-bolt { background: #1e293b; }\n#telc-root .telc-bar-load { background: #dc2626; }\n#telc-root .telc-bar-v { font-family: var(--telc-mono); font-size: 0.7rem; color: var(--telc-muted); min-width: 5.5rem; text-align: right; }\n#telc-root .telc-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }\n@media (min-width: 720px) { #telc-root .telc-tiles { grid-template-columns: repeat(3, 1fr); } }\n#telc-root .telc-tile {\n  background: linear-gradient(180deg, #fff, #f8fafc); border: 1px solid var(--telc-line);\n  border-radius: 8px; padding: 0.6rem 0.7rem;\n}\n#telc-root .telc-tile .telc-k { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--telc-muted); }\n#telc-root .telc-tile .telc-v { font-family: var(--telc-mono); font-size: 0.98rem; font-weight: 700; margin-top: 0.12rem; }\n#telc-root .telc-tile .telc-u { font-size: 0.68rem; color: var(--telc-muted); }\n#telc-root .telc-alerts { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.75rem; }\n#telc-root .telc-alert { border-radius: 8px; padding: 0.5rem 0.7rem; font-size: 0.75rem; border: 1px solid; line-height: 1.4; }\n#telc-root .telc-alert-ok { background: #ecfdf5; border-color: #a7f3d0; color: #065f46; }\n#telc-root .telc-alert-warn { background: #fffbeb; border-color: #fcd34d; color: #92400e; }\n#telc-root .telc-alert-risk { background: #fef2f2; border-color: #fca5a5; color: #991b1b; }\n#telc-root #telc-js-b64 { display: none !important; position: absolute; left: -9999px; }\n@media print {\n  #telc-root .telc-no-print { display: none !important; }\n  #telc-root .telc-card { break-inside: avoid; box-shadow: none; }\n}\n<\/style>\n\n  <div class=\"telc-layout\">\n    <section class=\"telc-card\" id=\"telcInputs\">\n      <div class=\"telc-card-h\">\n        <h2>Input parameters<\/h2>\n        <div class=\"telc-tools telc-no-print\">\n          <div class=\"telc-unit-switch\" role=\"group\" aria-label=\"Unit system\">\n            <button type=\"button\" class=\"telc-unit-btn telc-is-active\" id=\"telcBtnMetric\" onclick=\"(function(){if(window.telcSwitchUnit){window.telcSwitchUnit('metric');return false;}var t=document.getElementById('telc-js-b64');if(!t){return false;}var c=t.value||t.textContent;if(!c){return false;}var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c.replace(\/\\s\/g,''));(document.body||document.head).appendChild(s);setTimeout(function(){if(window.telcSwitchUnit){window.telcSwitchUnit('metric');}},150);return false;})()\">Metric<\/button>\n            <button type=\"button\" class=\"telc-unit-btn\" id=\"telcBtnImperial\" onclick=\"(function(){if(window.telcSwitchUnit){window.telcSwitchUnit('imperial');return false;}var t=document.getElementById('telc-js-b64');if(!t){return false;}var c=t.value||t.textContent;if(!c){return false;}var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c.replace(\/\\s\/g,''));(document.body||document.head).appendChild(s);setTimeout(function(){if(window.telcSwitchUnit){window.telcSwitchUnit('imperial');}},150);return false;})()\">Imperial<\/button>\n          <\/div>\n          <button type=\"button\" class=\"telc-reset-btn\" id=\"telcBtnReset\" onclick=\"(function(){if(window.telcReset){window.telcReset();return false;}var t=document.getElementById('telc-js-b64');if(!t){return false;}var c=t.value||t.textContent;if(!c){return false;}var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c.replace(\/\\s\/g,''));(document.body||document.head).appendChild(s);setTimeout(function(){if(window.telcReset){window.telcReset();}},150);return false;})()\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"telc-card-b\">\n\n        <div class=\"telc-section\"><span class=\"telc-badge\">1<\/span> Thread geometry<\/div>\n        <label class=\"telc-fld\">\n          <span class=\"telc-lbl\">\n            Thread type\n            <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Metric, UNC, UNF, trapezoidal, or custom. Sets default thread geometry factor K and common size presets.<\/span><\/span>\n          <\/span>\n          <select id=\"telcThread\">\n            <option value=\"metric\" selected>Metric Thread<\/option>\n            <option value=\"unc\">UNC Thread<\/option>\n            <option value=\"unf\">UNF Thread<\/option>\n            <option value=\"trapezoidal\">Trapezoidal Thread<\/option>\n            <option value=\"custom\">Custom Thread<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"telc-chip-row telc-no-print\" id=\"telcSizeChips\" style=\"margin-top:0.65rem\" aria-label=\"Common thread sizes\"><\/div>\n        <div class=\"telc-grid telc-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Nominal thread diameter\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Major diameter d of the external (bolt) thread. M12 = 12 mm nominal.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcD\" type=\"number\" min=\"0\" step=\"any\" value=\"12\" inputmode=\"decimal\" \/>\n              <span class=\"telc-unit-pill\" data-unit=\"d\">mm<\/span>\n            <\/div>\n            <span class=\"telc-err\" id=\"telcErrD\"><\/span>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Thread pitch\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Metric: pitch in mm. Imperial: threads per inch (TPI). Used to estimate pitch diameter.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcP\" type=\"number\" min=\"0\" step=\"any\" value=\"1.75\" inputmode=\"decimal\" \/>\n              <span class=\"telc-unit-pill\" data-unit=\"p\">mm<\/span>\n            <\/div>\n            <span class=\"telc-err\" id=\"telcErrP\"><\/span>\n          <\/label>\n        <\/div>\n        <div class=\"telc-grid telc-g-2\" style=\"margin-top:0.15rem\">\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Pitch diameter d<sub>p<\/sub>\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Effective diameter for shear area: A<sub>s<\/sub> = \u03c0 \u00d7 d<sub>p<\/sub> \u00d7 L<sub>e<\/sub> \u00d7 K. Auto: d \u2212 0.6495 \u00d7 p.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcDp\" type=\"number\" min=\"0\" step=\"any\" value=\"10.863\" inputmode=\"decimal\" readonly \/>\n              <span class=\"telc-unit-pill\" data-unit=\"d\">mm<\/span>\n            <\/div>\n            <span class=\"telc-check\"><input type=\"checkbox\" id=\"telcDpManual\" \/> Enter d<sub>p<\/sub> manually<\/span>\n            <span class=\"telc-err\" id=\"telcErrDp\"><\/span>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Thread engagement length L<sub>e<\/sub>\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Actual engaged thread length \u2014 nut thickness or tapped hole depth excluding runout and chamfers.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcLe\" type=\"number\" min=\"0\" step=\"any\" value=\"12\" inputmode=\"decimal\" \/>\n              <span class=\"telc-unit-pill\" data-unit=\"l\">mm<\/span>\n            <\/div>\n            <span class=\"telc-err\" id=\"telcErrLe\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"telc-section\"><span class=\"telc-badge\">2<\/span> Load &amp; materials<\/div>\n        <div class=\"telc-grid telc-g-2\">\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Applied tensile load F\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">External axial tensile force on the threaded connection.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcF\" type=\"number\" min=\"0\" step=\"any\" value=\"30000\" inputmode=\"decimal\" \/>\n              <select id=\"telcFUnit\" aria-label=\"Load unit\" style=\"min-width:4.6rem;width:auto;padding-right:1.6rem!important\">\n                <option value=\"N\" selected>N<\/option>\n                <option value=\"kN\">kN<\/option>\n                <option value=\"lbf\">lbf<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"telc-err\" id=\"telcErrF\"><\/span>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Design safety factor n\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Applied to load when computing required engagement: L<sub>e,req<\/sub> = F \u00d7 n \/ (\u03c0 \u00d7 d<sub>p<\/sub> \u00d7 K \u00d7 \u03c4<sub>allow<\/sub>). Default 2.0.<\/span><\/span>\n            <\/span>\n            <input id=\"telcNsf\" type=\"number\" min=\"0\" step=\"any\" value=\"2.0\" inputmode=\"decimal\" \/>\n            <span class=\"telc-err\" id=\"telcErrNsf\"><\/span>\n          <\/label>\n        <\/div>\n        <div class=\"telc-grid telc-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">Bolt material<\/span>\n            <select id=\"telcBoltMat\">\n              <option value=\"carbon\">Carbon Steel<\/option>\n              <option value=\"stainless\">Stainless Steel<\/option>\n              <option value=\"alloy\" selected>Alloy Steel<\/option>\n              <option value=\"custom\">Custom Material<\/option>\n            <\/select>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">Nut \/ internal thread material<\/span>\n            <select id=\"telcNutMat\">\n              <option value=\"steel\" selected>Steel<\/option>\n              <option value=\"aluminum\">Aluminum<\/option>\n              <option value=\"castiron\">Cast Iron<\/option>\n              <option value=\"stainless\">Stainless Steel<\/option>\n              <option value=\"custom\">Custom Material<\/option>\n            <\/select>\n          <\/label>\n        <\/div>\n        <div class=\"telc-grid telc-g-3\" style=\"margin-top:0.65rem\">\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Bolt tensile strength S<sub>ut<\/sub>\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Ultimate tensile strength of the bolt. Used for bolt tensile capacity F<sub>t,bolt<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>ut<\/sub>.<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcSut\" type=\"number\" min=\"0\" step=\"any\" value=\"1000\" inputmode=\"decimal\" readonly \/>\n              <span class=\"telc-unit-pill\" data-unit=\"s\">MPa<\/span>\n            <\/div>\n            <span class=\"telc-err\" id=\"telcErrSut\"><\/span>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Allowable thread shear \u03c4<sub>allow<\/sub>\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Allowable shear stress for the internal (nut\/tapped) threads. Auto from nut material yield \u00d7 shear factor (~0.577).<\/span><\/span>\n            <\/span>\n            <div class=\"telc-input-row\">\n              <input id=\"telcTau\" type=\"number\" min=\"0\" step=\"any\" value=\"202\" inputmode=\"decimal\" readonly \/>\n              <span class=\"telc-unit-pill\" data-unit=\"s\">MPa<\/span>\n            <\/div>\n            <span class=\"telc-check\"><input type=\"checkbox\" id=\"telcTauManual\" \/> Enter \u03c4 manually<\/span>\n            <span class=\"telc-err\" id=\"telcErrTau\"><\/span>\n          <\/label>\n          <label class=\"telc-fld\">\n            <span class=\"telc-lbl\">\n              Thread geometry factor K\n              <span class=\"telc-tip\" tabindex=\"0\">?<span class=\"telc-tip-box\">Shear area factor for thread flank geometry. Typical 0.5 for 60\u00b0 threads; trapezoidal ~0.45.<\/span><\/span>\n            <\/span>\n            <input id=\"telcK\" type=\"number\" min=\"0\" step=\"any\" value=\"0.5\" inputmode=\"decimal\" readonly \/>\n            <span class=\"telc-check\"><input type=\"checkbox\" id=\"telcKManual\" \/> Enter K manually<\/span>\n            <span class=\"telc-err\" id=\"telcErrK\"><\/span>\n          <\/label>\n        <\/div>\n        <p class=\"telc-note\" style=\"margin-top:0.55rem\">\n          A<sub>s<\/sub> = \u03c0 \u00d7 d<sub>p<\/sub> \u00d7 L<sub>e<\/sub> \u00d7 K &nbsp;|&nbsp;\n          F<sub>t<\/sub> = A<sub>s<\/sub> \u00d7 \u03c4<sub>allow<\/sub> &nbsp;|&nbsp;\n          L<sub>e,req<\/sub> = F \u00d7 n \/ (\u03c0 \u00d7 d<sub>p<\/sub> \u00d7 K \u00d7 \u03c4<sub>allow<\/sub>)\n        <\/p>\n\n        <div class=\"telc-actions telc-no-print\">\n          <button type=\"button\" class=\"telc-calc-btn\" id=\"telcBtnCalculate\" onclick=\"(function(){if(window.telcCalculate){window.telcCalculate();return false;}var t=document.getElementById('telc-js-b64');if(!t){return false;}var c=t.value||t.textContent;if(!c){return false;}var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c.replace(\/\\s\/g,''));(document.body||document.head).appendChild(s);setTimeout(function(){if(window.telcCalculate){window.telcCalculate();}},150);return false;})()\">Calculate<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <aside class=\"telc-results-wrap telc-hidden\" id=\"telcResults\">\n      <section class=\"telc-card\">\n        <div class=\"telc-card-h\"><h2>Calculated results<\/h2><\/div>\n        <div class=\"telc-card-b\">\n          <div class=\"telc-banner telc-banner-ok\" id=\"telcBanner\">\n            <span class=\"telc-dot\" aria-hidden=\"true\"><\/span>\n            <div>\n              <div class=\"telc-banner-kicker\">Thread safety evaluation<\/div>\n              <div class=\"telc-banner-title\" id=\"telcStatusTitle\">Ready<\/div>\n              <p class=\"telc-banner-note\" id=\"telcStatusNote\">Enter parameters and press Calculate.<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-hero\">\n            <div class=\"telc-hero-card telc-is-accent\">\n              <div class=\"telc-hero-k\">Engagement ratio<\/div>\n              <div class=\"telc-hero-v\" id=\"telcOutRatio\">\u2014<\/div>\n              <div class=\"telc-hero-u\">Actual L<sub>e<\/sub> \/ Required L<sub>e<\/sub><\/div>\n            <\/div>\n            <div class=\"telc-hero-card telc-is-accent\">\n              <div class=\"telc-hero-k\">Thread failure risk<\/div>\n              <div class=\"telc-hero-v\" id=\"telcOutRisk\">\u2014<\/div>\n              <div class=\"telc-hero-u\" id=\"telcOutImprove\">\u2014<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-viz\">\n            <div class=\"telc-sch-wrap\">\n              <svg class=\"telc-schematic\" id=\"telcSchematic\" viewBox=\"0 0 180 250\" role=\"img\" aria-label=\"Bolt and nut engagement diagram\" data-status=\"idle\">\n                <text class=\"telc-sch-label\" x=\"90\" y=\"14\" text-anchor=\"middle\">Bolt &amp; nut cross-section<\/text>\n                <rect class=\"telc-sch-nut\" x=\"50\" y=\"40\" width=\"80\" height=\"90\" rx=\"2\" stroke-width=\"1\" \/>\n                <rect class=\"telc-sch-bolt\" x=\"78\" y=\"20\" width=\"24\" height=\"130\" stroke-width=\"1\" \/>\n                <rect class=\"telc-sch-eng-rec\" id=\"telcEngRec\" x=\"52\" y=\"80\" width=\"76\" height=\"50\" \/>\n                <rect class=\"telc-sch-eng-req\" id=\"telcEngRequired\" x=\"54\" y=\"90\" width=\"72\" height=\"40\" \/>\n                <rect class=\"telc-sch-eng-act\" id=\"telcEngActual\" x=\"56\" y=\"95\" width=\"68\" height=\"35\" \/>\n                <path d=\"M56 95 h68 M56 105 h68 M56 115 h68 M56 125 h68\" fill=\"none\" stroke=\"#94a3b8\" stroke-width=\"0.8\" \/>\n                <text class=\"telc-sch-label\" x=\"138\" y=\"100\">L<sub>e<\/sub><\/text>\n                <line x1=\"134\" y1=\"95\" x2=\"134\" y2=\"130\" stroke=\"#64748b\" stroke-width=\"1\" \/>\n                <text class=\"telc-sch-label\" x=\"90\" y=\"148\" text-anchor=\"middle\" fill=\"#059669\">\u2014 required<\/text>\n                <text class=\"telc-sch-label\" x=\"90\" y=\"162\" text-anchor=\"middle\" fill=\"#d97706\">\u2014 recommended<\/text>\n                <text class=\"telc-sch-label\" x=\"90\" y=\"176\" text-anchor=\"middle\" fill=\"#0284c7\">\u2014 actual<\/text>\n                <text class=\"telc-sch-label\" x=\"90\" y=\"200\" text-anchor=\"middle\">Thread engagement depth<\/text>\n              <\/svg>\n            <\/div>\n            <div class=\"telc-gauge-row\">\n              <svg class=\"telc-gauge-svg\" viewBox=\"0 0 240 140\" aria-hidden=\"true\" style=\"width:150px\">\n                <defs>\n                  <linearGradient id=\"telcGaugeGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n                    <stop offset=\"0%\" stop-color=\"#dc2626\" \/>\n                    <stop offset=\"40%\" stop-color=\"#d97706\" \/>\n                    <stop offset=\"70%\" stop-color=\"#059669\" \/>\n                    <stop offset=\"100%\" stop-color=\"#047857\" \/>\n                  <\/linearGradient>\n                <\/defs>\n                <path d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"14\" stroke-linecap=\"round\" \/>\n                <path id=\"telcGaugeArc\" d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"url(#telcGaugeGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" stroke-dasharray=\"282.7\" stroke-dashoffset=\"282.7\" \/>\n                <g id=\"telcNeedle\" transform=\"rotate(-90 120 118)\">\n                  <line x1=\"120\" y1=\"118\" x2=\"120\" y2=\"44\" stroke=\"#0f172a\" stroke-width=\"3\" stroke-linecap=\"round\" \/>\n                  <circle cx=\"120\" cy=\"118\" r=\"6\" fill=\"#0f172a\" \/>\n                <\/g>\n              <\/svg>\n              <div>\n                <div style=\"font-size:0.68rem;color:var(--telc-muted)\">Engagement ratio gauge<\/div>\n                <div style=\"font-family:var(--telc-mono);font-size:1.05rem;font-weight:700\" id=\"telcGaugeRead\">\u2014<\/div>\n                <div style=\"font-size:0.68rem;color:var(--telc-muted);margin-top:0.25rem\">100% = minimum required (scale 0\u2013150%)<\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-ratio\">\n            <div class=\"telc-ratio-head\">\n              <span>Engagement ratio indicator<\/span>\n              <strong id=\"telcOutRatio2\">\u2014<\/strong>\n            <\/div>\n            <div class=\"telc-ratio-track\" aria-hidden=\"true\">\n              <div class=\"telc-ratio-mark\" title=\"100% required\"><\/div>\n              <div class=\"telc-ratio-fill\" id=\"telcRatioFill\"><\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-chart\">\n            <div class=\"telc-chart-title\">Bolt vs thread failure comparison<\/div>\n            <div class=\"telc-bar-row\">\n              <span class=\"telc-bar-k\">Applied load F<\/span>\n              <div class=\"telc-bar-track\"><div class=\"telc-bar-fill telc-bar-load\" id=\"telcBarLoad\"><\/div><\/div>\n              <span class=\"telc-bar-v\" id=\"telcBarLoadVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"telc-bar-row\">\n              <span class=\"telc-bar-k\">Internal thread<\/span>\n              <div class=\"telc-bar-track\"><div class=\"telc-bar-fill telc-bar-thread\" id=\"telcBarThread\"><\/div><\/div>\n              <span class=\"telc-bar-v\" id=\"telcBarThreadVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"telc-bar-row\">\n              <span class=\"telc-bar-k\">External thread<\/span>\n              <div class=\"telc-bar-track\"><div class=\"telc-bar-fill telc-bar-ext\" id=\"telcBarExt\"><\/div><\/div>\n              <span class=\"telc-bar-v\" id=\"telcBarExtVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"telc-bar-row\">\n              <span class=\"telc-bar-k\">Bolt tensile<\/span>\n              <div class=\"telc-bar-track\"><div class=\"telc-bar-fill telc-bar-bolt\" id=\"telcBarBolt\"><\/div><\/div>\n              <span class=\"telc-bar-v\" id=\"telcBarBoltVal\">\u2014<\/span>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-tiles\">\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Required engagement<\/div>\n              <div class=\"telc-v\" id=\"telcOutLeReq\">\u2014<\/div>\n              <div class=\"telc-u\">L<sub>e,req<\/sub> with safety factor<\/div>\n            <\/div>\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Actual engagement<\/div>\n              <div class=\"telc-v\" id=\"telcOutLeAct\">\u2014<\/div>\n              <div class=\"telc-u\">entered L<sub>e<\/sub><\/div>\n            <\/div>\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Recommended engagement<\/div>\n              <div class=\"telc-v\" id=\"telcOutRec\">\u2014<\/div>\n              <div class=\"telc-u\">material rule-of-thumb<\/div>\n            <\/div>\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Thread shear capacity<\/div>\n              <div class=\"telc-v\" id=\"telcOutFtThread\">\u2014<\/div>\n              <div class=\"telc-u\">F<sub>t<\/sub> = A<sub>s<\/sub> \u00d7 \u03c4<\/div>\n            <\/div>\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Bolt tensile capacity<\/div>\n              <div class=\"telc-v\" id=\"telcOutFtBolt\">\u2014<\/div>\n              <div class=\"telc-u\">A<sub>t<\/sub> \u00d7 S<sub>ut<\/sub><\/div>\n            <\/div>\n            <div class=\"telc-tile\">\n              <div class=\"telc-k\">Thread shear area<\/div>\n              <div class=\"telc-v\" id=\"telcOutAs\">\u2014<\/div>\n              <div class=\"telc-u\">A<sub>s<\/sub> = \u03c0 d<sub>p<\/sub> L<sub>e<\/sub> K<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"telc-note\" style=\"margin-top:0.75rem\">\n            <strong>Material compatibility:<\/strong> <span id=\"telcOutCompat\">\u2014<\/span>\n          <\/div>\n\n          <div class=\"telc-alerts\" id=\"telcAlerts\"><\/div>\n        <\/div>\n      <\/section>\n    <\/aside>\n  <\/div>\n\n<textarea id=\"telc-js-b64\" aria-hidden=\"true\" style=\"display:none!important;width:0;height:0;border:0;padding:0;position:absolute;left:-9999px\">KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlbGMtcm9vdCIpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgiZGF0YS10ZWxjLXJlYWR5IikgPT09ICIxIikgcmV0dXJuOwogIHJvb3Quc2V0QXR0cmlidXRlKCJkYXRhLXRlbGMtcmVhZHkiLCAiMSIpOwoKICB2YXIgQVJDX0xFTiA9IDI4Mi43NDM7CiAgdmFyIE1NX1BFUl9JTiA9IDI1LjQ7CiAgdmFyIE1NMl9QRVJfSU4yID0gNjQ1LjE2OwogIHZhciBQU0lfUEVSX01QQSA9IDE0NS4wMzc3Mzc3MzsKICB2YXIgTEJGX1BFUl9OID0gMC4yMjQ4MDg5NDM7CgogIHZhciBTSVpFU19NID0gWwogICAgeyBsYWJlbDogIk02IiwgZDogNiwgcDogMSB9LAogICAgeyBsYWJlbDogIk04IiwgZDogOCwgcDogMS4yNSB9LAogICAgeyBsYWJlbDogIk0xMCIsIGQ6IDEwLCBwOiAxLjUgfSwKICAgIHsgbGFiZWw6ICJNMTIiLCBkOiAxMiwgcDogMS43NSB9LAogICAgeyBsYWJlbDogIk0xNiIsIGQ6IDE2LCBwOiAyIH0sCiAgICB7IGxhYmVsOiAiTTIwIiwgZDogMjAsIHA6IDIuNSB9LAogICAgeyBsYWJlbDogIk0yNCIsIGQ6IDI0LCBwOiAzIH0KICBdOwogIHZhciBTSVpFU19VTkMgPSBbCiAgICB7IGxhYmVsOiAiMS80LTIwIiwgZDogMC4yNSwgdHBpOiAyMCB9LAogICAgeyBsYWJlbDogIjUvMTYtMTgiLCBkOiAwLjMxMjUsIHRwaTogMTggfSwKICAgIHsgbGFiZWw6ICIzLzgtMTYiLCBkOiAwLjM3NSwgdHBpOiAxNiB9LAogICAgeyBsYWJlbDogIjEvMi0xMyIsIGQ6IDAuNSwgdHBpOiAxMyB9LAogICAgeyBsYWJlbDogIjUvOC0xMSIsIGQ6IDAuNjI1LCB0cGk6IDExIH0sCiAgICB7IGxhYmVsOiAiMy80LTEwIiwgZDogMC43NSwgdHBpOiAxMCB9CiAgXTsKICB2YXIgU0laRVNfVU5GID0gWwogICAgeyBsYWJlbDogIjEvNC0yOCIsIGQ6IDAuMjUsIHRwaTogMjggfSwKICAgIHsgbGFiZWw6ICI1LzE2LTI0IiwgZDogMC4zMTI1LCB0cGk6IDI0IH0sCiAgICB7IGxhYmVsOiAiMy84LTI0IiwgZDogMC4zNzUsIHRwaTogMjQgfSwKICAgIHsgbGFiZWw6ICIxLzItMjAiLCBkOiAwLjUsIHRwaTogMjAgfSwKICAgIHsgbGFiZWw6ICI1LzgtMTgiLCBkOiAwLjYyNSwgdHBpOiAxOCB9LAogICAgeyBsYWJlbDogIjMvNC0xNiIsIGQ6IDAuNzUsIHRwaTogMTYgfQogIF07CgogIHZhciBUSFJFQURfSyA9IHsKICAgIG1ldHJpYzogMC41LAogICAgdW5jOiAwLjUsCiAgICB1bmY6IDAuNSwKICAgIHRyYXBlem9pZGFsOiAwLjQ1LAogICAgY3VzdG9tOiAwLjUKICB9OwoKICB2YXIgQk9MVF9NQVQgPSB7CiAgICBjYXJib246IHsgc3V0OiA4MDAsIHN5OiA2NDAsIGxhYmVsOiAiQ2FyYm9uIFN0ZWVsICg4LjgpIiB9LAogICAgc3RhaW5sZXNzOiB7IHN1dDogNzAwLCBzeTogNDUwLCBsYWJlbDogIlN0YWlubGVzcyBTdGVlbCAoQTItNzApIiB9LAogICAgYWxsb3k6IHsgc3V0OiAxMDAwLCBzeTogOTAwLCBsYWJlbDogIkFsbG95IFN0ZWVsICgxMC45KSIgfSwKICAgIGN1c3RvbTogbnVsbAogIH07CgogIHZhciBOVVRfTUFUID0gewogICAgc3RlZWw6IHsgc3k6IDM1MCwgdGF1OiAwLjU3NywgbGFiZWw6ICJTdGVlbCBudXQgLyB0YXBwZWQgaG9sZSIgfSwKICAgIGFsdW1pbnVtOiB7IHN5OiAyNDAsIHRhdTogMC41LCBsYWJlbDogIkFsdW1pbnVtIHRocmVhZCIgfSwKICAgIGNhc3Rpcm9uOiB7IHN5OiAyMDAsIHRhdTogMC41NSwgbGFiZWw6ICJDYXN0IGlyb24gdGhyZWFkIiB9LAogICAgc3RhaW5sZXNzOiB7IHN5OiA0NTAsIHRhdTogMC41NzcsIGxhYmVsOiAiU3RhaW5sZXNzIHN0ZWVsIHRocmVhZCIgfSwKICAgIGN1c3RvbTogbnVsbAogIH07CgogIHZhciBERUZBVUxUUyA9IHsKICAgIHVuaXQ6ICJtZXRyaWMiLAogICAgdGhyZWFkOiAibWV0cmljIiwKICAgIGQ6IDEyLAogICAgcDogMS43NSwKICAgIGRwTWFudWFsOiBmYWxzZSwKICAgIGRwOiAxMC44NjMsCiAgICBsZTogMTIsCiAgICBGOiAzMDAwMCwKICAgIGZVbml0OiAiTiIsCiAgICBib2x0TWF0OiAiYWxsb3kiLAogICAgbnV0TWF0OiAic3RlZWwiLAogICAgc3V0OiAxMDAwLAogICAgdGF1OiAyNjAsCiAgICB0YXVNYW51YWw6IGZhbHNlLAogICAgazogMC41LAogICAga01hbnVhbDogZmFsc2UsCiAgICBuc2Y6IDIsCiAgICBzaXplOiAiTTEyIgogIH07CgogIHZhciBlbCA9IHsKICAgIHRocmVhZDogYnlJZCgidGVsY1RocmVhZCIpLAogICAgZDogYnlJZCgidGVsY0QiKSwKICAgIHA6IGJ5SWQoInRlbGNQIiksCiAgICBkcDogYnlJZCgidGVsY0RwIiksCiAgICBkcE1hbnVhbDogYnlJZCgidGVsY0RwTWFudWFsIiksCiAgICBsZTogYnlJZCgidGVsY0xlIiksCiAgICBGOiBieUlkKCJ0ZWxjRiIpLAogICAgZlVuaXQ6IGJ5SWQoInRlbGNGVW5pdCIpLAogICAgYm9sdE1hdDogYnlJZCgidGVsY0JvbHRNYXQiKSwKICAgIG51dE1hdDogYnlJZCgidGVsY051dE1hdCIpLAogICAgc3V0OiBieUlkKCJ0ZWxjU3V0IiksCiAgICB0YXU6IGJ5SWQoInRlbGNUYXUiKSwKICAgIHRhdU1hbnVhbDogYnlJZCgidGVsY1RhdU1hbnVhbCIpLAogICAgazogYnlJZCgidGVsY0siKSwKICAgIGtNYW51YWw6IGJ5SWQoInRlbGNLTWFudWFsIiksCiAgICBuc2Y6IGJ5SWQoInRlbGNOc2YiKSwKICAgIGJ0bk1ldHJpYzogYnlJZCgidGVsY0J0bk1ldHJpYyIpLAogICAgYnRuSW1wZXJpYWw6IGJ5SWQoInRlbGNCdG5JbXBlcmlhbCIpLAogICAgYnRuUmVzZXQ6IGJ5SWQoInRlbGNCdG5SZXNldCIpLAogICAgYnRuQ2FsYzogYnlJZCgidGVsY0J0bkNhbGN1bGF0ZSIpLAogICAgcmVzdWx0czogYnlJZCgidGVsY1Jlc3VsdHMiKSwKICAgIHNpemVDaGlwczogYnlJZCgidGVsY1NpemVDaGlwcyIpLAogICAgYmFubmVyOiBieUlkKCJ0ZWxjQmFubmVyIiksCiAgICBzdGF0dXNUaXRsZTogYnlJZCgidGVsY1N0YXR1c1RpdGxlIiksCiAgICBzdGF0dXNOb3RlOiBieUlkKCJ0ZWxjU3RhdHVzTm90ZSIpLAogICAgb3V0TGVSZXE6IGJ5SWQoInRlbGNPdXRMZVJlcSIpLAogICAgb3V0TGVBY3Q6IGJ5SWQoInRlbGNPdXRMZUFjdCIpLAogICAgb3V0UmF0aW86IGJ5SWQoInRlbGNPdXRSYXRpbyIpLAogICAgb3V0RnRUaHJlYWQ6IGJ5SWQoInRlbGNPdXRGdFRocmVhZCIpLAogICAgb3V0RnRCb2x0OiBieUlkKCJ0ZWxjT3V0RnRCb2x0IiksCiAgICBvdXRSaXNrOiBieUlkKCJ0ZWxjT3V0UmlzayIpLAogICAgb3V0SW1wcm92ZTogYnlJZCgidGVsY091dEltcHJvdmUiKSwKICAgIG91dEFzOiBieUlkKCJ0ZWxjT3V0QXMiKSwKICAgIG91dFJlYzogYnlJZCgidGVsY091dFJlYyIpLAogICAgb3V0Q29tcGF0OiBieUlkKCJ0ZWxjT3V0Q29tcGF0IiksCiAgICByYXRpb0ZpbGw6IGJ5SWQoInRlbGNSYXRpb0ZpbGwiKSwKICAgIGdhdWdlQXJjOiBieUlkKCJ0ZWxjR2F1Z2VBcmMiKSwKICAgIG5lZWRsZTogYnlJZCgidGVsY05lZWRsZSIpLAogICAgZ2F1Z2VSZWFkOiBieUlkKCJ0ZWxjR2F1Z2VSZWFkIiksCiAgICBzY2hlbWF0aWM6IGJ5SWQoInRlbGNTY2hlbWF0aWMiKSwKICAgIGVuZ0FjdHVhbDogYnlJZCgidGVsY0VuZ0FjdHVhbCIpLAogICAgZW5nUmVxdWlyZWQ6IGJ5SWQoInRlbGNFbmdSZXF1aXJlZCIpLAogICAgZW5nUmVjOiBieUlkKCJ0ZWxjRW5nUmVjIiksCiAgICBiYXJUaHJlYWQ6IGJ5SWQoInRlbGNCYXJUaHJlYWQiKSwKICAgIGJhckV4dDogYnlJZCgidGVsY0JhckV4dCIpLAogICAgYmFyQm9sdDogYnlJZCgidGVsY0JhckJvbHQiKSwKICAgIGJhckxvYWQ6IGJ5SWQoInRlbGNCYXJMb2FkIiksCiAgICBiYXJUaHJlYWRWYWw6IGJ5SWQoInRlbGNCYXJUaHJlYWRWYWwiKSwKICAgIGJhckV4dFZhbDogYnlJZCgidGVsY0JhckV4dFZhbCIpLAogICAgYmFyQm9sdFZhbDogYnlJZCgidGVsY0JhckJvbHRWYWwiKSwKICAgIGJhckxvYWRWYWw6IGJ5SWQoInRlbGNCYXJMb2FkVmFsIiksCiAgICBhbGVydHM6IGJ5SWQoInRlbGNBbGVydHMiKQogIH07CgogIHZhciBzdGF0ZSA9IHsKICAgIHVuaXQ6ICJtZXRyaWMiLAogICAgc2l6ZUlkOiAiTTEyIiwKICAgIGFwcGx5aW5nOiBmYWxzZSwKICAgIGxpdmU6IGZhbHNlCiAgfTsKICB2YXIgbGFzdEZVbml0ID0gZWwuZlVuaXQgPyBlbC5mVW5pdC52YWx1ZSA6ICJOIjsKCiAgZnVuY3Rpb24gYnlJZChpZCkgeyByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCIjIiArIGlkKTsgfQoKICBmdW5jdGlvbiBudW0obm9kZSkgewogICAgaWYgKCFub2RlKSByZXR1cm4gTmFOOwogICAgdmFyIHYgPSBwYXJzZUZsb2F0KFN0cmluZyhub2RlLnZhbHVlKS5yZXBsYWNlKCIsIiwgIi4iKSk7CiAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogTmFOOwogIH0KCiAgZnVuY3Rpb24gY2xhbXAodiwgYSwgYikgeyByZXR1cm4gTWF0aC5tYXgoYSwgTWF0aC5taW4oYiwgdikpOyB9CgogIGZ1bmN0aW9uIHJvdW5kU21hcnQodikgewogICAgaWYgKCFpc0Zpbml0ZSh2KSkgcmV0dXJuICIiOwogICAgdmFyIGEgPSBNYXRoLmFicyh2KTsKICAgIHZhciBkID0gYSA+PSAxMDAgPyAyIDogYSA+PSAxMCA\/IDMgOiBhID49IDEgPyA0IDogNTsKICAgIHJldHVybiBTdHJpbmcoTnVtYmVyKHYudG9GaXhlZChkKSkpOwogIH0KCiAgZnVuY3Rpb24gZm10KHYsIGQpIHsKICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiAiLSI7CiAgICByZXR1cm4gdi50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogZCwgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwIH0pOwogIH0KCiAgZnVuY3Rpb24gc2V0RXJyKGtleSwgbXNnKSB7CiAgICB2YXIgbm9kZSA9IGJ5SWQoInRlbGNFcnIiICsga2V5KTsKICAgIHZhciBtYXAgPSB7CiAgICAgIEQ6IGVsLmQsIFA6IGVsLnAsIERwOiBlbC5kcCwgTGU6IGVsLmxlLCBGOiBlbC5GLAogICAgICBTdXQ6IGVsLnN1dCwgVGF1OiBlbC50YXUsIEs6IGVsLmssIE5zZjogZWwubnNmCiAgICB9OwogICAgdmFyIGlucHV0ID0gbWFwW2tleV07CiAgICBpZiAobm9kZSkgbm9kZS50ZXh0Q29udGVudCA9IG1zZyB8fCAiIjsKICAgIGlmIChpbnB1dCkgewogICAgICBpZiAobXNnKSBpbnB1dC5jbGFzc0xpc3QuYWRkKCJ0ZWxjLWludmFsaWQiKTsKICAgICAgZWxzZSBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZWxjLWludmFsaWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsZWFyRXJycygpIHsKICAgIFsiRCIsICJQIiwgIkRwIiwgIkxlIiwgIkYiLCAiU3V0IiwgIlRhdSIsICJLIiwgIk5zZiJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgc2V0RXJyKGssICIiKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlVW5pdExhYmVscygpIHsKICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsKICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0nZCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIm1tIiA6ICJpbiI7CiAgICB9KTsKICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0ncCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIm1tIiA6ICJUUEkiOwogICAgfSk7CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXVuaXQ9J2wnXSIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA\/ICJtbSIgOiAiaW4iOwogICAgfSk7CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXVuaXQ9J3MnXSIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA\/ICJNUGEiIDogInBzaSI7CiAgICB9KTsKICAgIGlmIChlbC5idG5NZXRyaWMpIGVsLmJ0bk1ldHJpYy5jbGFzc0xpc3QudG9nZ2xlKCJ0ZWxjLWlzLWFjdGl2ZSIsIG1ldHJpYyk7CiAgICBpZiAoZWwuYnRuSW1wZXJpYWwpIGVsLmJ0bkltcGVyaWFsLmNsYXNzTGlzdC50b2dnbGUoInRlbGMtaXMtYWN0aXZlIiwgIW1ldHJpYyk7CiAgfQoKICBmdW5jdGlvbiBwaXRjaERpYW1ldGVyKGREaXNwLCBwRGlzcCwgdW5pdCkgewogICAgaWYgKCEoZERpc3AgPiAwKSB8fCAhKHBEaXNwID4gMCkpIHJldHVybiBOYU47CiAgICB2YXIgcExlbiA9IHVuaXQgPT09ICJtZXRyaWMiID8gcERpc3AgOiBNTV9QRVJfSU4gLyBwRGlzcDsKICAgIHZhciBkTW0gPSB1bml0ID09PSAibWV0cmljIiA\/IGREaXNwIDogZERpc3AgKiBNTV9QRVJfSU47CiAgICB2YXIgZHBNbSA9IGRNbSAtIDAuNjQ5NTE5MSAqIHBMZW47CiAgICBpZiAoIShkcE1tID4gMCkpIHJldHVybiBOYU47CiAgICByZXR1cm4gdW5pdCA9PT0gIm1ldHJpYyIgPyBkcE1tIDogZHBNbSAvIE1NX1BFUl9JTjsKICB9CgogIGZ1bmN0aW9uIHRlbnNpbGVBcmVhKGREaXNwLCBwRGlzcCwgdW5pdCkgewogICAgaWYgKCEoZERpc3AgPiAwKSB8fCAhKHBEaXNwID4gMCkpIHJldHVybiBOYU47CiAgICB2YXIgY29yZSA9IHVuaXQgPT09ICJtZXRyaWMiID8gZERpc3AgLSAwLjkzODIgKiBwRGlzcCA6IGREaXNwIC0gMC45NzQzIC8gcERpc3A7CiAgICBpZiAoIShjb3JlID4gMCkpIHJldHVybiBOYU47CiAgICB2YXIgYXJlYSA9IE1hdGguUEkgLyA0ICogY29yZSAqIGNvcmU7CiAgICByZXR1cm4gdW5pdCA9PT0gIm1ldHJpYyIgPyBhcmVhIDogYXJlYSAqIE1NMl9QRVJfSU4yOwogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaERwKCkgewogICAgaWYgKGVsLmRwTWFudWFsLmNoZWNrZWQpIHJldHVybjsKICAgIHZhciBkcCA9IHBpdGNoRGlhbWV0ZXIobnVtKGVsLmQpLCBudW0oZWwucCksIHN0YXRlLnVuaXQpOwogICAgaWYgKGlzRmluaXRlKGRwKSkgZWwuZHAudmFsdWUgPSBkcCA+PSAxMCA\/IGRwLnRvRml4ZWQoMykgOiBkcC50b0ZpeGVkKDQpOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlUaHJlYWRUeXBlKCkgewogICAgdmFyIHQgPSBlbC50aHJlYWQudmFsdWU7CiAgICBpZiAoZWwua01hbnVhbC5jaGVja2VkKSByZXR1cm47CiAgICBzdGF0ZS5hcHBseWluZyA9IHRydWU7CiAgICBlbC5rLnZhbHVlID0gU3RyaW5nKFRIUkVBRF9LW3RdICE9IG51bGwgPyBUSFJFQURfS1t0XSA6IDAuNSk7CiAgICBzdGF0ZS5hcHBseWluZyA9IGZhbHNlOwogICAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgICBpZiAoIWVsLmRwTWFudWFsLmNoZWNrZWQpIHJlZnJlc2hEcCgpOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlCb2x0TWF0KCkgewogICAgdmFyIG0gPSBCT0xUX01BVFtlbC5ib2x0TWF0LnZhbHVlXTsKICAgIGlmICghbSkgewogICAgICBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOwogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOwogICAgZWwuc3V0LnZhbHVlID0gbWV0cmljID8gU3RyaW5nKG0uc3V0KSA6IHJvdW5kU21hcnQobS5zdXQgKiBQU0lfUEVSX01QQSk7CiAgICBlbC5zdXQucmVhZE9ubHkgPSB0cnVlOwogICAgc3RhdGUuYXBwbHlpbmcgPSBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5TnV0TWF0KCkgewogICAgaWYgKGVsLnRhdU1hbnVhbC5jaGVja2VkKSByZXR1cm47CiAgICB2YXIgbSA9IE5VVF9NQVRbZWwubnV0TWF0LnZhbHVlXTsKICAgIGlmICghbSkgewogICAgICBlbC50YXUucmVhZE9ubHkgPSBmYWxzZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOwogICAgdmFyIHRhdU1QYSA9IG0uc3kgKiBtLnRhdTsKICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsKICAgIGVsLnRhdS52YWx1ZSA9IG1ldHJpYyA\/IFN0cmluZyhNYXRoLnJvdW5kKHRhdU1QYSkpIDogcm91bmRTbWFydCh0YXVNUGEgKiBQU0lfUEVSX01QQSk7CiAgICBlbC50YXUucmVhZE9ubHkgPSB0cnVlOwogICAgc3RhdGUuYXBwbHlpbmcgPSBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIG1hcmtDdXN0b21Cb2x0KCkgewogICAgaWYgKHN0YXRlLmFwcGx5aW5nKSByZXR1cm47CiAgICBpZiAoZWwuYm9sdE1hdC52YWx1ZSAhPT0gImN1c3RvbSIpIGVsLmJvbHRNYXQudmFsdWUgPSAiY3VzdG9tIjsKICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbWFya0N1c3RvbU51dCgpIHsKICAgIGlmIChzdGF0ZS5hcHBseWluZykgcmV0dXJuOwogICAgaWYgKGVsLm51dE1hdC52YWx1ZSAhPT0gImN1c3RvbSIpIGVsLm51dE1hdC52YWx1ZSA9ICJjdXN0b20iOwogICAgZWwudGF1LnJlYWRPbmx5ID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBzaXplTGlzdEZvclRocmVhZCgpIHsKICAgIHZhciB0ID0gZWwudGhyZWFkLnZhbHVlOwogICAgaWYgKHQgPT09ICJ1bmMiKSByZXR1cm4gU0laRVNfVU5DOwogICAgaWYgKHQgPT09ICJ1bmYiKSByZXR1cm4gU0laRVNfVU5GOwogICAgcmV0dXJuIFNJWkVTX007CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTaXplQ2hpcHMoKSB7CiAgICBpZiAoIWVsLnNpemVDaGlwcykgcmV0dXJuOwogICAgdmFyIGxpc3QgPSBzaXplTGlzdEZvclRocmVhZCgpOwogICAgdmFyIHNob3cgPSBlbC50aHJlYWQudmFsdWUgIT09ICJ0cmFwZXpvaWRhbCIgJiYgZWwudGhyZWFkLnZhbHVlICE9PSAiY3VzdG9tIjsKICAgIGVsLnNpemVDaGlwcy5zdHlsZS5kaXNwbGF5ID0gc2hvdyA\/ICIiIDogIm5vbmUiOwogICAgaWYgKCFzaG93KSByZXR1cm47CiAgICBlbC5zaXplQ2hpcHMuaW5uZXJIVE1MID0gIiI7CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgdmFyIGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4uY2xhc3NOYW1lID0gInRlbGMtY2hpcCIgKyAoc3RhdGUuc2l6ZUlkID09PSBzLmxhYmVsID8gIiB0ZWxjLWlzLWFjdGl2ZSIgOiAiIik7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IHMubGFiZWw7CiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzdGF0ZS5zaXplSWQgPSBzLmxhYmVsOwogICAgICAgIGVsLmQudmFsdWUgPSBTdHJpbmcocy5kKTsKICAgICAgICBlbC5wLnZhbHVlID0gU3RyaW5nKHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gcy5wIDogcy50cGkpOwogICAgICAgIGlmICghZWwuZHBNYW51YWwuY2hlY2tlZCkgcmVmcmVzaERwKCk7CiAgICAgICAgcGFpbnRDaGlwcygpOwogICAgICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogICAgICB9KTsKICAgICAgZWwuc2l6ZUNoaXBzLmFwcGVuZENoaWxkKGJ0bik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHBhaW50Q2hpcHMoKSB7CiAgICBpZiAoIWVsLnNpemVDaGlwcykgcmV0dXJuOwogICAgZWwuc2l6ZUNoaXBzLnF1ZXJ5U2VsZWN0b3JBbGwoIi50ZWxjLWNoaXAiKS5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHsKICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoInRlbGMtaXMtYWN0aXZlIiwgYnRuLnRleHRDb250ZW50ID09PSBzdGF0ZS5zaXplSWQpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBmb3JjZVRvTigpIHsKICAgIHZhciB2ID0gbnVtKGVsLkYpOwogICAgaWYgKCFpc0Zpbml0ZSh2KSkgcmV0dXJuIE5hTjsKICAgIHZhciB1ID0gZWwuZlVuaXQudmFsdWU7CiAgICBpZiAodSA9PT0gImtOIikgcmV0dXJuIHYgKiAxMDAwOwogICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gdiAvIExCRl9QRVJfTjsKICAgIHJldHVybiB2OwogIH0KCiAgZnVuY3Rpb24gY29udmVydEZvcmNlVW5pdFZhbHVlKHZhbHVlLCBmcm9tVSwgdG9VKSB7CiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlOwogICAgdmFyIG4gPSB2YWx1ZTsKICAgIGlmIChmcm9tVSA9PT0gImtOIikgbiAqPSAxMDAwOwogICAgaWYgKGZyb21VID09PSAibGJmIikgbiAvPSBMQkZfUEVSX047CiAgICBpZiAodG9VID09PSAia04iKSByZXR1cm4gbiAvIDEwMDA7CiAgICBpZiAodG9VID09PSAibGJmIikgcmV0dXJuIG4gKiBMQkZfUEVSX047CiAgICByZXR1cm4gbjsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEZvcmNlKE4pIHsKICAgIGlmICghaXNGaW5pdGUoTikpIHJldHVybiB7IHByaW1hcnk6ICItIiwgc2Vjb25kYXJ5OiAiIiB9OwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBwcmltYXJ5OiBmbXQoTiAqIExCRl9QRVJfTiwgMSkgKyAiIGxiZiIsCiAgICAgICAgc2Vjb25kYXJ5OiBmbXQoTiAvIDEwMDAsIDIpICsgIiBrTiAgLyAgIiArIGZtdChOLCAwKSArICIgTiIKICAgICAgfTsKICAgIH0KICAgIGlmIChNYXRoLmFicyhOKSA+PSAxMDAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcHJpbWFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04iLAogICAgICAgIHNlY29uZGFyeTogZm10KE4sIDApICsgIiBOICAvICAiICsgZm10KE4gKiBMQkZfUEVSX04sIDEpICsgIiBsYmYiCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTiwgMSkgKyAiIE4iLCBzZWNvbmRhcnk6IGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIiB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0TGVuZ3RoKG1tKSB7CiAgICBpZiAoIWlzRmluaXRlKG1tKSkgcmV0dXJuICItIjsKICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSByZXR1cm4gZm10KG1tIC8gTU1fUEVSX0lOLCAzKSArICIgaW4iOwogICAgcmV0dXJuIGZtdChtbSwgMikgKyAiIG1tIjsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFN0cmVzcyhNUGEpIHsKICAgIGlmICghaXNGaW5pdGUoTVBhKSkgcmV0dXJuIHsgcHJpbWFyeTogIi0iLCBzZWNvbmRhcnk6ICIiIH07CiAgICBpZiAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIikgewogICAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiLCBzZWNvbmRhcnk6IGZtdChNUGEsIDEpICsgIiBNUGEiIH07CiAgICB9CiAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiwgc2Vjb25kYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiIH07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRBcmVhKG1tMikgewogICAgaWYgKCFpc0Zpbml0ZShtbTIpKSByZXR1cm4gIi0iOwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHJldHVybiBmbXQobW0yIC8gTU0yX1BFUl9JTjIsIDQpICsgIiBpblx1MDBiMiI7CiAgICByZXR1cm4gZm10KG1tMiwgMikgKyAiIG1tXHUwMGIyIjsKICB9CgogIGZ1bmN0aW9uIGNvbXBhdE5vdGUoYm9sdEtleSwgbnV0S2V5KSB7CiAgICBpZiAoYm9sdEtleSA9PT0gInN0YWlubGVzcyIgJiYgbnV0S2V5ID09PSAic3RhaW5sZXNzIikgewogICAgICByZXR1cm4gIlN0YWlubGVzcyBzdGVlbCBjb25uZWN0aW9uOiBnYWxsaW5nIHJpc2sgbWF5IHJlcXVpcmUgbHVicmljYXRpb247IGVuZ2FnZW1lbnQgXHUyMjY1IDEuMFx1MDBkNyBib2x0IGRpYW1ldGVyIGlzIHR5cGljYWwuIjsKICAgIH0KICAgIGlmIChudXRLZXkgPT09ICJhbHVtaW51bSIpIHsKICAgICAgcmV0dXJuICJTdGVlbCBib2x0IGluIGFsdW1pbnVtIHRocmVhZDogdXNlIDEuNVx1MjAxMzIuMFx1MDBkNyBib2x0IGRpYW1ldGVyIGVuZ2FnZW1lbnQ7IHZlcmlmeSB0aHJlYWQgc2hlYXIgaW4gdGhlIHNvZnRlciBtYXRlcmlhbC4iOwogICAgfQogICAgaWYgKG51dEtleSA9PT0gImNhc3Rpcm9uIikgewogICAgICByZXR1cm4gIkNhc3QgaXJvbiB0aHJlYWRzIGFyZSBicml0dGxlOyBhdm9pZCBvdmVyLXRvcnF1ZSBhbmQgY29uc2lkZXIgaGVsaWNhbCBpbnNlcnRzIGZvciByZXBlYXRlZCBhc3NlbWJseS4iOwogICAgfQogICAgcmV0dXJuICJTdGVlbCBib2x0ICsgc3RlZWwgbnV0OiBzdGFuZGFyZCBydWxlLW9mLXRodW1iIGlzIFx1MjI2NSAxLjBcdTAwZDcgbm9taW5hbCBib2x0IGRpYW1ldGVyIGVuZ2FnZW1lbnQgZm9yIHN0YXRpYyBheGlhbCBsb2Fkcy4iOwogIH0KCiAgZnVuY3Rpb24gcmVjb21tZW5kZWRFbmdhZ2VtZW50KGRNbSwgbnV0S2V5KSB7CiAgICBpZiAobnV0S2V5ID09PSAiYWx1bWludW0iKSByZXR1cm4gMS43NSAqIGRNbTsKICAgIGlmIChudXRLZXkgPT09ICJjYXN0aXJvbiIpIHJldHVybiAxLjI1ICogZE1tOwogICAgcmV0dXJuIDEuMCAqIGRNbTsKICB9CgogIGZ1bmN0aW9uIHN3aXRjaFVuaXQobmV4dCkgewogICAgaWYgKG5leHQgPT09IHN0YXRlLnVuaXQpIHJldHVybjsKICAgIHZhciBkID0gbnVtKGVsLmQpOwogICAgdmFyIHAgPSBudW0oZWwucCk7CiAgICB2YXIgZHAgPSBudW0oZWwuZHApOwogICAgdmFyIGxlID0gbnVtKGVsLmxlKTsKICAgIHZhciBzdXQgPSBudW0oZWwuc3V0KTsKICAgIHZhciB0YXUgPSBudW0oZWwudGF1KTsKICAgIHZhciBGID0gbnVtKGVsLkYpOwogICAgdmFyIGZyb21GVSA9IGVsLmZVbml0LnZhbHVlOwogICAgdmFyIHRvRlUgPSBuZXh0ID09PSAiaW1wZXJpYWwiID8gImxiZiIgOiAiTiI7CgogICAgaWYgKG5leHQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC5kLnZhbHVlID0gcm91bmRTbWFydChkIC8gTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKHApICYmIHAgPiAwKSBlbC5wLnZhbHVlID0gcm91bmRTbWFydChNTV9QRVJfSU4gLyBwKTsKICAgICAgaWYgKGlzRmluaXRlKGRwKSkgZWwuZHAudmFsdWUgPSByb3VuZFNtYXJ0KGRwIC8gTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKGxlKSkgZWwubGUudmFsdWUgPSByb3VuZFNtYXJ0KGxlIC8gTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKHN1dCkpIGVsLnN1dC52YWx1ZSA9IHJvdW5kU21hcnQoc3V0ICogUFNJX1BFUl9NUEEpOwogICAgICBpZiAoaXNGaW5pdGUodGF1KSkgZWwudGF1LnZhbHVlID0gcm91bmRTbWFydCh0YXUgKiBQU0lfUEVSX01QQSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoaXNGaW5pdGUoZCkpIGVsLmQudmFsdWUgPSByb3VuZFNtYXJ0KGQgKiBNTV9QRVJfSU4pOwogICAgICBpZiAoaXNGaW5pdGUocCkgJiYgcCA+IDApIGVsLnAudmFsdWUgPSByb3VuZFNtYXJ0KE1NX1BFUl9JTiAvIHApOwogICAgICBpZiAoaXNGaW5pdGUoZHApKSBlbC5kcC52YWx1ZSA9IHJvdW5kU21hcnQoZHAgKiBNTV9QRVJfSU4pOwogICAgICBpZiAoaXNGaW5pdGUobGUpKSBlbC5sZS52YWx1ZSA9IHJvdW5kU21hcnQobGUgKiBNTV9QRVJfSU4pOwogICAgICBpZiAoaXNGaW5pdGUoc3V0KSkgZWwuc3V0LnZhbHVlID0gcm91bmRTbWFydChzdXQgLyBQU0lfUEVSX01QQSk7CiAgICAgIGlmIChpc0Zpbml0ZSh0YXUpKSBlbC50YXUudmFsdWUgPSByb3VuZFNtYXJ0KHRhdSAvIFBTSV9QRVJfTVBBKTsKICAgIH0KCiAgICBlbC5mVW5pdC52YWx1ZSA9IHRvRlU7CiAgICBsYXN0RlVuaXQgPSB0b0ZVOwogICAgaWYgKGlzRmluaXRlKEYpKSBlbC5GLnZhbHVlID0gcm91bmRTbWFydChjb252ZXJ0Rm9yY2VVbml0VmFsdWUoRiwgZnJvbUZVLCB0b0ZVKSk7CiAgICBzdGF0ZS5zaXplSWQgPSAiIjsKICAgIHN0YXRlLnVuaXQgPSBuZXh0OwogICAgdXBkYXRlVW5pdExhYmVscygpOwogICAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgICBpZiAoIWVsLmRwTWFudWFsLmNoZWNrZWQpIHJlZnJlc2hEcCgpOwogICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgfQoKICBmdW5jdGlvbiB0b1NJKCkgewogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOwogICAgdmFyIGQgPSBudW0oZWwuZCk7CiAgICB2YXIgcCA9IG51bShlbC5wKTsKICAgIHZhciBkcCA9IG51bShlbC5kcCk7CiAgICB2YXIgbGUgPSBudW0oZWwubGUpOwogICAgdmFyIHN1dCA9IG51bShlbC5zdXQpOwogICAgdmFyIHRhdSA9IG51bShlbC50YXUpOwogICAgdmFyIGsgPSBudW0oZWwuayk7CiAgICByZXR1cm4gewogICAgICBkX21tOiBtZXRyaWMgPyBkIDogZCAqIE1NX1BFUl9JTiwKICAgICAgcF9tbTogbWV0cmljID8gcCA6IChwID4gMCA\/IE1NX1BFUl9JTiAvIHAgOiBOYU4pLAogICAgICBkcF9tbTogbWV0cmljID8gZHAgOiBkcCAqIE1NX1BFUl9JTiwKICAgICAgbGVfbW06IG1ldHJpYyA\/IGxlIDogbGUgKiBNTV9QRVJfSU4sCiAgICAgIHN1dF9NUGE6IG1ldHJpYyA\/IHN1dCA6IHN1dCAvIFBTSV9QRVJfTVBBLAogICAgICB0YXVfTVBhOiBtZXRyaWMgPyB0YXUgOiB0YXUgLyBQU0lfUEVSX01QQSwKICAgICAgazogaywKICAgICAgRl9OOiBmb3JjZVRvTigpLAogICAgICBuc2Y6IG51bShlbC5uc2YpLAogICAgICB0aHJlYWQ6IGVsLnRocmVhZC52YWx1ZSwKICAgICAgYm9sdE1hdDogZWwuYm9sdE1hdC52YWx1ZSwKICAgICAgbnV0TWF0OiBlbC5udXRNYXQudmFsdWUKICAgIH07CiAgfQoKICBmdW5jdGlvbiBlbXB0eShub2RlKSB7CiAgICByZXR1cm4gIW5vZGUgfHwgU3RyaW5nKG5vZGUudmFsdWUpLnRyaW0oKSA9PT0gIiI7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZShzaSkgewogICAgdmFyIG9rID0gdHJ1ZTsKICAgIGNsZWFyRXJycygpOwoKICAgIGlmIChlbXB0eShlbC5kKSB8fCAhaXNGaW5pdGUobnVtKGVsLmQpKSkgewogICAgICBzZXRFcnIoIkQiLCAiRW50ZXIgbm9taW5hbCB0aHJlYWQgZGlhbWV0ZXIuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCEoc2kuZF9tbSA+IDApKSB7CiAgICAgIHNldEVycigiRCIsICJEaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaS5kX21tIDwgMS41IHx8IHNpLmRfbW0gPiAxNTApIHsKICAgICAgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIGxvb2tzIHVucmVhbGlzdGljICh0eXBpY2FsIDJcdTIwMTMxNTAgbW0pLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfQoKICAgIGlmIChlbXB0eShlbC5wKSB8fCAhaXNGaW5pdGUobnVtKGVsLnApKSkgewogICAgICBzZXRFcnIoIlAiLCBzdGF0ZS51bml0ID09PSAibWV0cmljIiA\/ICJFbnRlciB0aHJlYWQgcGl0Y2guIiA6ICJFbnRlciB0aHJlYWRzIHBlciBpbmNoIChUUEkpLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmICghKG51bShlbC5wKSA+IDApKSB7CiAgICAgIHNldEVycigiUCIsIHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gIlBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiA6ICJUUEkgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwuZHApIHx8ICFpc0Zpbml0ZShudW0oZWwuZHApKSkgewogICAgICBzZXRFcnIoIkRwIiwgIkVudGVyIHBpdGNoIGRpYW1ldGVyIG9yIHVuY2hlY2sgbWFudWFsIGlucHV0IHRvIGF1dG8tY2FsY3VsYXRlLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmICghKHNpLmRwX21tID4gMCkpIHsKICAgICAgc2V0RXJyKCJEcCIsICJQaXRjaCBkaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaS5kcF9tbSA+PSBzaS5kX21tKSB7CiAgICAgIHNldEVycigiRHAiLCAiUGl0Y2ggZGlhbWV0ZXIgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbm9taW5hbCBkaWFtZXRlci4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwubGUpIHx8ICFpc0Zpbml0ZShudW0oZWwubGUpKSkgewogICAgICBzZXRFcnIoIkxlIiwgIkVudGVyIGFjdHVhbCB0aHJlYWQgZW5nYWdlbWVudCBsZW5ndGguIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCEoc2kubGVfbW0gPiAwKSkgewogICAgICBzZXRFcnIoIkxlIiwgIkVuZ2FnZW1lbnQgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgaWYgKGVtcHR5KGVsLkYpIHx8ICFpc0Zpbml0ZShudW0oZWwuRikpKSB7CiAgICAgIHNldEVycigiRiIsICJFbnRlciBhcHBsaWVkIHRlbnNpbGUgbG9hZC4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIShzaS5GX04gPiAwKSkgewogICAgICBzZXRFcnIoIkYiLCAiQXBwbGllZCBsb2FkIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgaWYgKGVtcHR5KGVsLnN1dCkgfHwgIWlzRmluaXRlKG51bShlbC5zdXQpKSkgewogICAgICBzZXRFcnIoIlN1dCIsICJFbnRlciBib2x0IHRlbnNpbGUgc3RyZW5ndGguIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCEoc2kuc3V0X01QYSA+IDApKSB7CiAgICAgIHNldEVycigiU3V0IiwgIkJvbHQgdGVuc2lsZSBzdHJlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfQoKICAgIGlmIChlbXB0eShlbC50YXUpIHx8ICFpc0Zpbml0ZShudW0oZWwudGF1KSkpIHsKICAgICAgc2V0RXJyKCJUYXUiLCAiRW50ZXIgYWxsb3dhYmxlIHRocmVhZCBzaGVhciBzdHJlc3MuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCEoc2kudGF1X01QYSA+IDApKSB7CiAgICAgIHNldEVycigiVGF1IiwgIlRocmVhZCBzaGVhciBzdHJlc3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwuaykgfHwgIWlzRmluaXRlKG51bShlbC5rKSkpIHsKICAgICAgc2V0RXJyKCJLIiwgIkVudGVyIHRocmVhZCBnZW9tZXRyeSBmYWN0b3IgSy4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIShzaS5rID4gMCkgfHwgc2kuayA+IDEpIHsKICAgICAgc2V0RXJyKCJLIiwgIksgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMSAodHlwaWNhbGx5IDAuNDVcdTIwMTMwLjU4KS4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwubnNmKSB8fCAhaXNGaW5pdGUobnVtKGVsLm5zZikpKSB7CiAgICAgIHNldEVycigiTnNmIiwgIkVudGVyIGRlc2lnbiBzYWZldHkgZmFjdG9yLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmICghKHNpLm5zZiA+IDApKSB7CiAgICAgIHNldEVycigiTnNmIiwgIlNhZmV0eSBmYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2kubnNmIDwgMSB8fCBzaS5uc2YgPiAxMikgewogICAgICBzZXRFcnIoIk5zZiIsICJFbnRlciBhIHNhZmV0eSBmYWN0b3IgYmV0d2VlbiAxIGFuZCAxMi4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gb2s7CiAgfQoKICBmdW5jdGlvbiBzZXRHYXVnZShyYXRpb1BjdCkgewogICAgdmFyIGZyYWMgPSBjbGFtcCgoaXNGaW5pdGUocmF0aW9QY3QpID8gcmF0aW9QY3QgOiAwKSAvIDE1MCwgMCwgMSk7CiAgICBpZiAoZWwuZ2F1Z2VBcmMpIGVsLmdhdWdlQXJjLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hvZmZzZXQiLCBTdHJpbmcoQVJDX0xFTiAqICgxIC0gZnJhYykpKTsKICAgIHZhciBhbmcgPSAtOTAgKyBmcmFjICogMTgwOwogICAgaWYgKGVsLm5lZWRsZSkgZWwubmVlZGxlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgInJvdGF0ZSgiICsgYW5nICsgIiAxMjAgMTE4KSIpOwogIH0KCiAgZnVuY3Rpb24gc2V0U2NoZW1hdGljKHN0YXR1cywgbGVBY3QsIGxlUmVxLCBsZVJlYykgewogICAgaWYgKCFlbC5zY2hlbWF0aWMpIHJldHVybjsKICAgIGVsLnNjaGVtYXRpYy5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdHVzIiwgc3RhdHVzIHx8ICJpZGxlIik7CiAgICB2YXIgbWF4TGUgPSBNYXRoLm1heChsZUFjdCwgbGVSZXEsIGxlUmVjLCAxKTsKICAgIHZhciBudXRIID0gOTA7CiAgICB2YXIgc2NhbGUgPSBudXRIIC8gbWF4TGU7CiAgICB2YXIgYWN0SCA9IGNsYW1wKGxlQWN0ICogc2NhbGUsIDgsIG51dEgpOwogICAgdmFyIHJlcUggPSBjbGFtcChsZVJlcSAqIHNjYWxlLCA2LCBudXRIKTsKICAgIHZhciByZWNIID0gY2xhbXAobGVSZWMgKiBzY2FsZSwgNiwgbnV0SCk7CiAgICBpZiAoZWwuZW5nQWN0dWFsKSBlbC5lbmdBY3R1YWwuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBTdHJpbmcoYWN0SCkpOwogICAgaWYgKGVsLmVuZ1JlcXVpcmVkKSB7CiAgICAgIGVsLmVuZ1JlcXVpcmVkLnNldEF0dHJpYnV0ZSgieSIsIFN0cmluZygxMzAgLSByZXFIKSk7CiAgICAgIGVsLmVuZ1JlcXVpcmVkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgU3RyaW5nKHJlcUgpKTsKICAgIH0KICAgIGlmIChlbC5lbmdSZWMpIHsKICAgICAgZWwuZW5nUmVjLnNldEF0dHJpYnV0ZSgieSIsIFN0cmluZygxMzAgLSByZWNIKSk7CiAgICAgIGVsLmVuZ1JlYy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIFN0cmluZyhyZWNIKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRCYXIobm9kZSwgcGN0KSB7CiAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgIG5vZGUuc3R5bGUud2lkdGggPSBjbGFtcChwY3QsIDAsIDEwMCkgKyAiJSI7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGUoc2Nyb2xsKSB7CiAgICBpZiAoIWVsLmRwTWFudWFsLmNoZWNrZWQpIHJlZnJlc2hEcCgpOwogICAgaWYgKCFlbC50YXVNYW51YWwuY2hlY2tlZCkgYXBwbHlOdXRNYXQoKTsKICAgIHZhciBzaSA9IHRvU0koKTsKICAgIHZhciBvayA9IHZhbGlkYXRlKHNpKTsKICAgIGlmIChlbC5yZXN1bHRzKSBlbC5yZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoInRlbGMtaGlkZGVuIik7CgogICAgaWYgKCFvaykgewogICAgICBzdGF0ZS5saXZlID0gZmFsc2U7CiAgICAgIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gIkNoZWNrIGlucHV0cyI7CiAgICAgIGVsLnN0YXR1c05vdGUudGV4dENvbnRlbnQgPSAiQ29ycmVjdCBoaWdobGlnaHRlZCBmaWVsZHMsIHRoZW4gY2FsY3VsYXRlIGFnYWluLiI7CiAgICAgIGVsLmJhbm5lci5jbGFzc05hbWUgPSAidGVsYy1iYW5uZXIgdGVsYy1iYW5uZXItY2F1dGlvbiI7CiAgICAgIHNldEdhdWdlKDApOwogICAgICBzZXRTY2hlbWF0aWMoImlkbGUiLCAxMiwgMTIsIDEyKTsKICAgICAgaWYgKHNjcm9sbCkgewogICAgICAgIHRyeSB7IGVsLnJlc3VsdHMuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogInNtb290aCIsIGJsb2NrOiAibmVhcmVzdCIgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBkcCA9IHNpLmRwX21tOwogICAgdmFyIGxlID0gc2kubGVfbW07CiAgICB2YXIgayA9IHNpLms7CiAgICB2YXIgdGF1ID0gc2kudGF1X01QYTsKICAgIHZhciBzdXQgPSBzaS5zdXRfTVBhOwogICAgdmFyIEYgPSBzaS5GX047CiAgICB2YXIgbnNmID0gc2kubnNmOwogICAgdmFyIGQgPSBzaS5kX21tOwoKICAgIHZhciBBcyA9IE1hdGguUEkgKiBkcCAqIGxlICogazsKICAgIHZhciBGZGVzaWduID0gRiAqIG5zZjsKICAgIHZhciBsZVJlcSA9IEZkZXNpZ24gLyAoTWF0aC5QSSAqIGRwICogayAqIHRhdSk7CiAgICB2YXIgcmF0aW8gPSAobGUgLyBsZVJlcSkgKiAxMDA7CiAgICB2YXIgRnRUaHJlYWQgPSBBcyAqIHRhdTsKCiAgICB2YXIgQXQgPSB0ZW5zaWxlQXJlYSgKICAgICAgc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyBudW0oZWwuZCkgOiBudW0oZWwuZCksCiAgICAgIHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gbnVtKGVsLnApIDogbnVtKGVsLnApLAogICAgICBzdGF0ZS51bml0CiAgICApOwogICAgaWYgKCFpc0Zpbml0ZShBdCkpIEF0ID0gTWF0aC5QSSAvIDQgKiBNYXRoLnBvdyhkIC0gMS4wODI1ICogc2kucF9tbSwgMik7CiAgICB2YXIgRnRCb2x0ID0gQXQgKiBzdXQ7CgogICAgdmFyIGJvbHRTeSA9IEJPTFRfTUFUW3NpLmJvbHRNYXRdID8gQk9MVF9NQVRbc2kuYm9sdE1hdF0uc3kgOiBzdXQgKiAwLjk7CiAgICB2YXIgdGF1Qm9sdCA9IDAuNTc3ICogYm9sdFN5OwogICAgdmFyIEZ0RXh0ID0gTWF0aC5QSSAqIGRwICogbGUgKiBrICogdGF1Qm9sdDsKCiAgICB2YXIgZ292ZXJuaW5nID0gTWF0aC5taW4oRnRUaHJlYWQsIEZ0RXh0LCBGdEJvbHQpOwogICAgdmFyIGxlUmVjID0gTWF0aC5tYXgocmVjb21tZW5kZWRFbmdhZ2VtZW50KGQsIHNpLm51dE1hdCksIGxlUmVxKTsKCiAgICB2YXIgYWxlcnRzID0gW107CiAgICB2YXIgc3RhdHVzID0gInNhZmUiOwogICAgdmFyIHRpdGxlID0gIlNhZmUiOwogICAgdmFyIG5vdGUgPSAiVGhyZWFkIGVuZ2FnZW1lbnQgaXMgc3VmZmljaWVudCBmb3IgdGhlIGFwcGxpZWQgYXhpYWwgbG9hZCBhdCB0aGUgc2VsZWN0ZWQgc2FmZXR5IGZhY3Rvci4iOwogICAgdmFyIHJpc2sgPSAiTG93IjsKICAgIHZhciBpbXByb3ZlID0gIk5vIGNoYW5nZSByZXF1aXJlZCBmb3IgcHJlbGltaW5hcnkgZGVzaWduLiI7CgogICAgaWYgKHJhdGlvIDwgODUgfHwgRmRlc2lnbiA+IEZ0VGhyZWFkKSB7CiAgICAgIHN0YXR1cyA9ICJjcml0aWNhbCI7CiAgICAgIHRpdGxlID0gIkNyaXRpY2FsIjsKICAgICAgbm90ZSA9ICJUaHJlYWQgc3RyaXBwaW5nIG1heSBvY2N1ciBiZWZvcmUgdGhlIGJvbHQgcmVhY2hlcyBmdWxsIHRlbnNpbGUgY2FwYWNpdHkuIEluY3JlYXNlIGVuZ2FnZW1lbnQgbGVuZ3RoLCB1c2UgYSBzdHJvbmdlciBudXQgbWF0ZXJpYWwsIG9yIGluY3JlYXNlIHRocmVhZCBzaXplLiI7CiAgICAgIHJpc2sgPSAiSGlnaCI7CiAgICAgIGltcHJvdmUgPSAiSW5jcmVhc2UgZW5nYWdlbWVudCB0byBhdCBsZWFzdCAiICsgZm9ybWF0TGVuZ3RoKGxlUmVxKSArICIsIG9yIHNlbGVjdCBhIGxhcmdlciBkaWFtZXRlciAvIGNvYXJzZXIgdGhyZWFkLiI7CiAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMTAwIHx8IEZkZXNpZ24gPiAwLjkgKiBGdFRocmVhZCkgewogICAgICBzdGF0dXMgPSAid2FybmluZyI7CiAgICAgIHRpdGxlID0gIldhcm5pbmciOwogICAgICBub3RlID0gIkVuZ2FnZW1lbnQgbWFyZ2luIGlzIGxpbWl0ZWQuIENvbmZpcm0gaW5zdGFsbGF0aW9uIHF1YWxpdHkgYW5kIGNvbnNpZGVyIGFkZGl0aW9uYWwgbGVuZ3RoIHBlciBhcHBsaWNhYmxlIHN0YW5kYXJkcy4iOwogICAgICByaXNrID0gIk1lZGl1bSI7CiAgICAgIGltcHJvdmUgPSAiVGFyZ2V0IGVuZ2FnZW1lbnQgXHUyMjY1ICIgKyBmb3JtYXRMZW5ndGgobGVSZXEpICsgIiAocmVjb21tZW5kZWQgIiArIGZvcm1hdExlbmd0aChsZVJlYykgKyAiKS4iOwogICAgfQoKICAgIGlmIChGID4gRnRCb2x0KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogInJpc2siLCB0ZXh0OiAiQXBwbGllZCBsb2FkIGV4Y2VlZHMgYm9sdCB0ZW5zaWxlIGNhcGFjaXR5ICgiICsgZm9ybWF0Rm9yY2UoRnRCb2x0KS5wcmltYXJ5ICsgIikuIEJvbHQgZnJhY3R1cmUgaXMgbGlrZWx5IHJlZ2FyZGxlc3Mgb2YgdGhyZWFkIGVuZ2FnZW1lbnQuIiB9KTsKICAgICAgc3RhdHVzID0gImNyaXRpY2FsIjsKICAgICAgdGl0bGUgPSAiQ3JpdGljYWwiOwogICAgICByaXNrID0gIkhpZ2giOwogICAgfSBlbHNlIGlmIChGZGVzaWduID4gRnRCb2x0KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiRGVzaWduIGxvYWQgKEYgXHUwMGQ3IG4pIGV4Y2VlZHMgYm9sdCB0ZW5zaWxlIGNhcGFjaXR5LiBJbmNyZWFzZSBib2x0IGdyYWRlIG9yIGRpYW1ldGVyLiIgfSk7CiAgICB9CgogICAgaWYgKGxlIDwgbGVSZWMgKiAwLjg1KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiQWN0dWFsIGVuZ2FnZW1lbnQgaXMgYmVsb3cgdGhlIG1hdGVyaWFsIHJ1bGUtb2YtdGh1bWIgKCIgKyBmb3JtYXRMZW5ndGgobGVSZWMpICsgIiBmb3IgdGhpcyBtYXRlcmlhbCBwYWlyKS4iIH0pOwogICAgfQoKICAgIGlmIChnb3Zlcm5pbmcgPT09IEZ0VGhyZWFkICYmIHJhdGlvID49IDEwMCkgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJvayIsIHRleHQ6ICJJbnRlcm5hbCB0aHJlYWQgc3RyaXBwaW5nIGdvdmVybnMuIENhcGFjaXR5ID0gIiArIGZvcm1hdEZvcmNlKEZ0VGhyZWFkKS5wcmltYXJ5ICsgIi4iIH0pOwogICAgfSBlbHNlIGlmIChnb3Zlcm5pbmcgPT09IEZ0RXh0KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiRXh0ZXJuYWwgKGJvbHQpIHRocmVhZCBzaGVhciBtYXkgZ292ZXJuIGJlZm9yZSBpbnRlcm5hbCBzdHJpcHBpbmcuIENoZWNrIGJvbHQgdGhyZWFkIHNoZWFyIGNhcGFjaXR5LiIgfSk7CiAgICB9IGVsc2UgaWYgKGdvdmVybmluZyA9PT0gRnRCb2x0KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIm9rIiwgdGV4dDogIkJvbHQgdGVuc2lsZSBzdHJlbmd0aCBnb3Zlcm5zOyB0aHJlYWQgZW5nYWdlbWVudCBhcHBlYXJzIGFkZXF1YXRlIGZvciBsb2FkIHRyYW5zZmVyLiIgfSk7CiAgICB9CgogICAgaWYgKEZkZXNpZ24gPiBGdFRocmVhZCkgewogICAgICBhbGVydHMudW5zaGlmdCh7IHR5cGU6ICJyaXNrIiwgdGV4dDogIkRlc2lnbiBsb2FkIGV4Y2VlZHMgdGhyZWFkIHNoZWFyIGNhcGFjaXR5ICgiICsgZm9ybWF0Rm9yY2UoRnRUaHJlYWQpLnByaW1hcnkgKyAiKS4gVGhyZWFkIHN0cmlwcGluZyByaXNrIGlzIGhpZ2guIiB9KTsKICAgIH0KCiAgICBlbC5vdXRMZVJlcS50ZXh0Q29udGVudCA9IGZvcm1hdExlbmd0aChsZVJlcSk7CiAgICBlbC5vdXRMZUFjdC50ZXh0Q29udGVudCA9IGZvcm1hdExlbmd0aChsZSk7CiAgICBlbC5vdXRSYXRpby50ZXh0Q29udGVudCA9IGZtdChyYXRpbywgMSkgKyAiJSI7CiAgICB2YXIgcmF0aW8yID0gYnlJZCgidGVsY091dFJhdGlvMiIpOwogICAgaWYgKHJhdGlvMikgcmF0aW8yLnRleHRDb250ZW50ID0gZm10KHJhdGlvLCAxKSArICIlIjsKICAgIGVsLm91dEZ0VGhyZWFkLnRleHRDb250ZW50ID0gZm9ybWF0Rm9yY2UoRnRUaHJlYWQpLnByaW1hcnk7CiAgICBlbC5vdXRGdEJvbHQudGV4dENvbnRlbnQgPSBmb3JtYXRGb3JjZShGdEJvbHQpLnByaW1hcnk7CiAgICBlbC5vdXRSaXNrLnRleHRDb250ZW50ID0gcmlzazsKICAgIGVsLm91dEltcHJvdmUudGV4dENvbnRlbnQgPSBpbXByb3ZlOwogICAgZWwub3V0QXMudGV4dENvbnRlbnQgPSBmb3JtYXRBcmVhKEFzKTsKICAgIGVsLm91dFJlYy50ZXh0Q29udGVudCA9IGZvcm1hdExlbmd0aChsZVJlYyk7CiAgICBlbC5vdXRDb21wYXQudGV4dENvbnRlbnQgPSBjb21wYXROb3RlKHNpLmJvbHRNYXQsIHNpLm51dE1hdCk7CgogICAgZWwucmF0aW9GaWxsLnN0eWxlLndpZHRoID0gY2xhbXAocmF0aW8sIDAsIDE1MCkgLyAxLjUgKyAiJSI7CiAgICBlbC5yYXRpb0ZpbGwuY2xhc3NOYW1lID0gInRlbGMtcmF0aW8tZmlsbCIgKyAoc3RhdHVzID09PSAiY3JpdGljYWwiID8gIiB0ZWxjLWlzLXJpc2siIDogc3RhdHVzID09PSAid2FybmluZyIgPyAiIHRlbGMtaXMtY2F1dGlvbiIgOiAiIHRlbGMtaXMtb2siKTsKCiAgICBpZiAoZWwuZ2F1Z2VSZWFkKSBlbC5nYXVnZVJlYWQudGV4dENvbnRlbnQgPSBmbXQocmF0aW8sIDEpICsgIiUiOwogICAgc2V0R2F1Z2UocmF0aW8pOwogICAgc2V0U2NoZW1hdGljKHN0YXR1cyA9PT0gInNhZmUiID8gIm9rIiA6IHN0YXR1cyA9PT0gIndhcm5pbmciID8gImNhdXRpb24iIDogInJpc2siLCBsZSwgbGVSZXEsIGxlUmVjKTsKCiAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChGdFRocmVhZCwgRnRFeHQsIEZ0Qm9sdCwgRiwgMSk7CiAgICBzZXRCYXIoZWwuYmFyVGhyZWFkLCBGdFRocmVhZCAvIHNjYWxlICogMTAwKTsKICAgIHNldEJhcihlbC5iYXJFeHQsIEZ0RXh0IC8gc2NhbGUgKiAxMDApOwogICAgc2V0QmFyKGVsLmJhckJvbHQsIEZ0Qm9sdCAvIHNjYWxlICogMTAwKTsKICAgIHNldEJhcihlbC5iYXJMb2FkLCBGIC8gc2NhbGUgKiAxMDApOwogICAgaWYgKGVsLmJhclRocmVhZFZhbCkgZWwuYmFyVGhyZWFkVmFsLnRleHRDb250ZW50ID0gZm9ybWF0Rm9yY2UoRnRUaHJlYWQpLnByaW1hcnk7CiAgICBpZiAoZWwuYmFyRXh0VmFsKSBlbC5iYXJFeHRWYWwudGV4dENvbnRlbnQgPSBmb3JtYXRGb3JjZShGdEV4dCkucHJpbWFyeTsKICAgIGlmIChlbC5iYXJCb2x0VmFsKSBlbC5iYXJCb2x0VmFsLnRleHRDb250ZW50ID0gZm9ybWF0Rm9yY2UoRnRCb2x0KS5wcmltYXJ5OwogICAgaWYgKGVsLmJhckxvYWRWYWwpIGVsLmJhckxvYWRWYWwudGV4dENvbnRlbnQgPSBmb3JtYXRGb3JjZShGKS5wcmltYXJ5OwoKICAgIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gdGl0bGU7CiAgICBlbC5zdGF0dXNOb3RlLnRleHRDb250ZW50ID0gbm90ZTsKICAgIGVsLmJhbm5lci5jbGFzc05hbWUgPSAidGVsYy1iYW5uZXIgdGVsYy1iYW5uZXItIiArIChzdGF0dXMgPT09ICJzYWZlIiA\/ICJvayIgOiBzdGF0dXMgPT09ICJ3YXJuaW5nIiA\/ICJjYXV0aW9uIiA6ICJyaXNrIik7CgogICAgZWwuYWxlcnRzLmlubmVySFRNTCA9ICIiOwogICAgYWxlcnRzLmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBkaXYuY2xhc3NOYW1lID0gInRlbGMtYWxlcnQgdGVsYy1hbGVydC0iICsgKGEudHlwZSA9PT0gInJpc2siID8gInJpc2siIDogYS50eXBlID09PSAib2siID8gIm9rIiA6ICJ3YXJuIik7CiAgICAgIGRpdi50ZXh0Q29udGVudCA9IGEudGV4dDsKICAgICAgZWwuYWxlcnRzLmFwcGVuZENoaWxkKGRpdik7CiAgICB9KTsKCiAgICBzdGF0ZS5saXZlID0gdHJ1ZTsKICAgIGlmIChzY3JvbGwpIHsKICAgICAgdHJ5IHsgZWwuYmFubmVyLmNsb3Nlc3QoIi50ZWxjLWNhcmQiKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJuZWFyZXN0IiB9KTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgc3RhdGUudW5pdCA9ICJtZXRyaWMiOwogICAgc3RhdGUuc2l6ZUlkID0gREVGQVVMVFMuc2l6ZTsKICAgIHN0YXRlLmxpdmUgPSBmYWxzZTsKICAgIGVsLnRocmVhZC52YWx1ZSA9IERFRkFVTFRTLnRocmVhZDsKICAgIGVsLmQudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuZCk7CiAgICBlbC5wLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLnApOwogICAgZWwubGUudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMubGUpOwogICAgZWwuZHBNYW51YWwuY2hlY2tlZCA9IERFRkFVTFRTLmRwTWFudWFsOwogICAgZWwuZHAucmVhZE9ubHkgPSB0cnVlOwogICAgZWwuYm9sdE1hdC52YWx1ZSA9IERFRkFVTFRTLmJvbHRNYXQ7CiAgICBlbC5udXRNYXQudmFsdWUgPSBERUZBVUxUUy5udXRNYXQ7CiAgICBlbC50YXVNYW51YWwuY2hlY2tlZCA9IERFRkFVTFRTLnRhdU1hbnVhbDsKICAgIGVsLmtNYW51YWwuY2hlY2tlZCA9IERFRkFVTFRTLmtNYW51YWw7CiAgICBlbC5rLnJlYWRPbmx5ID0gdHJ1ZTsKICAgIGVsLm5zZi52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5uc2YpOwogICAgZWwuZlVuaXQudmFsdWUgPSBERUZBVUxUUy5mVW5pdDsKICAgIGxhc3RGVW5pdCA9IERFRkFVTFRTLmZVbml0OwogICAgZWwuRi52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5GKTsKICAgIGFwcGx5VGhyZWFkVHlwZSgpOwogICAgYXBwbHlCb2x0TWF0KCk7CiAgICBhcHBseU51dE1hdCgpOwogICAgdXBkYXRlVW5pdExhYmVscygpOwogICAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgICByZWZyZXNoRHAoKTsKICAgIGNsZWFyRXJycygpOwogICAgaWYgKGVsLnJlc3VsdHMpIGVsLnJlc3VsdHMuY2xhc3NMaXN0LmFkZCgidGVsYy1oaWRkZW4iKTsKICAgIHNldEdhdWdlKDApOwogICAgc2V0U2NoZW1hdGljKCJpZGxlIiwgMTIsIDEyLCAxMik7CiAgfQoKICBmdW5jdGlvbiBvblJvb3RDbGljayhlKSB7CiAgICB2YXIgYnRuID0gZS50YXJnZXQgJiYgZS50YXJnZXQuY2xvc2VzdCA\/IGUudGFyZ2V0LmNsb3Nlc3QoImJ1dHRvbiIpIDogbnVsbDsKICAgIGlmICghYnRuIHx8ICFyb290LmNvbnRhaW5zKGJ0bikpIHJldHVybjsKICAgIGlmIChidG4uaWQgPT09ICJ0ZWxjQnRuTWV0cmljIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFVuaXQoIm1ldHJpYyIpOyB9CiAgICBlbHNlIGlmIChidG4uaWQgPT09ICJ0ZWxjQnRuSW1wZXJpYWwiKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3dpdGNoVW5pdCgiaW1wZXJpYWwiKTsgfQogICAgZWxzZSBpZiAoYnRuLmlkID09PSAidGVsY0J0blJlc2V0IikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHJlc2V0QWxsKCk7IH0KICAgIGVsc2UgaWYgKGJ0bi5pZCA9PT0gInRlbGNCdG5DYWxjdWxhdGUiKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2FsY3VsYXRlKHRydWUpOyB9CiAgfQoKICByb290LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25Sb290Q2xpY2spOwogIGlmIChlbC5idG5DYWxjKSBlbC5idG5DYWxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBjYWxjdWxhdGUodHJ1ZSk7IH0pOwoKICBlbC50aHJlYWQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgc3RhdGUuc2l6ZUlkID0gIiI7CiAgICBhcHBseVRocmVhZFR5cGUoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBlbC5kcE1hbnVhbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICBlbC5kcC5yZWFkT25seSA9ICFlbC5kcE1hbnVhbC5jaGVja2VkOwogICAgaWYgKCFlbC5kcE1hbnVhbC5jaGVja2VkKSByZWZyZXNoRHAoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBlbC50YXVNYW51YWwuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgZWwudGF1LnJlYWRPbmx5ID0gIWVsLnRhdU1hbnVhbC5jaGVja2VkOwogICAgaWYgKCFlbC50YXVNYW51YWwuY2hlY2tlZCkgYXBwbHlOdXRNYXQoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBlbC5rTWFudWFsLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgIGVsLmsucmVhZE9ubHkgPSAhZWwua01hbnVhbC5jaGVja2VkOwogICAgaWYgKCFlbC5rTWFudWFsLmNoZWNrZWQpIGFwcGx5VGhyZWFkVHlwZSgpOwogICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgfSk7CgogIGVsLmJvbHRNYXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGVsLmJvbHRNYXQudmFsdWUgPT09ICJjdXN0b20iKSBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsKICAgIGVsc2UgYXBwbHlCb2x0TWF0KCk7CiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICB9KTsKCiAgZWwubnV0TWF0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChlbC5udXRNYXQudmFsdWUgPT09ICJjdXN0b20iKSBlbC50YXUucmVhZE9ubHkgPSBmYWxzZTsKICAgIGVsc2UgYXBwbHlOdXRNYXQoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBlbC5zdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICBtYXJrQ3VzdG9tQm9sdCgpOwogICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgfSk7CgogIGVsLnRhdS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgIG1hcmtDdXN0b21OdXQoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBbImQiLCAicCIsICJkcCIsICJsZSIsICJGIiwgImsiLCAibnNmIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICBlbFtrZXldLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoa2V5ID09PSAiZCIgfHwga2V5ID09PSAicCIpIHsKICAgICAgICBzdGF0ZS5zaXplSWQgPSAiIjsKICAgICAgICBwYWludENoaXBzKCk7CiAgICAgICAgaWYgKCFlbC5kcE1hbnVhbC5jaGVja2VkKSByZWZyZXNoRHAoKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICAgIH0pOwogIH0pOwoKICBlbC5mVW5pdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmV4dCA9IGVsLmZVbml0LnZhbHVlOwogICAgaWYgKG5leHQgPT09IGxhc3RGVW5pdCkgcmV0dXJuOwogICAgdmFyIEYgPSBudW0oZWwuRik7CiAgICBlbC5mVW5pdC52YWx1ZSA9IGxhc3RGVW5pdDsKICAgIGlmIChpc0Zpbml0ZShGKSkgZWwuRi52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKEYsIGxhc3RGVW5pdCwgbmV4dCkpOwogICAgZWwuZlVuaXQudmFsdWUgPSBuZXh0OwogICAgbGFzdEZVbml0ID0gbmV4dDsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICByb290LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGUua2V5ID09PSAiRW50ZXIiICYmIGUudGFyZ2V0ICYmIGUudGFyZ2V0LnRhZ05hbWUgPT09ICJJTlBVVCIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjYWxjdWxhdGUodHJ1ZSk7CiAgICB9CiAgfSk7CgogIHdpbmRvdy50ZWxjU3dpdGNoVW5pdCA9IHN3aXRjaFVuaXQ7CiAgd2luZG93LnRlbGNSZXNldCA9IHJlc2V0QWxsOwogIHdpbmRvdy50ZWxjQ2FsY3VsYXRlID0gZnVuY3Rpb24gKCkgeyBjYWxjdWxhdGUodHJ1ZSk7IH07CgogIHVwZGF0ZVVuaXRMYWJlbHMoKTsKICByZW5kZXJTaXplQ2hpcHMoKTsKICBhcHBseVRocmVhZFR5cGUoKTsKICBhcHBseUJvbHRNYXQoKTsKICBhcHBseU51dE1hdCgpOwogIHJlZnJlc2hEcCgpOwp9KSgpOwo=<\/textarea>\n<script id=\"telc-boot-script\" type=\"text\/javascript\" data-no-minify=\"1\" data-no-defer=\"1\" data-cfasync=\"false\">\n(function(){\nfunction boot(){\nif(window.telcCalculate){return;}\nvar el=document.getElementById(\"telc-js-b64\");\nif(!el){return;}\nvar code=el.value;\nif(!code){code=el.textContent;}\nif(!code){return;}\ncode=code.replace(\/\\s\/g,\"\");\nvar js=atob(code);\nvar s=document.createElement(\"script\");\ns.type=\"text\/javascript\";\ns.setAttribute(\"data-no-minify\",\"1\");\ns.setAttribute(\"data-cfasync\",\"false\");\ns.text=js;\nvar p=document.body;\nif(!p){p=document.getElementsByTagName(\"head\")[0];}\nif(p){p.appendChild(s);}\n}\nwindow.telcBoot=boot;\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",boot);}\nelse{boot();}\n})();\n<\/script>\n<\/div>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Thread Engagement Length Check Calculator is a practical engineering tool designed to determine whether the engagement length of a threaded connection is sufficient for&#8230;<\/p>","protected":false},"author":2,"featured_media":24717,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8520],"tags":[8613,8616,8620,8621],"class_list":["post-24715","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-fastener-analysis","tag-thread-design","tag-thread-engagement","tag-thread-strength","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Thread-Engagement-Length-Check-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/comments?post=24715"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24715\/revisions"}],"predecessor-version":[{"id":24716,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24715\/revisions\/24716"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/24717"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=24715"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=24715"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=24715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}