{"id":799,"date":"2026-10-01T10:33:45","date_gmt":"2026-10-01T10:33:45","guid":{"rendered":"https:\/\/energycloud.org\/scotland\/?page_id=799"},"modified":"2026-10-01T10:46:38","modified_gmt":"2026-10-01T10:46:38","slug":"wasted-wind-tracker-scotland","status":"publish","type":"page","link":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/","title":{"rendered":"Wasted Wind Tracker Scotland"},"content":{"rendered":"\n<!--\n  EnergyCloud Scotland: Wasted Wind Tracker\n  ==========================================\n  HOW TO EDIT\n  1. Wording and logo: everything you are likely to change is in the first two parts of this block.\n     Look for lines starting \"EDIT:\".\n       - Part 1 (just below): the logo, headline, introduction, method notes and closing message.\n       - Part 2 (the ECWT_TEXT list): sentences that include live numbers.\n  2. Change only the words between the tags. Leave anything inside < > alone, apart from\n     the logo's src=\"...\" address and the closing button's href=\"...\" link.\n  3. Everything after the line \"DO NOT EDIT BELOW THIS LINE\" is styling and code.\n  4. Before editing, copy the whole block into a text file as a backup. If something breaks,\n     paste the backup back in.\n-->\n\n<!-- ======== PART 1: LOGO AND PAGE TEXT ======== -->\n<div class=\"ecwt\" id=\"ecwt-root\" aria-live=\"off\">\n  <!-- ================= EDIT: LOGO =================\n       To change the logo, replace the web address inside src=\"...\" below.\n       Get the address from WordPress: Media > Library > click the logo > Copy URL to clipboard.\n       alt=\"...\" is what screen readers say; keep it as the organisation's name. -->\n  <header class=\"ecwt-head\">\n    <img decoding=\"async\" class=\"ecwt-logo\" src=\"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif\" alt=\"EnergyCloud Scotland\" onerror=\"this.style.display='none'\">\n\n    <!-- ================= EDIT: HEADLINE AND INTRODUCTION ================= -->\n    <p class=\"ecwt-eyebrow\">EnergyCloud Scotland \u00b7 Wasted Wind Tracker<\/p>\n    <p class=\"ecwt-lede\">When the grid can&#8217;t carry Scotland&#8217;s wind power to where it&#8217;s needed, National Grid pays wind farms to turn down. EnergyCloud wants that surplus sent to households in fuel poverty instead. These figures come straight from Elexon&#8217;s official balancing data and update automatically.<\/p>\n  <\/header>\n\n  <div class=\"ecwt-banner\" id=\"ecwt-banner\" hidden>\n    <span id=\"ecwt-banner-text\">We couldn&#8217;t reach Elexon&#8217;s data service.<\/span>\n    <button type=\"button\" class=\"ecwt-btn\" id=\"ecwt-retry\">Try again<\/button>\n  <\/div>\n\n  <!-- The sections below fill in their numbers automatically. Plain wording between tags can be edited safely;\n       don't change anything with id=\"...\" or class=\"...\" on it. -->\n  <section class=\"ecwt-live\" aria-labelledby=\"ecwt-live-label\">\n    <div>\n      <div class=\"ecwt-live-status\">\n        <span class=\"ecwt-pill\" id=\"ecwt-live-pill\" data-state=\"loading\">Connecting<\/span>\n        <span class=\"ecwt-muted ecwt-num\" id=\"ecwt-live-when\">Reading the latest half-hour<\/span>\n      <\/div>\n      <div class=\"ecwt-figure\"><span class=\"ecwt-big\" id=\"ecwt-live-mw\">\u2013<\/span><span class=\"ecwt-unit\">MW<\/span><\/div>\n      <p class=\"ecwt-live-label\" id=\"ecwt-live-label\">of Scottish wind power being held back right now<\/p>\n    <\/div>\n    <dl class=\"ecwt-live-facts\">\n      <div class=\"ecwt-fact\"><dt class=\"ecwt-fact-v\" id=\"ecwt-live-homes\">\u2013<\/dt><dd class=\"ecwt-fact-k\">homes&#8217; average electricity demand that this could meet<\/dd><\/div>\n      <div class=\"ecwt-fact\"><dt class=\"ecwt-fact-v\" id=\"ecwt-live-farms\">\u2013<\/dt><dd class=\"ecwt-fact-k\">wind farms instructed to turn down<\/dd><\/div>\n      <div class=\"ecwt-fact\"><dt class=\"ecwt-fact-v\" id=\"ecwt-live-share\">\u2013<\/dt><dd class=\"ecwt-fact-k\">of monitored Scottish wind capacity<\/dd><\/div>\n    <\/dl>\n  <\/section>\n\n  <section class=\"ecwt-stats\" aria-label=\"Settled totals\">\n    <div class=\"ecwt-panel ecwt-stat\">\n      <p class=\"ecwt-stat-k\" id=\"ecwt-day-k\">Latest full day<\/p>\n      <div class=\"ecwt-stat-main\"><span class=\"ecwt-stat-v\" id=\"ecwt-day-v\">\u2013<\/span><span class=\"ecwt-stat-cost\" id=\"ecwt-day-cost\"><\/span><\/div>\n      <p class=\"ecwt-stat-homes\" id=\"ecwt-day-homes\">Loading settled data\u2026<\/p>\n    <\/div>\n    <div class=\"ecwt-panel ecwt-stat\">\n      <p class=\"ecwt-stat-k\" id=\"ecwt-range-k\">Last 7 days<\/p>\n      <div class=\"ecwt-stat-main\"><span class=\"ecwt-stat-v\" id=\"ecwt-range-v\">\u2013<\/span><span class=\"ecwt-stat-cost\" id=\"ecwt-range-cost\"><\/span><\/div>\n      <p class=\"ecwt-stat-homes\" id=\"ecwt-range-homes\">Loading settled data\u2026<\/p>\n    <\/div>\n  <\/section>\n\n  <section class=\"ecwt-panel\" aria-labelledby=\"ecwt-chart-title\">\n    <div class=\"ecwt-panel-head\">\n      <h3 class=\"ecwt-h3\" id=\"ecwt-chart-title\">Wind energy turned down each day<\/h3>\n      <div class=\"ecwt-controls\">\n        <div class=\"ecwt-seg\" role=\"group\" aria-label=\"Measure\">\n          <button type=\"button\" id=\"ecwt-m-energy\" data-metric=\"energy\" aria-pressed=\"true\">Energy<\/button>\n          <button type=\"button\" id=\"ecwt-m-cost\" data-metric=\"cost\" aria-pressed=\"false\">Cost<\/button>\n        <\/div>\n        <div class=\"ecwt-seg\" role=\"group\" aria-label=\"Period\">\n          <button type=\"button\" id=\"ecwt-r-7\" data-range=\"7\" aria-pressed=\"true\">7 days<\/button>\n          <button type=\"button\" id=\"ecwt-r-14\" data-range=\"14\" aria-pressed=\"false\">14 days<\/button>\n          <button type=\"button\" id=\"ecwt-r-30\" data-range=\"30\" aria-pressed=\"false\">30 days<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"ecwt-chart\" id=\"ecwt-chart\"><\/div>\n    <div class=\"ecwt-legend\" id=\"ecwt-legend\"><\/div>\n    <p class=\"ecwt-progress\" id=\"ecwt-progress\" aria-live=\"polite\"><\/p>\n    <details>\n      <summary>Show the daily figures as a table<\/summary>\n      <div class=\"ecwt-tablewrap\" id=\"ecwt-day-table\"><\/div>\n    <\/details>\n  <\/section>\n\n  <div class=\"ecwt-cols\">\n    <section class=\"ecwt-panel\" aria-labelledby=\"ecwt-farms-title\">\n      <div class=\"ecwt-panel-head\">\n        <h3 class=\"ecwt-h3\" id=\"ecwt-farms-title\">Turned down most<\/h3>\n        <span class=\"ecwt-note\" id=\"ecwt-farms-note\">Last 7 full days<\/span>\n      <\/div>\n      <div class=\"ecwt-tablewrap\" id=\"ecwt-farms\"><p class=\"ecwt-empty\">Loading\u2026<\/p><\/div>\n    <\/section>\n    <section class=\"ecwt-panel\" aria-labelledby=\"ecwt-now-title\">\n      <div class=\"ecwt-panel-head\">\n        <h3 class=\"ecwt-h3\" id=\"ecwt-now-title\">Held back right now<\/h3>\n        <span class=\"ecwt-note\" id=\"ecwt-now-note\">Current half-hour<\/span>\n      <\/div>\n      <div class=\"ecwt-tablewrap\" id=\"ecwt-now\"><p class=\"ecwt-empty\">Loading\u2026<\/p><\/div>\n    <\/section>\n  <\/div>\n\n  <div class=\"ecwt-actions\">\n    <button type=\"button\" class=\"ecwt-btn primary\" id=\"ecwt-copy\" disabled>Copy a summary to share<\/button>\n    <button type=\"button\" class=\"ecwt-btn\" id=\"ecwt-csv\" disabled>Download daily data (CSV)<\/button>\n    <span class=\"ecwt-toast\" id=\"ecwt-toast\" role=\"status\"><\/span>\n  <\/div>\n\n  <section class=\"ecwt-panel\">\n    <details class=\"ecwt-method-d\" style=\"border:0;margin:0;padding:0\">\n      <!-- ================= EDIT: METHOD NOTES ================= -->\n      <summary>How these figures are worked out<\/summary>\n      <div class=\"ecwt-method\" style=\"margin-top:12px\">\n        <p><strong>Right now.<\/strong> Every five minutes the tracker reads each Scottish wind farm&#8217;s Physical Notification (the output it told the grid it expected to produce) and the latest Bid-Offer Acceptance from National Grid&#8217;s control room for the current half-hour. Where an instruction has set a wind farm below its notified output, the gap is counted as power held back.<\/p>\n        <p><strong>Daily totals.<\/strong> Each day&#8217;s figure adds up the settled bid acceptance volumes (Elexon&#8217;s BOAV data) for the monitored wind farms. The cost is the sum of Elexon&#8217;s indicative bid cashflows (EBOCF) for the same wind farms: what was paid to them, net, for turning down. Settled data arrives about a day after each half-hour, so the latest full day is usually the day before yesterday. A paler bar marks a day that is still filling in.<\/p>\n        <p><strong>Homes.<\/strong> Comparisons use Ofgem&#8217;s typical household electricity use of 2,500 kWh a year (in force from 1 July 2026). That is about 6.8 kWh a day, or an average demand of 0.29 kW.<\/p>\n        <h3>What this leaves out<\/h3>\n        <ul>\n          <li>It&#8217;s a lower bound. It counts only grid instructions to transmission-connected and other Balancing Mechanism wind units in Scotland, and not wind farms that curtail themselves or smaller farms on the local distribution network.<\/li>\n          <li>The cost covers payments to the Scottish wind farms only. It excludes the cost of turning other power stations up to replace that energy, which adds substantially to total constraint costs.<\/li>\n          <li>Settlement figures can be revised after first publication.<\/li>\n        <\/ul>\n        <h3>Which wind farms are included<\/h3>\n        <p id=\"ecwt-coverage\">Loading the list of monitored wind farms\u2026<\/p>\n        <p class=\"ecwt-note\">A unit is included when Elexon&#8217;s register lists it as wind and either places it in the North or South Scotland grid supply area, or gives it a Scottish transmission loss zone. The list rebuilds itself from Elexon&#8217;s register, so new wind farms are picked up automatically.<\/p>\n        <details>\n          <summary>See every monitored unit<\/summary>\n          <div class=\"ecwt-unitlist\" id=\"ecwt-unitlist\"><\/div>\n        <\/details>\n      <\/div>\n    <\/details>\n  <\/section>\n\n  <!-- ================= EDIT: CLOSING MESSAGE AND BUTTON (href is where the button goes) ================= -->\n  <div class=\"ecwt-cta\">\n    <p>EnergyCloud is a not-for-profit working to redirect surplus renewable energy to households struggling with fuel poverty.<\/p>\n    <a class=\"ecwt-btn primary\" href=\"https:\/\/energycloud.org\/scotland\/about-us\/\">How EnergyCloud works<\/a>\n  <\/div>\n\n  <p class=\"ecwt-credit\">Contains BMRS data \u00a9 Elexon Limited copyright and database right <span id=\"ecwt-year\">2026<\/span>. Source: <a href=\"https:\/\/bmrs.elexon.co.uk\/\">Elexon Insights Solution<\/a>. Figures are indicative and provided for information.<\/p>\n<\/div>\n\n<!-- ======== PART 2: WORDING THAT INCLUDES LIVE NUMBERS ======== -->\n<script>\n\/* ================= EDIT: WORDING THAT INCLUDES LIVE NUMBERS =================\n   These sentences are filled in by the tracker. Change the words freely, but keep the\n   {placeholders} spelled exactly as they are: the tracker swaps them for the real figures.\n   Keep each line's quote marks and the comma at the end. <strong>...<\/strong> makes words bold. *\/\nwindow.ECWT_TEXT = {\n  liveWhen: \"Half-hour {period} \u00b7 as of {time} UK time\",\n  nowNote: \"Half-hour {period}, {time}\",\n  nowNone: \"No Scottish wind farms are being instructed to turn down at the moment.\",\n  dayLabel: \"Latest full day \u00b7 {date}\",\n  dayHomes: \"Enough electricity for <strong>{homes} homes<\/strong> for that day.\",\n  dayNone: \"No Scottish wind was turned down that day.\",\n  rangeLabel: \"Last {days} full days\",\n  rangeHomes: \"A whole year's electricity for <strong>{homes} homes<\/strong>.\",\n  rangeNone: \"No Scottish wind was turned down in this period.\",\n  paid: \"{cost} paid\",\n  chartEnergy: \"Wind energy turned down each day\",\n  chartCost: \"Paid to Scottish wind farms to turn down, each day\",\n  farmsNone: \"No Scottish wind farms were turned down in this period.\",\n  coverage: \"Monitoring {units} wind units at {sites} sites in Scotland, with {gw} GW of registered capacity.\",\n  share: \"In the last {days} days, {energy} of Scottish wind power was switched off because the grid couldn't use it, with {cost} paid to wind farms to turn down. That's a year's electricity for {homes} homes. On {date} alone, {dayEnergy} was turned down. Source: EnergyCloud Scotland Wasted Wind Tracker, using Elexon BMRS data. {link}\",\n  liveError: \"Live data couldn't be loaded. It will retry in five minutes.\",\n  liveErrorTable: \"Live data isn't available right now.\",\n  bannerAll: \"We couldn't reach Elexon's data service, so the figures can't be shown just now.\",\n  bannerSettled: \"Settled figures couldn't be loaded from Elexon just now.\"\n};\n<\/script>\n\n<!-- ======================= DO NOT EDIT BELOW THIS LINE ======================= -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Atkinson+Hyperlegible:wght@400;700&#038;family=Barlow+Semi+Condensed:wght@600;700&#038;display=swap\">\n<style>\n\/* Layout: one column of stacked panels \u2014 a live gauge, two summary blocks, a daily bar chart, two ranked tables, method notes.\n   Everything is scoped under .ecwt so it can sit inside a WordPress page without leaking or being overridden. *\/\n.ecwt {\n  --ec-bg: #f5f8f7;\n  --ec-surface: #ffffff;\n  --ec-ink: #13211e;\n  --ec-ink-2: #44554f;\n  --ec-muted: #66766f;\n  --ec-line: #dbe4e1;\n  --ec-brand: #3b7c6e;      \/* EnergyCloud teal: UI accents, links *\/\n  --ec-brand-ink: #2c6457;  \/* teal dark enough for small text *\/\n  --ec-bar: #17866f;        \/* chart marks, validated for chroma + contrast *\/\n  --ec-bar-soft: #b9ddd3;\n  --ec-tint: #e7f2ef;\n  --ec-live: #c2410c;       \/* \"held back right now\" signal *\/\n  --ec-live-tint: #fdeee6;\n  --ec-ok: #1f7a45;\n  --ec-warn: #9a6200;\n  --ec-err: #b42318;\n  --ec-display: \"Barlow Semi Condensed\", \"Arial Narrow\", \"Roboto Condensed\", system-ui, sans-serif;\n  --ec-body: \"Atkinson Hyperlegible\", \"Segoe UI\", system-ui, -apple-system, sans-serif;\n  --ec-radius: 10px;\n\n  box-sizing: border-box;\n  background: var(--ec-bg);\n  color: var(--ec-ink);\n  font-family: var(--ec-body);\n  font-size: 16px;\n  line-height: 1.5;\n  padding: clamp(16px, 3vw, 32px);\n  border-radius: 14px;\n  max-width: 1080px;\n  margin: 0 auto;\n  display: grid;\n  gap: 20px;\n  -webkit-font-smoothing: antialiased;\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme=\"light\"]) .ecwt.ecwt-auto {\n    --ec-bg: #0f1716; --ec-surface: #162220; --ec-ink: #e6efec; --ec-ink-2: #b6c6c0;\n    --ec-muted: #8fa29b; --ec-line: #2a3a37; --ec-brand: #5fb3a1; --ec-brand-ink: #7cc6b5;\n    --ec-bar: #2fa88c; --ec-bar-soft: #2a4d45; --ec-tint: #1c302c; --ec-live: #f08a5d;\n    --ec-live-tint: #2c1d16; --ec-ok: #5cc98a; --ec-warn: #e0a640; --ec-err: #f07a6f;\n    color-scheme: dark;\n  }\n}\n:root[data-theme=\"dark\"] .ecwt.ecwt-auto {\n  --ec-bg: #0f1716; --ec-surface: #162220; --ec-ink: #e6efec; --ec-ink-2: #b6c6c0;\n  --ec-muted: #8fa29b; --ec-line: #2a3a37; --ec-brand: #5fb3a1; --ec-brand-ink: #7cc6b5;\n  --ec-bar: #2fa88c; --ec-bar-soft: #2a4d45; --ec-tint: #1c302c; --ec-live: #f08a5d;\n  --ec-live-tint: #2c1d16; --ec-ok: #5cc98a; --ec-warn: #e0a640; --ec-err: #f07a6f;\n  color-scheme: dark;\n}\n\n.ecwt *, .ecwt *::before, .ecwt *::after { box-sizing: border-box; }\n.ecwt h1, .ecwt h2, .ecwt h3, .ecwt p, .ecwt ul, .ecwt ol, .ecwt dl, .ecwt dd, .ecwt figure { margin: 0; padding: 0; }\n.ecwt h1, .ecwt h2, .ecwt h3 { font-family: var(--ec-display); color: var(--ec-ink); text-wrap: balance; letter-spacing: 0; text-transform: none; }\n.ecwt a { color: var(--ec-brand-ink); text-decoration: underline; text-underline-offset: 2px; }\n.ecwt a:hover { text-decoration-thickness: 2px; }\n.ecwt button { font: inherit; }\n.ecwt :focus-visible { outline: 3px solid var(--ec-brand); outline-offset: 2px; }\n.ecwt .ecwt-num { font-variant-numeric: tabular-nums; }\n.ecwt .ecwt-muted { color: var(--ec-muted); }\n.ecwt [hidden] { display: none !important; }\n.ecwt .ecwt-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n\n\/* Header *\/\n.ecwt-head { display: grid; gap: 10px; max-width: 70ch; }\n.ecwt .ecwt-logo { display: block; height: 64px; width: auto; max-width: min(280px, 70%); object-fit: contain; margin: 0 0 6px; border: 0; box-shadow: none; }\n.ecwt-eyebrow { font-family: var(--ec-display); font-weight: 600; font-size: 14px; letter-spacing: .08em; text-transform: uppercase; color: var(--ec-brand-ink); }\n.ecwt .ecwt-title { font-size: clamp(28px, 4.4vw, 42px); line-height: 1.08; font-weight: 700; }\n.ecwt-lede { color: var(--ec-ink-2); font-size: 17px; }\n\n\/* Panels *\/\n.ecwt-panel { background: var(--ec-surface); border: 1px solid var(--ec-line); border-radius: var(--ec-radius); padding: clamp(16px, 2.5vw, 24px); min-width: 0; }\n.ecwt-panel-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 8px 16px; margin-bottom: 14px; }\n.ecwt .ecwt-h3 { font-size: 22px; font-weight: 700; line-height: 1.2; }\n.ecwt-note { font-size: 14px; color: var(--ec-muted); }\n\n\/* Live gauge *\/\n.ecwt-live { background: var(--ec-surface); border: 1px solid var(--ec-line); border-left: 6px solid var(--ec-live); border-radius: var(--ec-radius); padding: clamp(16px, 2.5vw, 24px); display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: 20px 32px; align-items: center; }\n.ecwt-live-status { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; font-size: 14px; }\n.ecwt-pill { display: inline-flex; align-items: center; gap: 6px; font-weight: 700; font-size: 13px; letter-spacing: .04em; text-transform: uppercase; padding: 3px 10px 3px 8px; border-radius: 999px; background: var(--ec-tint); color: var(--ec-ink-2); }\n.ecwt-pill::before { content: \"\"; width: 8px; height: 8px; border-radius: 50%; background: currentColor; }\n.ecwt-pill[data-state=\"live\"] { background: var(--ec-live-tint); color: var(--ec-live); }\n.ecwt-pill[data-state=\"live\"]::before { animation: ecwt-pulse 2s ease-in-out infinite; }\n.ecwt-pill[data-state=\"error\"] { color: var(--ec-err); }\n@keyframes ecwt-pulse { 50% { opacity: .25; } }\n@media (prefers-reduced-motion: reduce) { .ecwt-pill[data-state=\"live\"]::before { animation: none; } }\n.ecwt-figure { display: flex; align-items: baseline; gap: 8px; margin-top: 6px; }\n.ecwt-big { font-family: var(--ec-display); font-weight: 700; font-size: clamp(56px, 9vw, 88px); line-height: .95; color: var(--ec-ink); font-variant-numeric: tabular-nums; }\n.ecwt-unit { font-family: var(--ec-display); font-weight: 600; font-size: 28px; color: var(--ec-ink-2); }\n.ecwt-live-label { font-size: 17px; font-weight: 700; margin-top: 4px; }\n.ecwt-live-facts { display: grid; gap: 12px; }\n.ecwt-fact { display: grid; grid-template-columns: auto 1fr; gap: 2px 12px; align-items: baseline; padding-bottom: 12px; border-bottom: 1px solid var(--ec-line); }\n.ecwt-fact:last-child { border-bottom: 0; padding-bottom: 0; }\n.ecwt-fact-v { font-family: var(--ec-display); font-weight: 700; font-size: 26px; line-height: 1.1; min-width: 4.5ch; font-variant-numeric: tabular-nums; }\n.ecwt-fact-k { color: var(--ec-ink-2); font-size: 15px; }\n\n\/* Summary blocks *\/\n.ecwt-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }\n.ecwt-stat { display: grid; gap: 4px; align-content: start; }\n.ecwt-stat-k { font-family: var(--ec-display); font-weight: 600; font-size: 15px; letter-spacing: .06em; text-transform: uppercase; color: var(--ec-muted); }\n.ecwt-stat-main { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 18px; margin-top: 4px; }\n.ecwt-stat-v { font-family: var(--ec-display); font-weight: 700; font-size: clamp(36px, 5vw, 48px); line-height: 1; font-variant-numeric: tabular-nums; }\n.ecwt-stat-cost { font-family: var(--ec-display); font-weight: 600; font-size: 24px; color: var(--ec-ink-2); font-variant-numeric: tabular-nums; }\n.ecwt-stat-homes { font-size: 15px; color: var(--ec-ink-2); margin-top: 6px; }\n.ecwt-stat-homes strong { color: var(--ec-ink); }\n\n\/* Segmented controls *\/\n.ecwt-controls { display: flex; flex-wrap: wrap; gap: 8px 12px; }\n.ecwt-seg { display: inline-flex; border: 1px solid var(--ec-line); border-radius: 8px; padding: 2px; background: var(--ec-bg); }\n.ecwt-seg button { appearance: none; border: 0; background: transparent; color: var(--ec-ink-2); padding: 6px 12px; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 700; line-height: 1.2; min-height: 34px; box-shadow: none; text-transform: none; letter-spacing: 0; }\n.ecwt-seg button[aria-pressed=\"true\"] { background: var(--ec-surface); color: var(--ec-ink); box-shadow: 0 1px 2px rgba(0,0,0,.12); }\n.ecwt-seg button:hover:not([aria-pressed=\"true\"]) { color: var(--ec-ink); }\n\n\/* Chart *\/\n.ecwt-chart { position: relative; width: 100%; min-height: 260px; }\n.ecwt-chart svg { display: block; width: 100%; height: auto; overflow: visible; }\n.ecwt-chart .ax { fill: var(--ec-muted); font-family: var(--ec-body); font-size: 12px; }\n.ecwt-chart .grid { stroke: var(--ec-line); stroke-width: 1; }\n.ecwt-chart .base { stroke: var(--ec-ink-2); stroke-width: 1; }\n.ecwt-chart .bar { fill: var(--ec-bar); }\n.ecwt-chart .bar.partial { fill: var(--ec-bar-soft); }\n.ecwt-chart .bar.pending { fill: var(--ec-line); }\n.ecwt-chart .val { fill: var(--ec-ink); font-family: var(--ec-display); font-weight: 600; font-size: 13px; }\n.ecwt-chart .hit { fill: transparent; cursor: default; }\n.ecwt-chart .hit:hover + .hl, .ecwt-chart .hit:focus + .hl { opacity: 1; }\n.ecwt-chart .hl { fill: var(--ec-tint); opacity: 0; pointer-events: none; }\n.ecwt-tip { position: absolute; pointer-events: none; background: var(--ec-ink); color: var(--ec-surface); border-radius: 8px; padding: 8px 10px; font-size: 13px; line-height: 1.35; white-space: nowrap; transform: translate(-50%, calc(-100% - 10px)); z-index: 2; box-shadow: 0 4px 14px rgba(0,0,0,.18); }\n.ecwt-tip b { font-family: var(--ec-display); font-size: 15px; }\n.ecwt-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 13px; color: var(--ec-muted); margin-top: 8px; }\n.ecwt-legend i { display: inline-block; width: 12px; height: 12px; border-radius: 3px; vertical-align: -1px; margin-right: 6px; }\n.ecwt-progress { font-size: 14px; color: var(--ec-muted); min-height: 1.5em; margin-top: 6px; }\n\n\/* Tables *\/\n.ecwt-cols { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 20px; }\n.ecwt-tablewrap { overflow-x: auto; }\n.ecwt table { width: 100%; border-collapse: collapse; font-size: 15px; margin: 0; border: 0; background: transparent; }\n.ecwt th, .ecwt td { padding: 9px 8px; text-align: left; border: 0; border-bottom: 1px solid var(--ec-line); background: transparent; color: var(--ec-ink); vertical-align: middle; }\n.ecwt th { font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ec-muted); }\n.ecwt td.r, .ecwt th.r { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }\n.ecwt tr:last-child td { border-bottom: 0; }\n.ecwt-farm { font-weight: 700; }\n.ecwt-code { display: block; font-size: 12px; color: var(--ec-muted); font-weight: 400; }\n.ecwt-share { display: block; height: 4px; border-radius: 2px; background: var(--ec-bar); margin-top: 5px; min-width: 2px; }\n.ecwt-livebar { display: block; height: 4px; border-radius: 2px; background: var(--ec-live); margin-top: 5px; min-width: 2px; }\n.ecwt-empty { color: var(--ec-muted); font-size: 15px; padding: 12px 0; }\n.ecwt-link-btn { appearance: none; border: 0; background: none; padding: 8px 0 0; color: var(--ec-brand-ink); font-weight: 700; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; box-shadow: none; }\n\n\/* Actions *\/\n.ecwt-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 12px; }\n.ecwt-btn { appearance: none; border: 1px solid var(--ec-brand); background: var(--ec-surface); color: var(--ec-brand-ink); border-radius: 8px; padding: 9px 16px; font-weight: 700; font-size: 15px; cursor: pointer; line-height: 1.2; box-shadow: none; text-transform: none; letter-spacing: 0; }\n.ecwt-btn.primary { background: var(--ec-brand); color: #fff; }\n.ecwt-btn:hover { filter: brightness(1.05); }\n.ecwt-btn:disabled { opacity: .5; cursor: default; }\n.ecwt-toast { font-size: 14px; color: var(--ec-ok); font-weight: 700; }\n\n\/* Details *\/\n.ecwt details { border-top: 1px solid var(--ec-line); padding-top: 12px; margin-top: 12px; }\n.ecwt summary { cursor: pointer; font-weight: 700; color: var(--ec-brand-ink); }\n.ecwt-method { display: grid; gap: 12px; font-size: 15px; color: var(--ec-ink-2); max-width: 78ch; }\n.ecwt-method h3 { font-size: 18px; font-weight: 700; margin-top: 4px; }\n.ecwt-method ul { padding-left: 20px; display: grid; gap: 6px; }\n.ecwt-unitlist { max-height: 320px; overflow: auto; font-size: 13px; border: 1px solid var(--ec-line); border-radius: 8px; padding: 4px 10px; margin-top: 8px; }\n.ecwt-unitlist td { padding: 5px 6px; font-size: 13px; }\n\n.ecwt-cta { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 20px; background: var(--ec-tint); border-radius: var(--ec-radius); padding: 18px clamp(16px, 2.5vw, 24px); }\n.ecwt-cta p { max-width: 60ch; font-size: 16px; }\n.ecwt-cta a.ecwt-btn { text-decoration: none; display: inline-block; }\n.ecwt-credit { font-size: 13px; color: var(--ec-muted); }\n\n.ecwt-banner { border: 1px solid var(--ec-err); color: var(--ec-ink); background: var(--ec-surface); border-radius: var(--ec-radius); padding: 14px 16px; display: flex; flex-wrap: wrap; gap: 8px 16px; align-items: center; justify-content: space-between; }\n\n@media (max-width: 760px) {\n  .ecwt-live, .ecwt-stats, .ecwt-cols { grid-template-columns: minmax(0, 1fr); }\n}\n<\/style>\n<script>\n(function(){var b=atob(\"KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZWN3dC1yb290Iik7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLWVjd3QtaW5pdCIpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoImRhdGEtZWN3dC1pbml0IiwgIjEiKTsKCiAgdmFyIEFQSSA9ICJodHRwczovL2RhdGEuZWxleG9uLmNvLnVrL2JtcnMvYXBpL3YxIjsKICB2YXIgSE9NRV9LV0hfWUVBUiA9IDI1MDA7ICAgICAgICAgICAgICAgICAvLyBPZmdlbSBURENWLCBlbGVjdHJpY2l0eSwgZnJvbSAxIEp1bHkgMjAyNgogIHZhciBIT01FX0tXSF9EQVkgPSBIT01FX0tXSF9ZRUFSIC8gMzY1OwogIHZhciBIT01FX0tXX0FWRyA9IEhPTUVfS1dIX1lFQVIgLyA4NzYwOwogIHZhciBTRVRUTEVfTEFHX01TID0gMjUgKiAzNjAwZTM7ICAgICAgICAgIC8vIHNldHRsZWQgQk9BVi9FQk9DRiBhcnJpdmUgfjI0aDE1bSBhZnRlciBlYWNoIGhhbGYtaG91cgogIHZhciBMSVZFX1JFRlJFU0hfTVMgPSA1ICogNjBlMzsKICB2YXIgQ0hVTksgPSA1MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bml0cyBwZXIgZmlsdGVyZWQgcmVxdWVzdAogIHZhciBDQUNIRV9WID0gImVjd3QudjEuIjsKCiAgLy8gU2NvdHRpc2ggd2luZCBzdGF0aW9ucyBieSBOYXRpb25hbCBHcmlkIEJNVSBwcmVmaXguIFVzZWQgZm9yIGZyaWVuZGx5IG5hbWVzLCBhbmQgdG8gbWFrZSBzdXJlCiAgLy8gdGhlc2UgYXJlIGluY2x1ZGVkIGV2ZW4gaWYgdGhlIHJlZ2lzdGVyJ3MgbG9jYXRpb24gZmllbGRzIGFyZSBibGFuay4gVW5rbm93biBjb2RlcyBhcmUgaGFybWxlc3MuCiAgdmFyIE5BTUVTID0gewogICAgU0dSV086ICJTZWFncmVlbiAob2Zmc2hvcmUpIiwgTU9XRU86ICJNb3JheSBFYXN0IChvZmZzaG9yZSkiLCBNT1dXTzogIk1vcmF5IFdlc3QgKG9mZnNob3JlKSIsCiAgICBCRUFUTzogIkJlYXRyaWNlIChvZmZzaG9yZSkiLCBOTkdBTzogIk5lYXJ0IG5hIEdhb2l0aGUgKG9mZnNob3JlKSIsIEFCUkJPOiAiQWJlcmRlZW4gQmF5IChvZmZzaG9yZSkiLAogICAgS0lOQ086ICJLaW5jYXJkaW5lIChvZmZzaG9yZSkiLCBIWVdEVzogIkh5d2luZCBTY290bGFuZCAob2Zmc2hvcmUpIiwKICAgIFZLTkdXOiAiVmlraW5nIChTaGV0bGFuZCkiLCBET1JFVzogIkRvcmVuZWxsIiwgQ0xETlc6ICJDbHlkZSBOb3J0aCIsIENMRFNXOiAiQ2x5ZGUgU291dGgiLAogICAgQ0xEQ1c6ICJDbHlkZSBDZW50cmFsIiwgV0hJTFc6ICJXaGl0ZWxlZSIsIEtJTEJXOiAiS2lsZ2FsbGlvY2giLCBTVFJOVzogIlN0cm9uZWxhaXJnIiwKICAgIERVTkdXOiAiRHVubWFnbGFzcyIsIEdSSUZXOiAiR3JpZmZpbiIsIEZBTEdXOiAiRmFsbGFnbyBSaWciLCBIQUxTVzogIkhhbHNhcnkiLCBMSU1LVzogIkxpbWVraWxuIiwKICAgIENSWVJXOiAiQ3J5c3RhbCBSaWciLCBCSExBVzogIkJobGFyYWlkaCIsIENHVEhXOiAiQ29ycmllZ2FydGgiLCBBUkNIVzogIkFyZWNsZW9jaCIsCiAgICBNS0hMVzogIk1hcmsgSGlsbCIsIEdMV1NXOiAiR2FsYXdoaXN0bGUiLCBIUlNUVzogIkhhcmVzdGFuZXMiLCBCTExBOiAiQmxhY2sgTGF3IiwKICAgIEJMS1dXOiAiQmxhY2tjcmFpZyIsIEFGVE9XOiAiQWZ0b24iLCBBQlJUVzogIkF1Y2hyb2JlcnQiLAogICAgQUNIUlc6ICJBJ0NocnVhY2giLCBCUkRVVzogIkJlaW5uIGFuIFR1aXJjIiwgQ1JNTFc6ICJDb3JyaWVtb2lsbGllIiwgRkFBUlc6ICJGYXJyIiwKICAgIEdPUkRXOiAiR29yZG9uYnVzaCIsIE1JTFdXOiAiTWlsbGVubml1bSIsIEVESU5XOiAiRWRpbmJhbmUiLCBTQU5RVzogIlNhbnF1aGFyIiwKICAgIEtZUEVXOiAiS3lwZSBNdWlyIiwgQUlSU1c6ICJBaXJpZXMiLCBBTlNVVzogIkFuZGVyc2hhdyIsIEJUVUlXOiAiQmVpbm4gVGhhcnN1aW5uIiwKICAgIENMRkxXOiAiQ2xhY2hhbiBGbGF0cyIsIERBTFNXOiAiRGFsc3dpbnRvbiIKICB9OwoKCiAgLy8gV29yZGluZyBidWlsdCBieSB0aGUgc2NyaXB0LiBFZGl0IGl0IGluIHRoZSBFQ1dUX1RFWFQgYmxvY2sgbmVhciB0aGUgdG9wIG9mIHRoZSBwYWdlLCBub3QgaGVyZS4KICB2YXIgVFhUID0gewogICAgbGl2ZVdoZW46ICJIYWxmLWhvdXIge3BlcmlvZH0gwrcgYXMgb2Yge3RpbWV9IFVLIHRpbWUiLAogICAgbGl2ZUVycm9yOiAiTGl2ZSBkYXRhIGNvdWxkbid0IGJlIGxvYWRlZC4gSXQgd2lsbCByZXRyeSBpbiBmaXZlIG1pbnV0ZXMuIiwKICAgIGxpdmVFcnJvclRhYmxlOiAiTGl2ZSBkYXRhIGlzbid0IGF2YWlsYWJsZSByaWdodCBub3cuIiwKICAgIG5vd05vdGU6ICJIYWxmLWhvdXIge3BlcmlvZH0sIHt0aW1lfSIsCiAgICBub3dOb25lOiAiTm8gU2NvdHRpc2ggd2luZCBmYXJtcyBhcmUgYmVpbmcgaW5zdHJ1Y3RlZCB0byB0dXJuIGRvd24gYXQgdGhlIG1vbWVudC4iLAogICAgZGF5TGFiZWw6ICJMYXRlc3QgZnVsbCBkYXkgwrcge2RhdGV9IiwKICAgIGRheUhvbWVzOiAiRW5vdWdoIGVsZWN0cmljaXR5IGZvciA8c3Ryb25nPntob21lc30gaG9tZXM8L3N0cm9uZz4gZm9yIHRoYXQgZGF5LiIsCiAgICBkYXlOb25lOiAiTm8gU2NvdHRpc2ggd2luZCB3YXMgdHVybmVkIGRvd24gdGhhdCBkYXkuIiwKICAgIHJhbmdlTGFiZWw6ICJMYXN0IHtkYXlzfSBmdWxsIGRheXMiLAogICAgcmFuZ2VIb21lczogIkEgd2hvbGUgeWVhcidzIGVsZWN0cmljaXR5IGZvciA8c3Ryb25nPntob21lc30gaG9tZXM8L3N0cm9uZz4uIiwKICAgIHJhbmdlTm9uZTogIk5vIFNjb3R0aXNoIHdpbmQgd2FzIHR1cm5lZCBkb3duIGluIHRoaXMgcGVyaW9kLiIsCiAgICBwYWlkOiAie2Nvc3R9IHBhaWQiLAogICAgY2hhcnRFbmVyZ3k6ICJXaW5kIGVuZXJneSB0dXJuZWQgZG93biBlYWNoIGRheSIsCiAgICBjaGFydENvc3Q6ICJQYWlkIHRvIFNjb3R0aXNoIHdpbmQgZmFybXMgdG8gdHVybiBkb3duLCBlYWNoIGRheSIsCiAgICBmYXJtc05vbmU6ICJObyBTY290dGlzaCB3aW5kIGZhcm1zIHdlcmUgdHVybmVkIGRvd24gaW4gdGhpcyBwZXJpb2QuIiwKICAgIGNvdmVyYWdlOiAiTW9uaXRvcmluZyB7dW5pdHN9IHdpbmQgdW5pdHMgYXQge3NpdGVzfSBzaXRlcyBpbiBTY290bGFuZCwgd2l0aCB7Z3d9IEdXIG9mIHJlZ2lzdGVyZWQgY2FwYWNpdHkuIiwKICAgIHNoYXJlOiAiSW4gdGhlIGxhc3Qge2RheXN9IGRheXMsIHtlbmVyZ3l9IG9mIFNjb3R0aXNoIHdpbmQgcG93ZXIgd2FzIHN3aXRjaGVkIG9mZiBiZWNhdXNlIHRoZSBncmlkIGNvdWxkbid0IHVzZSBpdCwgd2l0aCB7Y29zdH0gcGFpZCB0byB3aW5kIGZhcm1zIHRvIHR1cm4gZG93bi4gVGhhdCdzIGEgeWVhcidzIGVsZWN0cmljaXR5IGZvciB7aG9tZXN9IGhvbWVzLiBPbiB7ZGF0ZX0gYWxvbmUsIHtkYXlFbmVyZ3l9IHdhcyB0dXJuZWQgZG93bi4gU291cmNlOiBFbmVyZ3lDbG91ZCBTY290bGFuZCBXYXN0ZWQgV2luZCBUcmFja2VyLCB1c2luZyBFbGV4b24gQk1SUyBkYXRhLiB7bGlua30iLAogICAgYmFubmVyQWxsOiAiV2UgY291bGRuJ3QgcmVhY2ggRWxleG9uJ3MgZGF0YSBzZXJ2aWNlLCBzbyB0aGUgZmlndXJlcyBjYW4ndCBiZSBzaG93biBqdXN0IG5vdy4iLAogICAgYmFubmVyU2V0dGxlZDogIlNldHRsZWQgZmlndXJlcyBjb3VsZG4ndCBiZSBsb2FkZWQgZnJvbSBFbGV4b24ganVzdCBub3cuIgogIH07CiAgdmFyIGN1c3RvbSA9IHdpbmRvdy5FQ1dUX1RFWFQgfHwge307CiAgT2JqZWN0LmtleXMoY3VzdG9tKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmICh0eXBlb2YgY3VzdG9tW2tdID09PSAic3RyaW5nIiAmJiBjdXN0b21ba10pIFRYVFtrXSA9IGN1c3RvbVtrXTsgfSk7CiAgZnVuY3Rpb24gZmlsbChzdHIsIG8pIHsgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoL1x7KFx3KylcfS9nLCBmdW5jdGlvbiAobSwgaykgeyByZXR1cm4gb1trXSAhPSBudWxsID8gb1trXSA6IG07IH0pOyB9CgogIHZhciAkID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IH07CiAgdmFyIHN0YXRlID0gewogICAgdW5pdHM6IG51bGwsIGJ5SWQ6IHt9LCBzdGF0aW9uczoge30sIGNhcE1XOiAwLAogICAgZmlsdGVyOiAidW5rbm93biIsICAgICAgICAgICAgIC8vICJvbiIgfCAib2ZmIiB8ICJ1bmtub3duIgogICAgZGF5czoge30sIHJhbmdlOiA3LCBtZXRyaWM6ICJlbmVyZ3kiLAogICAgbGl2ZTogbnVsbCwgbGl2ZVRpbWVyOiBudWxsLCBzaG93QWxsRmFybXM6IGZhbHNlLCBsb2FkaW5nOiAwCiAgfTsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSB0aW1lIGhlbHBlcnMgKEV1cm9wZS9Mb25kb24gc2V0dGxlbWVudCBkYXlzKSAtLS0tLS0tLS0tLS0tLS0tICovCiAgdmFyIGZtdFBhcnRzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLUdCIiwgeyB0aW1lWm9uZTogIkV1cm9wZS9Mb25kb24iLCB5ZWFyOiAibnVtZXJpYyIsIG1vbnRoOiAiMi1kaWdpdCIsIGRheTogIjItZGlnaXQiLCBob3VyOiAiMi1kaWdpdCIsIG1pbnV0ZTogIjItZGlnaXQiLCBzZWNvbmQ6ICIyLWRpZ2l0IiwgaG91ckN5Y2xlOiAiaDIzIiB9KTsKICBmdW5jdGlvbiBsb25kb25QYXJ0cyhtcykgewogICAgdmFyIG8gPSB7fTsgZm10UGFydHMuZm9ybWF0VG9QYXJ0cyhuZXcgRGF0ZShtcykpLmZvckVhY2goZnVuY3Rpb24gKHApIHsgb1twLnR5cGVdID0gcC52YWx1ZTsgfSk7CiAgICByZXR1cm4geyB5OiArby55ZWFyLCBtOiArby5tb250aCwgZDogK28uZGF5LCBoOiArby5ob3VyICUgMjQsIG1pOiArby5taW51dGUsIHM6ICtvLnNlY29uZCB9OwogIH0KICBmdW5jdGlvbiBvZmZzZXRNcyhtcykgeyB2YXIgcCA9IGxvbmRvblBhcnRzKG1zKTsgcmV0dXJuIERhdGUuVVRDKHAueSwgcC5tIC0gMSwgcC5kLCBwLmgsIHAubWksIHAucykgLSBNYXRoLmZsb29yKG1zIC8gMTAwMCkgKiAxMDAwOyB9CiAgZnVuY3Rpb24geW1kT2YobXMpIHsgdmFyIHAgPSBsb25kb25QYXJ0cyhtcyk7IHJldHVybiBwLnkgKyAiLSIgKyBwYWQocC5tKSArICItIiArIHBhZChwLmQpOyB9CiAgZnVuY3Rpb24gcGFkKG4pIHsgcmV0dXJuIChuIDwgMTAgPyAiMCIgOiAiIikgKyBuOyB9CiAgZnVuY3Rpb24gYWRkRGF5cyh5bWQsIG4pIHsgdmFyIGEgPSB5bWQuc3BsaXQoIi0iKTsgdmFyIHQgPSBEYXRlLlVUQygrYVswXSwgK2FbMV0gLSAxLCArYVsyXSArIG4pOyB2YXIgZCA9IG5ldyBEYXRlKHQpOyByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpICsgIi0iICsgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgIi0iICsgcGFkKGQuZ2V0VVRDRGF0ZSgpKTsgfQogIGZ1bmN0aW9uIG1pZG5pZ2h0KHltZCkgeyB2YXIgYSA9IHltZC5zcGxpdCgiLSIpOyB2YXIgZyA9IERhdGUuVVRDKCthWzBdLCArYVsxXSAtIDEsICthWzJdKTsgcmV0dXJuIGcgLSBvZmZzZXRNcyhnKTsgfQogIGZ1bmN0aW9uIGRheUVuZCh5bWQpIHsgcmV0dXJuIG1pZG5pZ2h0KGFkZERheXMoeW1kLCAxKSk7IH0KICBmdW5jdGlvbiBwZXJpb2RzSW4oeW1kKSB7IHJldHVybiBNYXRoLnJvdW5kKChkYXlFbmQoeW1kKSAtIG1pZG5pZ2h0KHltZCkpIC8gMTgwMGUzKTsgfQogIGZ1bmN0aW9uIGN1cnJlbnRQZXJpb2QobXMpIHsgdmFyIHltZCA9IHltZE9mKG1zKTsgcmV0dXJuIHsgeW1kOiB5bWQsIHNwOiBNYXRoLmZsb29yKChtcyAtIG1pZG5pZ2h0KHltZCkpIC8gMTgwMGUzKSArIDEgfTsgfQogIGZ1bmN0aW9uIGlzQ29tcGxldGUoeW1kLCBub3cpIHsgcmV0dXJuIG5vdyA+PSBkYXlFbmQoeW1kKSArIFNFVFRMRV9MQUdfTVM7IH0KICB2YXIgZm10RGF5U2hvcnQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tR0IiLCB7IHRpbWVab25lOiAiVVRDIiwgd2Vla2RheTogInNob3J0IiwgZGF5OiAibnVtZXJpYyIsIG1vbnRoOiAic2hvcnQiIH0pOwogIHZhciBmbXREYXlMb25nID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLUdCIiwgeyB0aW1lWm9uZTogIlVUQyIsIHdlZWtkYXk6ICJsb25nIiwgZGF5OiAibnVtZXJpYyIsIG1vbnRoOiAibG9uZyIgfSk7CiAgdmFyIGZtdFRpbWUgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tR0IiLCB7IHRpbWVab25lOiAiRXVyb3BlL0xvbmRvbiIsIGhvdXI6ICIyLWRpZ2l0IiwgbWludXRlOiAiMi1kaWdpdCIsIGhvdXJDeWNsZTogImgyMyIgfSk7CiAgZnVuY3Rpb24geW1kRGF0ZSh5bWQpIHsgdmFyIGEgPSB5bWQuc3BsaXQoIi0iKTsgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKCthWzBdLCArYVsxXSAtIDEsICthWzJdLCAxMikpOyB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gZm9ybWF0dGluZyAtLS0tLS0tLS0tLS0tLS0tICovCiAgdmFyIG5mMCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCgiZW4tR0IiLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsKICB2YXIgbmYxID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCJlbi1HQiIsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAxLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDEgfSk7CiAgZnVuY3Rpb24gZW5lcmd5KG13aCkgewogICAgaWYgKG13aCA9PSBudWxsIHx8IGlzTmFOKG13aCkpIHJldHVybiAi4oCTIjsKICAgIGlmIChtd2ggPj0gMTAwMCkgcmV0dXJuIChtd2ggPj0gMTAwMDAwID8gbmYwIDogbmYxKS5mb3JtYXQobXdoIC8gMTAwMCkgKyAiIEdXaCI7CiAgICByZXR1cm4gbmYwLmZvcm1hdChtd2gpICsgIiBNV2giOwogIH0KICBmdW5jdGlvbiBtb25leShnYnApIHsKICAgIGlmIChnYnAgPT0gbnVsbCB8fCBpc05hTihnYnApKSByZXR1cm4gIuKAkyI7CiAgICB2YXIgcyA9IGdicCA8IDAgPyAi4oiSwqMiIDogIsKjIiwgYSA9IE1hdGguYWJzKGdicCk7CiAgICBpZiAoYSA+PSAxZTYpIHJldHVybiBzICsgbmYxLmZvcm1hdChhIC8gMWU2KSArICJtIjsKICAgIGlmIChhID49IDFlNCkgcmV0dXJuIHMgKyBuZjAuZm9ybWF0KGEgLyAxZTMpICsgImsiOwogICAgcmV0dXJuIHMgKyBuZjAuZm9ybWF0KGEpOwogIH0KICBmdW5jdGlvbiByb3VuZEhvbWVzKG4pIHsKICAgIGlmIChuID49IDFlNikgcmV0dXJuIG5mMS5mb3JtYXQobiAvIDFlNikgKyAiIG1pbGxpb24iOwogICAgaWYgKG4gPj0gMWU0KSByZXR1cm4gbmYwLmZvcm1hdChNYXRoLnJvdW5kKG4gLyAxMDAwKSAqIDEwMDApOwogICAgaWYgKG4gPj0gMTAwKSByZXR1cm4gbmYwLmZvcm1hdChNYXRoLnJvdW5kKG4gLyAxMCkgKiAxMCk7CiAgICByZXR1cm4gbmYwLmZvcm1hdChuKTsKICB9CiAgZnVuY3Rpb24gZXNjKHMpIHsgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAiIiA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIHsgIiYiOiAiJmFtcDsiLCAiPCI6ICImbHQ7IiwgIj4iOiAiJmd0OyIsICciJzogIiZxdW90OyIsICInIjogIiYjMzk7IiB9W2NdOyB9KTsgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIHN0b3JhZ2UgKG9wdGlvbmFsKSAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gY2FjaGVHZXQoaykgeyB0cnkgeyB2YXIgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENBQ0hFX1YgKyBrKTsgcmV0dXJuIHYgPyBKU09OLnBhcnNlKHYpIDogbnVsbDsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfSB9CiAgZnVuY3Rpb24gY2FjaGVTZXQoaywgdikgeyB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDQUNIRV9WICsgaywgSlNPTi5zdHJpbmdpZnkodikpOyB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9IH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSBuZXR3b3JrIC0tLS0tLS0tLS0tLS0tLS0gKi8KICB2YXIgYWN0aXZlID0gMCwgcXVldWUgPSBbXTsKICBmdW5jdGlvbiBsaW1pdGVkKGZuKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBxdWV1ZS5wdXNoKGZ1bmN0aW9uICgpIHsgYWN0aXZlKys7IGZuKCkudGhlbihyZXNvbHZlLCByZWplY3QpLnRoZW4obmV4dCwgbmV4dCk7IH0pOwogICAgICBwdW1wKCk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIG5leHQoKSB7IGFjdGl2ZS0tOyBwdW1wKCk7IH0KICB9CiAgZnVuY3Rpb24gcHVtcCgpIHsgd2hpbGUgKGFjdGl2ZSA8IDQgJiYgcXVldWUubGVuZ3RoKSBxdWV1ZS5zaGlmdCgpKCk7IH0KICBmdW5jdGlvbiBnZXRKU09OKHVybCwgdHJpZXMpIHsKICAgIHRyaWVzID0gdHJpZXMgPT0gbnVsbCA\/IDIgOiB0cmllczsKICAgIHJldHVybiBsaW1pdGVkKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGN0bCA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogbnVsbDsKICAgICAgdmFyIHQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKGN0bCkgY3RsLmFib3J0KCk7IH0sIDQ1MDAwKTsKICAgICAgcmV0dXJuIGZldGNoKHVybCwgeyBzaWduYWw6IGN0bCA\/IGN0bC5zaWduYWwgOiB1bmRlZmluZWQsIGhlYWRlcnM6IHsgQWNjZXB0OiAiYXBwbGljYXRpb24vanNvbiIgfSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChyKSB7IGNsZWFyVGltZW91dCh0KTsgaWYgKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoIkhUVFAgIiArIHIuc3RhdHVzKTsgcmV0dXJuIHIuanNvbigpOyB9KTsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKGopIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoaikgPyBqIDogKGogJiYgai5kYXRhKSB8fCBbXTsgfSwgZnVuY3Rpb24gKGVycikgewogICAgICBpZiAodHJpZXMgPiAwKSByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcykgeyBzZXRUaW1lb3V0KHJlcywgMTUwMCk7IH0pLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0SlNPTih1cmwsIHRyaWVzIC0gMSk7IH0pOwogICAgICB0aHJvdyBlcnI7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gd2l0aFVuaXRzKGJhc2UsIGlkcykgeyByZXR1cm4gYmFzZSArIChiYXNlLmluZGV4T2YoIj8iKSA8IDAgPyAiPyIgOiAiJiIpICsgaWRzLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gImJtVW5pdD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGkpOyB9KS5qb2luKCImIik7IH0KICBmdW5jdGlvbiBtaW5lKHJvd3MpIHsgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBzdGF0ZS5ieUlkW3IuYm1Vbml0XSB8fCBzdGF0ZS5ieUlkW3IubmF0aW9uYWxHcmlkQm1Vbml0XTsgfSk7IH0KCiAgLy8gQXNrIG9ubHkgZm9yIG91ciB1bml0cy4gSWYgdGhlIEFQSSBpZ25vcmVzIHRoZSBmaWx0ZXIgKHdlIGdldCBvdGhlciB1bml0cyBiYWNrKSwgd2UgYWxyZWFkeSBoYXZlCiAgLy8gdGhlIGZ1bGwgc2V0LCBzbyBrZWVwIGl0IGFuZCBzdG9wIHNlbmRpbmcgZmlsdGVyZWQgcmVxdWVzdHMuCiAgZnVuY3Rpb24gZmV0Y2hGb3JVbml0cyhiYXNlKSB7CiAgICB2YXIgaWRzID0gc3RhdGUudW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7IHJldHVybiB1LmlkOyB9KTsKICAgIGlmIChzdGF0ZS5maWx0ZXIgPT09ICJvZmYiKSByZXR1cm4gZ2V0SlNPTihiYXNlKS50aGVuKG1pbmUpOwogICAgdmFyIGNodW5rcyA9IFtdOyBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkgKz0gQ0hVTkspIGNodW5rcy5wdXNoKGlkcy5zbGljZShpLCBpICsgQ0hVTkspKTsKICAgIHZhciBmaXJzdCA9IGNodW5rc1swXTsKICAgIHJldHVybiBnZXRKU09OKHdpdGhVbml0cyhiYXNlLCBmaXJzdCkpLnRoZW4oZnVuY3Rpb24gKHJvd3MpIHsKICAgICAgdmFyIHNldCA9IHt9OyBmaXJzdC5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7IHNldFt4XSA9IDE7IH0pOwogICAgICB2YXIgZm9yZWlnbiA9IHJvd3Muc29tZShmdW5jdGlvbiAocikgeyByZXR1cm4gIXNldFtyLmJtVW5pdF0gJiYgIXNldFtyLm5hdGlvbmFsR3JpZEJtVW5pdF07IH0pOwogICAgICBpZiAoZm9yZWlnbikgeyBzdGF0ZS5maWx0ZXIgPSAib2ZmIjsgcmV0dXJuIG1pbmUocm93cyk7IH0KICAgICAgc3RhdGUuZmlsdGVyID0gIm9uIjsKICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNodW5rcy5zbGljZSgxKS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGdldEpTT04od2l0aFVuaXRzKGJhc2UsIGMpKTsgfSkpCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3QpIHsgcmV0dXJuIG1pbmUocm93cy5jb25jYXQuYXBwbHkocm93cywgcmVzdCkpOyB9KTsKICAgIH0pOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSB1bml0IHJlZ2lzdGVyIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzdGF0aW9uT2YodSkgeyB2YXIgbmcgPSB1Lm5hdGlvbmFsR3JpZEJtVW5pdCB8fCB1LmVsZXhvbkJtVW5pdCB8fCAiIjsgcmV0dXJuIG5nLnNwbGl0KCItIilbMF0ucmVwbGFjZSgvXltBLVowLTldX18vLCAiIik7IH0KICBmdW5jdGlvbiB0aWR5KG5hbWUpIHsKICAgIGlmICghbmFtZSkgcmV0dXJuICIiOwogICAgdmFyIG4gPSBTdHJpbmcobmFtZSkucmVwbGFjZSgvXGIobGltaXRlZHxsdGR8bGxwfHBsY3xscClcYlwuPy9naSwgIiIpLnJlcGxhY2UoL1wodWtcKS9naSwgIiIpLnJlcGxhY2UoL1woZ2JcZCpcKT8vZ2ksICIiKQogICAgICAucmVwbGFjZSgvXGIob2Zmc2hvcmUgKT93aW5kID9mYXJtcz9cYi9naSwgIiIpLnJlcGxhY2UoL1xid2luZCBlbmVyZ3lcYi9naSwgIiIpLnJlcGxhY2UoL1xid2luZGZhcm1cYi9naSwgIiIpLnJlcGxhY2UoL1xzezIsfS9nLCAiICIpLnRyaW0oKTsKICAgIGlmIChuICYmIG4gPT09IG4udG9VcHBlckNhc2UoKSkgbiA9IG4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cYlx3L2csIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pOwogICAgcmV0dXJuIG47CiAgfQogIGZ1bmN0aW9uIHJlYWRhYmxlKHMpIHsgcmV0dXJuIHMgJiYgL1thLXpdLy50ZXN0KHMpICYmIC9ccy8udGVzdChzKSAmJiAhL15bQS1aMC05X117Mix9X18vLnRlc3Qocyk7IH0KCiAgZnVuY3Rpb24gbG9hZFVuaXRzKCkgewogICAgdmFyIGMgPSBjYWNoZUdldCgidW5pdHMiKTsKICAgIGlmIChjICYmIERhdGUubm93KCkgLSBjLmF0IDwgMjQgKiAzNjAwZTMgJiYgYy51bml0cyAmJiBjLnVuaXRzLmxlbmd0aCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjLnVuaXRzKTsKICAgIHJldHVybiBnZXRKU09OKEFQSSArICIvcmVmZXJlbmNlL2JtdW5pdHMvYWxsIikudGhlbihmdW5jdGlvbiAoYWxsKSB7CiAgICAgIHZhciBzY290ID0geyBfTjogMSwgX1A6IDEgfSwgdFNjb3QgPSB7fSwgdE90aGVyID0ge307CiAgICAgIGFsbC5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgaWYgKHUudHJhbnNtaXNzaW9uTG9zc0ZhY3RvciA9PSBudWxsIHx8ICF1LmdzcEdyb3VwSWQpIHJldHVybjsKICAgICAgICB2YXIgdCA9IFN0cmluZyh1LnRyYW5zbWlzc2lvbkxvc3NGYWN0b3IpOwogICAgICAgIGlmIChzY290W3UuZ3NwR3JvdXBJZF0pIHRTY290W3RdID0gKHRTY290W3RdIHx8IDApICsgMTsgZWxzZSB0T3RoZXJbdF0gPSAxOwogICAgICB9KTsKICAgICAgdmFyIHNjb3RUTEYgPSB7fTsgT2JqZWN0LmtleXModFNjb3QpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsgaWYgKHRTY290W3RdID49IDIgJiYgIXRPdGhlclt0XSkgc2NvdFRMRlt0XSA9IDE7IH0pOwogICAgICB2YXIgdW5pdHMgPSBbXTsKICAgICAgYWxsLmZvckVhY2goZnVuY3Rpb24gKHUpIHsKICAgICAgICBpZiAodS5mdWVsVHlwZSAhPT0gIldJTkQiIHx8ICF1LmVsZXhvbkJtVW5pdCkgcmV0dXJuOwogICAgICAgIHZhciBzdCA9IHN0YXRpb25PZih1KTsKICAgICAgICB2YXIgaW5TY290ID0gc2NvdFt1LmdzcEdyb3VwSWRdIHx8ICh1LnRyYW5zbWlzc2lvbkxvc3NGYWN0b3IgIT0gbnVsbCAmJiBzY290VExGW1N0cmluZyh1LnRyYW5zbWlzc2lvbkxvc3NGYWN0b3IpXSkgfHwgTkFNRVNbc3RdOwogICAgICAgIGlmICghaW5TY290KSByZXR1cm47CiAgICAgICAgdmFyIG5hbWUgPSBOQU1FU1tzdF0gfHwgKHJlYWRhYmxlKHUuYm1Vbml0TmFtZSkgPyB0aWR5KHUuYm1Vbml0TmFtZSkgOiAiIikgfHwgdGlkeSh1LmxlYWRQYXJ0eU5hbWUpIHx8IHN0OwogICAgICAgIHVuaXRzLnB1c2goeyBpZDogdS5lbGV4b25CbVVuaXQsIG5nOiB1Lm5hdGlvbmFsR3JpZEJtVW5pdCB8fCAiIiwgc3Q6IHN0LCBuYW1lOiBuYW1lLCBjYXA6ICt1LmdlbmVyYXRpb25DYXBhY2l0eSB8fCAwIH0pOwogICAgICB9KTsKICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSB8fCBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCk7IH0pOwogICAgICBpZiAodW5pdHMubGVuZ3RoKSBjYWNoZVNldCgidW5pdHMiLCB7IGF0OiBEYXRlLm5vdygpLCB1bml0czogdW5pdHMgfSk7CiAgICAgIHJldHVybiB1bml0czsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBpbmRleFVuaXRzKHVuaXRzKSB7CiAgICBzdGF0ZS51bml0cyA9IHVuaXRzOyBzdGF0ZS5ieUlkID0ge307IHN0YXRlLnN0YXRpb25zID0ge307IHN0YXRlLmNhcE1XID0gMDsKICAgIHVuaXRzLmZvckVhY2goZnVuY3Rpb24gKHUpIHsKICAgICAgc3RhdGUuYnlJZFt1LmlkXSA9IHU7IGlmICh1Lm5nKSBzdGF0ZS5ieUlkW3UubmddID0gdTsKICAgICAgdmFyIHMgPSBzdGF0ZS5zdGF0aW9uc1t1LnN0XSB8fCAoc3RhdGUuc3RhdGlvbnNbdS5zdF0gPSB7IHN0OiB1LnN0LCBuYW1lOiB1Lm5hbWUsIGNhcDogMCwgdW5pdHM6IFtdIH0pOwogICAgICAvLyBwcmVmZXIgdGhlIGN1cmF0ZWQgb3IgbW9zdCByZWFkYWJsZSBuYW1lIGFjcm9zcyBhIHN0YXRpb24ncyB1bml0cwogICAgICBpZiAoTkFNRVNbdS5zdF0pIHMubmFtZSA9IE5BTUVTW3Uuc3RdOwogICAgICBzLmNhcCArPSB1LmNhcDsgcy51bml0cy5wdXNoKHUpOyBzdGF0ZS5jYXBNVyArPSB1LmNhcDsKICAgIH0pOwogICAgcmVuZGVyQ292ZXJhZ2UoKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gbGl2ZTogbm90aWZpZWQgb3V0cHV0IHZzIGluc3RydWN0ZWQgbGV2ZWwgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGxldmVsQXQoc2VnLCB0KSB7CiAgICB2YXIgYSA9IERhdGUucGFyc2Uoc2VnLnRpbWVGcm9tKSwgYiA9IERhdGUucGFyc2Uoc2VnLnRpbWVUbyk7CiAgICBpZiAoYiA8PSBhKSByZXR1cm4gK3NlZy5sZXZlbFRvOwogICAgcmV0dXJuICtzZWcubGV2ZWxGcm9tICsgKCtzZWcubGV2ZWxUbyAtICtzZWcubGV2ZWxGcm9tKSAqICh0IC0gYSkgLyAoYiAtIGEpOwogIH0KICBmdW5jdGlvbiBjb3ZlcnMoc2VnLCB0KSB7IHJldHVybiBEYXRlLnBhcnNlKHNlZy50aW1lRnJvbSkgPD0gdCAmJiB0IDw9IERhdGUucGFyc2Uoc2VnLnRpbWVUbyk7IH0KCiAgZnVuY3Rpb24gbG9hZExpdmUoKSB7CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKSwgY3AgPSBjdXJyZW50UGVyaW9kKG5vdyk7CiAgICByZXR1cm4gbGl2ZUZvcihjcCwgbm93KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgaWYgKHJlcy5yZXBvcnRpbmcgPT09IDAgJiYgY3Auc3AgPiAxKSB7IC8vIFBOIG5vdCBpbiB5ZXQgZm9yIGEgYnJhbmQtbmV3IHBlcmlvZDogdXNlIHRoZSBwcmV2aW91cyBvbmUKICAgICAgICB2YXIgdCA9IG1pZG5pZ2h0KGNwLnltZCkgKyAoY3Auc3AgLSAxKSAqIDE4MDBlMyAtIDYwZTM7CiAgICAgICAgcmV0dXJuIGxpdmVGb3IoeyB5bWQ6IGNwLnltZCwgc3A6IGNwLnNwIC0gMSB9LCB0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGxpdmVGb3IoY3AsIHQpIHsKICAgIHZhciBxID0gInNldHRsZW1lbnREYXRlPSIgKyBjcC55bWQgKyAiJnNldHRsZW1lbnRQZXJpb2Q9IiArIGNwLnNwOwogICAgcmV0dXJuIFByb21pc2UuYWxsKFsKICAgICAgZmV0Y2hGb3JVbml0cyhBUEkgKyAiL2JhbGFuY2luZy9waHlzaWNhbC9hbGw\/ZGF0YXNldD1QTiYiICsgcSksCiAgICAgIGZldGNoRm9yVW5pdHMoQVBJICsgIi9iYWxhbmNpbmcvYWNjZXB0YW5jZXMvYWxsPyIgKyBxKQogICAgXSkudGhlbihmdW5jdGlvbiAocikgewogICAgICB2YXIgcG4gPSB7fSwgYm9hID0ge307CiAgICAgIHJbMF0uZm9yRWFjaChmdW5jdGlvbiAocykgeyB2YXIgdSA9IHN0YXRlLmJ5SWRbcy5ibVVuaXRdIHx8IHN0YXRlLmJ5SWRbcy5uYXRpb25hbEdyaWRCbVVuaXRdOyBpZiAodSAmJiBjb3ZlcnMocywgdCkpIHBuW3UuaWRdID0gbGV2ZWxBdChzLCB0KTsgfSk7CiAgICAgIHJbMV0uZm9yRWFjaChmdW5jdGlvbiAocykgewogICAgICAgIHZhciB1ID0gc3RhdGUuYnlJZFtzLmJtVW5pdF0gfHwgc3RhdGUuYnlJZFtzLm5hdGlvbmFsR3JpZEJtVW5pdF07IGlmICghdSB8fCAhY292ZXJzKHMsIHQpKSByZXR1cm47CiAgICAgICAgdmFyIGN1ciA9IGJvYVt1LmlkXTsKICAgICAgICBpZiAoIWN1ciB8fCArcy5hY2NlcHRhbmNlTnVtYmVyID4gY3VyLm4pIGJvYVt1LmlkXSA9IHsgbjogK3MuYWNjZXB0YW5jZU51bWJlciwgbHZsOiBsZXZlbEF0KHMsIHQpIH07CiAgICAgIH0pOwogICAgICB2YXIgYnlTdGF0aW9uID0ge30sIHRvdGFsID0gMCwgZmFybXMgPSAwOwogICAgICBPYmplY3Qua2V5cyhib2EpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgaWYgKHBuW2lkXSA9PSBudWxsKSByZXR1cm47CiAgICAgICAgdmFyIGRvd24gPSBwbltpZF0gLSBib2FbaWRdLmx2bDsKICAgICAgICBpZiAoZG93biA8PSAwLjUpIHJldHVybjsKICAgICAgICB2YXIgc3QgPSBzdGF0ZS5ieUlkW2lkXS5zdDsKICAgICAgICBieVN0YXRpb25bc3RdID0gKGJ5U3RhdGlvbltzdF0gfHwgMCkgKyBkb3duOyB0b3RhbCArPSBkb3duOwogICAgICB9KTsKICAgICAgZmFybXMgPSBPYmplY3Qua2V5cyhieVN0YXRpb24pLmxlbmd0aDsKICAgICAgcmV0dXJuIHsgYXQ6IHQsIHNwOiBjcC5zcCwgeW1kOiBjcC55bWQsIHRvdGFsOiB0b3RhbCwgZmFybXM6IGZhcm1zLCBieVN0YXRpb246IGJ5U3RhdGlvbiwgcmVwb3J0aW5nOiBPYmplY3Qua2V5cyhwbikubGVuZ3RoIH07CiAgICB9KTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gc2V0dGxlZCBkYXlzIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBsb2FkRGF5KHltZCkgewogICAgdmFyIG5vdyA9IERhdGUubm93KCksIGNvbXBsZXRlID0gaXNDb21wbGV0ZSh5bWQsIG5vdyk7CiAgICB2YXIgYyA9IGNhY2hlR2V0KCJkYXkuIiArIHltZCk7CiAgICBpZiAoYyAmJiBjLmNvbXBsZXRlICYmIGMudW5pdHNOID09PSBzdGF0ZS51bml0cy5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoYyk7CiAgICB2YXIgYmFzZSA9ICIvYmFsYW5jaW5nL3NldHRsZW1lbnQvIjsKICAgIHJldHVybiBQcm9taXNlLmFsbChbCiAgICAgIGZldGNoRm9yVW5pdHMoQVBJICsgYmFzZSArICJhY2NlcHRhbmNlL3ZvbHVtZXMvYWxsL2JpZC8iICsgeW1kKSwKICAgICAgZmV0Y2hGb3JVbml0cyhBUEkgKyBiYXNlICsgImluZGljYXRpdmUvY2FzaGZsb3dzL2FsbC9iaWQvIiArIHltZCkKICAgIF0pLnRoZW4oZnVuY3Rpb24gKHIpIHsKICAgICAgdmFyIGQgPSB7IHltZDogeW1kLCBjb21wbGV0ZTogY29tcGxldGUsIG13aDogMCwgZ2JwOiAwLCBzdDoge30sIGxhc3RTcDogMCwgdW5pdHNOOiBzdGF0ZS51bml0cy5sZW5ndGgsIGF0OiBub3cgfTsKICAgICAgclswXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7CiAgICAgICAgaWYgKHguc2V0dGxlbWVudERhdGUgJiYgeC5zZXR0bGVtZW50RGF0ZSAhPT0geW1kKSByZXR1cm47CiAgICAgICAgdmFyIHYgPSAreC50b3RhbFZvbHVtZUFjY2VwdGVkOyBpZiAoISh2IDwgMCkpIHJldHVybjsKICAgICAgICB2YXIgdSA9IHN0YXRlLmJ5SWRbeC5ibVVuaXRdIHx8IHN0YXRlLmJ5SWRbeC5uYXRpb25hbEdyaWRCbVVuaXRdOwogICAgICAgIGQubXdoIC09IHY7IHZhciBzID0gZC5zdFt1LnN0XSB8fCAoZC5zdFt1LnN0XSA9IFswLCAwXSk7IHNbMF0gLT0gdjsKICAgICAgICBpZiAoK3guc2V0dGxlbWVudFBlcmlvZCA+IGQubGFzdFNwKSBkLmxhc3RTcCA9ICt4LnNldHRsZW1lbnRQZXJpb2Q7CiAgICAgIH0pOwogICAgICByWzFdLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKICAgICAgICBpZiAoeC5zZXR0bGVtZW50RGF0ZSAmJiB4LnNldHRsZW1lbnREYXRlICE9PSB5bWQpIHJldHVybjsKICAgICAgICB2YXIgdiA9ICt4LnRvdGFsQ2FzaGZsb3c7IGlmICghaXNGaW5pdGUodikgfHwgIXYpIHJldHVybjsKICAgICAgICB2YXIgdSA9IHN0YXRlLmJ5SWRbeC5ibVVuaXRdIHx8IHN0YXRlLmJ5SWRbeC5uYXRpb25hbEdyaWRCbVVuaXRdOwogICAgICAgIGQuZ2JwICs9IHY7IHZhciBzID0gZC5zdFt1LnN0XSB8fCAoZC5zdFt1LnN0XSA9IFswLCAwXSk7IHNbMV0gKz0gdjsKICAgICAgfSk7CiAgICAgIGQubXdoID0gTWF0aC5yb3VuZChkLm13aCAqIDEwKSAvIDEwOyBkLmdicCA9IE1hdGgucm91bmQoZC5nYnApOwogICAgICBPYmplY3Qua2V5cyhkLnN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGQuc3Rba10gPSBbTWF0aC5yb3VuZChkLnN0W2tdWzBdICogMTApIC8gMTAsIE1hdGgucm91bmQoZC5zdFtrXVsxXSldOyB9KTsKICAgICAgaWYgKGNvbXBsZXRlKSBjYWNoZVNldCgiZGF5LiIgKyB5bWQsIGQpOwogICAgICByZXR1cm4gZDsKICAgIH0pOwogIH0KICBmdW5jdGlvbiB3aW5kb3dEYXlzKHJhbmdlKSB7CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKSwgdG9kYXkgPSB5bWRPZihub3cpLCBsYXN0ID0gYWRkRGF5cyh0b2RheSwgLTEpOwogICAgdmFyIHBhcnRpYWwgPSBudWxsOwogICAgd2hpbGUgKCFpc0NvbXBsZXRlKGxhc3QsIG5vdykpIHsgaWYgKGxhc3QgPT09IGFkZERheXModG9kYXksIC0xKSkgcGFydGlhbCA9IGxhc3Q7IGxhc3QgPSBhZGREYXlzKGxhc3QsIC0xKTsgfQogICAgdmFyIGxpc3QgPSBbXTsgZm9yICh2YXIgaSA9IHJhbmdlIC0gMTsgaSA+PSAwOyBpLS0pIGxpc3QucHVzaChhZGREYXlzKGxhc3QsIC1pKSk7CiAgICByZXR1cm4geyBmdWxsOiBsaXN0LCBwYXJ0aWFsOiBwYXJ0aWFsLCBsYXN0OiBsYXN0IH07CiAgfQogIGZ1bmN0aW9uIGxvYWRSYW5nZSgpIHsKICAgIHZhciB3ID0gd2luZG93RGF5cyhzdGF0ZS5yYW5nZSksIHdhbnQgPSB3LmZ1bGwuY29uY2F0KHcucGFydGlhbCA\/IFt3LnBhcnRpYWxdIDogW10pOwogICAgdmFyIHRvZG8gPSB3YW50LmZpbHRlcihmdW5jdGlvbiAoeSkgeyByZXR1cm4gIXN0YXRlLmRheXNbeV0gfHwgKCFzdGF0ZS5kYXlzW3ldLmNvbXBsZXRlICYmIERhdGUubm93KCkgLSBzdGF0ZS5kYXlzW3ldLmF0ID4gMzAgKiA2MGUzKTsgfSk7CiAgICB2YXIgZG9uZSA9IHdhbnQubGVuZ3RoIC0gdG9kby5sZW5ndGg7CiAgICBwcm9ncmVzcyh0b2RvLmxlbmd0aCA\/ICJMb2FkaW5nIHNldHRsZWQgZGF0YTogIiArIGRvbmUgKyAiIG9mICIgKyB3YW50Lmxlbmd0aCArICIgZGF5cyIgOiAiIik7CiAgICByZW5kZXJTZXR0bGVkKCk7CiAgICB2YXIgZmFpbGVkID0gMCwgbXlMb2FkID0gKytzdGF0ZS5sb2FkaW5nOwogICAgcmV0dXJuIFByb21pc2UuYWxsKHRvZG8ubWFwKGZ1bmN0aW9uICh5KSB7CiAgICAgIHJldHVybiBsb2FkRGF5KHkpLnRoZW4oZnVuY3Rpb24gKGQpIHsKICAgICAgICBzdGF0ZS5kYXlzW3ldID0gZDsgZG9uZSsrOwogICAgICAgIGlmIChteUxvYWQgPT09IHN0YXRlLmxvYWRpbmcpIHsgcHJvZ3Jlc3MoZG9uZSA8IHdhbnQubGVuZ3RoID8gIkxvYWRpbmcgc2V0dGxlZCBkYXRhOiAiICsgZG9uZSArICIgb2YgIiArIHdhbnQubGVuZ3RoICsgIiBkYXlzIiA6ICIiKTsgcmVuZGVyU2V0dGxlZCgpOyB9CiAgICAgIH0sIGZ1bmN0aW9uICgpIHsgZmFpbGVkKys7IH0pOwogICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBpZiAobXlMb2FkICE9PSBzdGF0ZS5sb2FkaW5nKSByZXR1cm47CiAgICAgIGlmIChmYWlsZWQpIHByb2dyZXNzKGZhaWxlZCArIChmYWlsZWQgPT09IDEgPyAiIGRheSIgOiAiIGRheXMiKSArICIgY291bGRuJ3QgYmUgbG9hZGVkIGZyb20gRWxleG9uLiBUb3RhbHMgY292ZXIgdGhlIGRheXMgc2hvd24uIik7CiAgICAgIHJlbmRlclNldHRsZWQoKTsKICAgICAgaWYgKGZhaWxlZCA9PT0gdG9kby5sZW5ndGggJiYgdG9kby5sZW5ndGgpIHRocm93IG5ldyBFcnJvcigic2V0dGxlZCIpOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHByb2dyZXNzKG1zZykgeyAkKCJlY3d0LXByb2dyZXNzIikudGV4dENvbnRlbnQgPSBtc2c7IH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSByZW5kZXJpbmcgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHJlbmRlckxpdmUoKSB7CiAgICB2YXIgTCA9IHN0YXRlLmxpdmUsIHBpbGwgPSAkKCJlY3d0LWxpdmUtcGlsbCIpOwogICAgaWYgKCFMKSByZXR1cm47CiAgICBwaWxsLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0ZSIsICJsaXZlIik7IHBpbGwudGV4dENvbnRlbnQgPSAiTGl2ZSI7CiAgICAkKCJlY3d0LWxpdmUtd2hlbiIpLnRleHRDb250ZW50ID0gZmlsbChUWFQubGl2ZVdoZW4sIHsgcGVyaW9kOiBMLnNwLCB0aW1lOiBmbXRUaW1lLmZvcm1hdChuZXcgRGF0ZShMLmF0KSkgfSk7CiAgICAkKCJlY3d0LWxpdmUtbXciKS50ZXh0Q29udGVudCA9IG5mMC5mb3JtYXQoTC50b3RhbCk7CiAgICAkKCJlY3d0LWxpdmUtaG9tZXMiKS50ZXh0Q29udGVudCA9IEwudG90YWwgPiAwID8gcm91bmRIb21lcyhMLnRvdGFsICogMTAwMCAvIEhPTUVfS1dfQVZHKSA6ICIwIjsKICAgICQoImVjd3QtbGl2ZS1mYXJtcyIpLnRleHRDb250ZW50ID0gbmYwLmZvcm1hdChMLmZhcm1zKTsKICAgICQoImVjd3QtbGl2ZS1zaGFyZSIpLnRleHRDb250ZW50ID0gc3RhdGUuY2FwTVcgPyAoTC50b3RhbCAvIHN0YXRlLmNhcE1XICogMTAwIDwgMSAmJiBMLnRvdGFsID4gMCA\/ICI8MSUiIDogbmYwLmZvcm1hdChMLnRvdGFsIC8gc3RhdGUuY2FwTVcgKiAxMDApICsgIiUiKSA6ICLigJMiOwogICAgdmFyIHJvd3MgPSBPYmplY3Qua2V5cyhMLmJ5U3RhdGlvbikubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiB7IHN0OiBrLCBtdzogTC5ieVN0YXRpb25ba10gfTsgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5tdyAtIGEubXc7IH0pOwogICAgJCgiZWN3dC1ub3ctbm90ZSIpLnRleHRDb250ZW50ID0gZmlsbChUWFQubm93Tm90ZSwgeyBwZXJpb2Q6IEwuc3AsIHRpbWU6IGZtdFRpbWUuZm9ybWF0KG5ldyBEYXRlKEwuYXQpKSB9KTsKICAgIGlmICghcm93cy5sZW5ndGgpIHsgJCgiZWN3dC1ub3ciKS5pbm5lckhUTUwgPSAnPHAgY2xhc3M9ImVjd3QtZW1wdHkiPicgKyBUWFQubm93Tm9uZSArICc8L3A+JzsgcmV0dXJuOyB9CiAgICB2YXIgbWF4ID0gcm93c1swXS5tdywgc2hvd24gPSByb3dzLnNsaWNlKDAsIDEwKTsKICAgICQoImVjd3Qtbm93IikuaW5uZXJIVE1MID0gIjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5XaW5kIGZhcm08L3RoPjx0aCBjbGFzcz1cInJcIj5IZWxkIGJhY2s8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IiArCiAgICAgIHNob3duLm1hcChmdW5jdGlvbiAocikgewogICAgICAgIHZhciBzID0gc3RhdGUuc3RhdGlvbnNbci5zdF07CiAgICAgICAgcmV0dXJuICI8dHI+PHRkPjxzcGFuIGNsYXNzPVwiZWN3dC1mYXJtXCI+IiArIGVzYyhzID8gcy5uYW1lIDogci5zdCkgKyAiPC9zcGFuPjxzcGFuIGNsYXNzPVwiZWN3dC1saXZlYmFyXCIgc3R5bGU9XCJ3aWR0aDoiICsgTWF0aC5tYXgoMiwgci5tdyAvIG1heCAqIDEwMCkudG9GaXhlZCgxKSArICIlXCI+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPVwiclwiPiIgKyBuZjAuZm9ybWF0KHIubXcpICsgIiBNVzwvdGQ+PC90cj4iOwogICAgICB9KS5qb2luKCIiKSArICI8L3Rib2R5PjwvdGFibGU+IiArCiAgICAgIChyb3dzLmxlbmd0aCA+IHNob3duLmxlbmd0aCA\/ICc8cCBjbGFzcz0iZWN3dC1ub3RlIiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPmFuZCAnICsgKHJvd3MubGVuZ3RoIC0gc2hvd24ubGVuZ3RoKSArICIgbW9yZTwvcD4iIDogIiIpOwogIH0KICBmdW5jdGlvbiBsaXZlRXJyb3IoKSB7CiAgICB2YXIgcGlsbCA9ICQoImVjd3QtbGl2ZS1waWxsIik7IHBpbGwuc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIiwgImVycm9yIik7IHBpbGwudGV4dENvbnRlbnQgPSAiVW5hdmFpbGFibGUiOwogICAgJCgiZWN3dC1saXZlLXdoZW4iKS50ZXh0Q29udGVudCA9IFRYVC5saXZlRXJyb3I7CiAgICBpZiAoIXN0YXRlLmxpdmUpICQoImVjd3Qtbm93IikuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJlY3d0LWVtcHR5Ij4nICsgVFhULmxpdmVFcnJvclRhYmxlICsgJzwvcD4nOwogIH0KCiAgZnVuY3Rpb24gcmFuZ2VUb3RhbHMoKSB7CiAgICB2YXIgdyA9IHdpbmRvd0RheXMoc3RhdGUucmFuZ2UpLCBtd2ggPSAwLCBnYnAgPSAwLCBoYXZlID0gMCwgc3QgPSB7fTsKICAgIHcuZnVsbC5mb3JFYWNoKGZ1bmN0aW9uICh5KSB7CiAgICAgIHZhciBkID0gc3RhdGUuZGF5c1t5XTsgaWYgKCFkKSByZXR1cm47IGhhdmUrKzsKICAgICAgbXdoICs9IGQubXdoOyBnYnAgKz0gZC5nYnA7CiAgICAgIE9iamVjdC5rZXlzKGQuc3QpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgdmFyIGEgPSBzdFtrXSB8fCAoc3Rba10gPSBbMCwgMF0pOyBhWzBdICs9IGQuc3Rba11bMF07IGFbMV0gKz0gZC5zdFtrXVsxXTsgfSk7CiAgICB9KTsKICAgIHJldHVybiB7IHc6IHcsIG13aDogbXdoLCBnYnA6IGdicCwgaGF2ZTogaGF2ZSwgc3Q6IHN0IH07CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTZXR0bGVkKCkgewogICAgdmFyIFQgPSByYW5nZVRvdGFscygpLCB3ID0gVC53LCBsYXN0RCA9IHN0YXRlLmRheXNbdy5sYXN0XTsKICAgICQoImVjd3QtZGF5LWsiKS50ZXh0Q29udGVudCA9IGZpbGwoVFhULmRheUxhYmVsLCB7IGRhdGU6IGZtdERheUxvbmcuZm9ybWF0KHltZERhdGUody5sYXN0KSkgfSk7CiAgICBpZiAobGFzdEQpIHsKICAgICAgJCgiZWN3dC1kYXktdiIpLnRleHRDb250ZW50ID0gZW5lcmd5KGxhc3RELm13aCk7CiAgICAgICQoImVjd3QtZGF5LWNvc3QiKS50ZXh0Q29udGVudCA9IGZpbGwoVFhULnBhaWQsIHsgY29zdDogbW9uZXkobGFzdEQuZ2JwKSB9KTsKICAgICAgJCgiZWN3dC1kYXktaG9tZXMiKS5pbm5lckhUTUwgPSBsYXN0RC5td2ggPiAwID8gZmlsbChUWFQuZGF5SG9tZXMsIHsgaG9tZXM6IHJvdW5kSG9tZXMobGFzdEQubXdoICogMTAwMCAvIEhPTUVfS1dIX0RBWSkgfSkgOiBUWFQuZGF5Tm9uZTsKICAgIH0KICAgIHZhciBjb21wbGV0ZSA9IFQuaGF2ZSA9PT0gdy5mdWxsLmxlbmd0aDsKICAgICQoImVjd3QtcmFuZ2UtayIpLnRleHRDb250ZW50ID0gZmlsbChUWFQucmFuZ2VMYWJlbCwgeyBkYXlzOiBzdGF0ZS5yYW5nZSB9KSArIChjb21wbGV0ZSA\/ICIiIDogIiAobG9hZGluZyAiICsgVC5oYXZlICsgIi8iICsgdy5mdWxsLmxlbmd0aCArICIpIik7CiAgICBpZiAoVC5oYXZlKSB7CiAgICAgICQoImVjd3QtcmFuZ2UtdiIpLnRleHRDb250ZW50ID0gZW5lcmd5KFQubXdoKTsKICAgICAgJCgiZWN3dC1yYW5nZS1jb3N0IikudGV4dENvbnRlbnQgPSBmaWxsKFRYVC5wYWlkLCB7IGNvc3Q6IG1vbmV5KFQuZ2JwKSB9KTsKICAgICAgJCgiZWN3dC1yYW5nZS1ob21lcyIpLmlubmVySFRNTCA9IFQubXdoID4gMCA\/IGZpbGwoVFhULnJhbmdlSG9tZXMsIHsgaG9tZXM6IHJvdW5kSG9tZXMoVC5td2ggKiAxMDAwIC8gSE9NRV9LV0hfWUVBUikgfSkgOiBUWFQucmFuZ2VOb25lOwogICAgfQogICAgJCgiZWN3dC1jb3B5IikuZGlzYWJsZWQgPSAhKGNvbXBsZXRlICYmIGxhc3REKTsgJCgiZWN3dC1jc3YiKS5kaXNhYmxlZCA9ICFULmhhdmU7CiAgICByZW5kZXJDaGFydChUKTsgcmVuZGVyRGF5VGFibGUoVCk7IHJlbmRlckZhcm1zKFQpOwogIH0KCiAgZnVuY3Rpb24gbmljZU1heCh2KSB7CiAgICBpZiAodiA8PSAwKSByZXR1cm4geyBtYXg6IDEsIHN0ZXA6IDAuMjUgfTsKICAgIHZhciByYXcgPSB2IC8gNCwgbWFnID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMChyYXcpKSksIG4gPSByYXcgLyBtYWc7CiAgICB2YXIgc3RlcCA9IChuIDw9IDEgPyAxIDogbiA8PSAyID8gMiA6IG4gPD0gMi41ID8gMi41IDogbiA8PSA1ID8gNSA6IDEwKSAqIG1hZzsKICAgIHJldHVybiB7IG1heDogTWF0aC5jZWlsKHYgLyBzdGVwKSAqIHN0ZXAsIHN0ZXA6IHN0ZXAgfTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyQ2hhcnQoVCkgewogICAgdmFyIGVsID0gJCgiZWN3dC1jaGFydCIpLCB3ID0gVC53LCBkYXlzID0gdy5mdWxsLmNvbmNhdCh3LnBhcnRpYWwgPyBbdy5wYXJ0aWFsXSA6IFtdKTsKICAgIHZhciBlbmVyZ3lNID0gc3RhdGUubWV0cmljID09PSAiZW5lcmd5IjsKICAgIHZhciB2YWxzID0gZGF5cy5tYXAoZnVuY3Rpb24gKHkpIHsgdmFyIGQgPSBzdGF0ZS5kYXlzW3ldOyByZXR1cm4gZCA\/IChlbmVyZ3lNID8gZC5td2ggLyAxMDAwIDogZC5nYnAgLyAxZTYpIDogbnVsbDsgfSk7CiAgICB2YXIgVyA9IE1hdGgubWF4KDMwMCwgZWwuY2xpZW50V2lkdGggfHwgNjAwKSwgSCA9IDI2MCwgcGFkTCA9IDQ0LCBwYWRSID0gOCwgcGFkVCA9IDI2LCBwYWRCID0gMzQ7CiAgICB2YXIgcGxvdFcgPSBXIC0gcGFkTCAtIHBhZFIsIHBsb3RIID0gSCAtIHBhZFQgLSBwYWRCOwogICAgdmFyIG5tID0gbmljZU1heChNYXRoLm1heC5hcHBseShudWxsLCB2YWxzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdiA9PSBudWxsID8gMCA6IE1hdGguYWJzKHYpOyB9KS5jb25jYXQoWzBdKSkpOwogICAgdmFyIHkgPSBmdW5jdGlvbiAodikgeyByZXR1cm4gcGFkVCArIHBsb3RIIC0gKHYgLyBubS5tYXgpICogcGxvdEg7IH07CiAgICB2YXIgYmFuZCA9IHBsb3RXIC8gZGF5cy5sZW5ndGgsIGJ3ID0gTWF0aC5taW4oMjQsIE1hdGgubWF4KDMsIGJhbmQgLSAyKSk7CiAgICB2YXIgdW5pdCA9IGVuZXJneU0gPyAiR1doIiA6ICLCo20iOwogICAgdmFyIGRlYyA9IE1hdGgubWluKDIsIE1hdGgubWF4KDAsIC1NYXRoLmZsb29yKE1hdGgubG9nMTAobm0uc3RlcCkgKyAxZS05KSkpOwogICAgdmFyIHRmID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCJlbi1HQiIsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkZWMsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZGVjIH0pOwogICAgdmFyIHRpY2tGbXQgPSBmdW5jdGlvbiAodikgeyByZXR1cm4gdGYuZm9ybWF0KHYpOyB9OwogICAgdmFyIHMgPSAnPHN2ZyB2aWV3Qm94PSIwIDAgJyArIFcgKyAiICIgKyBIICsgJyIgd2lkdGg9IicgKyBXICsgJyIgaGVpZ2h0PSInICsgSCArICciIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iJyArIChlbmVyZ3lNID8gIlNjb3R0aXNoIHdpbmQgZW5lcmd5IHR1cm5lZCBkb3duIGVhY2ggZGF5LCBnaWdhd2F0dCBob3VycyIgOiAiUGF5bWVudHMgdG8gU2NvdHRpc2ggd2luZCBmYXJtcyB0byB0dXJuIGRvd24gZWFjaCBkYXksIG1pbGxpb25zIG9mIHBvdW5kcyIpICsgJyI+JzsKICAgIGZvciAodmFyIHQgPSAwOyB0IDw9IG5tLm1heCArIDFlLTk7IHQgKz0gbm0uc3RlcCkgewogICAgICBzICs9ICc8bGluZSBjbGFzcz0iZ3JpZCIgeDE9IicgKyBwYWRMICsgJyIgeDI9IicgKyAoVyAtIHBhZFIpICsgJyIgeTE9IicgKyB5KHQpLnRvRml4ZWQoMSkgKyAnIiB5Mj0iJyArIHkodCkudG9GaXhlZCgxKSArICciLz4nOwogICAgICBzICs9ICc8dGV4dCBjbGFzcz0iYXgiIHg9IicgKyAocGFkTCAtIDYpICsgJyIgeT0iJyArICh5KHQpICsgNCkudG9GaXhlZCgxKSArICciIHRleHQtYW5jaG9yPSJlbmQiPicgKyB0aWNrRm10KHQpICsgIjwvdGV4dD4iOwogICAgfQogICAgcyArPSAnPHRleHQgY2xhc3M9ImF4IiB4PSInICsgKHBhZEwgLSA2KSArICciIHk9IjEwIiB0ZXh0LWFuY2hvcj0iZW5kIj4nICsgdW5pdCArICI8L3RleHQ+IjsKICAgIHZhciBsYWJlbEV2ZXJ5ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChkYXlzLmxlbmd0aCA8PSA4ID8gNTYgOiA0NikgLyBiYW5kKSk7CiAgICB2YXIgbWF4SSA9IC0xLCBtYXhWID0gLUluZmluaXR5OyB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHsgaWYgKHYgIT0gbnVsbCAmJiBkYXlzW2ldICE9PSB3LnBhcnRpYWwgJiYgdiA+IG1heFYpIHsgbWF4ViA9IHY7IG1heEkgPSBpOyB9IH0pOwogICAgZGF5cy5mb3JFYWNoKGZ1bmN0aW9uICh5bWQsIGkpIHsKICAgICAgdmFyIGN4ID0gcGFkTCArIGJhbmQgKiBpICsgYmFuZCAvIDIsIHYgPSB2YWxzW2ldLCBkID0gc3RhdGUuZGF5c1t5bWRdLCBwYXJ0ID0geW1kID09PSB3LnBhcnRpYWw7CiAgICAgIHZhciBjbHMgPSBkID8gKHBhcnQgPyAiYmFyIHBhcnRpYWwiIDogImJhciIpIDogImJhciBwZW5kaW5nIjsKICAgICAgdmFyIHZ2ID0gdiA9PSBudWxsID8gbm0ubWF4ICogMC4wNCA6IE1hdGgubWF4KDAsIHYpLCB0b3AgPSB5KHZ2KSwgaCA9IHBhZFQgKyBwbG90SCAtIHRvcDsKICAgICAgcyArPSAnPHJlY3QgY2xhc3M9ImhpdCIgeD0iJyArIChwYWRMICsgYmFuZCAqIGkpLnRvRml4ZWQoMSkgKyAnIiB5PSInICsgcGFkVCArICciIHdpZHRoPSInICsgYmFuZC50b0ZpeGVkKDEpICsgJyIgaGVpZ2h0PSInICsgcGxvdEggKyAnIiBkYXRhLWk9IicgKyBpICsgJyIgdGFiaW5kZXg9IjAiIGFyaWEtbGFiZWw9IicgKyBlc2MoZm10RGF5TG9uZy5mb3JtYXQoeW1kRGF0ZSh5bWQpKSkgKyAnIi8+JzsKICAgICAgcyArPSAnPHJlY3QgY2xhc3M9ImhsIiB4PSInICsgKHBhZEwgKyBiYW5kICogaSArIDEpLnRvRml4ZWQoMSkgKyAnIiB5PSInICsgcGFkVCArICciIHdpZHRoPSInICsgTWF0aC5tYXgoMCwgYmFuZCAtIDIpLnRvRml4ZWQoMSkgKyAnIiBoZWlnaHQ9IicgKyBwbG90SCArICciIHJ4PSI0Ii8+JzsKICAgICAgaWYgKGggPiAwLjUpIHsKICAgICAgICB2YXIgciA9IE1hdGgubWluKDQsIGJ3IC8gMiwgaCk7CiAgICAgICAgcyArPSAnPHBhdGggY2xhc3M9IicgKyBjbHMgKyAnIiBkPSJNJyArIChjeCAtIGJ3IC8gMikudG9GaXhlZCgxKSArICIsIiArIChwYWRUICsgcGxvdEgpICsgIlYiICsgKHRvcCArIHIpLnRvRml4ZWQoMSkgKyAiUSIgKyAoY3ggLSBidyAvIDIpLnRvRml4ZWQoMSkgKyAiLCIgKyB0b3AudG9GaXhlZCgxKSArICIgIiArIChjeCAtIGJ3IC8gMiArIHIpLnRvRml4ZWQoMSkgKyAiLCIgKyB0b3AudG9GaXhlZCgxKSArICJIIiArIChjeCArIGJ3IC8gMiAtIHIpLnRvRml4ZWQoMSkgKyAiUSIgKyAoY3ggKyBidyAvIDIpLnRvRml4ZWQoMSkgKyAiLCIgKyB0b3AudG9GaXhlZCgxKSArICIgIiArIChjeCArIGJ3IC8gMikudG9GaXhlZCgxKSArICIsIiArICh0b3AgKyByKS50b0ZpeGVkKDEpICsgIlYiICsgKHBhZFQgKyBwbG90SCkgKyAnWiIgcG9pbnRlci1ldmVudHM9Im5vbmUiLz4nOwogICAgICB9CiAgICAgIGlmIChpID09PSBtYXhJICYmIG1heFYgPiAwKSBzICs9ICc8dGV4dCBjbGFzcz0idmFsIiB4PSInICsgY3gudG9GaXhlZCgxKSArICciIHk9IicgKyAodG9wIC0gNikudG9GaXhlZCgxKSArICciIHRleHQtYW5jaG9yPSJtaWRkbGUiPicgKyAoZW5lcmd5TSA\/IGVuZXJneShkLm13aCkgOiBtb25leShkLmdicCkpICsgIjwvdGV4dD4iOwogICAgICBpZiAoKGRheXMubGVuZ3RoIC0gMSAtIGkpICUgbGFiZWxFdmVyeSA9PT0gMCkgewogICAgICAgIHZhciBkZCA9IHltZERhdGUoeW1kKSwgbGFiID0gZGF5cy5sZW5ndGggPD0gOCA\/IGZtdERheVNob3J0LmZvcm1hdChkZCkucmVwbGFjZSgiLCIsICIiKS5yZXBsYWNlKC8gXHcrJC8sICIiKSA6IGRkLmdldFVUQ0RhdGUoKSArICIgIiArIGZtdERheVNob3J0LmZvcm1hdChkZCkuc3BsaXQoIiAiKS5wb3AoKTsKICAgICAgICBzICs9ICc8dGV4dCBjbGFzcz0iYXgiIHg9IicgKyBjeC50b0ZpeGVkKDEpICsgJyIgeT0iJyArIChIIC0gMTIpICsgJyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+JyArIGVzYyhsYWIpICsgIjwvdGV4dD4iOwogICAgICB9CiAgICB9KTsKICAgIHMgKz0gJzxsaW5lIGNsYXNzPSJiYXNlIiB4MT0iJyArIHBhZEwgKyAnIiB4Mj0iJyArIChXIC0gcGFkUikgKyAnIiB5MT0iJyArIChwYWRUICsgcGxvdEgpICsgJyIgeTI9IicgKyAocGFkVCArIHBsb3RIKSArICciLz48L3N2Zz48ZGl2IGNsYXNzPSJlY3d0LXRpcCIgaGlkZGVuPjwvZGl2Pic7CiAgICBlbC5pbm5lckhUTUwgPSBzOwogICAgJCgiZWN3dC1sZWdlbmQiKS5pbm5lckhUTUwgPSAnPHNwYW4+PGkgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tZWMtYmFyKSI+PC9pPkZ1bGwgZGF5PC9zcGFuPicgKyAody5wYXJ0aWFsID8gJzxzcGFuPjxpIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWVjLWJhci1zb2Z0KSI+PC9pPicgKyBlc2MoZm10RGF5U2hvcnQuZm9ybWF0KHltZERhdGUody5wYXJ0aWFsKSkpICsgIiwgc3RpbGwgZmlsbGluZyBpbjwvc3Bhbj4iIDogIiIpOwogICAgdmFyIHRpcCA9IGVsLnF1ZXJ5U2VsZWN0b3IoIi5lY3d0LXRpcCIpOwogICAgZnVuY3Rpb24gc2hvdyhlKSB7CiAgICAgIHZhciBpID0gK2UudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS1pIiksIHltZCA9IGRheXNbaV0sIGQgPSBzdGF0ZS5kYXlzW3ltZF07CiAgICAgIHZhciBzdmcgPSBlbC5xdWVyeVNlbGVjdG9yKCJzdmciKSwgayA9IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAvIFc7CiAgICAgIHRpcC5pbm5lckhUTUwgPSAiPGI+IiArIGVzYyhmbXREYXlMb25nLmZvcm1hdCh5bWREYXRlKHltZCkpKSArICI8L2I+PGJyPiIgKyAoZCA\/IGVuZXJneShkLm13aCkgKyAiIHR1cm5lZCBkb3duPGJyPiIgKyBtb25leShkLmdicCkgKyAiIHBhaWQiICsgKHltZCA9PT0gdy5wYXJ0aWFsID8gIjxicj5TdGlsbCBmaWxsaW5nIGluIiA6ICIiKSA6ICJMb2FkaW5n4oCmIik7CiAgICAgIHRpcC5oaWRkZW4gPSBmYWxzZTsKICAgICAgdmFyIHggPSAocGFkTCArIGJhbmQgKiBpICsgYmFuZCAvIDIpICogaywgdG9wID0geSh2YWxzW2ldID09IG51bGwgPyAwIDogTWF0aC5tYXgoMCwgdmFsc1tpXSkpICogazsKICAgICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIDkwKSwgZWwuY2xpZW50V2lkdGggLSA5MCk7CiAgICAgIHRpcC5zdHlsZS5sZWZ0ID0geCArICJweCI7IHRpcC5zdHlsZS50b3AgPSBNYXRoLm1heCh0b3AsIDUwKSArICJweCI7CiAgICB9CiAgICBmdW5jdGlvbiBoaWRlKCkgeyB0aXAuaGlkZGVuID0gdHJ1ZTsgfQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKCIuaGl0IiksIGZ1bmN0aW9uIChoKSB7CiAgICAgIGguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsIHNob3cpOyBoLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgc2hvdyk7CiAgICAgIGguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIGhpZGUpOyBoLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCBoaWRlKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyRGF5VGFibGUoVCkgewogICAgdmFyIHcgPSBULncsIGRheXMgPSB3LmZ1bGwuc2xpY2UoKS5yZXZlcnNlKCk7CiAgICBpZiAody5wYXJ0aWFsKSBkYXlzLnVuc2hpZnQody5wYXJ0aWFsKTsKICAgICQoImVjd3QtZGF5LXRhYmxlIikuaW5uZXJIVE1MID0gIjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5EYXk8L3RoPjx0aCBjbGFzcz1cInJcIj5UdXJuZWQgZG93bjwvdGg+PHRoIGNsYXNzPVwiclwiPlBhaWQ8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IiArCiAgICAgIGRheXMubWFwKGZ1bmN0aW9uICh5KSB7CiAgICAgICAgdmFyIGQgPSBzdGF0ZS5kYXlzW3ldOwogICAgICAgIHJldHVybiAiPHRyPjx0ZD4iICsgZXNjKGZtdERheVNob3J0LmZvcm1hdCh5bWREYXRlKHkpKSkgKyAoeSA9PT0gdy5wYXJ0aWFsID8gJyA8c3BhbiBjbGFzcz0iZWN3dC1tdXRlZCI+KHNvIGZhcik8L3NwYW4+JyA6ICIiKSArICc8L3RkPjx0ZCBjbGFzcz0iciI+JyArIChkID8gZW5lcmd5KGQubXdoKSA6ICLigKYiKSArICc8L3RkPjx0ZCBjbGFzcz0iciI+JyArIChkID8gbW9uZXkoZC5nYnApIDogIuKApiIpICsgIjwvdGQ+PC90cj4iOwogICAgICB9KS5qb2luKCIiKSArICI8L3Rib2R5PjwvdGFibGU+IjsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckZhcm1zKFQpIHsKICAgICQoImVjd3QtZmFybXMtbm90ZSIpLnRleHRDb250ZW50ID0gZmlsbChUWFQucmFuZ2VMYWJlbCwgeyBkYXlzOiBzdGF0ZS5yYW5nZSB9KTsKICAgIHZhciByb3dzID0gT2JqZWN0LmtleXMoVC5zdCkubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiB7IHN0OiBrLCBtd2g6IFQuc3Rba11bMF0sIGdicDogVC5zdFtrXVsxXSB9OyB9KQogICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLm13aCA+IDAuMDUgfHwgTWF0aC5hYnMoci5nYnApID4gMTsgfSkKICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubXdoIC0gYS5td2g7IH0pOwogICAgaWYgKCFULmhhdmUpIHJldHVybjsKICAgIGlmICghcm93cy5sZW5ndGgpIHsgJCgiZWN3dC1mYXJtcyIpLmlubmVySFRNTCA9ICc8cCBjbGFzcz0iZWN3dC1lbXB0eSI+JyArIFRYVC5mYXJtc05vbmUgKyAnPC9wPic7IHJldHVybjsgfQogICAgdmFyIG1heCA9IHJvd3NbMF0ubXdoIHx8IDEsIHNob3duID0gc3RhdGUuc2hvd0FsbEZhcm1zID8gcm93cyA6IHJvd3Muc2xpY2UoMCwgMTApOwogICAgJCgiZWN3dC1mYXJtcyIpLmlubmVySFRNTCA9ICI8dGFibGU+PHRoZWFkPjx0cj48dGg+V2luZCBmYXJtPC90aD48dGggY2xhc3M9XCJyXCI+VHVybmVkIGRvd248L3RoPjx0aCBjbGFzcz1cInJcIj5QYWlkPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIgKwogICAgICBzaG93bi5tYXAoZnVuY3Rpb24gKHIpIHsKICAgICAgICB2YXIgcyA9IHN0YXRlLnN0YXRpb25zW3Iuc3RdOwogICAgICAgIHJldHVybiAiPHRyPjx0ZD48c3BhbiBjbGFzcz1cImVjd3QtZmFybVwiPiIgKyBlc2MocyA\/IHMubmFtZSA6IHIuc3QpICsgIjwvc3Bhbj48c3BhbiBjbGFzcz1cImVjd3Qtc2hhcmVcIiBzdHlsZT1cIndpZHRoOiIgKyBNYXRoLm1heCgyLCByLm13aCAvIG1heCAqIDEwMCkudG9GaXhlZCgxKSArICIlXCI+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPVwiclwiPiIgKyBlbmVyZ3koci5td2gpICsgJzwvdGQ+PHRkIGNsYXNzPSJyIj4nICsgbW9uZXkoci5nYnApICsgIjwvdGQ+PC90cj4iOwogICAgICB9KS5qb2luKCIiKSArICI8L3Rib2R5PjwvdGFibGU+IiArCiAgICAgIChyb3dzLmxlbmd0aCA+IDEwID8gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iZWN3dC1saW5rLWJ0biIgaWQ9ImVjd3QtZmFybXMtbW9yZSI+JyArIChzdGF0ZS5zaG93QWxsRmFybXMgPyAiU2hvdyB0b3AgMTAiIDogIlNob3cgYWxsICIgKyByb3dzLmxlbmd0aCArICIgd2luZCBmYXJtcyIpICsgIjwvYnV0dG9uPiIgOiAiIik7CiAgICB2YXIgbW9yZSA9ICQoImVjd3QtZmFybXMtbW9yZSIpOwogICAgaWYgKG1vcmUpIG1vcmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IHN0YXRlLnNob3dBbGxGYXJtcyA9ICFzdGF0ZS5zaG93QWxsRmFybXM7IHJlbmRlckZhcm1zKHJhbmdlVG90YWxzKCkpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckNvdmVyYWdlKCkgewogICAgdmFyIHN0ID0gT2JqZWN0LmtleXMoc3RhdGUuc3RhdGlvbnMpLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gc3RhdGUuc3RhdGlvbnNba107IH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIuY2FwIC0gYS5jYXA7IH0pOwogICAgJCgiZWN3dC1jb3ZlcmFnZSIpLnRleHRDb250ZW50ID0gZmlsbChUWFQuY292ZXJhZ2UsIHsgdW5pdHM6IHN0YXRlLnVuaXRzLmxlbmd0aCwgc2l0ZXM6IHN0Lmxlbmd0aCwgZ3c6IG5mMS5mb3JtYXQoc3RhdGUuY2FwTVcgLyAxMDAwKSB9KTsKICAgICQoImVjd3QtdW5pdGxpc3QiKS5pbm5lckhUTUwgPSAiPHRhYmxlPjx0aGVhZD48dHI+PHRoPlNpdGU8L3RoPjx0aD5Vbml0czwvdGg+PHRoIGNsYXNzPVwiclwiPk1XPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIgKwogICAgICBzdC5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuICI8dHI+PHRkPiIgKyBlc2Mocy5uYW1lKSArICI8L3RkPjx0ZD4iICsgZXNjKHMudW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7IHJldHVybiB1LmlkOyB9KS5qb2luKCIsICIpKSArICc8L3RkPjx0ZCBjbGFzcz0iciI+JyArIG5mMC5mb3JtYXQocy5jYXApICsgIjwvdGQ+PC90cj4iOyB9KS5qb2luKCIiKSArICI8L3Rib2R5PjwvdGFibGU+IjsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gYWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gdG9hc3QobXNnKSB7IHZhciB0ID0gJCgiZWN3dC10b2FzdCIpOyB0LnRleHRDb250ZW50ID0gbXNnOyBjbGVhclRpbWVvdXQodG9hc3QudCk7IHRvYXN0LnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdC50ZXh0Q29udGVudCA9ICIiOyB9LCA0MDAwKTsgfQogIGZ1bmN0aW9uIHN1bW1hcnlUZXh0KCkgewogICAgdmFyIFQgPSByYW5nZVRvdGFscygpLCB3ID0gVC53LCBkID0gc3RhdGUuZGF5c1t3Lmxhc3RdOwogICAgcmV0dXJuIGZpbGwoVFhULnNoYXJlLCB7IGRheXM6IHN0YXRlLnJhbmdlLCBlbmVyZ3k6IGVuZXJneShULm13aCksIGNvc3Q6IG1vbmV5KFQuZ2JwKSwgaG9tZXM6IHJvdW5kSG9tZXMoVC5td2ggKiAxMDAwIC8gSE9NRV9LV0hfWUVBUiksCiAgICAgIGRhdGU6IGZtdERheUxvbmcuZm9ybWF0KHltZERhdGUody5sYXN0KSksIGRheUVuZXJneTogZW5lcmd5KGQubXdoKSwgbGluazogbG9jYXRpb24uaHJlZi5zcGxpdCgiIyIpWzBdIH0pLnJlcGxhY2UoLzxbXj5dKz4vZywgIiIpOwogIH0KICAkKCJlY3d0LWNvcHkiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHZhciB0ZXh0ID0gc3VtbWFyeVRleHQoKTsKICAgIHZhciBkb25lID0gZnVuY3Rpb24gKCkgeyB0b2FzdCgiU3VtbWFyeSBjb3BpZWQiKTsgfTsKICAgIHZhciBmYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGEudmFsdWUgPSB0ZXh0OyB0YS5zZXRBdHRyaWJ1dGUoInJlYWRvbmx5IiwgIiIpOyB0YS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7IHRhLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTsgZG9uZSgpOyB9IGNhdGNoIChlKSB7IHRvYXN0KCJDb3VsZG4ndCBjb3B5LiBTZWxlY3QgdGhlIHRleHQgbWFudWFsbHkuIik7IH0KICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICB9OwogICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZG9uZSwgZmFsbGJhY2spOyBlbHNlIGZhbGxiYWNrKCk7CiAgfSk7CiAgJCgiZWN3dC1jc3YiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHZhciB3ID0gd2luZG93RGF5cyhzdGF0ZS5yYW5nZSksIGRheXMgPSB3LmZ1bGwuY29uY2F0KHcucGFydGlhbCA\/IFt3LnBhcnRpYWxdIDogW10pOwogICAgdmFyIGxpbmVzID0gWyJkYXRlLGNvbXBsZXRlLHR1cm5lZF9kb3duX213aCxpbmRpY2F0aXZlX3BheW1lbnRzX2dicCJdOwogICAgZGF5cy5mb3JFYWNoKGZ1bmN0aW9uICh5KSB7IHZhciBkID0gc3RhdGUuZGF5c1t5XTsgaWYgKGQpIGxpbmVzLnB1c2goW3ksIGQuY29tcGxldGUgPyAieWVzIiA6ICJubyIsIGQubXdoLCBkLmdicF0uam9pbigiLCIpKTsgfSk7CiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtsaW5lcy5qb2luKCJcbiIpICsgIlxuIl0sIHsgdHlwZTogInRleHQvY3N2IiB9KTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOyBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOyBhLmRvd25sb2FkID0gInNjb3R0aXNoLXdpbmQtdHVybmVkLWRvd24tIiArIHcubGFzdCArICIuY3N2IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IFVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKTsgYS5yZW1vdmUoKTsgfSwgMTAwMCk7CiAgfSk7CiAgZnVuY3Rpb24gc2V0UHJlc3NlZChhdHRyLCB2YWwpIHsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS0iICsgYXR0ciArICJdIiksIGZ1bmN0aW9uIChiKSB7IGIuc2V0QXR0cmlidXRlKCJhcmlhLXByZXNzZWQiLCBTdHJpbmcoYi5nZXRBdHRyaWJ1dGUoImRhdGEtIiArIGF0dHIpID09PSBTdHJpbmcodmFsKSkpOyB9KTsKICB9CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW1ldHJpY10iKSwgZnVuY3Rpb24gKGIpIHsKICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IHN0YXRlLm1ldHJpYyA9IGIuZ2V0QXR0cmlidXRlKCJkYXRhLW1ldHJpYyIpOyBzZXRQcmVzc2VkKCJtZXRyaWMiLCBzdGF0ZS5tZXRyaWMpOyAkKCJlY3d0LWNoYXJ0LXRpdGxlIikudGV4dENvbnRlbnQgPSBzdGF0ZS5tZXRyaWMgPT09ICJlbmVyZ3kiID8gVFhULmNoYXJ0RW5lcmd5IDogVFhULmNoYXJ0Q29zdDsgcmVuZGVyU2V0dGxlZCgpOyB9KTsKICB9KTsKICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtcmFuZ2VdIiksIGZ1bmN0aW9uIChiKSB7CiAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5yYW5nZSA9ICtiLmdldEF0dHJpYnV0ZSgiZGF0YS1yYW5nZSIpOyBzZXRQcmVzc2VkKCJyYW5nZSIsIHN0YXRlLnJhbmdlKTsgaWYgKHN0YXRlLnVuaXRzKSBsb2FkUmFuZ2UoKS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7IH0pOwogIH0pOwogIHZhciBydDsgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KHJ0KTsgcnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKHN0YXRlLnVuaXRzKSByZW5kZXJDaGFydChyYW5nZVRvdGFscygpKTsgfSwgMTUwKTsgfSk7CiAgJCgiZWN3dC1yZXRyeSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgc3RhcnQpOwogICQoImVjd3QteWVhciIpLnRleHRDb250ZW50ID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIHN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBiYW5uZXIobXNnKSB7ICQoImVjd3QtYmFubmVyIikuaGlkZGVuID0gIW1zZzsgaWYgKG1zZykgJCgiZWN3dC1iYW5uZXItdGV4dCIpLnRleHRDb250ZW50ID0gbXNnOyB9CiAgZnVuY3Rpb24gdGlja0xpdmUoKSB7CiAgICByZXR1cm4gbG9hZExpdmUoKS50aGVuKGZ1bmN0aW9uIChMKSB7IHN0YXRlLmxpdmUgPSBMOyByZW5kZXJMaXZlKCk7IH0sIGZ1bmN0aW9uICgpIHsgbGl2ZUVycm9yKCk7IH0pOwogIH0KICBmdW5jdGlvbiBzdGFydCgpIHsKICAgIGJhbm5lcigiIik7CiAgICBsb2FkVW5pdHMoKS50aGVuKGZ1bmN0aW9uICh1bml0cykgewogICAgICBpZiAoIXVuaXRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCJubyB1bml0cyIpOwogICAgICBpbmRleFVuaXRzKHVuaXRzKTsKICAgICAgdGlja0xpdmUoKTsKICAgICAgY2xlYXJJbnRlcnZhbChzdGF0ZS5saXZlVGltZXIpOyBzdGF0ZS5saXZlVGltZXIgPSBzZXRJbnRlcnZhbCh0aWNrTGl2ZSwgTElWRV9SRUZSRVNIX01TKTsKICAgICAgcmV0dXJuIGxvYWRSYW5nZSgpLmNhdGNoKGZ1bmN0aW9uICgpIHsgYmFubmVyKFRYVC5iYW5uZXJTZXR0bGVkKTsgfSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIGJhbm5lcihUWFQuYmFubmVyQWxsKTsKICAgICAgbGl2ZUVycm9yKCk7IHByb2dyZXNzKCIiKTsKICAgIH0pOwogIH0KICBzdGFydCgpOwp9KSgpOwo=\");var u=new Uint8Array(b.length);for(var i=0;i!==b.length;i++){u[i]=b.charCodeAt(i);}var s=document.createElement(\"script\");s.text=new TextDecoder(\"utf-8\").decode(u);document.body.appendChild(s);})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>EnergyCloud Scotland \u00b7 Wasted Wind Tracker When the grid can&#8217;t carry Scotland&#8217;s wind power to where it&#8217;s needed, National Grid pays wind farms to turn down. EnergyCloud wants that surplus sent to households in fuel poverty instead. These figures come straight from Elexon&#8217;s official balancing data and update automatically. We couldn&#8217;t reach Elexon&#8217;s data service. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-799","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Wasted Wind Tracker Scotland - Scotland<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wasted Wind Tracker Scotland - Scotland\" \/>\n<meta property=\"og:description\" content=\"EnergyCloud Scotland \u00b7 Wasted Wind Tracker When the grid can&#8217;t carry Scotland&#8217;s wind power to where it&#8217;s needed, National Grid pays wind farms to turn down. EnergyCloud wants that surplus sent to households in fuel poverty instead. These figures come straight from Elexon&#8217;s official balancing data and update automatically. We couldn&#8217;t reach Elexon&#8217;s data service. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/\" \/>\n<meta property=\"og:site_name\" content=\"Scotland\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-01T10:46:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/\",\"url\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/\",\"name\":\"Wasted Wind Tracker Scotland - Scotland\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/energycloud.org\\\/scotland\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/cropped-ec-logo-270x270.avif\",\"datePublished\":\"2026-10-01T10:33:45+00:00\",\"dateModified\":\"2026-10-01T10:46:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/#primaryimage\",\"url\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/cropped-ec-logo-270x270.avif\",\"contentUrl\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/cropped-ec-logo-270x270.avif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/energycloud.org\\\/scotland\\\/wasted-wind-tracker-scotland\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\\\/\\\/energycloud.org\\\/scotland\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Wasted Wind Tracker Scotland\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/energycloud.org\\\/scotland\\\/#website\",\"url\":\"http:\\\/\\\/energycloud.org\\\/scotland\\\/\",\"name\":\"EnergyCloud - Scotland\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/energycloud.org\\\/scotland\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wasted Wind Tracker Scotland - Scotland","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/","og_locale":"en_US","og_type":"article","og_title":"Wasted Wind Tracker Scotland - Scotland","og_description":"EnergyCloud Scotland \u00b7 Wasted Wind Tracker When the grid can&#8217;t carry Scotland&#8217;s wind power to where it&#8217;s needed, National Grid pays wind farms to turn down. EnergyCloud wants that surplus sent to households in fuel poverty instead. These figures come straight from Elexon&#8217;s official balancing data and update automatically. We couldn&#8217;t reach Elexon&#8217;s data service. [&hellip;]","og_url":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/","og_site_name":"Scotland","article_modified_time":"2026-10-01T10:46:38+00:00","og_image":[{"url":"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/","url":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/","name":"Wasted Wind Tracker Scotland - Scotland","isPartOf":{"@id":"http:\/\/energycloud.org\/scotland\/#website"},"primaryImageOfPage":{"@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/#primaryimage"},"image":{"@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/#primaryimage"},"thumbnailUrl":"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif","datePublished":"2026-10-01T10:33:45+00:00","dateModified":"2026-10-01T10:46:38+00:00","breadcrumb":{"@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/#primaryimage","url":"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif","contentUrl":"https:\/\/energycloud.org\/scotland\/wp-content\/uploads\/sites\/8\/2025\/12\/cropped-ec-logo-270x270.avif"},{"@type":"BreadcrumbList","@id":"https:\/\/energycloud.org\/scotland\/wasted-wind-tracker-scotland\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/energycloud.org\/scotland\/"},{"@type":"ListItem","position":2,"name":"Wasted Wind Tracker Scotland"}]},{"@type":"WebSite","@id":"http:\/\/energycloud.org\/scotland\/#website","url":"http:\/\/energycloud.org\/scotland\/","name":"EnergyCloud - Scotland","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/energycloud.org\/scotland\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/pages\/799","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/comments?post=799"}],"version-history":[{"count":3,"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/pages\/799\/revisions"}],"predecessor-version":[{"id":803,"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/pages\/799\/revisions\/803"}],"wp:attachment":[{"href":"https:\/\/energycloud.org\/scotland\/wp-json\/wp\/v2\/media?parent=799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}