{"id":24653,"date":"2026-08-17T05:57:48","date_gmt":"2026-08-17T05:57:48","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24653"},"modified":"2026-08-17T06:48:11","modified_gmt":"2026-08-17T06:48:11","slug":"bearing-interference-fit-thermal-expansion-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/bearing-interference-fit-thermal-expansion-calculator\/","title":{"rendered":"Bearing Interference Fit &amp; Thermal Expansion Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bearing Interference Fit &amp; Thermal Expansion Calculator<\/strong> is a practical engineering tool for evaluating bearing interference fits and dimensional changes caused by temperature variations. By considering shaft diameter, housing dimensions, material properties, temperature differences, and fit conditions, the calculator helps engineers estimate thermal expansion and determine an appropriate bearing fit. The Bearing Interference Fit &amp; Thermal Expansion Calculator supports accurate bearing installation, mechanical design, and maintenance while helping reduce the risk of excessive interference, bearing looseness, deformation, overheating, and premature 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=\"Bearing interference fit, thermal mounting, press-fit force and hoop-stress calculator. ISO 286, ISO 492, ISO 5753, DIN 7190, Lam\u00e9 thick-wall theory.\" \/>\n  <title>Bearing Interference Fit &amp; Thermal Expansion Calculator<\/title>\n  <style id=\"bif-calc-styles\">\n\/* WordPress-safe: every rule is under #bif-calc except the standalone-only\n   body:has(...) guard, which does not match a normal WordPress page. *\/\nbody:has(> #bif-calc:only-child) { margin: 0; padding: 0; background: #e8eef4; }\n\n#bif-calc {\n  --bif-bg: transparent;\n  --bif-surface: #ffffff;\n  --bif-surface-2: #f4f7fa;\n  --bif-ink: #1e293b;\n  --bif-muted: #64748b;\n  --bif-line: #d4dde8;\n  --bif-accent: #0284c7;\n  --bif-accent-2: #0369a1;\n  --bif-steel: #334155;\n  --bif-ok: #059669;\n  --bif-warn: #d97706;\n  --bif-risk: #dc2626;\n  --bif-info: #0891b2;\n  --bif-radius: 10px;\n  --bif-shadow: 0 1px 3px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);\n  --bif-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n  --bif-sans: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;\n\n  box-sizing: border-box;\n  isolation: isolate;\n  font-family: var(--bif-sans);\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bif-ink);\n  background: var(--bif-bg);\n  width: 1000px;\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 0 0 1.5rem;\n  text-align: left;\n  letter-spacing: normal;\n  text-transform: none;\n}\n\n#bif-calc *, #bif-calc *::before, #bif-calc *::after { box-sizing: border-box; }\n#bif-calc h1, #bif-calc h2, #bif-calc h3, #bif-calc h4, #bif-calc p, #bif-calc ul, #bif-calc ol,\n#bif-calc figure, #bif-calc blockquote, #bif-calc section, #bif-calc header, #bif-calc footer {\n  margin: 0; padding: 0; border: none; background: none; box-shadow: none;\n  font-family: inherit; font-size: inherit; font-weight: inherit; line-height: inherit;\n  color: inherit; letter-spacing: inherit; text-transform: none;\n}\n#bif-calc button, #bif-calc input, #bif-calc select, #bif-calc textarea, #bif-calc label {\n  font: inherit; color: inherit; margin: 0; max-width: none;\n}\n#bif-calc button {\n  cursor: pointer; background: transparent; border: none; padding: 0;\n  box-shadow: none; text-decoration: none; appearance: none; -webkit-appearance: none;\n}\n#bif-calc img, #bif-calc svg, #bif-calc video, #bif-calc canvas { display: block; max-width: 100%; height: auto; }\n#bif-calc a { color: inherit; text-decoration: none; }\n#bif-calc table { border-collapse: collapse; border-spacing: 0; width: auto; }\n#bif-calc .mono { font-family: var(--bif-mono); }\n#bif-calc .hidden { display: none !important; }\n#bif-calc sub, #bif-calc sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#bif-calc sub { bottom: -0.2em; } #bif-calc sup { top: -0.45em; }\n\n#bif-calc .bif-input-tools {\n  display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0;\n}\n#bif-calc .bif-unit-switch {\n  display: inline-flex !important; align-items: center !important; gap: 2px !important; padding: 3px !important;\n  border-radius: 8px !important; background: #0f172a !important; border: 1px solid #1e293b !important;\n  box-shadow: none !important;\n}\n#bif-calc .bif-unit-switch .unit-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border: none !important; border-radius: 6px !important;\n  background: transparent !important; color: #cbd5e1 !important; font-size: 0.8125rem !important; font-weight: 500 !important;\n  line-height: 1.25 !important; font-family: inherit !important; cursor: pointer !important;\n  box-shadow: none !important; text-decoration: none !important; text-transform: none !important;\n}\n#bif-calc .bif-unit-switch .unit-btn:hover { color: #fff !important; background: transparent !important; }\n#bif-calc .bif-unit-switch .unit-btn.is-active { background: #0ea5e9 !important; color: #fff !important; font-weight: 600 !important; }\n#bif-calc .bif-unit-switch .unit-btn.is-active:hover { background: #0ea5e9 !important; color: #fff !important; }\n#bif-calc .bif-reset-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border-radius: 6px !important; border: 1px solid #d1d5db !important;\n  background: #ffffff !important; color: #0f172a !important; font-size: 0.8125rem !important; font-weight: 500 !important;\n  line-height: 1.25 !important; font-family: inherit !important; cursor: pointer !important;\n  box-shadow: none !important; text-decoration: none !important; text-transform: none !important;\n}\n#bif-calc .bif-reset-btn:hover { background: #f8fafc !important; border-color: #94a3b8 !important; color: #0f172a !important; }\n\n#bif-calc .bif-calc-wrap {\n  display: flex; justify-content: center; margin-top: 1.15rem; padding-top: 0.85rem;\n  border-top: 1px solid var(--bif-line);\n}\n#bif-calc #btnCalculate.bif-calc-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  min-width: 220px !important; width: auto !important; max-width: 100% !important;\n  margin: 0 !important; padding: 0.85rem 2.75rem !important; border: none !important; border-radius: 10px !important;\n  background: #0077c2 !important; color: #ffffff !important; font-size: 1rem !important; font-weight: 700 !important;\n  line-height: 1.25 !important; font-family: inherit !important; letter-spacing: 0.01em !important;\n  cursor: pointer !important; box-shadow: none !important; text-decoration: none !important; text-transform: none !important;\n}\n#bif-calc #btnCalculate.bif-calc-btn:hover { background: #0066a8 !important; color: #fff !important; }\n#bif-calc #btnCalculate.bif-calc-btn:active { background: #005a94 !important; color: #fff !important; }\n\n#bif-calc .bif-layout {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n#bif-calc .bif-card {\n  background: var(--bif-surface);\n  border: 1px solid var(--bif-line);\n  border-radius: var(--bif-radius);\n  box-shadow: var(--bif-shadow);\n  overflow: visible;\n}\n#bif-calc .bif-card + .bif-card { margin-top: 0.85rem; }\n#bif-calc .bif-card-h {\n  display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;\n  padding: 0.7rem 1rem;\n  background: linear-gradient(180deg, #f8fafc, #f1f5f9);\n  border-bottom: 1px solid var(--bif-line);\n  flex-wrap: wrap;\n}\n#bif-calc .bif-card-h h2 {\n  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--bif-steel);\n  margin: 0; padding: 0; background: none; border: none;\n}\n#bif-calc .bif-card-b { padding: 0.95rem 1rem 1.05rem; }\n\n#bif-calc .bif-section {\n  font-size: 0.78rem; font-weight: 700; color: var(--bif-ink);\n  margin: 1rem 0 0.65rem; padding: 0 0 0.3rem; padding-bottom: 0.3rem;\n  border-bottom: 1px dashed var(--bif-line);\n  display: flex; align-items: center; gap: 0.45rem;\n  background: none;\n}\n#bif-calc .bif-section:first-child { margin-top: 0; }\n#bif-calc .bif-badge {\n  width: 1.35rem; height: 1.35rem; border-radius: 999px; flex-shrink: 0;\n  display: inline-flex; align-items: center; justify-content: center;\n  background: linear-gradient(135deg, #0f172a, #334155); color: #fff;\n  font-size: 0.65rem; font-weight: 700;\n}\n\n#bif-calc .bif-grid { display: grid; gap: 0.65rem 0.75rem; }\n#bif-calc .g-2 { grid-template-columns: 1fr 1fr; }\n#bif-calc .g-3 { grid-template-columns: 1fr 1fr 1fr; }\n@media (max-width: 640px) {\n  #bif-calc .g-2, #bif-calc .g-3 { grid-template-columns: 1fr; }\n}\n\n#bif-calc label.fld { display: flex; flex-direction: column; gap: 0.28rem; min-width: 0; }\n#bif-calc label.fld > span.lbl {\n  font-size: 0.75rem; font-weight: 600; color: #334155;\n}\n#bif-calc label.fld .hint { font-size: 0.68rem; color: var(--bif-muted); font-weight: 400; }\n#bif-calc input[type=\"number\"], #bif-calc input[type=\"text\"] {\n  appearance: none; -webkit-appearance: none; width: 100%; border: 1px solid #cbd5e1; border-radius: 8px;\n  padding: 0.48rem 0.7rem; font-size: 0.8125rem; background: #fff; color: #0f172a;\n  font-family: var(--bif-mono); box-shadow: none; line-height: 1.25;\n}\n#bif-calc select {\n  display: block !important; visibility: visible !important; opacity: 1 !important;\n  width: 100% !important; max-width: 100% !important; min-height: 2.45rem !important; height: auto !important;\n  margin: 0 !important; padding: 0.48rem 2rem 0.48rem 0.7rem !important;\n  border: 1px solid #cbd5e1 !important; border-radius: 8px !important;\n  background-color: #fff !important; color: #0f172a !important;\n  font-size: 0.8125rem !important; font-family: var(--bif-mono) !important; line-height: 1.25 !important;\n  box-shadow: none !important;\n  appearance: auto !important; -webkit-appearance: menulist !important; -moz-appearance: menulist !important;\n}\n#bif-calc select option, #bif-calc select optgroup {\n  display: block !important; color: #0f172a !important; background: #fff !important;\n}\n#bif-calc input:focus, #bif-calc select:focus { outline: 2px solid #0ea5e9; outline-offset: 0; border-color: #0ea5e9; }\n#bif-calc input:disabled, #bif-calc select:disabled, #bif-calc input[readonly] { background: #f8fafc; color: #0f172a; }\n#bif-calc input[type=\"checkbox\"] { width: 0.95rem; height: 0.95rem; accent-color: #0284c7; flex-shrink: 0; }\n#bif-calc .chk { display: flex; align-items: center; gap: 0.45rem; font-size: 0.78rem; color: #334155; }\n\n#bif-calc .chip-row { display: flex; flex-wrap: wrap; gap: 0.35rem; position: relative; z-index: 2; }\n#bif-calc .chip {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  padding: 0.32rem 0.55rem !important; border-radius: 6px !important;\n  border: 1px solid #cbd5e1 !important; background: #fff !important; color: #334155 !important;\n  font-size: 0.72rem !important; font-weight: 600 !important; font-family: var(--bif-mono) !important;\n  box-shadow: none !important; text-transform: none !important; line-height: 1.25 !important;\n  cursor: pointer !important; pointer-events: auto !important; margin: 0 !important;\n  user-select: none;\n}\n#bif-calc .chip { position: relative !important; }\n#bif-calc .chip input[type=\"radio\"] {\n  position: absolute !important; inset: 0 !important; opacity: 0 !important;\n  width: 100% !important; height: 100% !important; margin: 0 !important;\n  cursor: pointer !important; pointer-events: auto !important; z-index: 1 !important;\n}\n#bif-calc .chip:hover { border-color: #38bdf8 !important; }\n#bif-calc .chip.is-active,\n#bif-calc .chip:has(input:checked) {\n  background: #0284c7 !important; color: #fff !important; border-color: #0284c7 !important;\n}\n\n#bif-calc .note {\n  font-size: 0.72rem; color: var(--bif-muted); background: var(--bif-surface-2);\n  border: 1px solid var(--bif-line); border-radius: 8px; padding: 0.5rem 0.65rem;\n}\n\n#bif-calc .tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }\n@media (min-width: 560px) { #bif-calc .tiles.t-4 { grid-template-columns: 1fr 1fr 1fr 1fr; } }\n#bif-calc .tile {\n  background: linear-gradient(180deg, #fff, #f8fafc);\n  border: 1px solid var(--bif-line); border-radius: 8px; padding: 0.65rem 0.7rem;\n}\n#bif-calc .tile .k { font-size: 0.65rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--bif-muted); }\n#bif-calc .tile .v { font-family: var(--bif-mono); font-size: 1.05rem; font-weight: 600; color: #0f172a; margin-top: 0.15rem; }\n#bif-calc .tile .u { font-size: 0.68rem; color: var(--bif-muted); }\n#bif-calc .tile.is-ok { border-color: #a7f3d0; background: linear-gradient(180deg, #f0fdf4, #fff); }\n#bif-calc .tile.is-warn { border-color: #fcd34d; background: linear-gradient(180deg, #fffbeb, #fff); }\n#bif-calc .tile.is-risk { border-color: #fca5a5; background: linear-gradient(180deg, #fef2f2, #fff); }\n\n#bif-calc .banner {\n  border-radius: 8px; padding: 0.55rem 0.75rem; font-size: 0.78rem; color: #fff; margin-bottom: 0.5rem;\n}\n#bif-calc .banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#bif-calc .banner-warn { background: linear-gradient(90deg, #854d0e, #a16207); }\n#bif-calc .banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#bif-calc .banner-info { background: linear-gradient(90deg, #0c4a6e, #075985); }\n#bif-calc .alerts { display: flex; flex-direction: column; gap: 0.4rem; margin: 0.65rem 0; }\n#bif-calc .alert {\n  border-radius: 8px; padding: 0.55rem 0.7rem; font-size: 0.75rem; border: 1px solid;\n}\n#bif-calc .alert-ok { background: #ecfdf5; border-color: #a7f3d0; color: #065f46; }\n#bif-calc .alert-warn { background: #fffbeb; border-color: #fcd34d; color: #92400e; }\n#bif-calc .alert-risk { background: #fef2f2; border-color: #fca5a5; color: #991b1b; }\n#bif-calc .alert strong { font-weight: 700; }\n\n#bif-calc .svg-wrap {\n  background: #0f172a;\n  border-radius: 10px;\n  padding: 0.6rem 0.5rem 0.4rem;\n  border: 1px solid #1e293b;\n}\n#bif-calc .svg-wrap svg { width: 100%; height: auto; }\n#bif-calc .legend { display: flex; flex-wrap: wrap; gap: 0.65rem 1rem; padding: 0.45rem 0.15rem 0; font-size: 0.68rem; color: #94a3b8; }\n#bif-calc .legend i { display: inline-block; width: 0.7rem; height: 0.7rem; border-radius: 2px; margin-right: 0.3rem; vertical-align: -1px; font-style: normal; }\n\n#bif-calc .bar-fit { height: 14px; border-radius: 7px; background: #e2e8f0; position: relative; overflow: hidden; margin: 0.55rem 0 0.2rem; }\n#bif-calc .bar-fit .neg { position: absolute; left: 0; top: 0; bottom: 0; background: linear-gradient(90deg, #38bdf8, #7dd3fc); }\n#bif-calc .bar-fit .pos { position: absolute; top: 0; bottom: 0; background: linear-gradient(90deg, #fb923c, #ea580c); }\n#bif-calc .bar-fit .zero { position: absolute; top: 0; bottom: 0; width: 2px; background: #0f172a; }\n#bif-calc .bar-fit .mark { position: absolute; top: -3px; bottom: -3px; width: 3px; background: #0284c7; border-radius: 2px; }\n\n#bif-calc table.mini { width: 100%; border-collapse: collapse; font-size: 0.75rem; background: transparent; }\n#bif-calc table.mini th { text-align: left; font-weight: 600; color: var(--bif-muted); font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.04em; padding: 0.35rem 0.4rem; border-bottom: 1px solid var(--bif-line); background: none; }\n#bif-calc table.mini td { padding: 0.38rem 0.4rem; border-bottom: 1px solid #f1f5f9; background: none; }\n#bif-calc table.mini td:last-child, #bif-calc table.mini th:last-child { text-align: right; font-family: var(--bif-mono); }\n\n@media print {\n  body:has(> #bif-calc:only-child) { background: #fff !important; }\n  #bif-calc { max-width: none; padding: 0; background: #fff; }\n  #bif-calc .no-print { display: none !important; }\n  #bif-calc .bif-layout { display: block; }\n  #bif-calc #resultsPanel.hidden { display: block !important; }\n  #bif-calc .bif-card { break-inside: avoid; box-shadow: none; }\n  #bif-calc .print-only { display: block !important; }\n}\n#bif-calc .print-only { display: none; }\n  <\/style>\n<\/head>\n<body>\n<div id=\"bif-calc\">\n  <div class=\"bif-layout\">\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 INPUTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n    <section class=\"bif-card\">\n        <div class=\"bif-card-h\">\n          <h2>Input parameters<\/h2>\n          <div class=\"bif-input-tools no-print\">\n            <div class=\"bif-unit-switch\" role=\"group\" aria-label=\"Unit system\">\n              <button type=\"button\" class=\"unit-btn is-active\" id=\"btnMetric\" data-unit=\"metric\">Metric<\/button>\n              <button type=\"button\" class=\"unit-btn\" id=\"btnImperial\" data-unit=\"imperial\">Imperial<\/button>\n            <\/div>\n            <button type=\"button\" class=\"bif-reset-btn\" id=\"btnReset\">Reset<\/button>\n          <\/div>\n        <\/div>\n        <div class=\"bif-card-b\">\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">1<\/span> Bearing geometry<\/div>\n          <div class=\"bif-grid g-2\">\n            <label class=\"fld\"><span class=\"lbl\">Bearing type<\/span>\n              <select id=\"bearingType\">\n                <option value=\"dgb\" selected>Deep groove ball (ISO 5753-1)<\/option>\n                <option value=\"crb\">Cylindrical roller<\/option>\n                <option value=\"srb\">Spherical roller<\/option>\n                <option value=\"trb\">Tapered roller<\/option>\n              <\/select>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Designation <span class=\"hint\">(optional)<\/span><\/span>\n              <input id=\"designation\" type=\"text\" value=\"6310\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-3\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Bore d <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"d\" type=\"number\" step=\"any\" value=\"50\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">OD D <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"D\" type=\"number\" step=\"any\" value=\"110\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Width B <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"B\" type=\"number\" step=\"any\" value=\"27\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Inner-ring raceway F <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"F\" type=\"number\" step=\"any\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Outer-ring raceway E <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"E\" type=\"number\" step=\"any\" \/>\n            <\/label>\n          <\/div>\n          <p class=\"note\" style=\"margin-top:0.55rem\">F and E auto-fill from Harris\/SKF proportions F \u2248 0.25(D + 3d), E \u2248 0.25(3D + d) unless you type over them.<\/p>\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">2<\/span> Shaft \/ inner-ring fit (ISO 286 + ISO 492)<\/div>\n          <p class=\"note\" style=\"margin-bottom:0.55rem\">Inner-ring bore uses ISO 492 Normal (PN\/P0) limits (0 \/ minus). Shaft class is ISO 286.<\/p>\n          <div class=\"chip-row\" id=\"shaftFitChips\">\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"js5\" \/> js5<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"k5\" checked \/> k5<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"m5\" \/> m5<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"n6\" \/> n6<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"p6\" \/> p6<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"r6\" \/> r6<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifShaftFit\" value=\"h6\" \/> h6<\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Shaft fit<\/span>\n              <select id=\"shaftFit\">\n                <option value=\"js5\">js5<\/option>\n                <option value=\"k5\" selected>k5<\/option>\n                <option value=\"m5\">m5<\/option>\n                <option value=\"n6\">n6<\/option>\n                <option value=\"p6\">p6<\/option>\n                <option value=\"r6\">r6<\/option>\n                <option value=\"h6\">h6<\/option>\n              <\/select>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Fit source<\/span>\n              <select id=\"shaftMode\">\n                <option value=\"iso\">ISO 286 + ISO 492<\/option>\n                <option value=\"custom\">Custom ISO limits (\u03bcm)<\/option>\n              <\/select>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" id=\"shaftCustomRow\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Shaft ei \/ es <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <div class=\"bif-grid g-2\">\n                <input id=\"shaftEi\" type=\"number\" step=\"any\" placeholder=\"ei\" \/>\n                <input id=\"shaftEs\" type=\"number\" step=\"any\" placeholder=\"es\" \/>\n              <\/div>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Ring bore \u0394dmp hi \/ lo <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <div class=\"bif-grid g-2\">\n                <input id=\"boreHi\" type=\"number\" step=\"any\" \/>\n                <input id=\"boreLo\" type=\"number\" step=\"any\" \/>\n              <\/div>\n            <\/label>\n          <\/div>\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">3<\/span> Housing \/ outer-ring fit<\/div>\n          <div class=\"chip-row\" id=\"housingFitChips\">\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"H7\" checked \/> H7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"JS7\" \/> JS7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"J7\" \/> J7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"K7\" \/> K7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"M7\" \/> M7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"N7\" \/> N7<\/label>\n            <label class=\"chip\"><input type=\"radio\" name=\"bifHousFit\" value=\"P7\" \/> P7<\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Housing fit<\/span>\n              <select id=\"housingFit\">\n                <option value=\"H7\" selected>H7<\/option>\n                <option value=\"JS7\">JS7<\/option>\n                <option value=\"J7\">J7<\/option>\n                <option value=\"K7\">K7<\/option>\n                <option value=\"M7\">M7<\/option>\n                <option value=\"N7\">N7<\/option>\n                <option value=\"P7\">P7<\/option>\n              <\/select>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Fit source<\/span>\n              <select id=\"housingMode\">\n                <option value=\"iso\">ISO 286 + ISO 492<\/option>\n                <option value=\"custom\">Custom ISO limits (\u03bcm)<\/option>\n              <\/select>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" id=\"housingCustomRow\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Housing EI \/ ES <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <div class=\"bif-grid g-2\">\n                <input id=\"housEi\" type=\"number\" step=\"any\" placeholder=\"EI\" \/>\n                <input id=\"housEs\" type=\"number\" step=\"any\" placeholder=\"ES\" \/>\n              <\/div>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Ring OD \u0394Dmp hi \/ lo <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <div class=\"bif-grid g-2\">\n                <input id=\"odHi\" type=\"number\" step=\"any\" \/>\n                <input id=\"odLo\" type=\"number\" step=\"any\" \/>\n              <\/div>\n            <\/label>\n          <\/div>\n          <label class=\"fld\" style=\"margin-top:0.65rem\"><span class=\"lbl\">Housing hub OD D<sub>h<\/sub> <span class=\"hint u-len\">(mm, optional)<\/span><\/span>\n            <input id=\"Dh\" type=\"number\" step=\"any\" placeholder=\"blank = thick housing\" \/>\n          <\/label>\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">4<\/span> Shaft structure &amp; materials<\/div>\n          <div class=\"bif-grid g-2\">\n            <label class=\"fld\"><span class=\"lbl\">Shaft structure<\/span>\n              <select id=\"shaftStruct\">\n                <option value=\"solid\" selected>Solid<\/option>\n                <option value=\"hollow\">Hollow<\/option>\n              <\/select>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Inner diameter d<sub>i<\/sub> <span class=\"hint u-len\">(mm)<\/span><\/span>\n              <input id=\"di\" type=\"number\" step=\"any\" value=\"0\" disabled \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">Shaft material<\/span>\n              <select id=\"shaftMat\">\n                <option value=\"carbon_steel\" selected>Carbon steel (C45 \/ 1045)<\/option>\n                <option value=\"alloy_steel\">Alloy steel (42CrMo4)<\/option>\n                <option value=\"stainless\">Stainless steel (AISI 304)<\/option>\n                <option value=\"cast_iron\">Cast iron (EN-GJL-250)<\/option>\n                <option value=\"bronze\">Tin bronze (CuSn12)<\/option>\n                <option value=\"aluminum\">Aluminium (AlSi10Mg \/ 6061)<\/option>\n              <\/select>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Housing material<\/span>\n              <select id=\"housMat\">\n                <option value=\"carbon_steel\">Carbon steel (C45 \/ 1045)<\/option>\n                <option value=\"alloy_steel\">Alloy steel (42CrMo4)<\/option>\n                <option value=\"stainless\">Stainless steel (AISI 304)<\/option>\n                <option value=\"cast_iron\" selected>Cast iron (EN-GJL-250)<\/option>\n                <option value=\"bronze\">Tin bronze (CuSn12)<\/option>\n                <option value=\"aluminum\">Aluminium (AlSi10Mg \/ 6061)<\/option>\n              <\/select>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-3\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">E<sub>shaft<\/sub> <span class=\"hint\">(N\/mm\u00b2)<\/span><\/span>\n              <input id=\"Es\" type=\"number\" step=\"any\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">\u03bd<sub>shaft<\/sub><\/span>\n              <input id=\"nus\" type=\"number\" step=\"any\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">R<sub>e<\/sub> shaft <span class=\"hint u-stress\">(N\/mm\u00b2)<\/span><\/span>\n              <input id=\"Re\" type=\"number\" step=\"any\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">\u03b1<sub>shaft<\/sub> <span class=\"hint\">(\/K)<\/span><\/span>\n              <input id=\"alphaS\" type=\"number\" step=\"any\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">\u03b1<sub>ring<\/sub> 100Cr6 <span class=\"hint\">(\/K)<\/span><\/span>\n              <input id=\"alphaB\" type=\"number\" step=\"any\" value=\"0.000012\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">\u03b1<sub>housing<\/sub> <span class=\"hint\">(\/K)<\/span><\/span>\n              <input id=\"alphaH\" type=\"number\" step=\"any\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">Friction \u03bc<\/span>\n              <select id=\"mu\">\n                <option value=\"0.12\" selected>0.12 dry steel\/steel<\/option>\n                <option value=\"0.08\">0.08 oiled<\/option>\n                <option value=\"0.15\">0.15 dry (conservative)<\/option>\n                <option value=\"0.05\">0.05 well-lubricated<\/option>\n              <\/select>\n            <\/label>\n          <\/div>\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">5<\/span> Temperatures<\/div>\n          <div class=\"bif-grid g-3\">\n            <label class=\"fld\"><span class=\"lbl\">T<sub>ambient<\/sub> \/ initial <span class=\"hint u-temp\">(\u00b0C)<\/span><\/span>\n              <input id=\"T0\" type=\"number\" step=\"any\" value=\"20\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">T<sub>inner ring<\/sub> op. <span class=\"hint u-temp\">(\u00b0C)<\/span><\/span>\n              <input id=\"Tir\" type=\"number\" step=\"any\" value=\"70\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">T<sub>shaft<\/sub> op. <span class=\"hint u-temp\">(\u00b0C)<\/span><\/span>\n              <input id=\"Ts\" type=\"number\" step=\"any\" value=\"65\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.65rem\">\n            <label class=\"fld\"><span class=\"lbl\">T<sub>outer ring<\/sub> op. <span class=\"hint u-temp\">(\u00b0C)<\/span><\/span>\n              <input id=\"Tor\" type=\"number\" step=\"any\" value=\"60\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">T<sub>housing<\/sub> op. <span class=\"hint u-temp\">(\u00b0C)<\/span><\/span>\n              <input id=\"Th\" type=\"number\" step=\"any\" value=\"55\" \/>\n            <\/label>\n          <\/div>\n          <p class=\"note\" style=\"margin-top:0.55rem\">Heating temperature T<sub>heat<\/sub> is calculated so the inner-ring bore expands by I<sub>max<\/sub> plus a mounting safety of max(0.02%\u00b7d, 15 \u03bcm).<\/p>\n\n          <div class=\"bif-section\"><span class=\"bif-badge\">6<\/span> Initial radial clearance (ISO 5753-1)<\/div>\n          <div class=\"chip-row\" id=\"classChips\">\n            <label class=\"chip\" onclick=\"(function(lab){var el=lab.querySelector('input');if(!el)return;el.checked=true;var r=document.getElementById('bif-calc');if(!r)return;var c=r.querySelector('#useCustomG');if(c){if(c.checked)return;}var a=r.querySelector('#Gmin'),b=r.querySelector('#Gmax');if(!a||!b)return;a.value=el.getAttribute('data-gmin');b.value=el.getAttribute('data-gmax');})(this)\"><input type=\"radio\" name=\"bifClrClass\" value=\"C2\" data-gmin=\"1\" data-gmax=\"11\" \/> C2<\/label>\n            <label class=\"chip\" onclick=\"(function(lab){var el=lab.querySelector('input');if(!el)return;el.checked=true;var r=document.getElementById('bif-calc');if(!r)return;var c=r.querySelector('#useCustomG');if(c){if(c.checked)return;}var a=r.querySelector('#Gmin'),b=r.querySelector('#Gmax');if(!a||!b)return;a.value=el.getAttribute('data-gmin');b.value=el.getAttribute('data-gmax');})(this)\"><input type=\"radio\" name=\"bifClrClass\" value=\"CN\" data-gmin=\"6\" data-gmax=\"23\" \/> Normal<\/label>\n            <label class=\"chip\" onclick=\"(function(lab){var el=lab.querySelector('input');if(!el)return;el.checked=true;var r=document.getElementById('bif-calc');if(!r)return;var c=r.querySelector('#useCustomG');if(c){if(c.checked)return;}var a=r.querySelector('#Gmin'),b=r.querySelector('#Gmax');if(!a||!b)return;a.value=el.getAttribute('data-gmin');b.value=el.getAttribute('data-gmax');})(this)\"><input type=\"radio\" name=\"bifClrClass\" value=\"C3\" data-gmin=\"18\" data-gmax=\"36\" checked \/> C3<\/label>\n            <label class=\"chip\" onclick=\"(function(lab){var el=lab.querySelector('input');if(!el)return;el.checked=true;var r=document.getElementById('bif-calc');if(!r)return;var c=r.querySelector('#useCustomG');if(c){if(c.checked)return;}var a=r.querySelector('#Gmin'),b=r.querySelector('#Gmax');if(!a||!b)return;a.value=el.getAttribute('data-gmin');b.value=el.getAttribute('data-gmax');})(this)\"><input type=\"radio\" name=\"bifClrClass\" value=\"C4\" data-gmin=\"30\" data-gmax=\"51\" \/> C4<\/label>\n            <label class=\"chip\" onclick=\"(function(lab){var el=lab.querySelector('input');if(!el)return;el.checked=true;var r=document.getElementById('bif-calc');if(!r)return;var c=r.querySelector('#useCustomG');if(c){if(c.checked)return;}var a=r.querySelector('#Gmin'),b=r.querySelector('#Gmax');if(!a||!b)return;a.value=el.getAttribute('data-gmin');b.value=el.getAttribute('data-gmax');})(this)\"><input type=\"radio\" name=\"bifClrClass\" value=\"C5\" data-gmin=\"45\" data-gmax=\"73\" \/> C5<\/label>\n          <\/div>\n          <label class=\"chk\" style=\"margin-top:0.55rem\">\n            <input type=\"checkbox\" id=\"useCustomG\" \/>\n            Override with custom initial RIC G<sub>r<\/sub>\n          <\/label>\n          <div class=\"bif-grid g-2\" style=\"margin-top:0.45rem\">\n            <label class=\"fld\"><span class=\"lbl\">G<sub>r,min<\/sub> <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <input id=\"Gmin\" type=\"number\" step=\"any\" value=\"18\" \/>\n            <\/label>\n            <label class=\"fld\"><span class=\"lbl\">G<sub>r,max<\/sub> <span class=\"hint\">(\u03bcm)<\/span><\/span>\n              <input id=\"Gmax\" type=\"number\" step=\"any\" value=\"36\" \/>\n            <\/label>\n          <\/div>\n          <div class=\"bif-calc-wrap no-print\">\n            <button type=\"button\" id=\"btnCalculate\" class=\"bif-calc-btn\" onclick=\"(function(){if(window.BIF_runCalculate){window.BIF_runCalculate();return;}var t=document.getElementById('bif-js-b64');if(!t){return;}var c=t.value;if(!c){c=t.textContent;}if(!c){return;}c=c.replace(\/\\s\/g,'');var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c);var p=document.body;if(!p){p=document.getElementsByTagName('head')[0];}if(p){p.appendChild(s);}setTimeout(function(){if(window.BIF_runCalculate){window.BIF_runCalculate();}},200);})()\">Calculate<\/button>\n          <\/div>\n        <\/div>\n      <\/section>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 RESULTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n    <div id=\"resultsPanel\" class=\"hidden\">\n      <section class=\"bif-card\">\n        <div class=\"bif-card-h\">\n          <h2>Results<\/h2>\n          <div style=\"display:flex;align-items:center;gap:0.5rem;flex-shrink:0\">\n            <span class=\"hint mono\" id=\"fitName\" style=\"font-size:0.72rem;color:#0284c7;font-weight:600\"><\/span>\n            <button type=\"button\" class=\"bif-reset-btn no-print\" id=\"btnPrint\" style=\"font-size:0.75rem\">Export \/ Print<\/button>\n          <\/div>\n        <\/div>\n        <div class=\"bif-card-b\">\n          <div id=\"statusBanner\" class=\"banner banner-info\">Enter geometry to compute the fit.<\/div>\n\n          <div class=\"svg-wrap\" aria-label=\"Bearing cross-section diagram\">\n            <svg id=\"diagram\" viewBox=\"0 0 520 320\" role=\"img\"><\/svg>\n            <div class=\"legend\">\n              <span><i style=\"background:#64748b\"><\/i>Shaft<\/span>\n              <span><i style=\"background:#38bdf8\"><\/i>Inner ring<\/span>\n              <span><i style=\"background:#94a3b8\"><\/i>Outer ring<\/span>\n              <span><i style=\"background:#334155\"><\/i>Housing<\/span>\n              <span><i style=\"background:#ea580c\"><\/i>Interference<\/span>\n              <span><i style=\"background:#7dd3fc\"><\/i>Clearance<\/span>\n            <\/div>\n          <\/div>\n\n          <div class=\"tiles t-4\" style=\"margin-top:0.75rem\">\n            <div class=\"tile\" id=\"tileImin\"><div class=\"k\">I min (shaft)<\/div><div class=\"v\" id=\"outImin\">\u2014<\/div><div class=\"u\">interference + \/ clearance \u2212<\/div><\/div>\n            <div class=\"tile\" id=\"tileImax\"><div class=\"k\">I max (shaft)<\/div><div class=\"v\" id=\"outImax\">\u2014<\/div><div class=\"u\" id=\"outImaxU\">\u03bcm<\/div><\/div>\n            <div class=\"tile\" id=\"tileTheat\"><div class=\"k\">T heat<\/div><div class=\"v\" id=\"outTheat\">\u2014<\/div><div class=\"u\">inner ring, + safety<\/div><\/div>\n            <div class=\"tile\" id=\"tileFp\"><div class=\"k\">Press force F<sub>p<\/sub><\/div><div class=\"v\" id=\"outFp\">\u2014<\/div><div class=\"u\">at I<sub>max<\/sub>, \u03bc selected<\/div><\/div>\n          <\/div>\n\n          <div class=\"bar-fit\" id=\"fitBar\" title=\"Clearance (blue) vs interference (orange)\"><\/div>\n          <div style=\"display:flex;justify-content:space-between;font-size:0.65rem;color:#64748b\">\n            <span>Clearance<\/span><span>0<\/span><span>Interference<\/span>\n          <\/div>\n\n          <div class=\"alerts\" id=\"alerts\"><\/div>\n\n          <table class=\"mini\" style=\"margin-top:0.35rem\">\n            <thead><tr><th>Quantity<\/th><th>Value<\/th><\/tr><\/thead>\n            <tbody id=\"resultRows\"><\/tbody>\n          <\/table>\n        <\/div>\n      <\/section>\n\n      <section class=\"bif-card print-only\">\n        <div class=\"bif-card-h\"><h2>Print summary<\/h2><\/div>\n        <div class=\"bif-card-b\" id=\"printSummary\"><\/div>\n      <\/section>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- WordPress Custom HTML: paste this entire file. If Calculate still fails, in WP Rocket \/ LiteSpeed exclude \"bif-js-b64\" and \"bif-boot-script\". -->\n<textarea id=\"bif-js-b64\" aria-hidden=\"true\" style=\"display:none!important;width:0;height:0;border:0;padding:0;position:absolute;left:-9999px\">d2luZG93LmJpZlBpY2tDbGFzcyA9IGZ1bmN0aW9uIChlbCkgewogIGlmICghZWwpIHJldHVybjsKICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiaWYtY2FsYyIpOwogIGlmICghcm9vdCkgcmV0dXJuOwogIHZhciBjdXN0b20gPSByb290LnF1ZXJ5U2VsZWN0b3IoIiN1c2VDdXN0b21HIik7CiAgaWYgKGN1c3RvbSAmJiBjdXN0b20uY2hlY2tlZCkgcmV0dXJuOwogIHZhciBnbWluID0gcm9vdC5xdWVyeVNlbGVjdG9yKCIjR21pbiIpOwogIHZhciBnbWF4ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCIjR21heCIpOwogIGlmICghZ21pbiB8fCAhZ21heCkgcmV0dXJuOwogIHZhciBtbiA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1nbWluIik7CiAgdmFyIG14ID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWdtYXgiKTsKICBpZiAobW4gPT0gbnVsbCB8fCBteCA9PSBudWxsKSByZXR1cm47CiAgZ21pbi52YWx1ZSA9IG1uOwogIGdtYXgudmFsdWUgPSBteDsKfTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogIHZhciB0ID0gZS50YXJnZXQ7CiAgaWYgKCF0KSByZXR1cm47CiAgdmFyIGxhYiA9IHQuY2xvc2VzdCA\/IHQuY2xvc2VzdCgiI2NsYXNzQ2hpcHMgLmNoaXAiKSA6IG51bGw7CiAgaWYgKCFsYWIpIHJldHVybjsKICB2YXIgaW5wID0gKHQudGFnTmFtZSA9PT0gIklOUFVUIikgPyB0IDogbGFiLnF1ZXJ5U2VsZWN0b3IoImlucHV0Iik7CiAgaWYgKGlucCkgd2luZG93LmJpZlBpY2tDbGFzcyhpbnApOwp9LCB0cnVlKTsKCihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvKiBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgICBJU08gMjg2LTEgc3RhbmRhcmQgdG9sZXJhbmNlcyBJVDVcdTIwMTNJVDggKFx1MDNiY20pIHZzIG5vbWluYWwgc2l6ZSAobW0pCiAgICAgU291cmNlOiBJU08gMjg2LTE6MjAxMCBUYWJsZSAxCiAgICAgXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwICovCiAgY29uc3QgU0laRV9JVCA9IFszLCA2LCAxMCwgMTgsIDMwLCA1MCwgODAsIDEyMCwgMTgwLCAyNTAsIDMxNSwgNDAwLCA1MDBdOwogIGNvbnN0IElUID0gewogICAgNTogWzQsIDUsIDYsIDgsIDksIDExLCAxMywgMTUsIDE4LCAyMCwgMjMsIDI1LCAyN10sCiAgICA2OiBbNiwgOCwgOSwgMTEsIDEzLCAxNiwgMTksIDIyLCAyNSwgMjksIDMyLCAzNiwgNDBdLAogICAgNzogWzEwLCAxMiwgMTUsIDE4LCAyMSwgMjUsIDMwLCAzNSwgNDAsIDQ2LCA1MiwgNTcsIDYzXSwKICAgIDg6IFsxNCwgMTgsIDIyLCAyNywgMzMsIDM5LCA0NiwgNTQsIDYzLCA3MiwgODEsIDg5LCA5N10KICB9OwoKICAvKiBcdTAzOTQgdXNlZCBmb3IgSywgTSwgTiAoSVRcdTIyNjQ4KSBhbmQgUCAoSVRcdTIyNjQ3KSBob2xlIGRldmlhdGlvbnMgXHUyMDE0IElTTyAyODYtMSBUYWJsZSAzICovCiAgY29uc3QgREVMVEEgPSBbMCwgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgNCwgNCwgNCwgNV07CgogIGZ1bmN0aW9uIHNpemVJbmRleChkKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFNJWkVfSVQubGVuZ3RoOyBpKyspIGlmIChkIDw9IFNJWkVfSVRbaV0pIHJldHVybiBpOwogICAgcmV0dXJuIFNJWkVfSVQubGVuZ3RoIC0gMTsKICB9CiAgZnVuY3Rpb24gaXRHcmFkZShkLCBuKSB7IHJldHVybiBJVFtuXVtzaXplSW5kZXgoZCldOyB9CiAgZnVuY3Rpb24gZGVsdGFJU08oZCkgeyByZXR1cm4gREVMVEFbc2l6ZUluZGV4KGQpXTsgfQoKICAvKiBTaGFmdCBmdW5kYW1lbnRhbCBkZXZpYXRpb25zIGVpIChcdTAzYmNtKSwgSVNPIDI4Ni0yOjIwMTAuIGVzID0gZWkgKyBJVC4gKi8KICBmdW5jdGlvbiBzaGFmdEVpKGxldHRlciwgZCkgewogICAgY29uc3QgTCA9IGxldHRlci50b0xvd2VyQ2FzZSgpOwogICAgY29uc3Qgcm93ID0gKGN1dHMsIHZhbHMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXRzLmxlbmd0aDsgaSsrKSBpZiAoZCA8PSBjdXRzW2ldKSByZXR1cm4gdmFsc1tpXTsKICAgICAgcmV0dXJuIHZhbHNbdmFscy5sZW5ndGggLSAxXTsKICAgIH07CiAgICBjb25zdCB0YWJsZXMgPSB7CiAgICAgIGs6IFswLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCA0LCA0LCA0LCA1XSwKICAgICAgbTogWzIsIDQsIDYsIDcsIDgsIDksIDExLCAxMywgMTUsIDE3LCAyMCwgMjEsIDIzXSwKICAgICAgbjogWzQsIDgsIDEwLCAxMiwgMTUsIDE3LCAyMCwgMjMsIDI3LCAzMSwgMzQsIDM3LCA0MF0sCiAgICAgIHA6IFs2LCAxMiwgMTUsIDE4LCAyMiwgMjYsIDMyLCAzNywgNDMsIDUwLCA1NiwgNjIsIDY4XQogICAgfTsKICAgIGlmICh0YWJsZXNbTF0pIHJldHVybiB0YWJsZXNbTF1bc2l6ZUluZGV4KGQpXTsKICAgIGlmIChMID09PSAiciIpIHsKICAgICAgcmV0dXJuIHJvdygKICAgICAgICBbMywgNiwgMTAsIDE4LCAzMCwgNTAsIDY1LCA4MCwgMTAwLCAxMjAsIDE0MCwgMTYwLCAxODAsIDIwMCwgMjI1LCAyNTAsIDI4MCwgMzE1LCAzNTUsIDQwMCwgNDUwLCA1MDBdLAogICAgICAgIFsxMCwgMTUsIDE5LCAyMywgMjgsIDM0LCA0MSwgNDMsIDUxLCA1NCwgNjMsIDY1LCA2OCwgNzcsIDgwLCA4NCwgOTQsIDk4LCAxMDgsIDExNCwgMTI2LCAxMzJdCiAgICAgICk7CiAgICB9CiAgICBpZiAoTCA9PT0gInMiKSB7CiAgICAgIHJldHVybiByb3coCiAgICAgICAgWzMsIDYsIDEwLCAxOCwgMzAsIDUwLCA2NSwgODAsIDEwMCwgMTIwLCAxNDAsIDE2MCwgMTgwLCAyMDAsIDIyNSwgMjUwLCAyODAsIDMxNSwgMzU1LCA0MDAsIDQ1MCwgNTAwXSwKICAgICAgICBbMTQsIDE5LCAyMywgMjgsIDM1LCA0MywgNTMsIDU5LCA3MSwgNzksIDkyLCAxMDAsIDEwOCwgMTIyLCAxMzAsIDE0MCwgMTU4LCAxNzAsIDE5MCwgMjA4LCAyMzIsIDI1Ml0KICAgICAgKTsKICAgIH0KICAgIHJldHVybiAwOwogIH0KCiAgZnVuY3Rpb24gc2hhZnRMaW1pdHMoY29kZSwgZCkgewogICAgY29uc3QgbSA9IFN0cmluZyhjb2RlKS5tYXRjaCgvXihbYS16XSspKFxkKykkL2kpOwogICAgaWYgKCFtKSByZXR1cm4geyBlaTogMCwgZXM6IDAsIGl0OiAwIH07CiAgICBjb25zdCBsZXR0ZXIgPSBtWzFdLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBncmFkZSA9IHBhcnNlSW50KG1bMl0sIDEwKTsKICAgIGNvbnN0IGl0ID0gaXRHcmFkZShkLCBncmFkZSk7CiAgICBpZiAobGV0dGVyID09PSAianMiKSB7CiAgICAgIGNvbnN0IGhhbGYgPSBpdCAvIDI7CiAgICAgIHJldHVybiB7IGVpOiAtaGFsZiwgZXM6IGhhbGYsIGl0IH07CiAgICB9CiAgICBpZiAobGV0dGVyID09PSAiaCIpIHJldHVybiB7IGVpOiAtaXQsIGVzOiAwLCBpdCB9OwogICAgY29uc3QgZWkgPSBzaGFmdEVpKGxldHRlciwgZCk7CiAgICByZXR1cm4geyBlaTogZWksIGVzOiBlaSArIGl0LCBpdCB9OwogIH0KCiAgLyogSVNPIDI4Ni0yOjIwMTAgaG9sZSBFUyBmb3IgZ3JhZGUgNyAoXHUwM2JjbSkuIEVJID0gRVMgXHUyMjEyIElUNy4KICAgICBKIGFuZCBLIGFyZSB0YWJ1bGF0ZWQgKEsgaXMgbm90IGEgc3RyaWN0IGludmVyc2Ugb2YgaykuCiAgICAgTSwgTiwgUCB1c2UgaW52ZXJzZSBzaGFmdCBkZXZpYXRpb24gKyBcdTAzOTQgKElTTyAyODYtMSBcdTAwYTc1LjMuMiwgSVQgXHUyMjY0IDcvOCkuICovCiAgY29uc3QgSjdfRVMgPSBbNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYsIDIwLCAyMiwgMjUsIDI2LCAyOSwgMzNdOwogIGNvbnN0IEs3X0VTID0gWzAsIDAsIDAsIDEsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDVdOwoKICBmdW5jdGlvbiBob2xlTGltaXRzKGNvZGUsIEQpIHsKICAgIGNvbnN0IG0gPSBTdHJpbmcoY29kZSkubWF0Y2goL14oW0EtWl0rKShcZCspJC9pKTsKICAgIGlmICghbSkgcmV0dXJuIHsgRUk6IDAsIEVTOiAwLCBpdDogMCB9OwogICAgY29uc3QgbGV0dGVyID0gbVsxXS50b1VwcGVyQ2FzZSgpOwogICAgY29uc3QgZ3JhZGUgPSBwYXJzZUludChtWzJdLCAxMCk7CiAgICBjb25zdCBpdCA9IGl0R3JhZGUoRCwgZ3JhZGUpOwogICAgY29uc3QgaWR4ID0gc2l6ZUluZGV4KEQpOwogICAgY29uc3QgZGx0ID0gZGVsdGFJU08oRCk7CgogICAgaWYgKGxldHRlciA9PT0gIkgiKSByZXR1cm4geyBFSTogMCwgRVM6IGl0LCBpdCB9OwogICAgaWYgKGxldHRlciA9PT0gIkpTIikgcmV0dXJuIHsgRUk6IC1pdCAvIDIsIEVTOiBpdCAvIDIsIGl0IH07CiAgICBpZiAobGV0dGVyID09PSAiSiIpIHsKICAgICAgY29uc3QgRVMgPSBKN19FU1tpZHhdOwogICAgICByZXR1cm4geyBFSTogRVMgLSBpdCwgRVM6IEVTLCBpdCB9OwogICAgfQogICAgaWYgKGxldHRlciA9PT0gIksiKSB7CiAgICAgIGNvbnN0IEVTID0gSzdfRVNbaWR4XTsKICAgICAgcmV0dXJuIHsgRUk6IEVTIC0gaXQsIEVTOiBFUywgaXQgfTsKICAgIH0KICAgIGNvbnN0IHNoYWZ0TGV0dGVyID0gbGV0dGVyLnRvTG93ZXJDYXNlKCk7CiAgICBsZXQgRVMgPSAtc2hhZnRFaShzaGFmdExldHRlciwgRCk7CiAgICBpZiAoKGxldHRlciA9PT0gIk0iIHx8IGxldHRlciA9PT0gIk4iKSAmJiBncmFkZSA8PSA4KSBFUyArPSBkbHQ7CiAgICBpZiAoKGxldHRlciA9PT0gIlAiIHx8IGxldHRlciA9PT0gIlIiIHx8IGxldHRlciA9PT0gIlMiKSAmJiBncmFkZSA8PSA3KSBFUyArPSBkbHQ7CiAgICByZXR1cm4geyBFSTogRVMgLSBpdCwgRVM6IEVTLCBpdCB9OwogIH0KCiAgLyogSVNPIDQ5MjoyMDE0IE5vcm1hbCBjbGFzcyBcdTIwMTQgaW5uZXIgcmluZyBtZWFuIGJvcmUgZGV2aWF0aW9uIFx1MDM5NGRtcCAoXHUwM2JjbSkgKi8KICBmdW5jdGlvbiBpc280OTJCb3JlKGQpIHsKICAgIGNvbnN0IGN1dHMgPSBbMTAsIDE4LCAzMCwgNTAsIDgwLCAxMjAsIDE4MCwgMjUwLCAzMTUsIDQwMCwgNTAwXTsKICAgIGNvbnN0IGxvID0gWy04LCAtOCwgLTEwLCAtMTIsIC0xNSwgLTIwLCAtMjUsIC0zMCwgLTM1LCAtNDAsIC00NV07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1dHMubGVuZ3RoOyBpKyspIGlmIChkIDw9IGN1dHNbaV0pIHJldHVybiB7IGhpOiAwLCBsbzogbG9baV0gfTsKICAgIHJldHVybiB7IGhpOiAwLCBsbzogLTUwIH07CiAgfQogIC8qIElTTyA0OTIgTm9ybWFsIGNsYXNzIFx1MjAxNCBvdXRlciByaW5nIG1lYW4gT0QgZGV2aWF0aW9uIFx1MDM5NERtcCAoXHUwM2JjbSkgKi8KICBmdW5jdGlvbiBpc280OTJPRChEKSB7CiAgICBjb25zdCBjdXRzID0gWzE4LCAzMCwgNTAsIDgwLCAxMjAsIDE1MCwgMTgwLCAyNTAsIDMxNSwgNDAwLCA1MDBdOwogICAgY29uc3QgbG8gPSBbLTgsIC05LCAtMTEsIC0xMywgLTE1LCAtMTgsIC0yNSwgLTMwLCAtMzUsIC00MCwgLTQ1XTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3V0cy5sZW5ndGg7IGkrKykgaWYgKEQgPD0gY3V0c1tpXSkgcmV0dXJuIHsgaGk6IDAsIGxvOiBsb1tpXSB9OwogICAgcmV0dXJuIHsgaGk6IDAsIGxvOiAtNTAgfTsKICB9CgogIC8qIElTTyA1NzUzLTE6MjAwOSBUYWJsZSAxIFx1MjAxNCByYWRpYWwgY2xlYXJhbmNlIG9mIHJhZGlhbC1jb250YWN0IGdyb292ZSBiYWxsIGJlYXJpbmdzIChcdTAzYmNtKSAqLwogIGNvbnN0IFJJQ19ER0IgPSBbCiAgICB7IGQ6IDEwLCBDMjogWzAsIDddLCBDTjogWzIsIDEzXSwgQzM6IFs4LCAyM10sIEM0OiBbMTQsIDI5XSwgQzU6IFsyMCwgMzddIH0sCiAgICB7IGQ6IDE4LCBDMjogWzAsIDldLCBDTjogWzMsIDE4XSwgQzM6IFsxMSwgMjVdLCBDNDogWzE4LCAzM10sIEM1OiBbMjUsIDQ1XSB9LAogICAgeyBkOiAyNCwgQzI6IFswLCAxMF0sIENOOiBbNSwgMjBdLCBDMzogWzEzLCAyOF0sIEM0OiBbMjAsIDM2XSwgQzU6IFsyOCwgNDhdIH0sCiAgICB7IGQ6IDMwLCBDMjogWzEsIDExXSwgQ046IFs1LCAyMF0sIEMzOiBbMTMsIDI4XSwgQzQ6IFsyMywgNDFdLCBDNTogWzMwLCA1M10gfSwKICAgIHsgZDogNDAsIEMyOiBbMSwgMTFdLCBDTjogWzYsIDIwXSwgQzM6IFsxNSwgMzNdLCBDNDogWzI4LCA0Nl0sIEM1OiBbNDAsIDY0XSB9LAogICAgeyBkOiA1MCwgQzI6IFsxLCAxMV0sIENOOiBbNiwgMjNdLCBDMzogWzE4LCAzNl0sIEM0OiBbMzAsIDUxXSwgQzU6IFs0NSwgNzNdIH0sCiAgICB7IGQ6IDY1LCBDMjogWzEsIDE1XSwgQ046IFs4LCAyOF0sIEMzOiBbMjMsIDQzXSwgQzQ6IFszOCwgNjFdLCBDNTogWzU1LCA5MF0gfSwKICAgIHsgZDogODAsIEMyOiBbMSwgMTVdLCBDTjogWzEwLCAzMF0sIEMzOiBbMjUsIDUxXSwgQzQ6IFs0NiwgNzFdLCBDNTogWzY1LCAxMDVdIH0sCiAgICB7IGQ6IDEwMCwgQzI6IFsxLCAxOF0sIENOOiBbMTIsIDM2XSwgQzM6IFszMCwgNThdLCBDNDogWzUzLCA4NF0sIEM1OiBbNzUsIDEyMF0gfSwKICAgIHsgZDogMTIwLCBDMjogWzIsIDIwXSwgQ046IFsxNSwgNDFdLCBDMzogWzM2LCA2Nl0sIEM0OiBbNjEsIDk3XSwgQzU6IFs5MCwgMTQwXSB9LAogICAgeyBkOiAxNDAsIEMyOiBbMiwgMjNdLCBDTjogWzE4LCA0OF0sIEMzOiBbNDEsIDgxXSwgQzQ6IFs3MSwgMTE0XSwgQzU6IFsxMDUsIDE2MF0gfSwKICAgIHsgZDogMTYwLCBDMjogWzIsIDIzXSwgQ046IFsxOCwgNTNdLCBDMzogWzQ2LCA5MV0sIEM0OiBbODEsIDEzMF0sIEM1OiBbMTIwLCAxODBdIH0sCiAgICB7IGQ6IDE4MCwgQzI6IFsyLCAyNV0sIENOOiBbMjAsIDYxXSwgQzM6IFs1MywgMTAyXSwgQzQ6IFs5MSwgMTQ3XSwgQzU6IFsxMzUsIDIwMF0gfSwKICAgIHsgZDogMjAwLCBDMjogWzIsIDMwXSwgQ046IFsyNSwgNzFdLCBDMzogWzYzLCAxMTddLCBDNDogWzEwNywgMTYzXSwgQzU6IFsxNTAsIDIzMF0gfSwKICAgIHsgZDogMjUwLCBDMjogWzIsIDQwXSwgQ046IFszMCwgOTVdLCBDMzogWzg1LCAxNjBdLCBDNDogWzE0NSwgMjI1XSwgQzU6IFsyMDUsIDMwMF0gfSwKICAgIHsgZDogMzE1LCBDMjogWzIsIDU1XSwgQ046IFs0MCwgMTE1XSwgQzM6IFsxMDAsIDE5MF0sIEM0OiBbMTc1LCAyNzBdLCBDNTogWzI0NSwgMzcwXSB9LAogICAgeyBkOiA0MDAsIEMyOiBbMywgNzBdLCBDTjogWzU1LCAxNDVdLCBDMzogWzEzMCwgMjQwXSwgQzQ6IFsyMjUsIDM0MF0sIEM1OiBbMzE1LCA0NjBdIH0KICBdOwogIC8qIEN5bGluZHJpY2FsIHJvbGxlciBcdTIwMTQgSVNPIDU3NTMtMSBUYWJsZSAzIChzaW1wbGlmaWVkIHJlcHJlc2VudGF0aXZlIHJhbmdlcykgKi8KICBjb25zdCBSSUNfQ1JCID0gWwogICAgeyBkOiAyNCwgQzI6IFsxMCwgMzBdLCBDTjogWzIwLCA0NV0sIEMzOiBbMzUsIDYwXSwgQzQ6IFs1MCwgNzVdLCBDNTogWzY1LCA5NV0gfSwKICAgIHsgZDogNDAsIEMyOiBbMTIsIDM2XSwgQ046IFsyNSwgNTVdLCBDMzogWzQ1LCA3NV0sIEM0OiBbNjUsIDEwMF0sIEM1OiBbOTAsIDEzMF0gfSwKICAgIHsgZDogNTAsIEMyOiBbMTUsIDQwXSwgQ046IFszMCwgNjBdLCBDMzogWzUwLCA4MF0sIEM0OiBbNzAsIDExMF0sIEM1OiBbMTAwLCAxNTBdIH0sCiAgICB7IGQ6IDgwLCBDMjogWzIwLCA1NV0sIENOOiBbNDAsIDgwXSwgQzM6IFs3MCwgMTEwXSwgQzQ6IFsxMDAsIDE1MF0sIEM1OiBbMTQwLCAyMDBdIH0sCiAgICB7IGQ6IDEyMCwgQzI6IFsyNSwgNzBdLCBDTjogWzUwLCAxMDVdLCBDMzogWzkwLCAxNDVdLCBDNDogWzEzMCwgMjAwXSwgQzU6IFsxODAsIDI2MF0gfSwKICAgIHsgZDogMTgwLCBDMjogWzM1LCA5NV0sIENOOiBbNzAsIDE0NV0sIEMzOiBbMTIwLCAyMDBdLCBDNDogWzE4MCwgMjcwXSwgQzU6IFsyNTAsIDM2MF0gfSwKICAgIHsgZDogMjUwLCBDMjogWzUwLCAxMjVdLCBDTjogWzkwLCAxODVdLCBDMzogWzE2MCwgMjYwXSwgQzQ6IFsyMzAsIDM1MF0sIEM1OiBbMzIwLCA0NjBdIH0sCiAgICB7IGQ6IDQwMCwgQzI6IFs3MCwgMTc1XSwgQ046IFsxMzAsIDI2MF0sIEMzOiBbMjIwLCAzNjBdLCBDNDogWzMyMCwgNDgwXSwgQzU6IFs0NDAsIDY0MF0gfQogIF07CgogIGZ1bmN0aW9uIHJpY1JhbmdlKHR5cGUsIGNscywgZCkgewogICAgY29uc3QgdGJsID0gdHlwZSA9PT0gImRnYiIgPyBSSUNfREdCIDogUklDX0NSQjsKICAgIGxldCByb3cgPSB0YmxbdGJsLmxlbmd0aCAtIDFdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YmwubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGQgPD0gdGJsW2ldLmQpIHsgcm93ID0gdGJsW2ldOyBicmVhazsgfQogICAgfQogICAgY29uc3Qga2V5ID0gY2xzID09PSAiQ04iID8gIkNOIiA6IGNsczsKICAgIHJldHVybiByb3dba2V5XSB8fCByb3cuQ047CiAgfQoKICBjb25zdCBTSEFGVF9GSVRTID0gWyJqczUiLCAiazUiLCAibTUiLCAibjYiLCAicDYiLCAicjYiLCAiaDYiXTsKICBjb25zdCBIT1VTSU5HX0ZJVFMgPSBbIkg3IiwgIkpTNyIsICJKNyIsICJLNyIsICJNNyIsICJONyIsICJQNyJdOwogIGNvbnN0IENMUl9DTEFTUyA9IFsiQzIiLCAiQ04iLCAiQzMiLCAiQzQiLCAiQzUiXTsKCiAgY29uc3QgTUFURVJJQUxTID0gewogICAgY2FyYm9uX3N0ZWVsOiB7IG5hbWU6ICJDYXJib24gc3RlZWwgKEM0NSAvIDEwNDUpIiwgRTogMjEwMDAwLCBudTogMC4zMCwgYWxwaGE6IDExLjVlLTYsIFJlOiAzNTUgfSwKICAgIGFsbG95X3N0ZWVsOiB7IG5hbWU6ICJBbGxveSBzdGVlbCAoNDJDck1vNCkiLCBFOiAyMTAwMDAsIG51OiAwLjMwLCBhbHBoYTogMTEuNWUtNiwgUmU6IDc1MCB9LAogICAgc3RhaW5sZXNzOiB7IG5hbWU6ICJTdGFpbmxlc3Mgc3RlZWwgKEFJU0kgMzA0KSIsIEU6IDE5MzAwMCwgbnU6IDAuMjksIGFscGhhOiAxNy4zZS02LCBSZTogMjE1IH0sCiAgICBjYXN0X2lyb246IHsgbmFtZTogIkNhc3QgaXJvbiAoRU4tR0pMLTI1MCkiLCBFOiAxMTAwMDAsIG51OiAwLjI2LCBhbHBoYTogMTAuMGUtNiwgUmU6IDE2NSB9LAogICAgYnJvbnplOiB7IG5hbWU6ICJUaW4gYnJvbnplIChDdVNuMTIpIiwgRTogMTA1MDAwLCBudTogMC4zNCwgYWxwaGE6IDE4LjBlLTYsIFJlOiAxNTAgfSwKICAgIGFsdW1pbnVtOiB7IG5hbWU6ICJBbHVtaW5pdW0gKEFsU2kxME1nIC8gNjA2MSkiLCBFOiA3MTAwMCwgbnU6IDAuMzMsIGFscGhhOiAyMy4wZS02LCBSZTogMjQwIH0KICB9OwogIGNvbnN0IFJJTkcgPSB7IEU6IDIxMDAwMCwgbnU6IDAuMzAsIGFscGhhOiAxMi4wZS02LCBSZTogMTcwMCB9OyAvKiAxMDBDcjYgLyBBSVNJIDUyMTAwICovCgogIGZ1bmN0aW9uIGdldFJvb3QoKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmlmLWNhbGMiKTsgfQogIGNvbnN0ICQgPSAoaWQpID0+IHsKICAgIGNvbnN0IHIgPSBnZXRSb290KCk7CiAgICByZXR1cm4gKHIgJiYgci5xdWVyeVNlbGVjdG9yKCIjIiArIGlkKSkgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIH07CiAgY29uc3Qgc3RhdGUgPSB7IHVuaXQ6ICJtZXRyaWMiLCBsb2NrRkU6IGZhbHNlIH07CgogIGZ1bmN0aW9uIG51bShpZCkgewogICAgY29uc3QgZWwgPSAkKGlkKTsKICAgIGlmICghZWwpIHJldHVybiAwOwogICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOwogICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2KSA\/IHYgOiAwOwogIH0KICBmdW5jdGlvbiB0b01NKHYpIHsgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIgPyB2ICogMjUuNCA6IHY7IH0KICBmdW5jdGlvbiB0b0ModikgeyByZXR1cm4gc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIiA\/ICh2IC0gMzIpICogNSAvIDkgOiB2OyB9CiAgLyogU3RyZXNzIGlucHV0cyBhcmUgc3RvcmVkIGFzIE4vbW1cdTAwYjIgZXZlbiBpbiBpbXBlcmlhbCBkaXNwbGF5IChjb252ZXJ0ZWQgb24gcmVhZCkgKi8KICBmdW5jdGlvbiB0b01QYSh2KSB7IHJldHVybiBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gdiAvIDE0NS4wMzc3IDogdjsgfQoKICBmdW5jdGlvbiBmbXRMZW4obW0sIGRpZ2l0cykgewogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobW0pKSByZXR1cm4gIi0iOwogICAgdmFyIG4gPSAoZGlnaXRzID09IG51bGwpID8gKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIgPyA0IDogMykgOiBkaWdpdHM7CiAgICBpZiAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIikgcmV0dXJuIChtbSAvIDI1LjQpLnRvRml4ZWQobik7CiAgICByZXR1cm4gbW0udG9GaXhlZChuKTsKICB9CiAgZnVuY3Rpb24gZm10VW0odW0pIHsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHVtKSkgcmV0dXJuICJcdTIwMTQiOwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHJldHVybiAodW0gKiAzOS4zNzAxKS50b0ZpeGVkKDEpICsgIiBcdTAzYmNpbiI7CiAgICByZXR1cm4gdW0udG9GaXhlZCgxKSArICIgXHUwM2JjbSI7CiAgfQogIGZ1bmN0aW9uIGZtdFRlbXAoYykgewogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYykpIHJldHVybiAiXHUyMDE0IjsKICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSByZXR1cm4gKGMgKiA5IC8gNSArIDMyKS50b0ZpeGVkKDApICsgIiBcdTAwYjBGIjsKICAgIHJldHVybiBjLnRvRml4ZWQoMSkgKyAiIFx1MDBiMEMiOwogIH0KICBmdW5jdGlvbiBmbXRGb3JjZU4oTikgewogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoTikpIHJldHVybiAiXHUyMDE0IjsKICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSByZXR1cm4gKE4gKiAwLjIyNDgwOSkudG9GaXhlZCgwKSArICIgbGJmIjsKICAgIGlmIChNYXRoLmFicyhOKSA+PSAxMDAwKSByZXR1cm4gKE4gLyAxMDAwKS50b0ZpeGVkKDIpICsgIiBrTiI7CiAgICByZXR1cm4gTi50b0ZpeGVkKDApICsgIiBOIjsKICB9CiAgZnVuY3Rpb24gZm10U3RyZXNzKE1QYSkgewogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoTVBhKSkgcmV0dXJuICJcdTIwMTQiOwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHJldHVybiAoTVBhICogMTQ1LjAzOCkudG9GaXhlZCgwKSArICIgcHNpIjsKICAgIHJldHVybiBNUGEudG9GaXhlZCgxKSArICIgTi9tbVx1MDBiMiI7CiAgfQogIGZ1bmN0aW9uIHVMZW4oKSB7IHJldHVybiBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gIihpbikiIDogIihtbSkiOyB9CiAgZnVuY3Rpb24gdVRlbXAoKSB7IHJldHVybiBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gIihcdTAwYjBGKSIgOiAiKFx1MDBiMEMpIjsgfQogIGZ1bmN0aW9uIHVTdHJlc3MoKSB7IHJldHVybiBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gIihwc2kpIiA6ICIoTi9tbVx1MDBiMikiOyB9CgogIGZ1bmN0aW9uIGZpbGxTZWxlY3RJZkVtcHR5KGlkLCBvcHRpb25zLCBzZWxlY3RlZCkgewogICAgY29uc3QgZWwgPSAkKGlkKTsKICAgIGlmICghZWwpIHJldHVybjsKICAgIGlmICghZWwub3B0aW9ucyB8fCBlbC5vcHRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG8pIHsKICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKICAgICAgICBvcHQudmFsdWUgPSB0eXBlb2YgbyA9PT0gInN0cmluZyIgPyBvIDogby52YWx1ZTsKICAgICAgICBvcHQudGV4dENvbnRlbnQgPSB0eXBlb2YgbyA9PT0gInN0cmluZyIgPyBvIDogby5sYWJlbDsKICAgICAgICBlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChzZWxlY3RlZCkgZWwudmFsdWUgPSBzZWxlY3RlZDsKICB9CgogIGZ1bmN0aW9uIHBvcHVsYXRlU2VsZWN0cygpIHsKICAgIGNvbnN0IG1hdE9wdHMgPSBPYmplY3Qua2V5cyhNQVRFUklBTFMpLm1hcCgoaykgPT4gKHsgdmFsdWU6IGssIGxhYmVsOiBNQVRFUklBTFNba10ubmFtZSB9KSk7CiAgICBmaWxsU2VsZWN0SWZFbXB0eSgic2hhZnRNYXQiLCBtYXRPcHRzLCAiY2FyYm9uX3N0ZWVsIik7CiAgICBmaWxsU2VsZWN0SWZFbXB0eSgiaG91c01hdCIsIG1hdE9wdHMsICJjYXN0X2lyb24iKTsKICAgIGZpbGxTZWxlY3RJZkVtcHR5KCJzaGFmdEZpdCIsIFNIQUZUX0ZJVFMsICJrNSIpOwogICAgZmlsbFNlbGVjdElmRW1wdHkoImhvdXNpbmdGaXQiLCBIT1VTSU5HX0ZJVFMsICJINyIpOwogICAgYXBwbHlNYXRlcmlhbCgic2hhZnQiKTsKICAgIGFwcGx5TWF0ZXJpYWwoImhvdXMiKTsKICAgIGF1dG9GRSgpOwogICAgYXBwbHlJU09MaW1pdHNUb0N1c3RvbSgpOwogICAgYXBwbHlSSUMoKTsKICB9CgogIGZ1bmN0aW9uIGFjdGl2ZUNoaXAoaWQpIHsKICAgIGNvbnN0IGVsID0gJChpZCk7CiAgICBpZiAoIWVsKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5xdWVyeVNlbGVjdG9yKCJpbnB1dFt0eXBlPSdyYWRpbyddOmNoZWNrZWQiKTsKICAgIGlmIChjaGVja2VkKSByZXR1cm4gY2hlY2tlZC52YWx1ZTsKICAgIGNvbnN0IGEgPSBlbC5xdWVyeVNlbGVjdG9yKCIuY2hpcC5pcy1hY3RpdmUiKTsKICAgIHJldHVybiBhID8gKGEuZ2V0QXR0cmlidXRlKCJkYXRhLXYiKSB8fCBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKSkgOiBudWxsOwogIH0KICBmdW5jdGlvbiBzZXRBY3RpdmVDaGlwKGlkLCB2YWx1ZSkgewogICAgY29uc3QgZWwgPSAkKGlkKTsKICAgIGlmICghZWwpIHJldHVybjsKICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9J3JhZGlvJ10iKS5mb3JFYWNoKChpbnApID0+IHsKICAgICAgaW5wLmNoZWNrZWQgPSBpbnAudmFsdWUgPT09IHZhbHVlOwogICAgfSk7CiAgICBlbC5xdWVyeVNlbGVjdG9yQWxsKCIuY2hpcCIpLmZvckVhY2goKGIpID0+IHsKICAgICAgY29uc3QgdiA9IChiLnF1ZXJ5U2VsZWN0b3IoImlucHV0IikgJiYgYi5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLnZhbHVlKSB8fCBiLmdldEF0dHJpYnV0ZSgiZGF0YS12Iik7CiAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgiaXMtYWN0aXZlIiwgdiA9PT0gdmFsdWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsKHdoaWNoKSB7CiAgICBjb25zdCBrZXkgPSB3aGljaCA9PT0gInNoYWZ0IiA\/ICQoInNoYWZ0TWF0IikudmFsdWUgOiAkKCJob3VzTWF0IikudmFsdWU7CiAgICBjb25zdCBtID0gTUFURVJJQUxTW2tleV07CiAgICBpZiAoIW0pIHJldHVybjsKICAgIGlmICh3aGljaCA9PT0gInNoYWZ0IikgewogICAgICAkKCJFcyIpLnZhbHVlID0gbS5FOwogICAgICAkKCJudXMiKS52YWx1ZSA9IG0ubnU7CiAgICAgICQoIlJlIikudmFsdWUgPSBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gKG0uUmUgKiAxNDUuMDM4KS50b0ZpeGVkKDApIDogbS5SZTsKICAgICAgJCgiYWxwaGFTIikudmFsdWUgPSBtLmFscGhhOwogICAgfSBlbHNlIHsKICAgICAgJCgiYWxwaGFIIikudmFsdWUgPSBtLmFscGhhOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXV0b0ZFKCkgewogICAgaWYgKHN0YXRlLmxvY2tGRSkgcmV0dXJuOwogICAgY29uc3QgZCA9IHRvTU0obnVtKCJkIikpLCBEID0gdG9NTShudW0oIkQiKSk7CiAgICBpZiAoZCA8PSAwIHx8IEQgPD0gZCkgcmV0dXJuOwogICAgY29uc3QgRiA9IDAuMjUgKiAoRCArIDMgKiBkKTsKICAgIGNvbnN0IEUgPSAwLjI1ICogKDMgKiBEICsgZCk7CiAgICBjb25zdCBkZWMgPSBzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiID8gNCA6IDI7CiAgICAkKCJGIikudmFsdWUgPSAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIiA\/IEYgLyAyNS40IDogRikudG9GaXhlZChkZWMpOwogICAgJCgiRSIpLnZhbHVlID0gKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIgPyBFIC8gMjUuNCA6IEUpLnRvRml4ZWQoZGVjKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5SVNPTGltaXRzVG9DdXN0b20oKSB7CiAgICBjb25zdCBkID0gdG9NTShudW0oImQiKSksIEQgPSB0b01NKG51bSgiRCIpKTsKICAgIGlmIChkIDw9IDApIHJldHVybjsKICAgIGNvbnN0IHNsID0gc2hhZnRMaW1pdHMoJCgic2hhZnRGaXQiKS52YWx1ZSwgZCk7CiAgICBjb25zdCBobCA9IGhvbGVMaW1pdHMoJCgiaG91c2luZ0ZpdCIpLnZhbHVlLCBEKTsKICAgIGNvbnN0IGJyID0gaXNvNDkyQm9yZShkKTsKICAgIGNvbnN0IG9kID0gaXNvNDkyT0QoRCk7CiAgICBjb25zdCBzaGFmdElzbyA9ICQoInNoYWZ0TW9kZSIpID8gJCgic2hhZnRNb2RlIikudmFsdWUgPT09ICJpc28iIDogdHJ1ZTsKICAgIGNvbnN0IGhvdXNJc28gPSAkKCJob3VzaW5nTW9kZSIpID8gJCgiaG91c2luZ01vZGUiKS52YWx1ZSA9PT0gImlzbyIgOiB0cnVlOwogICAgWyJzaGFmdEVpIiwgInNoYWZ0RXMiLCAiYm9yZUhpIiwgImJvcmVMbyJdLmZvckVhY2goKGlkKSA9PiB7IGlmICgkKGlkKSkgJChpZCkucmVhZE9ubHkgPSBzaGFmdElzbzsgfSk7CiAgICBbImhvdXNFaSIsICJob3VzRXMiLCAib2RIaSIsICJvZExvIl0uZm9yRWFjaCgoaWQpID0+IHsgaWYgKCQoaWQpKSAkKGlkKS5yZWFkT25seSA9IGhvdXNJc287IH0pOwogICAgaWYgKHNoYWZ0SXNvKSB7CiAgICAgICQoInNoYWZ0RWkiKS52YWx1ZSA9IHNsLmVpLnRvRml4ZWQoMSk7CiAgICAgICQoInNoYWZ0RXMiKS52YWx1ZSA9IHNsLmVzLnRvRml4ZWQoMSk7CiAgICAgICQoImJvcmVIaSIpLnZhbHVlID0gYnIuaGk7CiAgICAgICQoImJvcmVMbyIpLnZhbHVlID0gYnIubG87CiAgICB9CiAgICBpZiAoaG91c0lzbykgewogICAgICAkKCJob3VzRWkiKS52YWx1ZSA9IGhsLkVJLnRvRml4ZWQoMSk7CiAgICAgICQoImhvdXNFcyIpLnZhbHVlID0gaGwuRVMudG9GaXhlZCgxKTsKICAgICAgJCgib2RIaSIpLnZhbHVlID0gb2QuaGk7CiAgICAgICQoIm9kTG8iKS52YWx1ZSA9IG9kLmxvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXBwbHlSSUMoY2xzT3B0KSB7CiAgICBjb25zdCBnbWluID0gJCgiR21pbiIpLCBnbWF4ID0gJCgiR21heCIpOwogICAgaWYgKCFnbWluIHx8ICFnbWF4KSByZXR1cm47CiAgICBpZiAoY2xzT3B0ICYmIHR5cGVvZiBjbHNPcHQgPT09ICJvYmplY3QiKSB7CiAgICAgIGlmIChjbHNPcHQudGFyZ2V0ICYmIGNsc09wdC50YXJnZXQudmFsdWUpIGNsc09wdCA9IGNsc09wdC50YXJnZXQudmFsdWU7CiAgICAgIGVsc2UgY2xzT3B0ID0gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgZCA9IHRvTU0obnVtKCJkIikpIHx8IDUwOwogICAgY29uc3QgY2xzID0gY2xzT3B0IHx8IGFjdGl2ZUNoaXAoImNsYXNzQ2hpcHMiKSB8fCAiQzMiOwogICAgY29uc3QgYnQgPSAkKCJiZWFyaW5nVHlwZSIpOwogICAgY29uc3QgdHlwZSA9IGJ0ICYmIGJ0LnZhbHVlID09PSAiY3JiIiA\/ICJjcmIiIDogImRnYiI7CiAgICBjb25zdCByID0gcmljUmFuZ2UodHlwZSwgY2xzLCBkKSB8fCBbMTgsIDM2XTsKICAgIGNvbnN0IGN1c3RvbSA9ICQoInVzZUN1c3RvbUciKSAmJiAkKCJ1c2VDdXN0b21HIikuY2hlY2tlZDsKICAgIGdtaW4ucmVhZE9ubHkgPSAhY3VzdG9tOwogICAgZ21heC5yZWFkT25seSA9ICFjdXN0b207CiAgICBpZiAoIWN1c3RvbSkgewogICAgICBnbWluLnZhbHVlID0gclswXTsKICAgICAgZ21heC52YWx1ZSA9IHJbMV07CiAgICB9CiAgfQogIHdpbmRvdy5CSUZfYXBwbHlSSUMgPSBhcHBseVJJQzsKCiAgZnVuY3Rpb24gc3luY0Rlcml2ZWRJbnB1dHMoKSB7CiAgICBhdXRvRkUoKTsKICAgIGFwcGx5SVNPTGltaXRzVG9DdXN0b20oKTsKICAgIGFwcGx5UklDKCk7CiAgfQoKICBmdW5jdGlvbiByZXN1bHRzVmlzaWJsZSgpIHsKICAgIHJldHVybiAkKCJyZXN1bHRzUGFuZWwiKSAmJiAhJCgicmVzdWx0c1BhbmVsIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJoaWRkZW4iKTsKICB9CgogIGZ1bmN0aW9uIHJ1bkNhbGN1bGF0ZSgpIHsKICAgIHN5bmNEZXJpdmVkSW5wdXRzKCk7CiAgICBjb21wdXRlKCk7CiAgICAkKCJyZXN1bHRzUGFuZWwiKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKICAgICQoInJlc3VsdHNQYW5lbCIpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogInN0YXJ0IiB9KTsKICB9CiAgd2luZG93LkJJRl9ydW5DYWxjdWxhdGUgPSBydW5DYWxjdWxhdGU7CgogIGZ1bmN0aW9uIGhpZGVSZXN1bHRzKCkgewogICAgJCgicmVzdWx0c1BhbmVsIikuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CiAgfQoKICAvKiBMYW1cdTAwZTkgLyBESU4gNzE5MCBjb250YWN0IHByZXNzdXJlIChOL21tXHUwMGIyKS4gXHUwM2I0LCBkaWFtZXRlcnMgaW4gbW07IEUgaW4gTi9tbVx1MDBiMi4gKi8KICBmdW5jdGlvbiBsYW1lUHJlc3N1cmUoZGVsdGFfbW0sIGQsIGRJbm5lciwgZE91dGVyLCBFX2lubmVyLCBudV9pbm5lciwgRV9vdXRlciwgbnVfb3V0ZXIpIHsKICAgIGlmIChkIDw9IDAgfHwgZGVsdGFfbW0gPD0gMCkgcmV0dXJuIDA7CiAgICBjb25zdCBiMiA9IGQgKiBkOwogICAgY29uc3QgYTIgPSBNYXRoLm1heChkSW5uZXIsIDApICogTWF0aC5tYXgoZElubmVyLCAwKTsKICAgIGNvbnN0IGMyID0gZE91dGVyICogZE91dGVyOwogICAgaWYgKGMyIDw9IGIyICsgMWUtOSkgcmV0dXJuIDA7CiAgICBjb25zdCBDX291dGVyID0gKChjMiArIGIyKSAvIChjMiAtIGIyKSArIG51X291dGVyKSAvIEVfb3V0ZXI7CiAgICBsZXQgQ19pbm5lcjsKICAgIGlmIChhMiA8IDFlLTgpIENfaW5uZXIgPSAoMSAtIG51X2lubmVyKSAvIEVfaW5uZXI7ICAgICAgICAgICAvKiBzb2xpZCAqLwogICAgZWxzZSBpZiAoYTIgPj0gYjIgKiAwLjk4KSByZXR1cm4gMDsKICAgIGVsc2UgQ19pbm5lciA9ICgoYjIgKyBhMikgLyAoYjIgLSBhMikgLSBudV9pbm5lcikgLyBFX2lubmVyOwogICAgY29uc3QgZGVuID0gQ19vdXRlciArIENfaW5uZXI7CiAgICBpZiAoZGVuIDw9IDApIHJldHVybiAwOwogICAgcmV0dXJuIChkZWx0YV9tbSAvIGQpIC8gZGVuOwogIH0KCiAgLyogRGlhbWV0cmFsIGV4cGFuc2lvbiBvZiBpbm5lci1yaW5nIHJhY2V3YXkgKG1tKSB1bmRlciBpbnRlcm5hbCBwcmVzc3VyZSBwLgogICAgIFJhZGlpIGE9ZC8yLCBjPUYvMi4gXHUwM2MzX3QoYykgPSAyIHAgZFx1MDBiMiAvIChGXHUwMGIyIFx1MjIxMiBkXHUwMGIyKSwgXHUwM2MzX3IoYykgPSAwLgogICAgIFJhZGlhbCBkaXNwbGFjZW1lbnQgdSA9IHIgXHUwM2MzX3QgLyBFOyBkaWFtZXRyYWwgXHUwMzk0UklDID0gMnUgPSBGIFx1MDNjM190IC8gRS4KICAgICBGb3Igc29saWQgc3RlZWwgdGhpcyB5aWVsZHMgXHUwMzk0UklDIFx1MjI0OCAwLjc1XHUyMDEzMC44NSBcdTAwZDcgaW50ZXJmZXJlbmNlIChTS0YpLiAqLwogIGZ1bmN0aW9uIHJhY2V3YXlFeHBhbnNpb24ocCwgZCwgRiwgRSwgbnUpIHsKICAgIGlmIChwIDw9IDAgfHwgRiA8PSBkKSByZXR1cm4gMDsKICAgIGNvbnN0IHN0ID0gMiAqIHAgKiBkICogZCAvIChGICogRiAtIGQgKiBkKTsKICAgIHJldHVybiAoRiAvIEUpICogKHN0IC0gbnUgKiAwKTsKICB9CiAgLyogRGlhbWV0cmFsIGNvbnRyYWN0aW9uIG9mIG91dGVyLXJpbmcgcmFjZXdheSB1bmRlciBleHRlcm5hbCBob3VzaW5nIHByZXNzdXJlLiAqLwogIGZ1bmN0aW9uIHJhY2V3YXlDb250cmFjdGlvbihwLCBELCBFX3J3eSwgRW1vZCwgbnUpIHsKICAgIGlmIChwIDw9IDAgfHwgRCA8PSBFX3J3eSkgcmV0dXJuIDA7CiAgICBjb25zdCBzdCA9IDIgKiBwICogRCAqIEQgLyAoRCAqIEQgLSBFX3J3eSAqIEVfcnd5KTsKICAgIHJldHVybiAoRV9yd3kgLyBFbW9kKSAqIHN0OwogIH0KCiAgZnVuY3Rpb24gaG9vcEF0Qm9yZShwLCBkLCBGKSB7CiAgICBpZiAocCA8PSAwIHx8IEYgPD0gZCkgcmV0dXJuIHsgc3Q6IDAsIHNyOiAwLCB2bTogMCB9OwogICAgY29uc3QgYjIgPSBkICogZCwgYzIgPSBGICogRjsKICAgIGNvbnN0IHN0ID0gcCAqIChjMiArIGIyKSAvIChjMiAtIGIyKTsKICAgIGNvbnN0IHNyID0gLXA7CiAgICBjb25zdCB2bSA9IE1hdGguc3FydChzdCAqIHN0ICsgc3IgKiBzciAtIHN0ICogc3IpOwogICAgcmV0dXJuIHsgc3QsIHNyLCB2bSB9OwogIH0KCiAgZnVuY3Rpb24gY2xhc3NpZnlGaXQoaW1pbiwgaW1heCkgewogICAgaWYgKGltaW4gPj0gMCAmJiBpbWF4ID49IDApIHJldHVybiB7IGs6ICJJbnRlcmZlcmVuY2UiLCBjbHM6ICJyaXNrIiB9OwogICAgaWYgKGltYXggPD0gMCAmJiBpbWluIDw9IDApIHJldHVybiB7IGs6ICJDbGVhcmFuY2UiLCBjbHM6ICJvayIgfTsKICAgIHJldHVybiB7IGs6ICJUcmFuc2l0aW9uIiwgY2xzOiAid2FybiIgfTsKICB9CgogIGZ1bmN0aW9uIGNvbXB1dGUoKSB7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudS1sZW4iKS5mb3JFYWNoKChuKSA9PiB7IG4udGV4dENvbnRlbnQgPSB1TGVuKCk7IH0pOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnUtdGVtcCIpLmZvckVhY2goKG4pID0+IHsgbi50ZXh0Q29udGVudCA9IHVUZW1wKCk7IH0pOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnUtc3RyZXNzIikuZm9yRWFjaCgobikgPT4geyBuLnRleHRDb250ZW50ID0gdVN0cmVzcygpOyB9KTsKCiAgICBjb25zdCBkID0gdG9NTShudW0oImQiKSk7CiAgICBjb25zdCBEID0gdG9NTShudW0oIkQiKSk7CiAgICBjb25zdCBCID0gdG9NTShudW0oIkIiKSk7CiAgICBjb25zdCBGID0gdG9NTShudW0oIkYiKSkgfHwgMC4yNSAqIChEICsgMyAqIGQpOwogICAgY29uc3QgRXJ3eSA9IHRvTU0obnVtKCJFIikpIHx8IDAuMjUgKiAoMyAqIEQgKyBkKTsKICAgIGNvbnN0IGRpID0gJCgic2hhZnRTdHJ1Y3QiKS52YWx1ZSA9PT0gImhvbGxvdyIgPyB0b01NKG51bSgiZGkiKSkgOiAwOwogICAgY29uc3QgRGggPSB0b01NKG51bSgiRGgiKSk7CgogICAgaWYgKGQgPD0gMCB8fCBEIDw9IGQgfHwgQiA8PSAwKSB7CiAgICAgICQoInN0YXR1c0Jhbm5lciIpLmNsYXNzTmFtZSA9ICJiYW5uZXIgYmFubmVyLXdhcm4iOwogICAgICAkKCJzdGF0dXNCYW5uZXIiKS50ZXh0Q29udGVudCA9ICJDaGVjayBnZW9tZXRyeTogcmVxdWlyZSBEID4gZCA+IDAgYW5kIEIgPiAwLiI7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhcHBseUlTT0xpbWl0c1RvQ3VzdG9tKCk7CiAgICBhcHBseVJJQygpOwoKICAgIGNvbnN0IGVpID0gbnVtKCJzaGFmdEVpIiksIGVzID0gbnVtKCJzaGFmdEVzIik7CiAgICBjb25zdCBib3JlSGkgPSBudW0oImJvcmVIaSIpLCBib3JlTG8gPSBudW0oImJvcmVMbyIpOwogICAgY29uc3QgRUkgPSBudW0oImhvdXNFaSIpLCBFUyA9IG51bSgiaG91c0VzIik7CiAgICBjb25zdCBvZEhpID0gbnVtKCJvZEhpIiksIG9kTG8gPSBudW0oIm9kTG8iKTsKCiAgICAvKiBTaGFmdCAvIGlubmVyLXJpbmcgaW50ZXJmZXJlbmNlIChcdTAzYmNtKS4gUG9zaXRpdmUgPSBpbnRlcmZlcmVuY2UuICovCiAgICBjb25zdCBJbWluX3MgPSBlaSAtIGJvcmVIaTsKICAgIGNvbnN0IEltYXhfcyA9IGVzIC0gYm9yZUxvOwogICAgLyogSG91c2luZyAvIG91dGVyLXJpbmc6IHJpbmcgT0QgXHUyMjEyIGhvdXNpbmcgYm9yZSAqLwogICAgY29uc3QgSW1pbl9oID0gb2RMbyAtIEVTOwogICAgY29uc3QgSW1heF9oID0gb2RIaSAtIEVJOwoKICAgIGNvbnN0IEVfcyA9IG51bSgiRXMiKSB8fCAyMTAwMDA7CiAgICBjb25zdCBudV9zID0gbnVtKCJudXMiKSB8fCAwLjM7CiAgICBjb25zdCBSZSA9IHRvTVBhKG51bSgiUmUiKSkgfHwgMzU1OwogICAgY29uc3QgRV9oID0gTUFURVJJQUxTWyQoImhvdXNNYXQiKS52YWx1ZV0uRTsKICAgIGNvbnN0IG51X2ggPSBNQVRFUklBTFNbJCgiaG91c01hdCIpLnZhbHVlXS5udTsKICAgIGNvbnN0IGFscGhhUyA9IG51bSgiYWxwaGFTIikgfHwgMTEuNWUtNjsKICAgIGNvbnN0IGFscGhhQiA9IG51bSgiYWxwaGFCIikgfHwgMTJlLTY7CiAgICBjb25zdCBhbHBoYUggPSBudW0oImFscGhhSCIpIHx8IDEwZS02OwogICAgY29uc3QgbXUgPSBwYXJzZUZsb2F0KCQoIm11IikudmFsdWUpIHx8IDAuMTI7CgogICAgY29uc3QgVDAgPSB0b0MobnVtKCJUMCIpKTsKICAgIGNvbnN0IFRpciA9IHRvQyhudW0oIlRpciIpKTsKICAgIGNvbnN0IFRzaCA9IHRvQyhudW0oIlRzIikpOwogICAgY29uc3QgVG9yID0gdG9DKG51bSgiVG9yIikpOwogICAgY29uc3QgVGhzID0gdG9DKG51bSgiVGgiKSk7CgogICAgY29uc3QgZEltaW4gPSBJbWluX3MgLyAxMDAwOyAvKiBtbSAqLwogICAgY29uc3QgZEltYXggPSBJbWF4X3MgLyAxMDAwOwoKICAgIGNvbnN0IHBfbWF4ID0gbGFtZVByZXNzdXJlKE1hdGgubWF4KGRJbWF4LCAwKSwgZCwgZGksIEYsIEVfcywgbnVfcywgUklORy5FLCBSSU5HLm51KTsKICAgIGNvbnN0IHBfbWluID0gbGFtZVByZXNzdXJlKE1hdGgubWF4KGRJbWluLCAwKSwgZCwgZGksIEYsIEVfcywgbnVfcywgUklORy5FLCBSSU5HLm51KTsKCiAgICBjb25zdCBEaF9lZmYgPSBEaCA+IEQgPyBEaCA6IEQgKiAzOyAvKiB0aGljayBob3VzaW5nIGRlZmF1bHQgKi8KICAgIGNvbnN0IHBIX21heCA9IGxhbWVQcmVzc3VyZShNYXRoLm1heChJbWF4X2ggLyAxMDAwLCAwKSwgRCwgRXJ3eSwgRGhfZWZmLCBSSU5HLkUsIFJJTkcubnUsIEVfaCwgbnVfaCk7CiAgICBjb25zdCBwSF9taW4gPSBsYW1lUHJlc3N1cmUoTWF0aC5tYXgoSW1pbl9oIC8gMTAwMCwgMCksIEQsIEVyd3ksIERoX2VmZiwgUklORy5FLCBSSU5HLm51LCBFX2gsIG51X2gpOwoKICAgIGNvbnN0IHJpY0lSX21heCA9IHJhY2V3YXlFeHBhbnNpb24ocF9tYXgsIGQsIEYsIFJJTkcuRSwgUklORy5udSkgKiAxMDAwOyAvKiBcdTAzYmNtICovCiAgICBjb25zdCByaWNJUl9taW4gPSByYWNld2F5RXhwYW5zaW9uKHBfbWluLCBkLCBGLCBSSU5HLkUsIFJJTkcubnUpICogMTAwMDsKICAgIGNvbnN0IHJpY09SX21heCA9IHJhY2V3YXlDb250cmFjdGlvbihwSF9tYXgsIEQsIEVyd3ksIFJJTkcuRSwgUklORy5udSkgKiAxMDAwOwogICAgY29uc3QgcmljT1JfbWluID0gcmFjZXdheUNvbnRyYWN0aW9uKHBIX21pbiwgRCwgRXJ3eSwgUklORy5FLCBSSU5HLm51KSAqIDEwMDA7CgogICAgY29uc3QgZFJJQ19taW4gPSByaWNJUl9taW4gKyByaWNPUl9taW47CiAgICBjb25zdCBkUklDX21heCA9IHJpY0lSX21heCArIHJpY09SX21heDsKCiAgICBjb25zdCBHbWluID0gbnVtKCJHbWluIiksIEdtYXggPSBudW0oIkdtYXgiKTsKICAgIGNvbnN0IEdyZW1fbWluID0gR21pbiAtIGRSSUNfbWF4OwogICAgY29uc3QgR3JlbV9tYXggPSBHbWF4IC0gZFJJQ19taW47CgogICAgY29uc3QgZG0gPSAwLjUgKiAoZCArIEQpOwogICAgLyogSVNPIDE1MjQxLXN0eWxlIHRoZXJtYWwgY2xlYXJhbmNlIGNoYW5nZTogaW5uZXIgaG90dGVyIHRoYW4gb3V0ZXIgcmVkdWNlcyBSSUMgKi8KICAgIGNvbnN0IGRSSUNfdGggPSBhbHBoYUIgKiBkbSAqIChUaXIgLSBUb3IpICogMTAwMDsgLyogXHUwM2JjbSwgcG9zaXRpdmUgPSByZWR1Y3Rpb24gKi8KICAgIGNvbnN0IEdvcF9taW4gPSBHcmVtX21pbiAtIGRSSUNfdGg7CiAgICBjb25zdCBHb3BfbWF4ID0gR3JlbV9tYXggLSBkUklDX3RoOwogICAgY29uc3QgR29wX21lYW4gPSAwLjUgKiAoR21pbiArIEdtYXgpIC0gMC41ICogKGRSSUNfbWluICsgZFJJQ19tYXgpIC0gZFJJQ190aDsKCiAgICAvKiBPcGVyYXRpbmcgaW50ZXJmZXJlbmNlIChzaGFmdCB2cyBpbm5lciByaW5nKSAqLwogICAgY29uc3QgZElfdGggPSBkICogKGFscGhhUyAqIChUc2ggLSBUMCkgLSBhbHBoYUIgKiAoVGlyIC0gVDApKTsgLyogbW0sIGFkZGVkIHRvIEkgKi8KICAgIGNvbnN0IElvcF9taW4gPSBJbWluX3MgKyBkSV90aCAqIDEwMDA7CiAgICBjb25zdCBJb3BfbWF4ID0gSW1heF9zICsgZElfdGggKiAxMDAwOwoKICAgIGNvbnN0IFMgPSBNYXRoLm1heCgwLjAwMDIgKiBkLCAwLjAxNSk7IC8qIG1tLCAwLjAyJSBvZiBkIG9yIDE1IFx1MDNiY20gKi8KICAgIGNvbnN0IG5lZWRFeHAgPSBNYXRoLm1heChkSW1heCwgMCkgKyAoZEltYXggPiAwID8gUyA6IDApOwogICAgY29uc3QgZFQgPSAoZCAqIGFscGhhQikgPiAwID8gbmVlZEV4cCAvIChkICogYWxwaGFCKSA6IDA7CiAgICBjb25zdCBUaGVhdCA9IGRJbWF4ID4gMCA\/IFQwICsgZFQgOiBUMDsKICAgIGNvbnN0IFRoZWF0RiA9IFRoZWF0ICogOSAvIDUgKyAzMjsKCiAgICBjb25zdCBGcCA9IG11ICogcF9tYXggKiBNYXRoLlBJICogZCAqIEI7IC8qIE4gOyBwIGluIE4vbW1cdTAwYjIsIGQsQiBpbiBtbSBcdTIxOTIgTiAqLwogICAgY29uc3QgaG9vcCA9IGhvb3BBdEJvcmUocF9tYXgsIGQsIEYpOwogICAgY29uc3QgcEFsbG93U2hhZnQgPSAwLjYgKiBSZTsKICAgIGNvbnN0IGhvb3BBbGxvdyA9IFJJTkcuUmUgLyAyOyAvKiBTRiBcdTIyNDggMiBvbiAxMDBDcjYgUnAwLjIgKi8KCiAgICBjb25zdCBmaXRTID0gY2xhc3NpZnlGaXQoSW1pbl9zLCBJbWF4X3MpOwogICAgY29uc3QgZml0SCA9IGNsYXNzaWZ5Rml0KEltaW5faCwgSW1heF9oKTsKICAgICQoImZpdE5hbWUiKS50ZXh0Q29udGVudCA9ICQoInNoYWZ0Rml0IikudmFsdWUgKyAiIC8gIiArICQoImhvdXNpbmdGaXQiKS52YWx1ZSArICIgXHUwMGI3ICIgKyBmaXRTLmsgKyAiIChzaGFmdCkiOwoKICAgIC8qIGJhbm5lcnMgKyBhbGVydHMgKi8KICAgIGNvbnN0IGFsZXJ0cyA9IFtdOwogICAgbGV0IHdvcnN0ID0gIm9rIjsKICAgIGNvbnN0IGJ1bXAgPSAobHZsKSA9PiB7IGlmIChsdmwgPT09ICJyaXNrIiB8fCAobHZsID09PSAid2FybiIgJiYgd29yc3QgPT09ICJvayIpKSB3b3JzdCA9IGx2bDsgfTsKCiAgICBpZiAoVGhlYXQgPiAxMjApIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJyaXNrIiwgdDogIkhlYXRpbmcgdGVtcGVyYXR1cmUgIiArIFRoZWF0LnRvRml4ZWQoMCkgKyAiIFx1MDBiMEMgKCIgKyBUaGVhdEYudG9GaXhlZCgwKSArICIgXHUwMGIwRikgZXhjZWVkcyAxMjAgXHUwMGIwQy4gT2lsLWJhdGggb3IgdW5jb250cm9sbGVkIGhlYXRpbmcgYWJvdmUgdGhpcyBjYW4gdGVtcGVyIDEwMENyNiAvIEFJU0kgNTIxMDAgKGhhcmRuZXNzIGxvc3MpLiBVc2UgaW5kdWN0aW9uIHdpdGggdGltZS1saW1pdCwgb3IgYSBsb29zZXIgc2hhZnQgZml0LiIgfSk7CiAgICAgIGJ1bXAoInJpc2siKTsKICAgIH0gZWxzZSBpZiAoVGhlYXQgPiAxMDApIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJ3YXJuIiwgdDogIlRfaGVhdCBpcyAiICsgVGhlYXQudG9GaXhlZCgwKSArICIgXHUwMGIwQyBcdTIwMTQgYXBwcm9hY2hpbmcgdGhlIDEyMCBcdTAwYjBDIG1ldGFsbHVyZ2ljYWwgbGltaXQgZm9yIHRocm91Z2gtaGFyZGVuZWQgYmVhcmluZyBzdGVlbC4gUHJlZmVyIGluZHVjdGlvbiBoZWF0aW5nIHdpdGggdGVtcGVyYXR1cmUgcHJvYmUuIiB9KTsKICAgICAgYnVtcCgid2FybiIpOwogICAgfQoKICAgIGlmIChob29wLnN0ID4gUklORy5SZSkgewogICAgICBhbGVydHMucHVzaCh7IGx2bDogInJpc2siLCB0OiAiSW5uZXItcmluZyBob29wIHN0cmVzcyBcdTAzYzNfdCA9ICIgKyBob29wLnN0LnRvRml4ZWQoMCkgKyAiIE4vbW1cdTAwYjIgZXhjZWVkcyAxMDBDcjYgeWllbGQgKH4xNzAwIE4vbW1cdTAwYjIpLiBSZWR1Y2UgaW50ZXJmZXJlbmNlIG9yIGNoZWNrIHJhY2V3YXkgZGlhbWV0ZXIgRi4iIH0pOwogICAgICBidW1wKCJyaXNrIik7CiAgICB9IGVsc2UgaWYgKGhvb3Audm0gPiBob29wQWxsb3cpIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJ3YXJuIiwgdDogInZvbiBNaXNlcyBob29wIGZpZWxkICgiICsgaG9vcC52bS50b0ZpeGVkKDApICsgIiBOL21tXHUwMGIyKSBpcyBhYm92ZSBScDAuMi8yID0gIiArIGhvb3BBbGxvdy50b0ZpeGVkKDApICsgIiBOL21tXHUwMGIyLiBBY2NlcHRhYmxlIGZvciBoYXJkZW5lZCByaW5ncyBpbiBtYW55IFNLRi9TY2hhZWZmbGVyIGNhc2VzLCBidXQgcmV2aWV3IGZvciB0aGluIHJpbmdzIGFuZCByNi9wNiBmaXRzLiIgfSk7CiAgICAgIGJ1bXAoIndhcm4iKTsKICAgIH0KCiAgICBpZiAocF9tYXggPiBwQWxsb3dTaGFmdCkgewogICAgICBhbGVydHMucHVzaCh7IGx2bDogInJpc2siLCB0OiAiQ29udGFjdCBwcmVzc3VyZSBwX21heCA9ICIgKyBwX21heC50b0ZpeGVkKDEpICsgIiBOL21tXHUwMGIyIGV4Y2VlZHMgRElOIDcxOTAgZ3VpZGVsaW5lIDAuNlx1MDBiN1JfZSA9ICIgKyBwQWxsb3dTaGFmdC50b0ZpeGVkKDApICsgIiBOL21tXHUwMGIyIGZvciB0aGUgc2hhZnQgbWF0ZXJpYWwuIFJpc2sgb2YgcGxhc3RpYyBncm9vdmluZyBvZiB0aGUgam91cm5hbC4iIH0pOwogICAgICBidW1wKCJyaXNrIik7CiAgICB9CgogICAgY29uc3QgdHlwZUtleSA9ICQoImJlYXJpbmdUeXBlIikudmFsdWUgPT09ICJkZ2IiID8gImRnYiIgOiAiY3JiIjsKICAgIGNvbnN0IGMyID0gcmljUmFuZ2UodHlwZUtleSwgIkMyIiwgZCk7CiAgICBjb25zdCBjbiA9IHJpY1JhbmdlKHR5cGVLZXksICJDTiIsIGQpOwogICAgaWYgKEdvcF9tYXggPCAwKSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgbHZsOiAicmlzayIsIHQ6ICJFdmVuIHRoZSBtYXhpbXVtIG9wZXJhdGluZyBSSUMgaXMgbmVnYXRpdmUgKCIgKyBHb3BfbWF4LnRvRml4ZWQoMCkgKyAiIFx1MDNiY20pLiBUaGUgYmVhcmluZyB3aWxsIHJ1biBwcmVsb2FkZWQgYW5kIG1heSBzZWl6ZS4gU2VsZWN0IEMzL0M0LCBhIG1pbGRlciBzaGFmdCBmaXQsIG9yIHJlZHVjZSB0aGUgaW5uZXJcdTIwMTNvdXRlciB0ZW1wZXJhdHVyZSBncmFkaWVudC4iIH0pOwogICAgICBidW1wKCJyaXNrIik7CiAgICB9IGVsc2UgaWYgKEdvcF9tZWFuIDwgMCkgewogICAgICBhbGVydHMucHVzaCh7IGx2bDogInJpc2siLCB0OiAiTWVhbiBvcGVyYXRpbmcgUklDIGlzIG5lZ2F0aXZlICgiICsgR29wX21lYW4udG9GaXhlZCgwKSArICIgXHUwM2JjbSkuIFByZWxvYWQgaXMgbGlrZWx5IGluIHNlcnZpY2UuIEluY3JlYXNlIGluaXRpYWwgY2xhc3MgKEMzL0M0KSBvciByZWR1Y2UgaW50ZXJmZXJlbmNlIC8gdGhlcm1hbCBncmFkaWVudC4iIH0pOwogICAgICBidW1wKCJyaXNrIik7CiAgICB9IGVsc2UgaWYgKEdvcF9taW4gPCAwKSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgbHZsOiAid2FybiIsIHQ6ICJXb3JzdC1jYXNlIG9wZXJhdGluZyBSSUMgKElfbWF4ICsgR19yLG1pbiArIHRoZXJtYWwpIGlzICIgKyBHb3BfbWluLnRvRml4ZWQoMCkgKyAiIFx1MDNiY20gXHUyMDE0IGJlbG93IHplcm8uIE1lYW4gcmVtYWluaW5nIGlzICIgKyBHb3BfbWVhbi50b0ZpeGVkKDApICsgIiBcdTAzYmNtLiBQb3NzaWJsZSBwcmVsb2FkIGF0IHRoZSB0aWdodCB0b2xlcmFuY2Ugc3RhY2s7IEMzL0M0IG9yIGEgaG9sbG93IHNoYWZ0IHJlZHVjZXMgdGhlIHJpc2suIiB9KTsKICAgICAgYnVtcCgid2FybiIpOwogICAgfSBlbHNlIGlmIChHb3BfbWluIDwgYzJbMF0pIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJ3YXJuIiwgdDogIlBvc3QtbW91bnQgKyB0aGVybWFsIFJJQyBtaW4gKCIgKyBHb3BfbWluLnRvRml4ZWQoMCkgKyAiIFx1MDNiY20pIGlzIGJlbG93IHRoZSBDMiBvcGVyYXRpb25hbCBmbG9vciAoIiArIGMyWzBdICsgIiBcdTAzYmNtKSBmb3IgdGhpcyBib3JlLiIgfSk7CiAgICAgIGJ1bXAoIndhcm4iKTsKICAgIH0gZWxzZSBpZiAoR29wX21lYW4gPCBjblswXSkgewogICAgICBhbGVydHMucHVzaCh7IGx2bDogIndhcm4iLCB0OiAiTWVhbiBvcGVyYXRpbmcgUklDICgiICsgR29wX21lYW4udG9GaXhlZCgwKSArICIgXHUwM2JjbSkgaXMgYmVsb3cgTm9ybWFsIChDTikgbWluaW11bSAoIiArIGNuWzBdICsgIiBcdTAzYmNtKS4gQWNjZXB0YWJsZSBmb3IgbWFueSBwcmVjaXNpb24gc3BpbmRsZXM7IHZlcmlmeSB0aGUgdGhlcm1hbCBncmFkaWVudC4iIH0pOwogICAgICBidW1wKCJ3YXJuIik7CiAgICB9IGVsc2UgaWYgKGFjdGl2ZUNoaXAoImNsYXNzQ2hpcHMiKSA9PT0gIkMzIiB8fCBhY3RpdmVDaGlwKCJjbGFzc0NoaXBzIikgPT09ICJDNCIpIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJvayIsIHQ6ICJPcGVyYXRpbmcgUklDIG1lYW4gIiArIEdvcF9tZWFuLnRvRml4ZWQoMCkgKyAiIFx1MDNiY20gc3RheXMgYWJvdmUgdGhlIE5vcm1hbCBmbG9vciAoIiArIGNuWzBdICsgIiBcdTAzYmNtKSBhbmQgaW5zaWRlIGEgQzJcdTIwMTNDMyB3b3JraW5nIGJhbmQgXHUyMDE0IHR5cGljYWwgZm9yIGEgcm90YXRpbmcgaW5uZXIgcmluZy4iIH0pOwogICAgfQoKICAgIGlmIChkaSA+IDAgJiYgZGkgPj0gZCAqIDAuNykgewogICAgICBhbGVydHMucHVzaCh7IGx2bDogIndhcm4iLCB0OiAiSG9sbG93IHNoYWZ0IGRfaSAvIGQgPSAiICsgKGRpIC8gZCkudG9GaXhlZCgyKSArICIgaXMgbGFyZ2U6IGludGVyZmVyZW5jZSBwcm9kdWNlcyBsaXR0bGUgcHJlc3N1cmUgYW5kIGxpdHRsZSBSSUMgcmVkdWN0aW9uLCBidXQgbW91bnRpbmcgZm9yY2UgZXN0aW1hdGVzIGJlY29tZSBzZW5zaXRpdmUgdG8gd2FsbCB0aGlja25lc3MuIiB9KTsKICAgICAgYnVtcCh3b3JzdCA9PT0gIm9rIiA\/ICJ3YXJuIiA6IHdvcnN0KTsKICAgIH0KCiAgICBpZiAoIWFsZXJ0cy5sZW5ndGgpIHsKICAgICAgYWxlcnRzLnB1c2goeyBsdmw6ICJvayIsIHQ6ICJObyBzdGFuZGFyZCB3YXJuaW5ncy4gSGVhdGluZyBzdGF5cyBcdTIyNjQgMTIwIFx1MDBiMEMsIGhvb3Agc3RyZXNzIGlzIHdpdGhpbiBoYXJkZW5lZC1yaW5nIHByYWN0aWNlLCBhbmQgcmVzaWR1YWwgY2xlYXJhbmNlIHN0YXlzIHBvc2l0aXZlLiIgfSk7CiAgICB9CgogICAgY29uc3QgYmFubmVyID0gJCgic3RhdHVzQmFubmVyIik7CiAgICBiYW5uZXIuY2xhc3NOYW1lID0gImJhbm5lciBiYW5uZXItIiArICh3b3JzdCA9PT0gInJpc2siID8gInJpc2siIDogd29yc3QgPT09ICJ3YXJuIiA\/ICJ3YXJuIiA6ICJvayIpOwogICAgYmFubmVyLnRleHRDb250ZW50ID0gd29yc3QgPT09ICJyaXNrIgogICAgICA\/ICJDaGVjayByZXF1aXJlZCBcdTIwMTQgaW50ZXJmZXJlbmNlLCBoZWF0aW5nIG9yIHJlc2lkdWFsIGNsZWFyYW5jZSBpcyBvdXRzaWRlIHJlY29tbWVuZGVkIGxpbWl0cy4iCiAgICAgIDogd29yc3QgPT09ICJ3YXJuIgogICAgICAgID8gIlVzYWJsZSB3aXRoIGNhdXRpb24gXHUyMDE0IHJldmlldyBoaWdobGlnaHRlZCB3YXJuaW5ncyBiZWZvcmUgc3BlY2lmeWluZyB0aGUgZml0LiIKICAgICAgICA6ICJGaXQgaXMgd2l0aGluIHR5cGljYWwgSVNPIC8gU0tGIG1vdW50aW5nIHByYWN0aWNlIGZvciBhIHJvdGF0aW5nIGlubmVyIHJpbmcuIjsKCiAgICB2YXIgYWxlcnRCb3ggPSAkKCJhbGVydHMiKTsKICAgIGFsZXJ0Qm94LnRleHRDb250ZW50ID0gIiI7CiAgICBhbGVydHMuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBkLmNsYXNzTmFtZSA9ICJhbGVydCBhbGVydC0iICsgYS5sdmw7CiAgICAgIHZhciBzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIpOwogICAgICBzdC50ZXh0Q29udGVudCA9IChhLmx2bCA9PT0gInJpc2siID8gIkFsZXJ0IiA6IGEubHZsID09PSAid2FybiIgPyAiV2FybmluZyIgOiAiT0siKSArICIuIjsKICAgICAgZC5hcHBlbmRDaGlsZChzdCk7CiAgICAgIGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiICsgYS50KSk7CiAgICAgIGFsZXJ0Qm94LmFwcGVuZENoaWxkKGQpOwogICAgfSk7CgogICAgJCgib3V0SW1pbiIpLnRleHRDb250ZW50ID0gZm10VW0oSW1pbl9zKS5yZXBsYWNlKC8gXHUwM2JjbXwgXHUwM2JjaW4vZywgIiIpOwogICAgJCgib3V0SW1heCIpLnRleHRDb250ZW50ID0gZm10VW0oSW1heF9zKS5yZXBsYWNlKC8gXHUwM2JjbXwgXHUwM2JjaW4vZywgIiIpOwogICAgJCgib3V0SW1heFUiKS50ZXh0Q29udGVudCA9IHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIgPyAiXHUwM2JjaW4iIDogIlx1MDNiY20iOwogICAgJCgib3V0VGhlYXQiKS50ZXh0Q29udGVudCA9IGZtdFRlbXAoVGhlYXQpOwogICAgJCgib3V0RnAiKS50ZXh0Q29udGVudCA9IGZtdEZvcmNlTihGcCk7CgogICAgJCgidGlsZUltaW4iKS5jbGFzc05hbWUgPSAidGlsZSAiICsgKEltaW5fcyA+PSAwID8gImlzLXdhcm4iIDogImlzLW9rIik7CiAgICAkKCJ0aWxlSW1heCIpLmNsYXNzTmFtZSA9ICJ0aWxlICIgKyAoSW1heF9zID4gNDAgPyAiaXMtd2FybiIgOiAiaXMtb2siKTsKICAgICQoInRpbGVUaGVhdCIpLmNsYXNzTmFtZSA9ICJ0aWxlICIgKyAoVGhlYXQgPiAxMjAgPyAiaXMtcmlzayIgOiBUaGVhdCA+IDEwMCA\/ICJpcy13YXJuIiA6ICJpcy1vayIpOwogICAgJCgidGlsZUZwIikuY2xhc3NOYW1lID0gInRpbGUiOwoKICAgIGRyYXdGaXRCYXIoSW1pbl9zLCBJbWF4X3MpOwogICAgZHJhd0RpYWdyYW0oeyBkLCBELCBCLCBkaSwgSW1heF9zLCBJbWluX3MsIEltYXhfaCwgRiwgRXJ3eSwgaG9sbG93OiBkaSA+IDAgfSk7CgogICAgY29uc3QgaG91c01hdCA9IE1BVEVSSUFMU1skKCJob3VzTWF0IikudmFsdWVdOwogICAgY29uc3Qgcm93cyA9IFsKICAgICAgWyJTaGFmdCBsaW1pdHMgZWkgLyBlcyIsIGVpLnRvRml4ZWQoMSkgKyAiIC8gIiArIGVzLnRvRml4ZWQoMSkgKyAiIFx1MDNiY20iXSwKICAgICAgWyJJbm5lci1yaW5nIFx1MDM5NGRtcCAoSVNPIDQ5MikiLCBib3JlSGkudG9GaXhlZCgxKSArICIgLyAiICsgYm9yZUxvLnRvRml4ZWQoMSkgKyAiIFx1MDNiY20iXSwKICAgICAgWyJIb3VzaW5nIEVJIC8gRVMiLCBFSS50b0ZpeGVkKDEpICsgIiAvICIgKyBFUy50b0ZpeGVkKDEpICsgIiBcdTAzYmNtIl0sCiAgICAgIFsiT3V0ZXItcmluZyBcdTAzOTREbXAgKElTTyA0OTIpIiwgb2RIaS50b0ZpeGVkKDEpICsgIiAvICIgKyBvZExvLnRvRml4ZWQoMSkgKyAiIFx1MDNiY20iXSwKICAgICAgWyJTaGFmdCBmaXQgY2xhc3MiLCBmaXRTLmsgKyAiIFx1MDBiNyBJID0gIiArIGZtdFVtKEltaW5fcykgKyAiIFx1MjAyNiAiICsgZm10VW0oSW1heF9zKV0sCiAgICAgIFsiSG91c2luZyBmaXQgY2xhc3MiLCBmaXRILmsgKyAiIFx1MDBiNyBJID0gIiArIGZtdFVtKEltaW5faCkgKyAiIFx1MjAyNiAiICsgZm10VW0oSW1heF9oKV0sCiAgICAgIFsiUmFjZXdheSBGIC8gRSIsIGZtdExlbihGLCAyKSArICIgLyAiICsgZm10TGVuKEVyd3ksIDIpICsgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIgPyAiIGluIiA6ICIgbW0iKV0sCiAgICAgIFsiQ29udGFjdCBwcmVzc3VyZSBwIChJbWluIFx1MjAyNiBJbWF4KSIsIGZtdFN0cmVzcyhwX21pbikgKyAiIFx1MjAyNiAiICsgZm10U3RyZXNzKHBfbWF4KV0sCiAgICAgIFsiSG91c2luZyBjb250YWN0IHBfbWF4IiwgZm10U3RyZXNzKHBIX21heCldLAogICAgICBbIlJJQyByZWR1Y3Rpb24gKGZpdCBvbmx5KSIsIGZtdFVtKGRSSUNfbWluKSArICIgXHUyMDI2ICIgKyBmbXRVbShkUklDX21heCldLAogICAgICBbIiAgXHUyMDE0IGZyb20gaW5uZXIgcmluZyIsIGZtdFVtKHJpY0lSX21pbikgKyAiIFx1MjAyNiAiICsgZm10VW0ocmljSVJfbWF4KV0sCiAgICAgIFsiICBcdTIwMTQgZnJvbSBvdXRlciByaW5nIiwgZm10VW0ocmljT1JfbWluKSArICIgXHUyMDI2ICIgKyBmbXRVbShyaWNPUl9tYXgpXSwKICAgICAgWyJNb3VudGVkIFJJQyByZW1haW5pbmciLCBmbXRVbShHcmVtX21pbikgKyAiIFx1MjAyNiAiICsgZm10VW0oR3JlbV9tYXgpXSwKICAgICAgWyJUaGVybWFsIFJJQyBkcm9wIFx1MDNiMVx1MDBiN2RfbVx1MDBiNyhUX2lyXHUyMjEyVF9vcikiLCBmbXRVbShkUklDX3RoKV0sCiAgICAgIFsiT3BlcmF0aW5nIFJJQyAobWluIFx1MjAyNiBtZWFuIFx1MjAyNiBtYXgpIiwgZm10VW0oR29wX21pbikgKyAiIFx1MjAyNiAiICsgZm10VW0oR29wX21lYW4pICsgIiBcdTIwMjYgIiArIGZtdFVtKEdvcF9tYXgpXSwKICAgICAgWyJPcGVyYXRpbmcgc2hhZnQgaW50ZXJmZXJlbmNlIiwgZm10VW0oSW9wX21pbikgKyAiIFx1MjAyNiAiICsgZm10VW0oSW9wX21heCldLAogICAgICBbIlNhZmV0eSBtYXJnaW4gUyBmb3IgaGVhdGluZyIsIGZtdFVtKFMgKiAxMDAwKV0sCiAgICAgIFsiUmVxdWlyZWQgaW5uZXItcmluZyBleHBhbnNpb24iLCBmbXRVbShuZWVkRXhwICogMTAwMCldLAogICAgICBbIlRfaGVhdCAoaW5uZXIgcmluZykiLCBmbXRUZW1wKFRoZWF0KSArIChUaGVhdCA+IDEyMCA\/ICIgIFx1MjZhMCA+IDEyMCBcdTAwYjBDIiA6ICIiKV0sCiAgICAgIFsiRnJpY3Rpb24gXHUwM2JjIiwgbXUudG9GaXhlZCgyKSArICgkKCJtdSIpLnNlbGVjdGVkT3B0aW9uc1swXSA\/ICIgXHUwMGI3ICIgKyAkKCJtdSIpLnNlbGVjdGVkT3B0aW9uc1swXS50ZXh0Q29udGVudCA6ICIiKV0sCiAgICAgIFsiUHJlc3MtZml0IGZvcmNlIEZfcCAoSW1heCkiLCBmbXRGb3JjZU4oRnApXSwKICAgICAgWyJIb29wIHN0cmVzcyBcdTAzYzNfdCAoYm9yZSkiLCBmbXRTdHJlc3MoaG9vcC5zdCldLAogICAgICBbInZvbiBNaXNlcyAoYm9yZSkiLCBmbXRTdHJlc3MoaG9vcC52bSldLAogICAgICBbIlNoYWZ0IHAgdnMgMC42IFJfZSIsIGZtdFN0cmVzcyhwX21heCkgKyAiIC8gIiArIGZtdFN0cmVzcyhwQWxsb3dTaGFmdCldLAogICAgICBbIjEwMENyNiBSX3AwLjIgLyAyIiwgZm10U3RyZXNzKGhvb3BBbGxvdyldLAogICAgICBbIkhvdXNpbmcgbWF0ZXJpYWwiLCBob3VzTWF0Lm5hbWVdCiAgICBdOwogICAgdmFyIHRiID0gJCgicmVzdWx0Um93cyIpOwogICAgdGIudGV4dENvbnRlbnQgPSAiIjsKICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICB2YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwogICAgICB2YXIgdGQwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgdmFyIHRkMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7CiAgICAgIHRkMC50ZXh0Q29udGVudCA9IHJbMF07CiAgICAgIHRkMS50ZXh0Q29udGVudCA9IHJbMV07CiAgICAgIHRyLmFwcGVuZENoaWxkKHRkMCk7CiAgICAgIHRyLmFwcGVuZENoaWxkKHRkMSk7CiAgICAgIHRiLmFwcGVuZENoaWxkKHRyKTsKICAgIH0pOwoKICAgIHZhciBwcyA9ICQoInByaW50U3VtbWFyeSIpOwogICAgcHMudGV4dENvbnRlbnQgPSAiIjsKICAgIHZhciBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOwogICAgdmFyIHN0cm9uZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIpOwogICAgc3Ryb25nLnRleHRDb250ZW50ID0gJCgiZGVzaWduYXRpb24iKS52YWx1ZSB8fCAiQmVhcmluZyI7CiAgICBwLmFwcGVuZENoaWxkKHN0cm9uZyk7CiAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKAogICAgICAiIFx1MDBiNyBkPSIgKyBmbXRMZW4oZCwgMikgKyAiIEQ9IiArIGZtdExlbihELCAyKSArICIgQj0iICsgZm10TGVuKEIsIDIpICsKICAgICAgIiBcdTAwYjcgIiArICQoInNoYWZ0Rml0IikudmFsdWUgKyAiIC8gIiArICQoImhvdXNpbmdGaXQiKS52YWx1ZSArCiAgICAgICIgXHUwMGI3ICIgKyAoYWN0aXZlQ2hpcCgiY2xhc3NDaGlwcyIpIHx8ICIiKQogICAgKSk7CiAgICBwcy5hcHBlbmRDaGlsZChwKTsKICAgIHZhciB1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7CiAgICByb3dzLnNsaWNlKDQsIDIwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7CiAgICAgIGxpLnRleHRDb250ZW50ID0gclswXSArICI6ICIgKyByWzFdOwogICAgICB1bC5hcHBlbmRDaGlsZChsaSk7CiAgICB9KTsKICAgIHBzLmFwcGVuZENoaWxkKHVsKTsKICB9CgogIGZ1bmN0aW9uIGRyYXdGaXRCYXIoaW1pbiwgaW1heCkgewogICAgY29uc3QgZWwgPSAkKCJmaXRCYXIiKTsKICAgIGNvbnN0IHNwYW4gPSBNYXRoLm1heChNYXRoLmFicyhpbWluKSwgTWF0aC5hYnMoaW1heCksIDIwKSAqIDEuMTU7CiAgICBjb25zdCBwY3QgPSAoeCkgPT4gNTAgKyA1MCAqICh4IC8gc3Bhbik7CiAgICBjb25zdCB6ID0gNTA7CiAgICBjb25zdCBhID0gcGN0KE1hdGgubWluKGltaW4sIGltYXgpKTsKICAgIGNvbnN0IGIgPSBwY3QoTWF0aC5tYXgoaW1pbiwgaW1heCkpOwogICAgY29uc3QgbGVmdCA9IE1hdGgubWluKGEsIHopOwogICAgY29uc3QgcmlnaHQgPSBNYXRoLm1heChiLCB6KTsKICAgIGVsLnRleHRDb250ZW50ID0gIiI7CiAgICBmdW5jdGlvbiBhZGRNYXJrKGNscywgc3R5bGUpIHsKICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgIHMuY2xhc3NOYW1lID0gY2xzOwogICAgICBzLnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHlsZSk7CiAgICAgIGVsLmFwcGVuZENoaWxkKHMpOwogICAgfQogICAgYWRkTWFyaygibmVnIiwgIndpZHRoOjUwJSIpOwogICAgYWRkTWFyaygicG9zIiwgImxlZnQ6NTAlO3dpZHRoOjUwJSIpOwogICAgYWRkTWFyaygiemVybyIsICJsZWZ0OjUwJSIpOwogICAgYWRkTWFyaygibWFyayIsICJsZWZ0OiIgKyBsZWZ0ICsgIiUiKTsKICAgIGFkZE1hcmsoIm1hcmsiLCAibGVmdDoiICsgcmlnaHQgKyAiJSIpOwogIH0KCiAgZnVuY3Rpb24gc3ZnTWFrZShuYW1lLCBhdHRycykgewogICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsIG5hbWUpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgaWYgKGF0dHJzW2tdICE9IG51bGwpIGVsLnNldEF0dHJpYnV0ZShrLCBTdHJpbmcoYXR0cnNba10pKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZWw7CiAgfQogIGZ1bmN0aW9uIHN2Z0xhYmVsKHgsIHksIGZpbGwsIHNpemUsIGZhbWlseSwgd2VpZ2h0LCBjb250ZW50KSB7CiAgICB2YXIgdCA9IHN2Z01ha2UoInRleHQiLCB7IHg6IHgsIHk6IHksIGZpbGw6IGZpbGwsICJmb250LXNpemUiOiBzaXplLCAiZm9udC1mYW1pbHkiOiBmYW1pbHkgfSk7CiAgICBpZiAod2VpZ2h0KSB0LnNldEF0dHJpYnV0ZSgiZm9udC13ZWlnaHQiLCB3ZWlnaHQpOwogICAgdC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7CiAgICByZXR1cm4gdDsKICB9CgogIGZ1bmN0aW9uIGRyYXdEaWFncmFtKGcpIHsKICAgIHZhciBzdmcgPSAkKCJkaWFncmFtIik7CiAgICBpZiAoIXN2ZykgcmV0dXJuOwogICAgd2hpbGUgKHN2Zy5maXJzdENoaWxkKSBzdmcucmVtb3ZlQ2hpbGQoc3ZnLmZpcnN0Q2hpbGQpOwoKICAgIHZhciBjeCA9IDIxMCwgY3kgPSAxNjA7CiAgICB2YXIgbWF4UiA9IDExODsKICAgIHZhciBzY2FsZSA9IG1heFIgLyAoZy5EICogMC41ICogMS4xNSk7CiAgICB2YXIgckQgPSBnLkQgKiAwLjUgKiBzY2FsZTsKICAgIHZhciByRSA9IGcuRXJ3eSAqIDAuNSAqIHNjYWxlOwogICAgdmFyIHJGID0gZy5GICogMC41ICogc2NhbGU7CiAgICB2YXIgcmQgPSBnLmQgKiAwLjUgKiBzY2FsZTsKICAgIHZhciByZGkgPSBnLmhvbGxvdyA\/IGcuZGkgKiAwLjUgKiBzY2FsZSA6IDA7CiAgICB2YXIgckggPSByRCArIDE4OwoKICAgIHZhciBpU2hhZnQgPSAoZy5JbWluX3MgKyBnLkltYXhfcykgLyAyOwogICAgdmFyIGlIb3VzID0gZy5JbWF4X2g7CiAgICB2YXIgc2hhZnRGaWxsID0gaVNoYWZ0ID4gMiA\/ICIjZWE1ODBjIiA6IGlTaGFmdCA8IC0yID8gIiMzOGJkZjgiIDogIiNmYmJmMjQiOwogICAgdmFyIGhvdXNGaWxsID0gaUhvdXMgPiAyID8gIiNlYTU4MGMiIDogaUhvdXMgPCAtMiA\/ICIjN2RkM2ZjIiA6ICIjZmJiZjI0IjsKCiAgICBmdW5jdGlvbiByaW5nKHIsIGZpbGwsIG9wLCBzdywgc2MpIHsKICAgICAgcmV0dXJuIHN2Z01ha2UoImNpcmNsZSIsIHsKICAgICAgICBjeDogY3gsIGN5OiBjeSwgcjogTnVtYmVyKHIpLnRvRml4ZWQoMSksCiAgICAgICAgZmlsbDogZmlsbCwgImZpbGwtb3BhY2l0eSI6IG9wLAogICAgICAgIHN0cm9rZTogc2MgfHwgIiM5NGEzYjgiLCAic3Ryb2tlLXdpZHRoIjogc3cgfHwgMQogICAgICB9KTsKICAgIH0KCiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTWFrZSgicmVjdCIsIHsgd2lkdGg6IDUyMCwgaGVpZ2h0OiAzMjAsIGZpbGw6ICIjMGYxNzJhIiB9KSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQocmluZyhySCwgIiMxZTI5M2IiLCAxLCAxLCAiIzMzNDE1NSIpKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyaW5nKHJEICsgMi4yLCBob3VzRmlsbCwgMC44NSwgMCwgIm5vbmUiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQocmluZyhyRCwgIiM5NGEzYjgiLCAxLCAxLCAiI2NiZDVlMSIpKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyaW5nKHJFLCAiIzBmMTcyYSIsIDEsIDAsICJub25lIikpOwogICAgc3ZnLmFwcGVuZENoaWxkKHJpbmcockYsICIjMzhiZGY4IiwgMC45NSwgMSwgIiM3ZGQzZmMiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQocmluZyhyZCArIDIuNCwgc2hhZnRGaWxsLCAwLjksIDAsICJub25lIikpOwogICAgc3ZnLmFwcGVuZENoaWxkKHJpbmcocmQsICIjNjQ3NDhiIiwgMSwgMSwgIiNjYmQ1ZTEiKSk7CiAgICBpZiAocmRpID4gMSkgc3ZnLmFwcGVuZENoaWxkKHJpbmcocmRpLCAiIzBmMTcyYSIsIDEsIDEsICIjMzM0MTU1IikpOwogICAgc3ZnLmFwcGVuZENoaWxkKHN2Z01ha2UoImxpbmUiLCB7IHgxOiBjeCwgeTE6IGN5IC0gckgsIHgyOiBjeCwgeTI6IGN5ICsgckgsIHN0cm9rZTogIiMzMzQxNTUiLCAic3Ryb2tlLWRhc2hhcnJheSI6ICIzIDQiIH0pKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChzdmdNYWtlKCJsaW5lIiwgeyB4MTogY3ggLSBySCwgeTE6IGN5LCB4MjogY3ggKyBySCwgeTI6IGN5LCBzdHJva2U6ICIjMzM0MTU1IiwgInN0cm9rZS1kYXNoYXJyYXkiOiAiMyA0IiB9KSk7CgogICAgdmFyIGRlcyA9ICQoImRlc2lnbmF0aW9uIik7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCAzNiwgIiNlMmU4ZjAiLCAxMiwgIklCTSBQbGV4IFNhbnMsc2Fucy1zZXJpZiIsICI2MDAiLCAiUmFkaWFsIHNlY3Rpb24iKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCA1NiwgIiM3ZGQzZmMiLCAxMSwgIklCTSBQbGV4IE1vbm8sbW9ub3NwYWNlIiwgbnVsbCwgKGRlcyAmJiBkZXMudmFsdWUpIHx8ICIiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCA4NCwgIiM5NGEzYjgiLCAxMCwgIklCTSBQbGV4IE1vbm8sbW9ub3NwYWNlIiwgbnVsbCwgImQgPSAiICsgZm10TGVuKGcuZCwgMikpKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChzdmdMYWJlbCg0MDAsIDEwMCwgIiM5NGEzYjgiLCAxMCwgIklCTSBQbGV4IE1vbm8sbW9ub3NwYWNlIiwgbnVsbCwgIkQgPSAiICsgZm10TGVuKGcuRCwgMikpKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChzdmdMYWJlbCg0MDAsIDExNiwgIiM5NGEzYjgiLCAxMCwgIklCTSBQbGV4IE1vbm8sbW9ub3NwYWNlIiwgbnVsbCwgIkIgPSAiICsgZm10TGVuKGcuQiwgMikpKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChzdmdMYWJlbCg0MDAsIDE0MCwgIiNmYjkyM2MiLCAxMCwgIklCTSBQbGV4IE1vbm8sbW9ub3NwYWNlIiwgbnVsbCwgIklfc2hhZnQgIiArIGZtdFVtKChnLkltaW5fcyArIGcuSW1heF9zKSAvIDIpKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCAxNTYsICIjN2RkM2ZjIiwgMTAsICJJQk0gUGxleCBNb25vLG1vbm9zcGFjZSIsIG51bGwsICJJX2hvdXMgIiArIGZtdFVtKGcuSW1heF9oKSkpOwogICAgc3ZnLmFwcGVuZENoaWxkKHN2Z0xhYmVsKDQwMCwgMTgwLCAiIzY0NzQ4YiIsIDksICJJQk0gUGxleCBTYW5zLHNhbnMtc2VyaWYiLCBudWxsLCAiT3JhbmdlIHJpbmcgPSBpbnRlcmZlcmVuY2UiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCAxOTQsICIjNjQ3NDhiIiwgOSwgIklCTSBQbGV4IFNhbnMsc2Fucy1zZXJpZiIsIG51bGwsICJDeWFuIHJpbmcgPSBjbGVhcmFuY2UiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoNDAwLCAyMDgsICIjNjQ3NDhiIiwgOSwgIklCTSBQbGV4IFNhbnMsc2Fucy1zZXJpZiIsIG51bGwsICJHYXAgZXhhZ2dlcmF0ZWQgZm9yIGRpc3BsYXkiKSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTWFrZSgibGluZSIsIHsgeDE6IGN4LCB5MTogY3ksIHgyOiBjeCArIHJkLCB5MjogY3ksIHN0cm9rZTogIiM2NDc0OGIiLCAic3Ryb2tlLXdpZHRoIjogMSB9KSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoc3ZnTGFiZWwoKGN4ICsgY3ggKyByZCkgLyAyICsgOCwgY3kgLSA0LCAiIzk0YTNiOCIsIDEwLCAiSUJNIFBsZXggTW9ubyxtb25vc3BhY2UiLCBudWxsLCAiZC8yIikpOwogIH0KCiAgLyogXHUyNTAwXHUyNTAwIHVuaXQgdG9nZ2xlOiBjb252ZXJ0IHZpc2libGUgbnVtZXJpYyBmaWVsZHMgXHUyNTAwXHUyNTAwICovCiAgY29uc3QgTEVOX0lEUyA9IFsiZCIsICJEIiwgIkIiLCAiRiIsICJFIiwgImRpIiwgIkRoIl07CiAgY29uc3QgVEVNUF9JRFMgPSBbIlQwIiwgIlRpciIsICJUcyIsICJUb3IiLCAiVGgiXTsKICBjb25zdCBTVFJFU1NfSURTID0gWyJSZSJdOwoKICBmdW5jdGlvbiBzd2l0Y2hVbml0KG5leHQpIHsKICAgIGlmIChuZXh0ID09PSBzdGF0ZS51bml0KSByZXR1cm47CiAgICBjb25zdCBmcm9tSW1wID0gc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIjsKICAgIExFTl9JRFMuZm9yRWFjaCgoaWQpID0+IHsKICAgICAgY29uc3QgZWwgPSAkKGlkKTsKICAgICAgaWYgKGVsLnZhbHVlID09PSAiIikgcmV0dXJuOwogICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7CiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47CiAgICAgIGVsLnZhbHVlID0gZnJvbUltcCA\/ICh2ICogMjUuNCkudG9GaXhlZChpZCA9PT0gImQiIHx8IGlkID09PSAiRCIgfHwgaWQgPT09ICJCIiA\/IDIgOiAyKQogICAgICAgICAgICAgICAgICAgICAgICAgOiAodiAvIDI1LjQpLnRvRml4ZWQoNCk7CiAgICB9KTsKICAgIFRFTVBfSURTLmZvckVhY2goKGlkKSA9PiB7CiAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KCQoaWQpLnZhbHVlKTsKICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIHJldHVybjsKICAgICAgJChpZCkudmFsdWUgPSBmcm9tSW1wID8gKCh2IC0gMzIpICogNSAvIDkpLnRvRml4ZWQoMSkgOiAodiAqIDkgLyA1ICsgMzIpLnRvRml4ZWQoMSk7CiAgICB9KTsKICAgIFNUUkVTU19JRFMuZm9yRWFjaCgoaWQpID0+IHsKICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoJChpZCkudmFsdWUpOwogICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgcmV0dXJuOwogICAgICAkKGlkKS52YWx1ZSA9IGZyb21JbXAgPyAodiAvIDE0NS4wMzgpLnRvRml4ZWQoMCkgOiAodiAqIDE0NS4wMzgpLnRvRml4ZWQoMCk7CiAgICB9KTsKICAgIHN0YXRlLnVuaXQgPSBuZXh0OwogICAgJCgiYnRuTWV0cmljIikuY2xhc3NMaXN0LnRvZ2dsZSgiaXMtYWN0aXZlIiwgbmV4dCA9PT0gIm1ldHJpYyIpOwogICAgJCgiYnRuSW1wZXJpYWwiKS5jbGFzc0xpc3QudG9nZ2xlKCJpcy1hY3RpdmUiLCBuZXh0ID09PSAiaW1wZXJpYWwiKTsKICAgIHN0YXRlLmxvY2tGRSA9IGZhbHNlOwogICAgYXV0b0ZFKCk7CiAgICBpZiAocmVzdWx0c1Zpc2libGUoKSkgY29tcHV0ZSgpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXREZW1vKCkgewogICAgc3RhdGUudW5pdCA9ICJtZXRyaWMiOwogICAgJCgiYnRuTWV0cmljIikuY2xhc3NMaXN0LmFkZCgiaXMtYWN0aXZlIik7CiAgICAkKCJidG5JbXBlcmlhbCIpLmNsYXNzTGlzdC5yZW1vdmUoImlzLWFjdGl2ZSIpOwogICAgJCgiZGVzaWduYXRpb24iKS52YWx1ZSA9ICI2MzEwIjsKICAgICQoImJlYXJpbmdUeXBlIikudmFsdWUgPSAiZGdiIjsKICAgICQoImQiKS52YWx1ZSA9IDUwOyAkKCJEIikudmFsdWUgPSAxMTA7ICQoIkIiKS52YWx1ZSA9IDI3OwogICAgJCgic2hhZnRTdHJ1Y3QiKS52YWx1ZSA9ICJzb2xpZCI7ICQoImRpIikudmFsdWUgPSAwOyAkKCJkaSIpLmRpc2FibGVkID0gdHJ1ZTsKICAgICQoIkRoIikudmFsdWUgPSAiIjsKICAgICQoIlQwIikudmFsdWUgPSAyMDsgJCgiVGlyIikudmFsdWUgPSA3MDsgJCgiVHMiKS52YWx1ZSA9IDY1OyAkKCJUb3IiKS52YWx1ZSA9IDYwOyAkKCJUaCIpLnZhbHVlID0gNTU7CiAgICAkKCJhbHBoYUIiKS52YWx1ZSA9IDAuMDAwMDEyOwogICAgJCgibXUiKS52YWx1ZSA9ICIwLjEyIjsKICAgICQoInNoYWZ0TW9kZSIpLnZhbHVlID0gImlzbyI7ICQoImhvdXNpbmdNb2RlIikudmFsdWUgPSAiaXNvIjsKICAgICQoInVzZUN1c3RvbUciKS5jaGVja2VkID0gZmFsc2U7CiAgICAkKCJzaGFmdEZpdCIpLnZhbHVlID0gIms1IjsgJCgiaG91c2luZ0ZpdCIpLnZhbHVlID0gIkg3IjsKICAgICQoInNoYWZ0TWF0IikudmFsdWUgPSAiY2FyYm9uX3N0ZWVsIjsgJCgiaG91c01hdCIpLnZhbHVlID0gImNhc3RfaXJvbiI7CiAgICBzZXRBY3RpdmVDaGlwKCJzaGFmdEZpdENoaXBzIiwgIms1Iik7CiAgICBzZXRBY3RpdmVDaGlwKCJob3VzaW5nRml0Q2hpcHMiLCAiSDciKTsKICAgIHNldEFjdGl2ZUNoaXAoImNsYXNzQ2hpcHMiLCAiQzMiKTsKICAgIGFwcGx5TWF0ZXJpYWwoInNoYWZ0Iik7IGFwcGx5TWF0ZXJpYWwoImhvdXMiKTsKICAgIHN0YXRlLmxvY2tGRSA9IGZhbHNlOyBhdXRvRkUoKTsgYXBwbHlJU09MaW1pdHNUb0N1c3RvbSgpOyBhcHBseVJJQygpOwogICAgaGlkZVJlc3VsdHMoKTsKICB9CgogIGZ1bmN0aW9uIGJpbmQoKSB7CiAgICBpZiAoIWdldFJvb3QoKSkgcmV0dXJuOwogICAgcG9wdWxhdGVTZWxlY3RzKCk7CgogICAgY29uc3Qgb24gPSAoaWQsIGV2LCBmbikgPT4geyBjb25zdCBlbCA9ICQoaWQpOyBpZiAoZWwpIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXYsIGZuKTsgfTsKCiAgICBbImQiLCAiRCJdLmZvckVhY2goKGlkKSA9PiB7CiAgICAgIG9uKGlkLCAiaW5wdXQiLCAoKSA9PiB7IHN0YXRlLmxvY2tGRSA9IGZhbHNlOyBhdXRvRkUoKTsgc3luY0Rlcml2ZWRJbnB1dHMoKTsgfSk7CiAgICB9KTsKICAgIFsiRiIsICJFIl0uZm9yRWFjaCgoaWQpID0+IHsKICAgICAgb24oaWQsICJpbnB1dCIsICgpID0+IHsgc3RhdGUubG9ja0ZFID0gdHJ1ZTsgfSk7CiAgICB9KTsKICAgIG9uKCJzaGFmdFN0cnVjdCIsICJjaGFuZ2UiLCAoKSA9PiB7CiAgICAgICQoImRpIikuZGlzYWJsZWQgPSAkKCJzaGFmdFN0cnVjdCIpLnZhbHVlICE9PSAiaG9sbG93IjsKICAgICAgaWYgKCQoInNoYWZ0U3RydWN0IikudmFsdWUgIT09ICJob2xsb3ciKSAkKCJkaSIpLnZhbHVlID0gMDsKICAgIH0pOwogICAgb24oInNoYWZ0TWF0IiwgImNoYW5nZSIsICgpID0+IHsgYXBwbHlNYXRlcmlhbCgic2hhZnQiKTsgfSk7CiAgICBvbigiaG91c01hdCIsICJjaGFuZ2UiLCAoKSA9PiB7IGFwcGx5TWF0ZXJpYWwoImhvdXMiKTsgfSk7CiAgICBvbigic2hhZnRGaXQiLCAiY2hhbmdlIiwgKCkgPT4gewogICAgICBzZXRBY3RpdmVDaGlwKCJzaGFmdEZpdENoaXBzIiwgJCgic2hhZnRGaXQiKS52YWx1ZSk7CiAgICAgIHN5bmNEZXJpdmVkSW5wdXRzKCk7CiAgICB9KTsKICAgIG9uKCJob3VzaW5nRml0IiwgImNoYW5nZSIsICgpID0+IHsKICAgICAgc2V0QWN0aXZlQ2hpcCgiaG91c2luZ0ZpdENoaXBzIiwgJCgiaG91c2luZ0ZpdCIpLnZhbHVlKTsKICAgICAgc3luY0Rlcml2ZWRJbnB1dHMoKTsKICAgIH0pOwogICAgb24oInNoYWZ0TW9kZSIsICJjaGFuZ2UiLCBzeW5jRGVyaXZlZElucHV0cyk7CiAgICBvbigiaG91c2luZ01vZGUiLCAiY2hhbmdlIiwgc3luY0Rlcml2ZWRJbnB1dHMpOwogICAgb24oInVzZUN1c3RvbUciLCAiY2hhbmdlIiwgYXBwbHlSSUMpOwogICAgb24oImJlYXJpbmdUeXBlIiwgImNoYW5nZSIsIGFwcGx5UklDKTsKICAgIG9uKCJkIiwgImlucHV0IiwgYXBwbHlSSUMpOwoKICAgIHZhciBjbGFzc1JvdyA9ICQoImNsYXNzQ2hpcHMiKTsKICAgIGlmIChjbGFzc1JvdykgewogICAgICBjbGFzc1Jvdy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBhcHBseVJJQyk7CiAgICAgIGNsYXNzUm93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICB2YXIgbGFiID0gZS50YXJnZXQgJiYgZS50YXJnZXQuY2xvc2VzdCA\/IGUudGFyZ2V0LmNsb3Nlc3QoIi5jaGlwIikgOiBudWxsOwogICAgICAgIGlmICghbGFiIHx8ICFjbGFzc1Jvdy5jb250YWlucyhsYWIpKSByZXR1cm47CiAgICAgICAgdmFyIGlucCA9IGxhYi5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICAgIGlmICghaW5wKSByZXR1cm47CiAgICAgICAgaW5wLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIGFwcGx5UklDKGlucC52YWx1ZSk7CiAgICAgIH0pOwogICAgfQoKICAgIG9uKCJidG5NZXRyaWMiLCAiY2xpY2siLCAoKSA9PiBzd2l0Y2hVbml0KCJtZXRyaWMiKSk7CiAgICBvbigiYnRuSW1wZXJpYWwiLCAiY2xpY2siLCAoKSA9PiBzd2l0Y2hVbml0KCJpbXBlcmlhbCIpKTsKICAgIG9uKCJidG5SZXNldCIsICJjbGljayIsIHJlc2V0RGVtbyk7CiAgICBvbigiYnRuUHJpbnQiLCAiY2xpY2siLCAoKSA9PiB3aW5kb3cucHJpbnQoKSk7CiAgICBvbigiYnRuQ2FsY3VsYXRlIiwgImNsaWNrIiwgcnVuQ2FsY3VsYXRlKTsKICB9CgogIGZ1bmN0aW9uIG9uUm9vdEV2ZW50KGUpIHsKICAgIGNvbnN0IHQgPSBlLnRhcmdldDsKICAgIGlmICghdCB8fCAhdC5jbG9zZXN0KSByZXR1cm47CiAgICBjb25zdCB3cmFwID0gdC5jbG9zZXN0KCIjYmlmLWNhbGMiKTsKICAgIGlmICghd3JhcCkgcmV0dXJuOwogICAgY29uc3QgY2xhc3NSb3cgPSB0LmNsb3Nlc3QoIiNjbGFzc0NoaXBzIik7CiAgICBpZiAoY2xhc3NSb3cpIHsKICAgICAgdmFyIGlucCA9ICh0LnRhZ05hbWUgPT09ICJJTlBVVCIpID8gdCA6ICh0LmNsb3Nlc3QoIi5jaGlwIikgJiYgdC5jbG9zZXN0KCIuY2hpcCIpLnF1ZXJ5U2VsZWN0b3IoImlucHV0IikpOwogICAgICBpZiAoaW5wKSB7CiAgICAgICAgaW5wLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIGFwcGx5UklDKGlucC52YWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGUudHlwZSAhPT0gImNoYW5nZSIpIHJldHVybjsKICAgIGlmICh0LmNsb3Nlc3QoIiNzaGFmdEZpdENoaXBzIikgfHwgdC5uYW1lID09PSAiYmlmU2hhZnRGaXQiKSB7CiAgICAgIGNvbnN0IHNlbCA9IHdyYXAucXVlcnlTZWxlY3RvcigiI3NoYWZ0Rml0Iik7CiAgICAgIGlmIChzZWwgJiYgdC52YWx1ZSkgc2VsLnZhbHVlID0gdC52YWx1ZTsKICAgICAgc3luY0Rlcml2ZWRJbnB1dHMoKTsKICAgIH0gZWxzZSBpZiAodC5jbG9zZXN0KCIjaG91c2luZ0ZpdENoaXBzIikgfHwgdC5uYW1lID09PSAiYmlmSG91c0ZpdCIpIHsKICAgICAgY29uc3Qgc2VsID0gd3JhcC5xdWVyeVNlbGVjdG9yKCIjaG91c2luZ0ZpdCIpOwogICAgICBpZiAoc2VsICYmIHQudmFsdWUpIHNlbC52YWx1ZSA9IHQudmFsdWU7CiAgICAgIHN5bmNEZXJpdmVkSW5wdXRzKCk7CiAgICB9CiAgfQoKICB2YXIgc3RhcnRlZCA9IGZhbHNlOwogIGZ1bmN0aW9uIGJvb3QoKSB7CiAgICBpZiAoIWdldFJvb3QoKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHN0YXJ0ZWQpIHsKICAgICAgdHJ5IHsgYXBwbHlSSUMoKTsgfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBzdGFydGVkID0gdHJ1ZTsKICAgIHRyeSB7IGJpbmQoKTsgfSBjYXRjaCAoZXJyKSB7IHRyeSB7IGFwcGx5UklDKCk7IH0gY2F0Y2ggKGUyKSB7fSB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIG9uUm9vdEV2ZW50LCB0cnVlKTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIG9uUm9vdEV2ZW50LCB0cnVlKTsKCiAgaWYgKCFib290KCkpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBib290KTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYm9vdCk7CiAgICB2YXIgdHJpZXMgPSAwOwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICB0cmllcyArPSAxOwogICAgICBpZiAoYm9vdCgpIHx8IHRyaWVzID4gMjApIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgfSwgMjUwKTsKICB9Cn0pKCk7<\/textarea>\n<script id=\"bif-boot-script\" type=\"text\/javascript\" data-no-minify=\"1\" data-no-defer=\"1\" data-cfasync=\"false\">\n(function(){\nvar el=document.getElementById(\"bif-js-b64\");\nif(!el){return;}\nvar code=el.value;\nif(!code){code=el.textContent;}\nif(!code){return;}\ncode=code.replace(\/\\s\/g,\"\");\nvar s=document.createElement(\"script\");\ns.type=\"text\/javascript\";\ns.text=atob(code);\nvar p=document.body;\nif(!p){p=document.getElementsByTagName(\"head\")[0];}\nif(p){p.appendChild(s);}\n})();\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Bearing Interference Fit &amp; Thermal Expansion Calculator is a practical engineering tool for evaluating bearing interference fits and dimensional changes caused by temperature variations&#8230;.<\/p>","protected":false},"author":2,"featured_media":24654,"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":[8567,8582,8581,8583],"class_list":["post-24653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bearing-calculator","tag-bearing-fit","tag-interference-fit","tag-thermal-expansion","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Bearing-Interference-Fit-Thermal-Expansion-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24653","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=24653"}],"version-history":[{"count":6,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24653\/revisions"}],"predecessor-version":[{"id":24660,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24653\/revisions\/24660"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/24654"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=24653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=24653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=24653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}