{"id":26,"date":"2024-12-11T14:53:09","date_gmt":"2024-12-11T14:53:09","guid":{"rendered":"https:\/\/rentamac.io\/?page_id=26"},"modified":"2026-10-18T14:24:02","modified_gmt":"2026-10-18T14:24:02","slug":"precificacao","status":"publish","type":"page","link":"https:\/\/rentamac.io\/pt\/pricing\/","title":{"rendered":"Pre\u00e7os"},"content":{"rendered":"\n<!-- RentaMac Pricing Component for WordPress -->\n<!-- Add this to your theme's functions.php or use a plugin to load Inter font:\n     wp_enqueue_style('google-fonts-inter', 'https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&display=swap');\n-->\n<style>\n    \/* ============================================\n       CONFIGURATION - Easy to modify pricing\n       ============================================ *\/\n\n    .rentamac-pricing {\n      \/* Colors *\/\n      --bg: #0a0a0f;\n      --bg-card: rgba(255, 255, 255, 0.03);\n      --bg-card-hover: rgba(255, 255, 255, 0.05);\n      --stroke: rgba(255, 255, 255, 0.08);\n      --stroke-hover: rgba(255, 255, 255, 0.15);\n      --text: #f0f2f5;\n      --text-secondary: #8b919e;\n      --text-muted: #5c6370;\n\n      \/* Accent colors *\/\n      --accent-blue: #3b82f6;\n      --accent-blue-glow: rgba(59, 130, 246, 0.2);\n      --accent-purple: #a855f7;\n      --accent-green: #22c55e;\n      --accent-green-glow: rgba(34, 197, 94, 0.15);\n      --accent-orange: #f97316;\n\n      \/* Gradients *\/\n      --gradient-primary: linear-gradient(135deg, #3b82f6, #8b5cf6);\n      --gradient-success: linear-gradient(135deg, #22c55e, #10b981);\n\n      \/* Shadows *\/\n      --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);\n      --shadow-md: 0 8px 32px rgba(0, 0, 0, 0.4);\n      --shadow-lg: 0 16px 64px rgba(0, 0, 0, 0.5);\n      --shadow-glow: 0 0 40px var(--accent-blue-glow);\n\n      \/* Base styles for the component *\/\n      font-family: 'Inter', system-ui, -apple-system, sans-serif;\n      color: var(--text);\n      -webkit-font-smoothing: antialiased;\n      line-height: 1.5;\n      box-sizing: border-box;\n    }\n\n    .rentamac-pricing *,\n    .rentamac-pricing *::before,\n    .rentamac-pricing *::after {\n      box-sizing: border-box;\n    }\n\n    \/* Container *\/\n    .rentamac-pricing .container {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 4px 24px 24px;\n    }\n\n    \/* Header *\/\n    .rentamac-pricing .header {\n      text-align: center;\n      margin-top: 0;\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .header h1 {\n      font-size: clamp(32px, 5vw, 48px);\n      font-weight: 800;\n      letter-spacing: -0.5px;\n      margin-top: 0;\n      margin-bottom: 10px;\n      color: #ffffff; \/* White fallback color for browsers that don't support gradient text *\/\n    }\n\n    @supports (-webkit-background-clip: text) or (background-clip: text) {\n      .rentamac-pricing .header h1 {\n        background: linear-gradient(135deg, #ffffff 0%, rgba(255, 255, 255, 0.8) 100%);\n        -webkit-background-clip: text;\n        -webkit-text-fill-color: transparent;\n        background-clip: text;\n      }\n    }\n\n    \/* Main Card *\/\n    .rentamac-pricing .pricing-card {\n      background: var(--bg);\n      border: 1px solid var(--stroke);\n      border-radius: 24px;\n      padding: 24px 32px 32px;\n      box-shadow: var(--shadow-lg);\n    }\n\n    \/* Device Info *\/\n    .rentamac-pricing .device-info {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding-bottom: 10px;\n      border-bottom: 1px solid var(--stroke);\n      margin-bottom: 10px;\n    }\n\n    .rentamac-pricing .device-image {\n      width: 100px;\n      height: 56px;\n      object-fit: contain;\n      filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.4));\n    }\n\n    .rentamac-pricing .device-details h2 {\n      font-size: 22px;\n      font-weight: 700;\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .device-specs {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n    }\n\n    .rentamac-pricing .spec-badge {\n      background: rgba(255, 255, 255, 0.06);\n      border: 1px solid var(--stroke);\n      border-radius: 6px;\n      padding: 4px 10px;\n      font-size: 12px;\n      font-weight: 500;\n      color: var(--text-secondary);\n      display: inline-flex;\n      align-items: center;\n      gap: 4px;\n      position: relative;\n    }\n\n    .rentamac-pricing .spec-badge .feature-info {\n      width: 14px;\n      height: 14px;\n    }\n\n    .rentamac-pricing .spec-badge .feature-info svg {\n      width: 12px;\n      height: 12px;\n    }\n\n    \/* Section Titles *\/\n    .rentamac-pricing .section-title {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      margin-bottom: 3px;\n    }\n\n    \/* Cycle Selector *\/\n    .rentamac-pricing .cycle-section {\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .cycle-tabs {\n      display: flex;\n      gap: 4px;\n      flex-wrap: wrap;\n    }\n\n    .rentamac-pricing .cycle-tab {\n      flex: 1;\n      min-width: 80px;\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid var(--stroke);\n      border-radius: 12px;\n      padding: 14px 12px;\n      cursor: pointer;\n      transition: all 0.2s ease;\n      text-align: center;\n      position: relative;\n    }\n\n    .rentamac-pricing .cycle-tab:hover {\n      background: rgba(255, 255, 255, 0.06);\n      border-color: var(--stroke-hover);\n    }\n\n    .rentamac-pricing .cycle-tab.active {\n      background: rgba(59, 130, 246, 0.1);\n      border-color: var(--accent-blue);\n      box-shadow: 0 0 20px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .cycle-tab .cycle-name {\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--text);\n      display: block;\n      margin-top: 6px;\n      margin-bottom: 2px;\n    }\n\n    .rentamac-pricing .cycle-tab .cycle-price {\n      font-size: 12px;\n      color: var(--text-secondary);\n    }\n\n    .rentamac-pricing .cycle-tab.active .cycle-name {\n      color: var(--accent-blue);\n    }\n\n    \/* Popular \/ Save pills sit on the tab's top edge, side by side when a tab has both *\/\n    .rentamac-pricing .cycle-tab .tab-pills {\n      position: absolute;\n      top: -8px;\n      left: 4px;\n      right: 4px;\n      display: flex;\n      justify-content: center;\n      gap: 4px;\n      pointer-events: none;\n    }\n\n    .rentamac-pricing .cycle-tab .popular-badge,\n    .rentamac-pricing .cycle-tab .savings-badge {\n      min-width: 0;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      background: var(--accent-blue);\n      color: #fff;\n      font-size: 9px;\n      font-weight: 700;\n      line-height: 1.5;\n      padding: 1px 6px;\n      border-radius: 4px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n\n    .rentamac-pricing .cycle-tab .savings-badge {\n      background: var(--gradient-success);\n      color: #000;\n    }\n\n    \/* Unavailable cycle tab (e.g. daily plan low stock) *\/\n    .rentamac-pricing .cycle-tab.unavailable {\n      cursor: not-allowed;\n      position: relative;\n    }\n\n    .rentamac-pricing .cycle-tab.unavailable .cycle-name,\n    .rentamac-pricing .cycle-tab.unavailable .cycle-price {\n      opacity: 0.4;\n    }\n\n    .rentamac-pricing .cycle-tab.unavailable:hover {\n      background: rgba(255, 255, 255, 0.04);\n      border-color: var(--stroke);\n    }\n\n    .rentamac-pricing .cycle-tab.unavailable::after {\n      content: 'Disabled when availability is low. Join the waitlist to be notified.';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      background: var(--accent-orange);\n      color: #fff;\n      padding: 8px 14px;\n      border-radius: 8px;\n      font-size: 12px;\n      font-weight: 600;\n      white-space: nowrap;\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      pointer-events: none;\n      z-index: 10;\n      margin-bottom: 10px;\n    }\n\n    .rentamac-pricing .cycle-tab.unavailable::before {\n      content: '';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      border: 6px solid transparent;\n      border-top-color: var(--accent-orange);\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      margin-bottom: -2px;\n      z-index: 10;\n    }\n\n    .rentamac-pricing .cycle-tab.unavailable:hover::after,\n    .rentamac-pricing .cycle-tab.unavailable:hover::before {\n      opacity: 1;\n      visibility: visible;\n    }\n\n    \/* Region-aware tooltip text set from JS (falls back to the static copy above) *\/\n    .rentamac-pricing .cycle-tab.unavailable[data-tip]::after {\n      content: attr(data-tip);\n    }\n\n    \/* Location Section *\/\n    .rentamac-pricing .location-section {\n      margin-bottom: 4px;\n    }\n\n    \/* Storage Section *\/\n    .rentamac-pricing .storage-section {\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .storage-options {\n      display: flex;\n      gap: 5px;\n      flex-wrap: wrap;\n    }\n\n    .rentamac-pricing .storage-option {\n      flex: 1;\n      min-width: 140px;\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid var(--stroke);\n      border-radius: 12px;\n      padding: 16px;\n      cursor: pointer;\n      transition: all 0.2s ease;\n      text-align: center;\n      position: relative;\n    }\n\n    .rentamac-pricing .storage-option:hover:not(.disabled) {\n      background: rgba(255, 255, 255, 0.06);\n      border-color: var(--stroke-hover);\n    }\n\n    .rentamac-pricing .storage-option.active {\n      background: rgba(34, 197, 94, 0.08);\n      border-color: var(--accent-green);\n    }\n\n    .rentamac-pricing .storage-option.disabled {\n      cursor: not-allowed;\n    }\n    .rentamac-pricing .storage-option.disabled .storage-content {\n      opacity: 0.6;\n      filter: blur(1.5px);\n    }\n    .rentamac-pricing .storage-option.disabled:hover .storage-content {\n      filter: blur(1px);\n    }\n    .rentamac-pricing .storage-option.disabled::after {\n      content: 'Storage add-ons are only available on weekly or higher plans';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      background: rgba(0, 0, 0, 0.9);\n      color: var(--text);\n      padding: 8px 12px;\n      border-radius: 8px;\n      font-size: 12px;\n      font-weight: 500;\n      white-space: nowrap;\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      pointer-events: none;\n      z-index: 10;\n      margin-bottom: 8px;\n      border: 1px solid var(--stroke);\n    }\n    .rentamac-pricing .storage-option.disabled::before {\n      content: '';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      border: 6px solid transparent;\n      border-top-color: rgba(0, 0, 0, 0.9);\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      margin-bottom: 2px;\n    }\n    .rentamac-pricing .storage-option.disabled:hover::after,\n    .rentamac-pricing .storage-option.disabled:hover::before {\n      opacity: 1;\n      visibility: visible;\n    }\n\n    .rentamac-pricing .storage-option.unavailable {\n      cursor: not-allowed;\n      position: relative;\n    }\n\n    .rentamac-pricing .storage-option.unavailable .storage-content {\n      opacity: 0.6;\n      filter: blur(1.5px);\n    }\n\n    .rentamac-pricing .storage-option.unavailable:hover .storage-content {\n      filter: blur(1px);\n    }\n\n    .rentamac-pricing .storage-option.unavailable::after {\n      content: 'Unavailable due to high demand';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      background: rgba(0, 0, 0, 0.9);\n      color: var(--text);\n      padding: 8px 12px;\n      border-radius: 8px;\n      font-size: 12px;\n      font-weight: 500;\n      white-space: nowrap;\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      pointer-events: none;\n      z-index: 10;\n      margin-bottom: 8px;\n      border: 1px solid var(--stroke);\n    }\n\n    .rentamac-pricing .storage-option.unavailable::before {\n      content: '';\n      position: absolute;\n      bottom: 100%;\n      left: 50%;\n      transform: translateX(-50%);\n      border: 6px solid transparent;\n      border-top-color: rgba(0, 0, 0, 0.9);\n      opacity: 0;\n      visibility: hidden;\n      transition: all 0.2s ease;\n      margin-bottom: 2px;\n    }\n\n    .rentamac-pricing .storage-option.unavailable:hover::after,\n    .rentamac-pricing .storage-option.unavailable:hover::before {\n      opacity: 1;\n      visibility: visible;\n    }\n\n    \/* Region-aware tooltip text set from JS (falls back to the static copy above) *\/\n    .rentamac-pricing .storage-option.unavailable[data-tip]::after {\n      content: attr(data-tip);\n    }\n\n\n    .rentamac-pricing .storage-option .storage-size {\n      font-size: 18px;\n      font-weight: 700;\n      color: var(--text);\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .storage-option.active .storage-size {\n      color: var(--accent-green);\n    }\n\n    .rentamac-pricing .storage-option .storage-label {\n      font-size: 12px;\n      color: var(--text-secondary);\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .storage-option .storage-sublabel {\n      font-size: 10px;\n      color: var(--text-muted);\n      margin-bottom: 6px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n\n    .rentamac-pricing .storage-option .storage-price {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--text-muted);\n    }\n\n    .rentamac-pricing .storage-option.active .storage-price {\n      color: var(--accent-green);\n    }\n\n    .rentamac-pricing .storage-option .default-badge {\n      position: absolute;\n      top: -8px;\n      right: 12px;\n      background: var(--accent-blue);\n      color: #fff;\n      font-size: 9px;\n      font-weight: 700;\n      padding: 3px 8px;\n      border-radius: 4px;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n\n    \/* Features List *\/\n    .rentamac-pricing .features-section {\n      margin-bottom: 4px;\n      padding-top: 10px;\n    }\n\n    \/* Tooltips of the spec badges and the Included sheet.\n       Hidden tooltips are display:none so they never widen the page; JS (placeTip) shifts an open one\n       back inside the viewport through --tip-shift and flips it below when there is no room above. *\/\n    .rentamac-pricing .tip-owner { cursor: help; outline: none; }\n    .rentamac-pricing .tip-owner:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; border-radius: 6px; }\n\n    .rentamac-pricing .feature-info {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 16px;\n      height: 16px;\n      margin-inline-start: 2px;\n      flex-shrink: 0;\n    }\n\n    .rentamac-pricing .feature-info svg {\n      width: 14px;\n      height: 14px;\n      color: var(--text-muted);\n      transition: color 0.2s ease;\n    }\n\n    .rentamac-pricing .tip-owner .tooltip {\n      --tip-shift: 0px;\n      display: none;\n      position: absolute;\n      bottom: calc(100% + 8px);\n      left: 50%;\n      transform: translateX(calc(-50% + var(--tip-shift)));\n      width: 260px;\n      max-width: calc(100vw - 16px);\n      background: rgba(15, 15, 20, 0.98);\n      border: 1px solid var(--stroke-hover);\n      border-radius: 10px;\n      padding: 12px 14px;\n      font-size: 13px;\n      font-weight: 400;\n      line-height: 1.5;\n      color: var(--text-secondary);\n      text-align: start;\n      white-space: normal;\n      letter-spacing: normal;\n      text-transform: none;\n      z-index: 100;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n      pointer-events: none;\n      animation: rentamacTipIn 0.15s ease-out;\n    }\n\n    .rentamac-pricing .tip-owner .tooltip::after {\n      content: '';\n      position: absolute;\n      top: 100%;\n      left: calc(50% - var(--tip-shift));\n      transform: translateX(-50%);\n      border: 6px solid transparent;\n      border-top-color: rgba(15, 15, 20, 0.98);\n    }\n\n    .rentamac-pricing .tip-below .tooltip { bottom: auto; top: calc(100% + 8px); }\n    .rentamac-pricing .tip-below .tooltip::after { top: auto; bottom: 100%; border-top-color: transparent; border-bottom-color: rgba(15, 15, 20, 0.98); }\n\n    .rentamac-pricing .tip-owner.tip-open .tooltip,\n    .rentamac-pricing .tip-owner:focus-visible .tooltip { display: block; }\n    .rentamac-pricing .tip-owner.tip-open .feature-info svg,\n    .rentamac-pricing .tip-owner:focus-visible .feature-info svg { color: var(--accent-blue); }\n\n    \/* Hover only where there is a real pointer: on touch a tap toggles .tip-open instead *\/\n    @media (hover: hover) {\n      .rentamac-pricing .tip-owner:hover .tooltip { display: block; }\n      .rentamac-pricing .tip-owner:hover .feature-info svg { color: var(--accent-blue); }\n    }\n\n    @keyframes rentamacTipIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n\n    \/* Price Display *\/\n    .rentamac-pricing .price-section {\n      text-align: center;\n      padding: 10px 0;\n      border-bottom: 1px solid var(--stroke);\n      margin-bottom: 10px;\n    }\n\n    .rentamac-pricing .total-label {\n      font-size: 13px;\n      color: var(--text-muted);\n      margin-bottom: 8px;\n    }\n\n    .rentamac-pricing .total-price {\n      font-size: 52px;\n      font-weight: 800;\n      letter-spacing: -2px;\n      margin-bottom: 8px;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .price-breakdown {\n      font-size: 15px;\n      color: var(--text-secondary);\n    }\n\n    .rentamac-pricing .storage-addon-note {\n      font-size: 13px;\n      color: var(--text-muted);\n      margin-top: 8px;\n    }\n\n    \/* CTA Button *\/\n    .rentamac-pricing .cta-button {\n      width: 100%;\n      padding: 18px 24px;\n      font-size: 17px;\n      font-weight: 700;\n      border: none;\n      border-radius: 14px;\n      cursor: pointer;\n      background: var(--accent-blue);\n      color: white;\n      transition: all 0.2s ease;\n      box-shadow: var(--shadow-md), 0 0 30px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .cta-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-lg), 0 0 50px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .cta-button:active {\n      transform: translateY(0);\n    }\n\n    .rentamac-pricing .cta-button:disabled {\n      opacity: 0.65;\n      cursor: default;\n      transform: none;\n      box-shadow: none;\n    }\n\n    .rentamac-pricing .checkout-error {\n      margin-top: 12px;\n      font-size: 14px;\n      line-height: 1.4;\n      text-align: center;\n      color: #f87171;\n    }\n\n    \/* Help Text *\/\n    .rentamac-pricing .help-text {\n      text-align: center;\n      margin-top: 20px;\n      font-size: 14px;\n      color: var(--text-muted);\n    }\n\n    .rentamac-pricing .help-text a {\n      color: var(--accent-blue);\n      text-decoration: none;\n    }\n\n    .rentamac-pricing .help-text a:hover {\n      text-decoration: underline;\n    }\n\n    \/* Animations *\/\n    @keyframes rentamacFadeIn {\n      from { opacity: 0; transform: translateY(10px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    .rentamac-pricing .pricing-card {\n      animation: rentamacFadeIn 0.4s ease-out;\n    }\n\n    \/* Responsive *\/\n    @media (max-width: 600px) {\n      .rentamac-pricing .container {\n        padding: 32px 16px;\n      }\n\n      .rentamac-pricing .pricing-card {\n        padding: 24px 20px;\n      }\n\n      .rentamac-pricing .device-info {\n        flex-direction: column;\n        text-align: center;\n      }\n\n      .rentamac-pricing .device-specs {\n        justify-content: center;\n      }\n\n      .rentamac-pricing .cycle-tabs {\n        flex-wrap: wrap;\n      }\n\n      .rentamac-pricing .cycle-tab {\n        min-width: calc(33.333% - 6px);\n        padding: 12px 8px;\n      }\n\n      .rentamac-pricing .cycle-tab.unavailable::after {\n        white-space: normal;\n        width: 220px;\n        text-align: center;\n      }\n\n      .rentamac-pricing .storage-option.unavailable::after {\n        white-space: normal;\n        width: 220px;\n        text-align: center;\n      }\n\n      .rentamac-pricing .total-price {\n        font-size: 42px;\n      }\n    }\n\n    \/* Compact layout for short viewports (e.g. 1080x720) *\/\n    @media (max-height: 820px) {\n      .rentamac-pricing .container {\n        padding-top: 0;\n      }\n\n      .rentamac-pricing .header {\n        margin-bottom: 2px;\n      }\n\n      .rentamac-pricing .header h1 {\n        font-size: clamp(24px, 4vw, 36px);\n        margin-bottom: 2px;\n      }\n\n      .rentamac-pricing .pricing-card {\n        padding: 20px 28px;\n      }\n\n      .rentamac-pricing .device-info {\n        padding-bottom: 6px;\n        margin-bottom: 6px;\n      }\n\n      .rentamac-pricing .cycle-section {\n        margin-bottom: 2px;\n      }\n\n      .rentamac-pricing .cycle-tab {\n        padding: 10px 10px;\n      }\n\n      .rentamac-pricing .storage-section {\n        margin-bottom: 2px;\n      }\n\n      .rentamac-pricing .storage-option {\n        padding: 10px;\n      }\n\n      .rentamac-pricing .features-section {\n        margin-bottom: 2px;\n        padding-top: 6px;\n      }\n\n      .rentamac-pricing .price-section {\n        padding: 6px 0;\n        margin-bottom: 6px;\n      }\n\n      .rentamac-pricing .total-price {\n        font-size: 40px;\n        margin-bottom: 4px;\n      }\n\n      .rentamac-pricing .total-label {\n        margin-bottom: 4px;\n      }\n\n      .rentamac-pricing .cta-button {\n        padding: 14px 24px;\n      }\n    }\n\n    \/* No storage available message *\/\n    .rentamac-pricing .no-storage-message {\n      background: rgba(249, 115, 22, 0.1);\n      border: 1px solid rgba(249, 115, 22, 0.2);\n      border-radius: 10px;\n      padding: 12px 16px;\n      text-align: center;\n      color: var(--accent-orange);\n      font-size: 13px;\n      font-weight: 500;\n    }\n\n    \/* Availability Dialog *\/\n    .rentamac-pricing .availability-overlay {\n      position: fixed;\n      inset: 0;\n      background: rgba(0, 0, 0, 0.7);\n      backdrop-filter: blur(8px);\n      z-index: 1000;\n      animation: rentamacFadeIn 0.25s ease-out forwards;\n    }\n\n    .rentamac-pricing .availability-dialog {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: var(--bg);\n      border: 1px solid var(--stroke);\n      border-radius: 20px;\n      padding: 32px;\n      max-width: 480px;\n      width: calc(100% - 48px);\n      z-index: 1010;\n      animation: rentamacDialogSlide 0.3s ease-out forwards;\n    }\n\n    @keyframes rentamacDialogSlide {\n      from { opacity: 0; transform: translate(-50%, calc(-50% - 20px)); }\n      to { opacity: 1; transform: translate(-50%, -50%); }\n    }\n\n    .rentamac-pricing .availability-dialog__header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n    }\n\n    .rentamac-pricing .availability-dialog__title {\n      font-size: 22px;\n      font-weight: 700;\n      color: var(--text);\n      margin: 0;\n    }\n\n    .rentamac-pricing .availability-dialog__close {\n      background: transparent;\n      border: none;\n      color: var(--text-secondary);\n      font-size: 24px;\n      cursor: pointer;\n      transition: color 0.2s ease;\n      line-height: 1;\n    }\n\n    .rentamac-pricing .availability-dialog__close:hover {\n      color: var(--text);\n    }\n\n    .rentamac-pricing .availability-dialog p {\n      color: var(--text-secondary);\n      line-height: 1.6;\n      margin: 0 0 20px;\n    }\n\n    .rentamac-pricing .availability-form {\n      display: flex;\n      gap: 12px;\n      flex-wrap: wrap;\n    }\n\n    .rentamac-pricing .availability-form input[type=\"email\"] {\n      flex: 1;\n      min-width: 200px;\n      padding: 14px 16px;\n      border-radius: 12px;\n      border: 1px solid var(--stroke);\n      background: rgba(0, 0, 0, 0.3);\n      color: var(--text);\n      font-size: 15px;\n      outline: none;\n      transition: border-color 0.2s ease;\n    }\n\n    .rentamac-pricing .availability-form input[type=\"email\"]:focus {\n      border-color: var(--accent-blue);\n    }\n\n    .rentamac-pricing .availability-form button {\n      padding: 14px 24px;\n      border-radius: 12px;\n      border: none;\n      background: var(--accent-blue);\n      color: white;\n      font-weight: 600;\n      font-size: 15px;\n      cursor: pointer;\n      transition: transform 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease;\n    }\n\n    .rentamac-pricing .availability-form button:hover {\n      transform: translateY(-1px);\n      box-shadow: 0 0 20px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .availability-form button:disabled {\n      opacity: 0.6;\n      cursor: not-allowed;\n      transform: none;\n    }\n\n    .rentamac-pricing .availability-feedback {\n      width: 100%;\n      margin-top: 12px;\n      font-size: 14px;\n      min-height: 20px;\n    }\n\n    .rentamac-pricing .availability-feedback.success { color: var(--accent-green); }\n    .rentamac-pricing .availability-feedback.error { color: #ef4444; }\n    .rentamac-pricing .availability-feedback.info { color: var(--text-muted); }\n\n    .rentamac-pricing .availability-disclaimer {\n      font-size: 12px;\n      color: var(--text-muted);\n      margin-top: 16px;\n    }\n\n    .rentamac-pricing .is-hidden { display: none !important; }\n\n    .rentamac-pricing .sr-only {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      border: 0;\n    }\n\n    \/* Out of stock button state *\/\n    .rentamac-pricing .cta-button.out-of-stock {\n      background: rgba(255, 255, 255, 0.1);\n      box-shadow: none;\n    }\n\n    .rentamac-pricing .cta-button.out-of-stock:hover {\n      transform: none;\n      box-shadow: none;\n    }\n\n    \/* Cross-location availability notices (rendered from JS, hidden until the status API lands).\n       Same blue treatment as the active tab \/ CTA so they read as part of the card. *\/\n    .rentamac-pricing .availability-note {\n      display: flex;\n      align-items: flex-start;\n      gap: 10px;\n      margin-top: 12px;\n      padding: 12px 14px;\n      border: 1px solid rgba(59, 130, 246, 0.4);\n      border-radius: 12px;\n      background: rgba(59, 130, 246, 0.1);\n      color: var(--text);\n      font-size: 13px;\n      font-weight: 500;\n      line-height: 1.5;\n      text-align: start;\n    }\n\n    .rentamac-pricing .availability-note.is-warning {\n      border-color: rgba(59, 130, 246, 0.55);\n      background: rgba(59, 130, 246, 0.14);\n    }\n\n    .rentamac-pricing .availability-note__icon {\n      flex: 0 0 auto;\n      width: 16px;\n      height: 16px;\n      margin-top: 2px;\n      color: #93c5fd;\n    }\n\n    .rentamac-pricing .availability-note a,\n    .rentamac-pricing .cta-alt-location a,\n    .rentamac-pricing .availability-alt a {\n      color: #93c5fd;\n      font-weight: 600;\n      text-decoration: underline;\n      text-underline-offset: 2px;\n      cursor: pointer;\n      transition: color 0.2s ease;\n    }\n\n    .rentamac-pricing .availability-note__body {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      min-width: 0;\n    }\n\n    .rentamac-pricing .availability-note__actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n    }\n\n    .rentamac-pricing .availability-note__actions button {\n      max-width: 100%;\n      margin: 0;\n      padding: 7px 12px;\n      border: none;\n      border-radius: 10px;\n      background: var(--accent-blue);\n      color: #fff;\n      font: inherit;\n      font-size: 13px;\n      font-weight: 600;\n      line-height: 1.3;\n      text-align: center;\n      cursor: pointer;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n\n    .rentamac-pricing .availability-note__actions button:hover {\n      transform: translateY(-1px);\n      box-shadow: 0 0 20px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .availability-note__actions button:focus-visible {\n      outline: 2px solid #93c5fd;\n      outline-offset: 2px;\n    }\n\n    \/* Sold-out banner: one tappable row per alternative (Mac, region, price) *\/\n    .rentamac-pricing .availability-note__body { flex: 1; }\n    .rentamac-pricing .alt-lead { display: flex; align-items: flex-start; gap: 10px; }\n    .rentamac-pricing .alt-rows { display: flex; flex-direction: column; gap: 6px; }\n    .rentamac-pricing .alt-row {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      width: 100%;\n      margin: 0;\n      padding: 10px 12px;\n      border: 1px solid var(--stroke-hover);\n      border-radius: 10px;\n      background: rgba(255, 255, 255, 0.05);\n      color: var(--text);\n      font: inherit;\n      font-size: 13px;\n      line-height: 1.3;\n      text-align: start;\n      white-space: normal;\n      cursor: pointer;\n      transition: border-color 0.2s ease;\n    }\n    .rentamac-pricing .alt-row:hover { border-color: var(--accent-blue); }\n    .rentamac-pricing .alt-row:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }\n    .rentamac-pricing .alt-row__what { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n    .rentamac-pricing .alt-row__what b { font-weight: 700; }\n    .rentamac-pricing .alt-row__what span { font-size: 12px; color: var(--text-secondary); }\n    .rentamac-pricing .alt-row__price { font-weight: 700; white-space: nowrap; }\n    .rentamac-pricing .alt-row__chev { flex: none; width: 14px; height: 14px; color: var(--text-secondary); }\n    [dir=\"rtl\"] .rentamac-pricing .alt-row__chev { transform: scaleX(-1); }\n\n    .rentamac-pricing .availability-note a:hover,\n    .rentamac-pricing .cta-alt-location a:hover,\n    .rentamac-pricing .availability-alt a:hover {\n      color: #fff;\n    }\n\n    .rentamac-pricing .cta-alt-location {\n      margin-top: 10px;\n      text-align: center;\n      font-size: 13px;\n      color: var(--text-secondary);\n    }\n\n    .rentamac-pricing .availability-alt {\n      display: flex;\n      flex-wrap: wrap;\n      align-items: center;\n      justify-content: space-between;\n      gap: 10px 12px;\n      margin: 0 0 20px;\n      padding: 12px 14px;\n      border: 1px solid rgba(59, 130, 246, 0.4);\n      border-radius: 12px;\n      background: rgba(59, 130, 246, 0.1);\n      color: var(--text);\n      font-size: 14px;\n      font-weight: 500;\n      line-height: 1.5;\n    }\n\n    .rentamac-pricing .availability-alt__actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n    }\n\n    .rentamac-pricing .availability-alt button {\n      padding: 8px 14px;\n      border-radius: 10px;\n      border: none;\n      background: var(--accent-blue);\n      color: #fff;\n      font-weight: 600;\n      font-size: 13px;\n      white-space: nowrap;\n      cursor: pointer;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n\n    .rentamac-pricing .availability-alt button:hover {\n      transform: translateY(-1px);\n      box-shadow: 0 0 20px var(--accent-blue-glow);\n    }\n\n    .rentamac-pricing .availability-note[hidden],\n    .rentamac-pricing .cta-alt-location[hidden],\n    .rentamac-pricing .availability-alt[hidden] {\n      display: none !important;\n    }\n\n\n    \/* Purchase Info Dropdown *\/\n    .rentamac-pricing .purchase-info {\n      margin-top: 32px;\n      text-align: center;\n    }\n\n    .rentamac-pricing .purchase-dropdown {\n      max-width: 480px;\n      margin: 0 auto;\n    }\n\n    .rentamac-pricing .purchase-dropdown-trigger {\n      width: 100%;\n      background: rgba(255, 255, 255, 0.06);\n      border: 1px solid var(--stroke);\n      border-radius: 12px;\n      padding: 16px 20px;\n      color: var(--text);\n      font-size: 15px;\n      font-weight: 600;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.2s ease;\n      position: relative;\n    }\n\n    .rentamac-pricing .purchase-dropdown-trigger:hover {\n      background: rgba(255, 255, 255, 0.08);\n      border-color: var(--stroke-hover);\n    }\n\n    .rentamac-pricing .purchase-dropdown-icon {\n      position: absolute;\n      right: 20px;\n      opacity: 0.6;\n      transition: transform 0.2s ease;\n    }\n\n    .rentamac-pricing .purchase-dropdown-trigger[aria-expanded=\"true\"] .purchase-dropdown-icon {\n      transform: rotate(180deg);\n    }\n\n    .rentamac-pricing .purchase-dropdown-content {\n      overflow: hidden;\n      max-height: 0;\n      opacity: 0;\n      transition: all 0.3s ease;\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid var(--stroke);\n      border-top: none;\n      border-radius: 0 0 12px 12px;\n      margin-top: -1px;\n    }\n\n    .rentamac-pricing .purchase-dropdown-content.expanded {\n      max-height: 200px;\n      opacity: 1;\n      padding: 16px 20px;\n    }\n\n    .rentamac-pricing .purchase-dropdown-content p {\n      font-size: 14px;\n      color: var(--text-secondary);\n      margin: 0;\n      line-height: 1.6;\n      text-align: center;\n    }\n\n    \/* Help Section *\/\n    .rentamac-pricing .help-section {\n      margin-top: 64px;\n      text-align: center;\n    }\n\n    .rentamac-pricing .help-header {\n      margin-bottom: 40px;\n    }\n\n    .rentamac-pricing .help-header h3 {\n      font-size: 28px;\n      font-weight: 700;\n      margin: 0 0 8px;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .help-subtitle {\n      font-size: 16px;\n      color: var(--text-secondary);\n      margin: 0;\n    }\n\n    .rentamac-pricing .help-cards {\n      display: grid;\n      grid-template-columns: repeat(2, 1fr);\n      gap: 24px;\n      max-width: 720px;\n      margin: 0 auto 48px;\n    }\n\n    @media (max-width: 600px) {\n      .rentamac-pricing .help-cards {\n        grid-template-columns: 1fr;\n        gap: 20px;\n      }\n    }\n\n    .rentamac-pricing .help-card {\n      background: var(--bg);\n      border: 1px solid var(--stroke);\n      border-radius: 20px;\n      padding: 32px 24px;\n      text-align: center;\n      transition: all 0.3s ease;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .rentamac-pricing .help-card::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      height: 3px;\n      background: var(--gradient-primary);\n      opacity: 0;\n      transition: opacity 0.3s ease;\n    }\n\n    .rentamac-pricing .help-card:hover {\n      transform: translateY(-4px);\n      border-color: var(--stroke-hover);\n      box-shadow: var(--shadow-lg);\n    }\n\n    .rentamac-pricing .help-card:hover::before {\n      opacity: 1;\n    }\n\n    .rentamac-pricing .help-icon {\n      width: 56px;\n      height: 56px;\n      margin: 0 auto 20px;\n      background: rgba(255, 255, 255, 0.06);\n      border-radius: 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--text);\n      transition: all 0.3s ease;\n    }\n\n    .rentamac-pricing .help-card:hover .help-icon {\n      background: rgba(255, 255, 255, 0.1);\n      transform: scale(1.05);\n    }\n\n    .rentamac-pricing .help-card h4 {\n      font-size: 20px;\n      font-weight: 700;\n      margin: 0 0 12px;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .help-card p {\n      color: var(--text-secondary);\n      margin: 0 0 24px;\n      font-size: 14px;\n      line-height: 1.5;\n    }\n\n    .rentamac-pricing .help-btn {\n      border: none;\n      border-radius: 12px;\n      padding: 12px 24px;\n      font-weight: 600;\n      cursor: pointer;\n      font-size: 14px;\n      transition: all 0.2s ease;\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .rentamac-pricing .help-btn.secondary {\n      background: rgba(255, 255, 255, 0.08);\n      color: var(--text);\n      border: 1px solid var(--stroke);\n    }\n\n    .rentamac-pricing .help-btn.secondary:hover {\n      background: rgba(255, 255, 255, 0.12);\n      transform: translateY(-2px);\n    }\n\n    .rentamac-pricing .help-footer {\n      margin-top: 48px;\n      padding-top: 40px;\n      border-top: 1px solid var(--stroke);\n    }\n\n    .rentamac-pricing .help-footer-text {\n      font-size: 16px;\n      color: var(--text-secondary);\n      margin: 0 0 20px;\n    }\n\n    .rentamac-pricing .help-portal-btn {\n      background: rgba(255, 255, 255, 0.06);\n      color: var(--text);\n      border: 1px solid var(--stroke);\n      border-radius: 14px;\n      padding: 14px 24px;\n      font-weight: 600;\n      font-size: 15px;\n      cursor: pointer;\n      transition: all 0.2s ease;\n      display: inline-flex;\n      align-items: center;\n      gap: 10px;\n    }\n\n    .rentamac-pricing .help-portal-btn:hover {\n      background: rgba(255, 255, 255, 0.1);\n      border-color: var(--stroke-hover);\n      transform: translateY(-2px);\n    }\n\n    \/* Enterprise Section *\/\n    .rentamac-pricing .enterprise-section {\n      margin-top: 8px;\n    }\n\n    .rentamac-pricing .enterprise-card {\n      background: var(--bg);\n      border: 1px solid var(--stroke);\n      border-radius: 24px;\n      padding: 28px;\n      max-width: 520px;\n      margin: 0 auto;\n    }\n\n    .rentamac-pricing .enterprise-card .card-header {\n      text-align: center;\n      margin-bottom: 4px;\n      padding-bottom: 3px;\n      border-bottom: 1px solid var(--stroke);\n    }\n\n    .rentamac-pricing .enterprise-card .card-title {\n      font-size: 24px;\n      font-weight: 700;\n      margin: 0 0 8px;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .enterprise-card .card-subtitle {\n      font-size: 14px;\n      color: var(--text-secondary);\n      margin: 0;\n    }\n\n    .rentamac-pricing .enterprise-benefits {\n      display: flex;\n      gap: 4px;\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .benefit-item {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 12px;\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid var(--stroke);\n      border-radius: 10px;\n    }\n\n    .rentamac-pricing .benefit-icon {\n      width: 32px;\n      height: 32px;\n      background: rgba(249, 115, 22, 0.15);\n      border-radius: 8px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--accent-orange);\n      flex-shrink: 0;\n    }\n\n    .rentamac-pricing .benefit-item h4 {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--text);\n      margin: 0;\n    }\n\n    \/* Sliders *\/\n    .rentamac-pricing .slider-group {\n      margin-bottom: 4px;\n    }\n\n    .rentamac-pricing .slider-label-row {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 3px;\n    }\n\n    .rentamac-pricing .slider-label {\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .slider-value {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .rentamac-pricing .slider-value-number {\n      background: rgba(249, 115, 22, 0.12);\n      border: 1px solid rgba(249, 115, 22, 0.25);\n      border-radius: 8px;\n      padding: 4px 12px;\n      font-size: 16px;\n      font-weight: 700;\n      color: var(--accent-orange);\n      min-width: 40px;\n      text-align: center;\n    }\n\n    .rentamac-pricing .slider-discount-badge {\n      background: rgba(249, 115, 22, 0.15);\n      border: 1px solid rgba(249, 115, 22, 0.3);\n      border-radius: 12px;\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 700;\n      color: var(--accent-orange);\n      opacity: 0;\n      transform: scale(0.9);\n      transition: all 0.3s ease;\n    }\n\n    .rentamac-pricing .slider-discount-badge.active {\n      opacity: 1;\n      transform: scale(1);\n    }\n\n    .rentamac-pricing .slider-discount-badge.bounce {\n      animation: rentamacDiscountBounce 0.6s ease;\n    }\n\n    .rentamac-pricing .slider-value-number.bounce {\n      animation: rentamacNumberBounce 0.5s ease;\n    }\n\n    @keyframes rentamacDiscountBounce {\n      0%, 100% { transform: scale(1); }\n      25% { transform: scale(1.2); }\n      50% { transform: scale(0.95); }\n      75% { transform: scale(1.1); }\n    }\n\n    @keyframes rentamacNumberBounce {\n      0%, 100% { transform: scale(1); }\n      30% { transform: scale(1.15); }\n      60% { transform: scale(0.98); }\n    }\n\n    .rentamac-pricing .enterprise-slider {\n      -webkit-appearance: none;\n      appearance: none;\n      width: 100%;\n      height: 6px;\n      border-radius: 10px;\n      background: rgba(255, 255, 255, 0.08);\n      outline: none;\n      cursor: pointer;\n    }\n\n    .rentamac-pricing .enterprise-slider::-webkit-slider-thumb {\n      -webkit-appearance: none;\n      appearance: none;\n      width: 20px;\n      height: 20px;\n      border-radius: 50%;\n      background: var(--accent-orange);\n      cursor: grab;\n      box-shadow: 0 2px 12px rgba(249, 115, 22, 0.4);\n      transition: all 0.2s ease;\n    }\n\n    .rentamac-pricing .enterprise-slider::-webkit-slider-thumb:hover {\n      transform: scale(1.2);\n      box-shadow: 0 4px 16px rgba(249, 115, 22, 0.6);\n    }\n\n    .rentamac-pricing .enterprise-slider::-moz-range-thumb {\n      width: 20px;\n      height: 20px;\n      border-radius: 50%;\n      background: var(--accent-orange);\n      cursor: grab;\n      border: none;\n      box-shadow: 0 2px 12px rgba(249, 115, 22, 0.4);\n    }\n\n    .rentamac-pricing .slider-range-labels {\n      display: flex;\n      justify-content: space-between;\n      margin-top: 8px;\n      font-size: 12px;\n      color: var(--text-muted);\n    }\n\n    \/* Enterprise pricing display *\/\n    .rentamac-pricing .enterprise-pricing {\n      text-align: center;\n      padding: 20px 0;\n      border-top: 1px solid var(--stroke);\n      margin-top: 8px;\n    }\n\n    .rentamac-pricing .non-cumulative-notice {\n      background: rgba(34, 197, 94, 0.08);\n      border: 1px solid rgba(34, 197, 94, 0.2);\n      border-radius: 10px;\n      padding: 10px 16px;\n      margin-bottom: 16px;\n      font-size: 13px;\n      color: var(--accent-green);\n      font-weight: 600;\n      display: none;\n    }\n\n    .rentamac-pricing .enterprise-pricing .price-amount {\n      font-size: 42px;\n      font-weight: 800;\n      color: var(--text);\n      letter-spacing: -1px;\n    }\n\n    .rentamac-pricing .enterprise-pricing .price-label {\n      font-size: 16px;\n      color: var(--text-secondary);\n      margin-left: 4px;\n    }\n\n    .rentamac-pricing .enterprise-pricing .discount-text {\n      font-size: 14px;\n      color: var(--text-muted);\n      margin: 8px 0 4px;\n    }\n\n    .rentamac-pricing .enterprise-pricing .discount-text.active {\n      color: var(--accent-orange);\n      font-weight: 700;\n    }\n\n    .rentamac-pricing .enterprise-pricing .price-breakdown {\n      font-size: 13px;\n      color: var(--text-muted);\n    }\n\n    .rentamac-pricing .enterprise-cta {\n      margin-top: 20px;\n      text-align: center;\n    }\n\n    .rentamac-pricing .enterprise-btn {\n      width: 100%;\n      padding: 16px 24px;\n      font-size: 16px;\n      font-weight: 700;\n      border: none;\n      border-radius: 12px;\n      cursor: pointer;\n      background: linear-gradient(135deg, var(--accent-orange), #ea580c);\n      color: white;\n      transition: all 0.2s ease;\n      box-shadow: 0 8px 24px rgba(249, 115, 22, 0.3);\n    }\n\n    .rentamac-pricing .enterprise-btn:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 12px 32px rgba(249, 115, 22, 0.4);\n    }\n\n    .rentamac-pricing .enterprise-contact {\n      margin-top: 12px;\n      font-size: 14px;\n      color: var(--text-muted);\n    }\n\n    .rentamac-pricing .enterprise-contact a {\n      color: var(--accent-orange);\n      text-decoration: none;\n    }\n\n    .rentamac-pricing .enterprise-contact a:hover {\n      text-decoration: underline;\n    }\n\n    @media (max-width: 500px) {\n      .rentamac-pricing .enterprise-benefits {\n        flex-direction: column;\n      }\n    }\n\n    \/* Google Reviews Section *\/\n    .rentamac-pricing .reviews-section {\n      margin-top: 48px;\n      padding: 20px 0;\n      \/* Break out of container to wider width *\/\n      width: 90vw;\n      max-width: 1000px;\n      position: relative;\n      left: 50%;\n      transform: translateX(-50%);\n    }\n\n    .rentamac-pricing .reviews-header {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 12px;\n      margin-bottom: 20px;\n    }\n\n    .rentamac-pricing .google-icon-small {\n      width: 24px;\n      height: 24px;\n      flex-shrink: 0;\n    }\n\n    .rentamac-pricing .reviews-header .rating-stars {\n      display: flex;\n      gap: 2px;\n    }\n\n    .rentamac-pricing .reviews-header .rating-stars svg {\n      width: 18px;\n      height: 18px;\n    }\n\n    .rentamac-pricing .reviews-meta {\n      font-size: 15px;\n      color: var(--text-secondary);\n    }\n\n    .rentamac-pricing .reviews-meta .rating-number {\n      font-weight: 700;\n      color: var(--text);\n    }\n\n    .rentamac-pricing .reviews-meta a {\n      color: var(--text-secondary);\n      text-decoration: none;\n    }\n\n    .rentamac-pricing .reviews-meta a:hover {\n      color: var(--text);\n    }\n\n    \/* Reviews Carousel *\/\n    .rentamac-pricing .reviews-carousel-container {\n      position: relative;\n      overflow: hidden;\n      -webkit-mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);\n      mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);\n    }\n\n    .rentamac-pricing .reviews-carousel {\n      display: flex;\n      gap: 20px;\n      animation: rentamacScrollReviews 60s linear infinite;\n      width: max-content;\n    }\n\n    .rentamac-pricing .reviews-carousel:hover {\n      animation-play-state: paused;\n    }\n\n    @keyframes rentamacScrollReviews {\n      0% {\n        transform: translateX(0);\n      }\n      100% {\n        transform: translateX(-50%);\n      }\n    }\n\n    .rentamac-pricing .review-card {\n      flex: 0 0 300px;\n      background: var(--bg);\n      border: 1px solid var(--stroke);\n      border-radius: 16px;\n      padding: 24px;\n      min-height: 180px;\n      display: flex;\n      flex-direction: column;\n    }\n\n    .rentamac-pricing .review-header {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      margin-bottom: 12px;\n    }\n\n    .rentamac-pricing .reviewer-avatar {\n      width: 40px;\n      height: 40px;\n      border-radius: 50%;\n      background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple));\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 16px;\n      font-weight: 700;\n      color: white;\n      flex-shrink: 0;\n    }\n\n    .rentamac-pricing .reviewer-avatar img {\n      width: 100%;\n      height: 100%;\n      border-radius: 50%;\n      object-fit: cover;\n    }\n\n    .rentamac-pricing .reviewer-info {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .rentamac-pricing .reviewer-name {\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--text);\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .rentamac-pricing .review-date {\n      font-size: 12px;\n      color: var(--text-muted);\n    }\n\n    .rentamac-pricing .review-stars {\n      display: flex;\n      gap: 2px;\n      margin-bottom: 12px;\n    }\n\n    .rentamac-pricing .review-stars svg {\n      width: 16px;\n      height: 16px;\n      color: #FBBC04;\n    }\n\n    .rentamac-pricing .review-text {\n      font-size: 14px;\n      line-height: 1.6;\n      color: var(--text-secondary);\n      flex: 1;\n      overflow: hidden;\n      display: -webkit-box;\n      -webkit-line-clamp: 5;\n      -webkit-box-orient: vertical;\n    }\n\n    .rentamac-pricing .review-google-icon {\n      margin-top: 12px;\n      opacity: 0.5;\n    }\n\n    .rentamac-pricing .review-google-icon svg {\n      height: 16px;\n      width: auto;\n    }\n\n    @media (max-width: 600px) {\n      .rentamac-pricing .review-card {\n        flex: 0 0 260px;\n      }\n    }\n\n    \/* ============================================\n       Skeleton Loaders\n       Shown while availability + reviews load, then\n       swapped for real cards by the render functions.\n       ============================================ *\/\n    @keyframes rentamacSkeletonShimmer {\n      0%   { background-position: 200% 0; }\n      100% { background-position: -200% 0; }\n    }\n\n    .rentamac-pricing .skeleton-bar {\n      background: linear-gradient(\n        90deg,\n        rgba(255, 255, 255, 0.04) 25%,\n        rgba(255, 255, 255, 0.10) 37%,\n        rgba(255, 255, 255, 0.04) 63%\n      );\n      background-size: 200% 100%;\n      animation: rentamacSkeletonShimmer 1.4s ease-in-out infinite;\n      border-radius: 6px;\n    }\n\n    .rentamac-pricing .cycle-tab.is-skeleton,\n    .rentamac-pricing .storage-option.is-skeleton,\n    .rentamac-pricing .review-card.is-skeleton {\n      cursor: default;\n      pointer-events: none;\n    }\n\n    .rentamac-pricing .cycle-tab.is-skeleton:hover,\n    .rentamac-pricing .storage-option.is-skeleton:hover {\n      background: rgba(255, 255, 255, 0.04);\n      border-color: var(--stroke);\n    }\n\n    \/* Don't auto-scroll the carousel while it's still showing skeletons *\/\n    .rentamac-pricing .reviews-carousel:has(.review-card.is-skeleton) {\n      animation: none;\n    }\n\n    @media (prefers-reduced-motion: reduce) {\n      .rentamac-pricing .skeleton-bar {\n        animation: none;\n      }\n    }\n    .loc-flag{width:18px;height:12px;border-radius:2px;vertical-align:-1px;margin-right:2px;display:inline-block;flex:none}\n\n    \/* ============================================\n       Redesign 2026-10: card in two columns, total + CTA + Included\n       in a sticky right column. One column below 1060px.\n       ============================================ *\/\n    .rentamac-pricing .container.wide { max-width: 1040px; padding: 24px 24px 44px; }\n    .rentamac-pricing .container.wide .header { margin-bottom: 20px; }\n    .rentamac-pricing .container.wide .header h1 { margin-bottom: 0; }\n    .rentamac-pricing .pricing-card.two-col {\n      display: grid;\n      grid-template-columns: minmax(0, 1.55fr) minmax(290px, 1fr);\n      column-gap: 38px;\n      align-items: start;\n      padding: 30px 34px;\n    }\n    .rentamac-pricing .two-col .pc-left { display: grid; gap: 20px; align-content: start; min-width: 0; }\n    .rentamac-pricing .two-col .pc-right { min-width: 0; align-self: stretch; border-left: 1px solid var(--stroke); padding-left: 34px; }\n    .rentamac-pricing .two-col .pc-sticky { position: sticky; top: 24px; }\n    .rentamac-pricing .two-col .device-info { margin-bottom: 0; }\n    .rentamac-pricing .two-col .location-section,\n    .rentamac-pricing .two-col .cycle-section,\n    .rentamac-pricing .two-col .storage-section { margin: 0; }\n    .rentamac-pricing .two-col .section-title { margin-bottom: 8px; }\n    .rentamac-pricing .two-col .cycle-tabs { gap: 8px; }\n    .rentamac-pricing .two-col .cycle-tab { padding: 14px 10px 12px; }\n    .rentamac-pricing .two-col .storage-options { gap: 8px; }\n    .rentamac-pricing .two-col .storage-option { padding: 14px 12px; }\n    .rentamac-pricing .two-col .price-section { padding: 6px 0 18px; margin-bottom: 16px; }\n    .rentamac-pricing .two-col .total-label { margin-bottom: 8px; }\n    .rentamac-pricing .two-col .total-price { font-size: 50px; margin-bottom: 8px; }\n    .rentamac-pricing .two-col .cta-button { padding: 17px 24px; }\n    .rentamac-pricing .renew-line { margin: 12px 0 0; font-size: 12.5px; color: var(--text-muted); text-align: center; }\n    .rentamac-pricing .two-col .features-section { margin: 22px 0 0; padding-top: 18px; border-top: 1px solid var(--stroke); }\n    .rentamac-pricing .container.wide .purchase-info { margin-top: 40px; }\n\n    \/* CSS tooltips of unavailable tabs and tiles: display:none while hidden so they never widen the page,\n       and pinned to the card edge on phones instead of centred over an edge tile *\/\n    .rentamac-pricing .cycle-tab.unavailable::after,\n    .rentamac-pricing .cycle-tab.unavailable::before,\n    .rentamac-pricing .storage-option.unavailable::after,\n    .rentamac-pricing .storage-option.unavailable::before,\n    .rentamac-pricing .storage-option.disabled::after,\n    .rentamac-pricing .storage-option.disabled::before { display: none; }\n    .rentamac-pricing .cycle-tab.unavailable:hover::after,\n    .rentamac-pricing .cycle-tab.unavailable:hover::before,\n    .rentamac-pricing .storage-option.unavailable:hover::after,\n    .rentamac-pricing .storage-option.unavailable:hover::before,\n    .rentamac-pricing .storage-option.disabled:hover::after,\n    .rentamac-pricing .storage-option.disabled:hover::before { display: block; }\n    @media (max-width: 600px) {\n      .rentamac-pricing .cycle-tab.unavailable:first-child::after,\n      .rentamac-pricing .storage-option:first-child::after { left: 0; transform: none; }\n      .rentamac-pricing .cycle-tab.unavailable:last-child::after,\n      .rentamac-pricing .storage-option:nth-child(2)::after { left: auto; right: 0; transform: none; }\n    }\n\n    \/* Room above each row of billing tabs for the Popular \/ Save pills *\/\n    .rentamac-pricing .two-col #cycleTabs { padding-top: 6px; row-gap: 16px; }\n\n    \/* Spec badges under the Mac tiles; the chip badge follows the selected model *\/\n    .rentamac-pricing .two-col .device-specs { margin-top: -4px; justify-content: center; }\n\n    \/* Included as a spec sheet; each term is dotted-underlined and has its tooltip *\/\n    .rentamac-pricing .inc-spec { display: grid; margin: 0; }\n    .rentamac-pricing .inc-spec > div { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: 12px; padding: 9px 0; border-bottom: 1px dashed var(--stroke); }\n    .rentamac-pricing .inc-spec > div:last-child { border-bottom: 0; }\n    .rentamac-pricing .inc-spec dt { font-size: 11px; font-weight: 600; letter-spacing: 0.6px; text-transform: uppercase; color: var(--text-muted); padding-top: 2px; }\n    .rentamac-pricing .inc-spec dd { margin: 0; font-size: 13.5px; color: var(--text); line-height: 1.45; }\n    .rentamac-pricing .inc-term { position: relative; display: inline-block; max-width: 100%; text-decoration: underline dotted rgba(255, 255, 255, 0.35); text-underline-offset: 3px; transition: color 0.2s ease; }\n    .rentamac-pricing .inc-term.tip-open,\n    .rentamac-pricing .inc-term:focus-visible { color: #93c5fd; text-decoration-color: #93c5fd; }\n    @media (hover: hover) {\n      .rentamac-pricing .inc-term:hover { color: #93c5fd; text-decoration-color: #93c5fd; }\n    }\n    .rentamac-pricing .inc-sep { color: var(--text-muted); }\n\n    \/* Mobile CTA bar: the choices and Buy Plan pinned to the bottom of the screen in the one-column\n       layout, while the real button is off screen (initMobileCtaBar) *\/\n    .rentamac-pricing .mcb { display: none; }\n    @media (max-width: 1060px) {\n      .rentamac-pricing .mcb {\n        display: block;\n        position: fixed;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        z-index: 990;\n        transform: translateY(calc(100% + 30px));\n        visibility: hidden;\n        transition: transform 0.28s ease, visibility 0s linear 0.28s;\n      }\n      .rentamac-pricing .mcb.is-on { transform: none; visibility: visible; transition: transform 0.28s ease; }\n    }\n    @media (prefers-reduced-motion: reduce) {\n      .rentamac-pricing .mcb, .rentamac-pricing .mcb.is-on { transition: none; }\n    }\n    .rentamac-pricing .mcb-inner {\n      padding: 10px 16px calc(12px + env(safe-area-inset-bottom));\n      background: rgba(10, 10, 15, 0.88);\n      -webkit-backdrop-filter: blur(16px) saturate(140%);\n      backdrop-filter: blur(16px) saturate(140%);\n      border-top: 1px solid var(--stroke-hover);\n    }\n    \/* Above phone width it is as wide as the choices in the card, so the button never stretches across the screen *\/\n    @media (min-width: 601px) {\n      .rentamac-pricing .mcb-content { max-width: var(--rp-mcb-w, 480px); margin: 0 auto; }\n    }\n    .rentamac-pricing .mcb-summary { margin-bottom: 8px; font-size: 12px; line-height: 1.4; text-align: center; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .rentamac-pricing .mcb-btn {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      font: inherit;\n      font-size: 16px;\n      font-weight: 700;\n      line-height: 1.2;\n      color: #fff;\n      background: var(--accent-blue);\n      border: 0;\n      border-radius: 12px;\n      padding: 15px 18px;\n      white-space: nowrap;\n      cursor: pointer;\n      box-shadow: 0 0 24px var(--accent-blue-glow);\n      transition: opacity 0.2s ease; \/* the theme animates every button property *\/\n    }\n    .rentamac-pricing .mcb-btn:disabled { opacity: 0.65; cursor: default; box-shadow: none; }\n    .rentamac-pricing .mcb-btn:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }\n    .rentamac-pricing .mcb-label { overflow: hidden; text-overflow: ellipsis; }\n    .rentamac-pricing .mcb-btn-price::before { content: \"\\00a0\u00b7\\00a0\"; }\n    \/* The Crisp chat and cookie bubbles move up while the bar is showing *\/\n    html.rp-mcb-lift #crisp-chatbox [data-maximized=\"false\"] { bottom: calc(var(--rp-mcb-h, 0px) + 14px) !important; transition: bottom 0.28s ease !important; }\n    html.rp-mcb-lift .ram-cc-revisit { bottom: calc(var(--rp-mcb-h, 0px) + 15px) !important; transition: bottom 0.28s ease; }\n\n    \/* Translated labels must fit their tiles (the theme sets white-space: nowrap on every button) *\/\n    .rentamac-pricing #locationTabs .cycle-price { white-space: normal; text-wrap: balance; } \/* country.usa keeps \"\u00b7\" on the first line *\/\n    .rentamac-pricing .enterprise-btn { white-space: normal; }\n    \/* The reviews strip is centred with left + translate, which pushes it off screen in right-to-left Arabic *\/\n    [dir=\"rtl\"] .rentamac-pricing .reviews-section { left: auto; right: 50%; transform: translateX(50%); }\n\n    \/* Options are real buttons now, so they work from the keyboard *\/\n    .rentamac-pricing button.cycle-tab,\n    .rentamac-pricing button.storage-option { font: inherit; color: inherit; }\n    \/* The theme sets white-space: nowrap on every button; the storage labels must wrap inside their tile *\/\n    .rentamac-pricing button.storage-option { white-space: normal; }\n    .rentamac-pricing button.cycle-tab:focus-visible,\n    .rentamac-pricing button.storage-option:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }\n    .rentamac-pricing .storage-option .storage-size,\n    .rentamac-pricing .storage-option .storage-label,\n    .rentamac-pricing .storage-option .storage-price,\n    .rentamac-pricing .storage-option .storage-content { display: block; }\n\n    \/* Sold out and wrong-cycle tiles stay readable: dimmed, no blur *\/\n    .rentamac-pricing .storage-option.unavailable .storage-content,\n    .rentamac-pricing .storage-option.unavailable:hover .storage-content,\n    .rentamac-pricing .storage-option.disabled .storage-content,\n    .rentamac-pricing .storage-option.disabled:hover .storage-content { filter: none; opacity: 0.5; }\n\n    \/* Daily-unavailable tooltip in the same dark style as the storage ones *\/\n    .rentamac-pricing .cycle-tab.unavailable::after { background: rgba(0, 0, 0, 0.9); color: var(--text); font-weight: 500; border: 1px solid var(--stroke); }\n    .rentamac-pricing .cycle-tab.unavailable::before { border-top-color: rgba(0, 0, 0, 0.9); }\n\n    \/* Mac model tiles: photo, name, specs, monthly price on three short lines *\/\n    .rentamac-pricing .model-section { container-type: inline-size; }\n    .rentamac-pricing .model-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; padding-top: 6px; }\n    @container (max-width: 480px) {\n      .rentamac-pricing .model-tiles { grid-template-columns: 1fr; }\n    }\n    .rentamac-pricing .model-tile {\n      position: relative;\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      padding: 10px 14px;\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid var(--stroke);\n      border-radius: 12px;\n      cursor: pointer;\n      text-align: left;\n      font: inherit;\n      color: inherit;\n      transition: all 0.2s ease;\n    }\n    .rentamac-pricing .model-tile:hover { background: rgba(255, 255, 255, 0.06); border-color: var(--stroke-hover); }\n    .rentamac-pricing .model-tile.active { background: rgba(59, 130, 246, 0.1); border-color: var(--accent-blue); box-shadow: 0 0 20px var(--accent-blue-glow); }\n    .rentamac-pricing .model-tile:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }\n    .rentamac-pricing .model-tile.coming-soon .mt-img,\n    .rentamac-pricing .model-tile.coming-soon .mt-text { opacity: 0.6; }\n    .rentamac-pricing .mt-img { width: 56px; height: auto; flex: none; object-fit: contain; filter: drop-shadow(0 6px 10px rgba(0, 0, 0, 0.4)); }\n    .rentamac-pricing .mt-text { display: grid; gap: 1px; min-width: 0; flex: 1; }\n    .rentamac-pricing .mt-name { font-size: 15.5px; font-weight: 700; color: var(--text); white-space: nowrap; }\n    .rentamac-pricing .model-tile.active .mt-name { color: var(--accent-blue); }\n    .rentamac-pricing .mt-line { font-size: 12px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .rentamac-pricing .mt-line b { font-size: 13px; font-weight: 700; color: var(--text); }\n    .rentamac-pricing .model-tile .popular-badge {\n      position: absolute;\n      top: -8px;\n      right: 12px;\n      background: var(--accent-blue);\n      color: #fff;\n      font-size: 9px;\n      font-weight: 700;\n      padding: 3px 8px;\n      border-radius: 4px;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n\n    @media (max-width: 1060px) {\n      .rentamac-pricing .pricing-card.two-col { grid-template-columns: 1fr; }\n      .rentamac-pricing .two-col .pc-right { border-left: 0; padding-left: 0; border-top: 1px solid var(--stroke); margin-top: 22px; padding-top: 22px; }\n      .rentamac-pricing .two-col .pc-sticky { position: static; }\n    }\n    @media (max-width: 600px) {\n      .rentamac-pricing .pricing-card.two-col { padding: 24px 18px; }\n      \/* Flag above the region name on phones, so America (or Am\u00e9rique) fits the narrow location tabs *\/\n      .rentamac-pricing #locationTabs .cycle-name { display: flex; flex-direction: column; align-items: center; gap: 4px; }\n      .rentamac-pricing #locationTabs .loc-flag { margin: 0; }\n      .rentamac-pricing #locationTabs .cycle-tab { padding-left: 6px; padding-right: 6px; }\n      \/* Spec badges as an even 2 x 2 grid on phones *\/\n      .rentamac-pricing .two-col .device-specs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n      .rentamac-pricing .two-col .device-specs .spec-badge { justify-content: center; }\n    }\n  <\/style>\n\n<div class=\"rentamac-pricing\">\n  <div class=\"container wide\">\n    <header class=\"header\">\n      <h1>Choose Your Plan<\/h1>\n    <\/header>\n\n    <div class=\"pricing-card two-col\">\n      <div class=\"pc-left\">\n      <!-- Mac model. Prices come from MODELS in the JS; a model other than the M4 shows \"Coming soon\"\n           and opens the waitlist until the status API returns rows for it. -->\n      <div class=\"model-section\">\n        <div class=\"section-title\">Mac<\/div>\n        <div class=\"model-tiles\" id=\"modelTiles\">\n          <button type=\"button\" class=\"model-tile active\" data-model=\"m4\" aria-pressed=\"true\">\n            <img decoding=\"async\" class=\"mt-img\" src=\"https:\/\/rentamac.io\/wp-content\/uploads\/2025\/09\/mm24-front-cut-1.png\" alt=\"\" width=\"56\" height=\"23\" \/>\n            <span class=\"mt-text\">\n              <span class=\"mt-name\" data-no-translation>Mac mini M4<\/span>\n              <span class=\"mt-line\"><b data-model-price>$119<\/b><span data-model-per>\/mo<\/span><\/span>\n            <\/span>\n          <\/button>\n          <button type=\"button\" class=\"model-tile\" data-model=\"m6\" aria-pressed=\"false\">\n            <span class=\"popular-badge model-badge\">New<\/span>\n            <img decoding=\"async\" class=\"mt-img\" src=\"https:\/\/rentamac.io\/wp-content\/uploads\/2025\/09\/mm24-front-cut-1.png\" alt=\"\" width=\"56\" height=\"23\" \/>\n            <span class=\"mt-text\">\n              <span class=\"mt-name\" data-no-translation>Mac mini M6<\/span>\n              <span class=\"mt-line\"><b data-model-price>$139<\/b><span data-model-per>\/mo<\/span><\/span>\n            <\/span>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <!-- Spec badges with tooltips; #specChip and #tipChip follow the selected model (renderModelTiles) -->\n      <div class=\"device-specs\">\n        <span class=\"spec-badge tip-owner\" tabindex=\"0\" aria-describedby=\"tipChip\">\n          <span id=\"specChip\">M4 10-core<\/span>\n          <span class=\"feature-info\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line><\/svg>\n            <span class=\"tooltip\" role=\"tooltip\" id=\"tipChip\">Apple M4 chip with 10-core CPU (4 performance cores + 6 efficiency cores) and 10-core GPU. Delivers exceptional single-threaded and multi-threaded performance for development, builds, and creative workloads.<\/span>\n          <\/span>\n        <\/span>\n        <span class=\"spec-badge tip-owner\" tabindex=\"0\" aria-describedby=\"tipRam\">\n          <span data-i18n=\"spec.ram\">16 GB RAM<\/span>\n          <span class=\"feature-info\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line><\/svg>\n            <span class=\"tooltip\" role=\"tooltip\" id=\"tipRam\" data-i18n=\"tip.ram\">16 GB of unified memory shared between CPU and GPU. Unlike traditional RAM, unified memory eliminates the need to copy data between processors, resulting in faster performance and better efficiency.<\/span>\n          <\/span>\n        <\/span>\n        <span class=\"spec-badge tip-owner\" tabindex=\"0\" aria-describedby=\"tipSsd\">\n          <span data-i18n=\"spec.ssd\">256 GB SSD<\/span>\n          <span class=\"feature-info\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line><\/svg>\n            <span class=\"tooltip\" role=\"tooltip\" id=\"tipSsd\" data-i18n=\"tip.ssd\">256 GB internal NVMe solid-state drive with read speeds up to 3.4 GB\/s. Fast enough for Xcode builds, Docker containers, and large project files. Additional external storage available as add-on.<\/span>\n          <\/span>\n        <\/span>\n        <span class=\"spec-badge tip-owner\" tabindex=\"0\" aria-describedby=\"tipMacos\">\n          <span data-i18n=\"spec.macos\">macOS 27<\/span>\n          <span class=\"feature-info\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line><\/svg>\n            <span class=\"tooltip\" role=\"tooltip\" id=\"tipMacos\" data-i18n=\"tip.macos\">macOS 27 (version 27.0 or later) \u2014 Apple&#8217;s latest operating system. Includes the newest Xcode, Swift, and development tools. Always kept up to date with the latest security patches.<\/span>\n          <\/span>\n        <\/span>\n      <\/div>\n\n      <!-- Location picker. Pre-selected from the visitor's IP (see resolveGeoPreferredLocation);\n           picking a tab pins the choice for the rest of the session.\n           Skeleton baked in for first paint like the cycle tabs below \u2014 rendered from JS only, it\n           appeared a beat after the other two. -->\n      <div class=\"location-section\">\n        <div class=\"section-title\">Location<\/div>\n        <div class=\"cycle-tabs\" id=\"locationTabs\">\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Billing Cycle -->\n      <div class=\"cycle-section\">\n        <div class=\"section-title\">Billing Cycle<\/div>\n        <!-- Skeleton tabs are baked into the static markup so they show on first paint\n             (no empty flash before JS runs). Replaced by renderCycleTabs() once availability\n             data arrives; renderCycleTabsSkeleton() in init re-renders identical markup. -->\n        <div class=\"cycle-tabs\" id=\"cycleTabs\">\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n          <div class=\"cycle-tab is-skeleton\">\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Storage -->\n      <div class=\"storage-section\">\n        <div class=\"section-title\">Storage<\/div>\n        <!-- Skeleton options baked in for first paint (see cycle-tabs note above). -->\n        <div id=\"storageContainer\">\n          <div class=\"storage-options\" id=\"storageOptions\">\n            <div class=\"storage-option is-skeleton\">\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\n            <\/div>\n            <div class=\"storage-option is-skeleton\">\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\n            <\/div>\n            <div class=\"storage-option is-skeleton\">\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <\/div>\n\n      <div class=\"pc-right\">\n        <div class=\"pc-sticky\">\n          <!-- Price Display -->\n          <div class=\"price-section\">\n            <div class=\"total-label\">Total<\/div>\n            <div class=\"total-price\" id=\"totalPrice\">$119<\/div>\n            <div class=\"price-breakdown\" id=\"priceBreakdown\">Billed monthly<\/div>\n            <div class=\"storage-addon-note\" id=\"storageNote\"><\/div>\n          <\/div>\n\n          <!-- CTA -->\n          <button class=\"cta-button\" id=\"ctaButton\">\n            Buy Plan\n          <\/button>\n          <p class=\"renew-line\" id=\"renewLine\">Renews monthly \u00b7 Cancel anytime<\/p>\n          <p class=\"checkout-error\" id=\"checkoutError\" role=\"alert\" style=\"display: none;\"><\/p>\n\n          <!-- Included, as a spec sheet; every term has its tooltip. #accessDuration, #sipFeature and #tipDedicated are driven by the JS. -->\n          <div class=\"features-section\">\n            <div class=\"section-title\">Included<\/div>\n            <dl class=\"inc-spec\">\n              <div><dt data-i18n=\"spec.access\">Access<\/dt><dd>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipRemote\"><span data-i18n=\"spec.remoteDesktop\">Remote desktop<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipRemote\" data-i18n=\"tip.remoteDesktop\">Connect via DeskIn remote desktop software. After purchase, you&#8217;ll receive credentials by email. DeskIn offers the highest frame rate and lowest latency among remote desktop products.<\/span><\/span><span class=\"inc-sep\" aria-hidden=\"true\"> \u00b7 <\/span>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipSsh\"><span>SSH<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipSsh\" data-i18n=\"tip.ssh\">Full SSH terminal access to your Mac for remote development, running builds, and file transfers (scp\/sftp). Connect from any terminal using the credentials provided after purchase.<\/span><\/span><span class=\"inc-sep\" aria-hidden=\"true\"> \u00b7 <\/span>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipAdmin\"><span>Root<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipAdmin\" data-i18n=\"tip.admin\">Full administrator privileges (Root access) with no restrictions. Install any software, configure development environments, and have complete control over the system.<\/span><\/span>\n              <\/dd><\/div>\n              <div><dt data-i18n=\"spec.machine\">Machine<\/dt><dd>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipDedicated\"><span data-i18n=\"spec.dedicated\">Dedicated Mac mini<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipDedicated\">The Mac mini M4 is fully dedicated to you \u2014 no virtual machines or multi-user environment. You get the entire physical machine exclusively for your use.<\/span><\/span><span class=\"inc-sep\" aria-hidden=\"true\"> \u00b7 <\/span>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipXcode\"><span>Xcode<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipXcode\" data-i18n=\"tip.xcode\">Every Mac comes with Xcode already installed and ready to use. Start building and running iOS and macOS apps immediately, with no lengthy download or setup.<\/span><\/span><span class=\"inc-sep\" aria-hidden=\"true\"> \u00b7 <\/span>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipImmediate\"><span data-i18n=\"spec.instantSetup\">Instant setup<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipImmediate\" data-i18n=\"tip.immediate\">Instances are already running. You&#8217;ll receive your credentials immediately after payment and can start using your Mac right away \u2014 no waiting time.<\/span><\/span>\n              <\/dd><\/div>\n              <div><dt data-i18n=\"spec.network\">Network<\/dt><dd>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipNetwork\"><span data-i18n=\"spec.networkValue\">1 Gbps down \u00b7 200 Mbps up<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipNetwork\" data-i18n=\"tip.network\">High-speed connection from our Cyprus datacenter: up to 1 Gbps download and ~200 Mbps upload. Perfect for large file transfers and CI\/CD workflows.<\/span><\/span>\n              <\/dd><\/div>\n              <div><dt data-i18n=\"spec.plan\">Plan<\/dt><dd>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipAccess\"><span id=\"accessDuration\">1 month access<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipAccess\" data-i18n=\"tip.access\">Continuous 24\/7 access \u2014 not working days or limited hours. Your access starts immediately after payment and auto-renews unless you cancel from the User Portal.<\/span><\/span>\n              <\/dd><\/div>\n              <div id=\"sipFeature\" style=\"display: none;\"><dt data-i18n=\"spec.extra\">Extra<\/dt><dd>\n                <span class=\"inc-term tip-owner\" tabindex=\"0\" aria-describedby=\"tipSip\"><span data-i18n=\"spec.sip\">SIP customization<\/span><span class=\"tooltip\" role=\"tooltip\" id=\"tipSip\" data-i18n=\"tip.sip\">Since SIP introduces additional hardware risk, we offer customization only on 6-month plans. After purchase, contact support to have it enabled as it requires manual intervention.<\/span><\/span>\n              <\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Purchase Information -->\n    <section class=\"purchase-info\">\n      <div class=\"purchase-dropdown\">\n        <button class=\"purchase-dropdown-trigger\" id=\"purchaseDropdownTrigger\" type=\"button\" aria-expanded=\"false\" aria-controls=\"purchaseDropdownContent\">\n          <span>What happens after purchase?<\/span>\n          <svg class=\"purchase-dropdown-icon\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"\/>\n          <\/svg>\n        <\/button>\n        <div class=\"purchase-dropdown-content\" id=\"purchaseDropdownContent\" aria-hidden=\"true\">\n          <p>Once your payment is processed, you will be taken to our User Portal, where you can find your Mac credentials and manage your subscription. An email will also be sent to you with all the necessary information using the email from checkout.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- Google Reviews Section -->\n    <section class=\"reviews-section\">\n      <div class=\"reviews-header\">\n        <!-- Google \"G\" Icon -->\n        <svg class=\"google-icon-small\" viewBox=\"0 0 24 24\">\n          <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\/>\n          <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\/>\n          <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\/>\n          <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\/>\n        <\/svg>\n        <div class=\"rating-stars\" id=\"avgStars\"><\/div>\n        <span class=\"reviews-meta\">\n          <span class=\"rating-number\" id=\"avgRating\">5.0<\/span>\n          <a href=\"https:\/\/maps.app.goo.gl\/v55edKD7K2gePhTh9\" target=\"_blank\" rel=\"noopener nofollow\">on Google<\/a>\n        <\/span>\n      <\/div>\n\n      <div class=\"reviews-carousel-container\">\n        <div class=\"reviews-carousel\" id=\"reviewsCarousel\">\n          <!-- Skeleton placeholders shown until reviews are rendered by JS -->\n          <div class=\"review-card is-skeleton\">\n            <div class=\"review-header\">\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\n              <div class=\"reviewer-info\">\n                <div class=\"skeleton-bar\" style=\"height:14px;width:60%;\"><\/div>\n              <\/div>\n            <\/div>\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:92%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:74%;\"><\/div>\n          <\/div>\n          <div class=\"review-card is-skeleton\">\n            <div class=\"review-header\">\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\n              <div class=\"reviewer-info\">\n                <div class=\"skeleton-bar\" style=\"height:14px;width:55%;\"><\/div>\n              <\/div>\n            <\/div>\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:88%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:64%;\"><\/div>\n          <\/div>\n          <div class=\"review-card is-skeleton\">\n            <div class=\"review-header\">\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\n              <div class=\"reviewer-info\">\n                <div class=\"skeleton-bar\" style=\"height:14px;width:65%;\"><\/div>\n              <\/div>\n            <\/div>\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:90%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:70%;\"><\/div>\n          <\/div>\n          <div class=\"review-card is-skeleton\">\n            <div class=\"review-header\">\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\n              <div class=\"reviewer-info\">\n                <div class=\"skeleton-bar\" style=\"height:14px;width:58%;\"><\/div>\n              <\/div>\n            <\/div>\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:85%;margin-bottom:8px;\"><\/div>\n            <div class=\"skeleton-bar\" style=\"height:12px;width:60%;\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- Enterprise Section -->\n    <section class=\"enterprise-section\">\n      <div class=\"enterprise-card\">\n        <div class=\"card-header\">\n          <h2 class=\"card-title\">Enterprise<\/h2>\n          <p class=\"card-subtitle\"><span id=\"enterpriseModelName\">Mac mini M4<\/span> &#8211; <span data-i18n=\"enterprise.volumePricing\">Volume pricing<\/span><\/p>\n        <\/div>\n\n        <div class=\"enterprise-benefits\">\n          <div class=\"benefit-item\">\n            <div class=\"benefit-icon\">\n              <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\/>\n              <\/svg>\n            <\/div>\n            <h4>Volume discounts<\/h4>\n          <\/div>\n          <div class=\"benefit-item\">\n            <div class=\"benefit-icon\">\n              <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.031 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\/>\n              <\/svg>\n            <\/div>\n            <h4>SLA guarantees<\/h4>\n          <\/div>\n        <\/div>\n\n        <!-- Quantity Slider -->\n        <div class=\"slider-group\">\n          <div class=\"slider-label-row\">\n            <span class=\"slider-label\">Number of Instances<\/span>\n            <div class=\"slider-value\">\n              <span class=\"slider-value-number\" id=\"quantityValue\">1<\/span>\n              <span class=\"slider-discount-badge\" id=\"quantityDiscountBadge\">10% OFF<\/span>\n            <\/div>\n          <\/div>\n          <input type=\"range\" id=\"quantitySlider\" min=\"1\" max=\"15\" value=\"1\" class=\"enterprise-slider\" \/>\n          <div class=\"slider-range-labels\">\n            <span>1<\/span>\n            <span>15+<\/span>\n          <\/div>\n        <\/div>\n\n        <!-- Duration Slider -->\n        <div class=\"slider-group\">\n          <div class=\"slider-label-row\">\n            <span class=\"slider-label\">Duration (Months)<\/span>\n            <div class=\"slider-value\">\n              <span class=\"slider-value-number\" id=\"durationValue\">1<\/span>\n              <span class=\"slider-discount-badge\" id=\"durationDiscountBadge\">10% OFF<\/span>\n            <\/div>\n          <\/div>\n          <input type=\"range\" id=\"durationSlider\" min=\"1\" max=\"12\" value=\"1\" class=\"enterprise-slider\" \/>\n          <div class=\"slider-range-labels\">\n            <span>1 month<\/span>\n            <span>12 months<\/span>\n          <\/div>\n        <\/div>\n\n        <!-- Pricing Display -->\n        <div class=\"enterprise-pricing\">\n          <div class=\"non-cumulative-notice\" id=\"nonCumulativeNotice\">\n            Discounts are not cumulative\n          <\/div>\n          <div>\n            <span class=\"price-amount\" id=\"enterprisePrice\">$119<\/span>\n            <span class=\"price-label\">total<\/span>\n          <\/div>\n          <p class=\"discount-text\" id=\"discountBadge\">Standard pricing<\/p>\n          <p class=\"price-breakdown\" id=\"priceBreakdownEnterprise\">$119.00\/month per instance<\/p>\n        <\/div>\n\n        <div class=\"enterprise-cta\">\n          <button class=\"enterprise-btn\" onclick=\"if(typeof $crisp !== 'undefined') $crisp.push(['do', 'chat:open']); else window.location.href='mailto:support@rentamac.io';\">\n            Get custom quote\n          <\/button>\n          <p class=\"enterprise-contact\">or email <a href=\"mailto:support@rentamac.io\">support@rentamac.io<\/a><\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- Help Section -->\n    <section class=\"help-section\">\n      <div class=\"help-header\">\n        <h3>Need help deciding?<\/h3>\n        <p class=\"help-subtitle\">See it in action or get your questions answered<\/p>\n      <\/div>\n\n      <div class=\"help-cards\">\n        <div class=\"help-card\">\n          <div class=\"help-icon\">\n            <svg width=\"28\" height=\"28\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\/>\n            <\/svg>\n          <\/div>\n          <h4>Watch live demo<\/h4>\n          <p>See our Mac Mini cloud service in action with a live demonstration. No signup required!<\/p>\n          <button class=\"help-btn secondary\" onclick=\"navigateWithLanguage('\/demo\/');\">\n            <span>View Demo<\/span>\n            <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\/>\n            <\/svg>\n          <\/button>\n        <\/div>\n\n        <div class=\"help-card\">\n          <div class=\"help-icon\">\n            <svg width=\"28\" height=\"28\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\/>\n            <\/svg>\n          <\/div>\n          <h4>Get answers<\/h4>\n          <p>Find detailed answers to common questions about setup, pricing, and features.<\/p>\n          <button class=\"help-btn secondary\" onclick=\"navigateWithLanguage('\/faq\/');\">\n            <span>Browse FAQ<\/span>\n            <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\/>\n            <\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"help-footer\">\n        <p class=\"help-footer-text\">Prefer to create your account first?<\/p>\n        <button class=\"help-portal-btn\" onclick=\"window.open('https:\/\/portal.rentamac.io\/register', '_blank');\">\n          <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\"\/>\n          <\/svg>\n          <span>Create Account<\/span>\n        <\/button>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <!-- Mobile CTA bar (one-column layout only): mirrors the choices, total and Buy Plan, see initMobileCtaBar -->\n  <div class=\"mcb\" id=\"mobileCtaBar\" inert>\n    <div class=\"mcb-inner\">\n      <div class=\"mcb-content\">\n        <div class=\"mcb-summary\"><\/div>\n        <button type=\"button\" class=\"mcb-btn\"><span class=\"mcb-label\">Buy Plan<\/span><span class=\"mcb-btn-price\">$119<\/span><\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Availability Dialog -->\n  <div id=\"availabilityOverlay\" class=\"availability-overlay is-hidden\" aria-hidden=\"true\"><\/div>\n  <div id=\"availabilityDialog\" class=\"availability-dialog is-hidden\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"availabilityDialogTitle\">\n    <div class=\"availability-dialog__header\">\n      <h2 id=\"availabilityDialogTitle\" class=\"availability-dialog__title\">All instances are currently allocated<\/h2>\n      <button type=\"button\" id=\"availabilityDialogClose\" class=\"availability-dialog__close\" aria-label=\"Close dialog\">&times;<\/button>\n    <\/div>\n    <p>\n      We&#8217;re at full capacity right now, but we can let you know the moment a Mac becomes available again.\n      Leave your email below and you&#8217;ll be first in line when we spin up new instances.\n    <\/p>\n    <form id=\"availabilityForm\" class=\"availability-form\" novalidate>\n      <label for=\"availabilityEmail\" class=\"sr-only\">Email address<\/label>\n      <input\n        id=\"availabilityEmail\"\n        name=\"email\"\n        type=\"email\"\n        inputmode=\"email\"\n        autocomplete=\"email\"\n        placeholder=\"your@email.com\"\n        aria-label=\"Email address\"\n        required\n      \/>\n      <button type=\"submit\">Notify me<\/button>\n    <\/form>\n    <div id=\"availabilityFeedback\" class=\"availability-feedback info\" role=\"status\"><\/div>\n    <p class=\"availability-disclaimer\">We only use this email to update you about availability. No spam.<\/p>\n  <\/div>\n<\/div>\n\n<script>(function(){try{var b=atob(\"CiAgICAoZnVuY3Rpb24oKSB7CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSTE4TgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRyYW5zbGF0ZVByZXNzIG9ubHkgdHJhbnNsYXRlcyBzdGF0aWMgSFRNTCBpdCBoYXMgc3RyaW5ncyBmb3IsIHNvIHRleHQgd3JpdHRlbiBoZXJlIChhbmQKICAgIC8vIHN0YXRpYyB0ZXh0IG5ldyBpbiB0aGUgcmVkZXNpZ24pIGlzIHRyYW5zbGF0ZWQgYnkgdGhlIHBhZ2UgaXRzZWxmLCBmcm9tIDxodG1sIGxhbmc+LgoKICAgIGNvbnN0IExBTkcgPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgfHwgJ2VuJykuc2xpY2UoMCwgMikudG9Mb3dlckNhc2UoKTsKCiAgICBjb25zdCBJMThOID0gewogICAgICBlbjogewogICAgICAgICdjeWNsZS5kYWlseSc6ICdEYWlseScsCiAgICAgICAgJ2N5Y2xlLndlZWtseSc6ICdXZWVrbHknLAogICAgICAgICdjeWNsZS5tb250aGx5JzogJ01vbnRobHknLAogICAgICAgICdjeWNsZS4zbW9udGgnOiAnMyBNb250aHMnLAogICAgICAgICdjeWNsZS42bW9udGgnOiAnNiBNb250aHMnLAogICAgICAgICdiaWxsZWQuZGFpbHknOiAnQmlsbGVkIGRhaWx5JywKICAgICAgICAnYmlsbGVkLndlZWtseSc6ICdCaWxsZWQgd2Vla2x5JywKICAgICAgICAnYmlsbGVkLm1vbnRobHknOiAnQmlsbGVkIG1vbnRobHknLAogICAgICAgICdiaWxsZWQuM21vbnRoJzogJ0JpbGxlZCBldmVyeSAzIG1vbnRocycsCiAgICAgICAgJ2JpbGxlZC42bW9udGgnOiAnQmlsbGVkIGV2ZXJ5IDYgbW9udGhzJywKICAgICAgICAnYWNjZXNzLmRhaWx5JzogJzI0IGhvdXJzIGFjY2VzcycsCiAgICAgICAgJ2FjY2Vzcy53ZWVrbHknOiAnNyBkYXlzIGFjY2VzcycsCiAgICAgICAgJ2FjY2Vzcy5tb250aGx5JzogJzEgbW9udGggYWNjZXNzJywKICAgICAgICAnYWNjZXNzLjNtb250aCc6ICczIG1vbnRocyBhY2Nlc3MnLAogICAgICAgICdhY2Nlc3MuNm1vbnRoJzogJzYgbW9udGhzIGFjY2VzcycsCiAgICAgICAgJ3JlbmV3cy5kYWlseSc6ICdSZW5ld3MgZGFpbHknLAogICAgICAgICdyZW5ld3Mud2Vla2x5JzogJ1JlbmV3cyB3ZWVrbHknLAogICAgICAgICdyZW5ld3MubW9udGhseSc6ICdSZW5ld3MgbW9udGhseScsCiAgICAgICAgJ3JlbmV3cy4zbW9udGgnOiAnUmVuZXdzIGV2ZXJ5IDMgbW9udGhzJywKICAgICAgICAncmVuZXdzLjZtb250aCc6ICdSZW5ld3MgZXZlcnkgNiBtb250aHMnLAogICAgICAgICdyZW5ld0xpbmUnOiAne3JlbmV3c30gwrcgQ2FuY2VsIGFueXRpbWUnLAogICAgICAgICdwZXJEYXknOiAne3ByaWNlfS9kYXknLAogICAgICAgICdwb3B1bGFyJzogJ1BvcHVsYXInLAogICAgICAgICdzYXZlJzogJ1NhdmUge3BjdH0lJywKICAgICAgICAnc3RvcmFnZS5zaXplJzogJ3tzaXplfSBHQicsCiAgICAgICAgJ3N0b3JhZ2UuYmFzZSc6ICdJbnRlcm5hbCBTU0QnLAogICAgICAgICdzdG9yYWdlLmFkZG9uMjU2JzogJzI1NiBHQiArIDI1NiBHQiBleHRlcm5hbCcsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb241MTInOiAnMjU2IEdCICsgNTEyIEdCIGV4dGVybmFsJywKICAgICAgICAnc3RvcmFnZS5zb2xkT3V0JzogJ1NvbGQgb3V0JywKICAgICAgICAnc3RvcmFnZS5wZXJNb250aCc6ICcre3ByaWNlfS9tbycsCiAgICAgICAgJ3N0b3JhZ2UuaW5jbHVkZWQnOiAnSW5jbHVkZWQnLAogICAgICAgICdzdG9yYWdlLmRlZmF1bHQnOiAnRGVmYXVsdCcsCiAgICAgICAgJ3N0b3JhZ2Uubm90ZSc6ICdJbmNsdWRlcyB7bGFiZWx9IHN0b3JhZ2UgKCt7cHJpY2V9KScsCiAgICAgICAgJ3RpcC5zdG9yYWdlRWxzZXdoZXJlJzogJ1NvbGQgb3V0IHtpbkhlcmV9LiBBdmFpbGFibGUgaW4ge25hbWVzfS4nLAogICAgICAgICd0aXAuc3RvcmFnZU5vbmUnOiAnVW5hdmFpbGFibGUgZHVlIHRvIGhpZ2ggZGVtYW5kLicsCiAgICAgICAgJ3RpcC5kYWlseUVsc2V3aGVyZSc6ICdEYWlseSBwbGFuIGlzIHNvbGQgb3V0IHtpbkhlcmV9LiBBdmFpbGFibGUgaW4ge25hbWVzfS4nLAogICAgICAgICd0aXAuZGFpbHlOb25lJzogJ0Rpc2FibGVkIHdoZW4gYXZhaWxhYmlsaXR5IGlzIGxvdy4gSm9pbiB0aGUgd2FpdGxpc3QgdG8gYmUgbm90aWZpZWQuJywKICAgICAgICAndGlwLm1vZGVsTm90SGVyZSc6ICd7bW9kZWx9IGlzIG5vdCBhdmFpbGFibGUgaGVyZSB5ZXQnLAogICAgICAgICdjb250aW5lbnQuY3lwcnVzJzogJ0V1cm9wZScsCiAgICAgICAgJ2NvbnRpbmVudC51c2EnOiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgJ2NvbnRpbmVudC5pbmRpYSc6ICdBc2lhJywKICAgICAgICAnY291bnRyeS5jeXBydXMnOiAnQ3lwcnVzJywKICAgICAgICAnY291bnRyeS51c2EnOiAnVVNBXHUwMGEwwrcgVGV4YXMnLAogICAgICAgICdjb3VudHJ5LmluZGlhJzogJ0luZGlhJywKICAgICAgICAnaW4uY3lwcnVzJzogJ2luIHtuYW1lfScsCiAgICAgICAgJ2luLnVzYSc6ICdpbiB7bmFtZX0nLAogICAgICAgICdpbi5pbmRpYSc6ICdpbiB7bmFtZX0nLAogICAgICAgICd0aGlzUmVnaW9uJzogJ3RoaXMgcmVnaW9uJywKICAgICAgICAnbGlzdFNlcCc6ICcsICcsCiAgICAgICAgJ2xpc3RBbmQnOiAnIGFuZCAnLAogICAgICAgICdiYWRnZS5uZXcnOiAnTmV3JywKICAgICAgICAnYmFkZ2Uuc29vbic6ICdDb21pbmcgc29vbicsCiAgICAgICAgJ25vdGUubTRPbmx5JzogJ3tyZWdpb259IGhhcyB0aGUgTWFjIG1pbmkgTTQgZm9yIG5vdywgc28gd2Ugc3dpdGNoZWQgeW91IHRvIE00LicsCiAgICAgICAgJ25vdGUubG9jYXRpb25Td2l0Y2hlZCc6ICd7bW9kZWx9IGlzIG5vdCBhdmFpbGFibGUge2luUHJldmlvdXN9IHlldCwgc28gd2Ugc3dpdGNoZWQgeW91ciBsb2NhdGlvbiB0byB7cmVnaW9ufS4nLAogICAgICAgICdjdGEuYnV5JzogJ0J1eSBQbGFuJywKICAgICAgICAnY3RhLndhaXRsaXN0JzogJ0pvaW4gV2FpdGxpc3QnLAogICAgICAgICdjdGEuc3RhcnRpbmcnOiAnU3RhcnRpbmcgY2hlY2tvdXTigKYnLAogICAgICAgICdjaGVja291dC5ub0xvY2F0aW9uJzogIlRoYXQgbG9jYXRpb24gaXNuJ3QgYXZhaWxhYmxlIHlldC4iLAogICAgICAgICdjaGVja291dC5mYWlsZWQnOiAiQ291bGRuJ3Qgc3RhcnQgY2hlY2tvdXQuIFBsZWFzZSB0cnkgYWdhaW4uIiwKICAgICAgICAnY2hlY2tvdXQudG9vTWFueSc6ICdUb28gbWFueSBjaGVja291dCBhdHRlbXB0cy4gUGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2Fpbi4nLAogICAgICAgICdkaWFsb2cuc29vblRpdGxlJzogJ3ttb2RlbH0gaXMgY29taW5nIHNvb24nLAogICAgICAgICdkaWFsb2cuc29vbkRlc2MnOiAnTGVhdmUgeW91ciBlbWFpbCBiZWxvdyBhbmQgd2XigJlsbCBsZXQgeW91IGtub3cgdGhlIG1vbWVudCBpdCBpcyBhdmFpbGFibGUuJywKICAgICAgICAnZGlhbG9nLmRhaWx5VGl0bGUnOiAnRGFpbHkgcGxhbiB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScsCiAgICAgICAgJ2RpYWxvZy5kYWlseURlc2MnOiAnVGhlIGRhaWx5IHBsYW4gaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIGR1ZSB0byBoaWdoIGRlbWFuZC4nLAogICAgICAgICdkaWFsb2cuZGFpbHlEZXNjSGVyZSc6ICdUaGUgZGFpbHkgcGxhbiBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUge2luSGVyZX0gZHVlIHRvIGhpZ2ggZGVtYW5kLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU90aGVycyc6ICcgV2Vla2x5LCBtb250aGx5LCBhbmQgbG9uZ2VyIHBsYW5zIGFyZSBzdGlsbCBhdmFpbGFibGUuJywKICAgICAgICAnZGlhbG9nLmRhaWx5Tm90aWZ5JzogJyBMZWF2ZSB5b3VyIGVtYWlsIGJlbG93IGFuZCB3ZeKAmWxsIG5vdGlmeSB5b3UgYXMgc29vbiBhcyB0aGUgZGFpbHkgcGxhbiBpcyBiYWNrLicsCiAgICAgICAgJ2RpYWxvZy5zdG9yYWdlVGl0bGUnOiAnVGhpcyBzdG9yYWdlIG9wdGlvbiBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUnLAogICAgICAgICdkaWFsb2cuc3RvcmFnZURlc2MnOiAnRXZlcnkgTWFjIHdpdGggdGhpcyBkcml2ZSBjb25maWd1cmF0aW9uIHtpbkhlcmV9IGlzIGFsbG9jYXRlZCByaWdodCBub3cuIExlYXZlIHlvdXIgZW1haWwgYmVsb3cgYW5kIHdl4oCZbGwgbGV0IHlvdSBrbm93IHRoZSBtb21lbnQgb25lIGZyZWVzIHVwLicsCiAgICAgICAgJ2RpYWxvZy5hbGxUaXRsZSc6ICdBbGwgaW5zdGFuY2VzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkJywKICAgICAgICAnZGlhbG9nLmFsbFRpdGxlSGVyZSc6ICdBbGwgaW5zdGFuY2VzIHtpbkhlcmV9IGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkJywKICAgICAgICAnZGlhbG9nLm1vZGVsVGl0bGUnOiAnQWxsIHttb2RlbH0gaW5zdGFuY2VzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkJywKICAgICAgICAnZGlhbG9nLm1vZGVsVGl0bGVIZXJlJzogJ0FsbCB7bW9kZWx9IGluc3RhbmNlcyB7aW5IZXJlfSBhcmUgY3VycmVudGx5IGFsbG9jYXRlZCcsCiAgICAgICAgJ2RpYWxvZy5hbGxEZXNjJzogJ1dl4oCZcmUgYXQgZnVsbCBjYXBhY2l0eSByaWdodCBub3csIGJ1dCB3ZSBjYW4gbGV0IHlvdSBrbm93IHRoZSBtb21lbnQgYSBNYWMgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4uIExlYXZlIHlvdXIgZW1haWwgYmVsb3cgYW5kIHlvdeKAmWxsIGJlIGZpcnN0IGluIGxpbmUgd2hlbiB3ZSBzcGluIHVwIG5ldyBpbnN0YW5jZXMuJywKICAgICAgICAnZGlhbG9nLmFsbERlc2NIZXJlJzogJ1dl4oCZcmUgYXQgZnVsbCBjYXBhY2l0eSB7aW5IZXJlfSByaWdodCBub3csIGJ1dCB3ZSBjYW4gbGV0IHlvdSBrbm93IHRoZSBtb21lbnQgYSBNYWMgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4uIExlYXZlIHlvdXIgZW1haWwgYmVsb3cgYW5kIHlvdeKAmWxsIGJlIGZpcnN0IGluIGxpbmUgd2hlbiB3ZSBzcGluIHVwIG5ldyBpbnN0YW5jZXMuJywKICAgICAgICAnYWx0LmRhaWx5JzogJ1ByZWZlciBub3QgdG8gd2FpdD8gVGhlIGRhaWx5IHBsYW4gaXMgYXZhaWxhYmxlIG5vdyBpbiB7bmFtZXN9LicsCiAgICAgICAgJ2FsdC5jb25maWcnOiAnUHJlZmVyIG5vdCB0byB3YWl0PyBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlIG5vdyBpbiB7bmFtZXN9LicsCiAgICAgICAgJ2FsdC5hbnknOiAnUHJlZmVyIG5vdCB0byB3YWl0PyBNYWNzIGFyZSBhdmFpbGFibGUgbm93IGluIHtuYW1lc30uJywKICAgICAgICAnYWx0LnN3aXRjaCc6ICdTd2l0Y2ggdG8ge3JlZ2lvbn0nLAogICAgICAgICd4YWx0LmxlYWRSZWdpb24nOiAnVGhlIHttb2RlbH0gaXMgc29sZCBvdXQge2luSGVyZX0uJywKICAgICAgICAneGFsdC5hdmFpbGFibGVOb3cnOiAnQXZhaWxhYmxlIG5vdzonLAogICAgICAgICd4YWx0LmxlYWREYWlseSc6ICdUaGUgZGFpbHkgcGxhbiBmb3IgdGhlIHttb2RlbH0gaXMgc29sZCBvdXQge2luSGVyZX0uJywKICAgICAgICAneGFsdC5sZWFkQmFzZSc6ICdUaGUge21vZGVsfSB3aXRob3V0IGFuIGV4dGVybmFsIGRyaXZlIGlzIHNvbGQgb3V0IHtpbkhlcmV9LicsCiAgICAgICAgJ3hhbHQubGVhZFN0b3JhZ2UnOiAnVGhlIHttb2RlbH0gd2l0aCB7c3RvcmFnZX0gaXMgc29sZCBvdXQge2luSGVyZX0uJywKICAgICAgICAnd2FpdGxpc3Qubm90aWZ5JzogJ05vdGlmeSBtZScsCiAgICAgICAgJ3dhaXRsaXN0LmNsb3NlJzogJ0Nsb3NlJywKICAgICAgICAnd2FpdGxpc3QuaW52YWxpZEVtYWlsJzogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuJywKICAgICAgICAnd2FpdGxpc3Quc2F2aW5nJzogJ1NhdmluZyB5b3VyIHJlcXVlc3QuLi4nLAogICAgICAgICd3YWl0bGlzdC50b29GYXN0JzogIllvdSdyZSBnb2luZyB0b28gZmFzdC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iLAogICAgICAgICd3YWl0bGlzdC5mYWlsZWRMYXRlcic6ICdTb3JyeSwgc29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkJzogJ1NvcnJ5LCBzb21ldGhpbmcgd2VudCB3cm9uZy4nLAogICAgICAgICd3YWl0bGlzdC5zdWNjZXNzJzogIllvdSdyZSBvbiB0aGUgbGlzdCEgV2UnbGwgZW1haWwgeW91IHRoZSBtb21lbnQgYSBNYWMgc3BpbnMgdXAuIiwKICAgICAgICAnd2FpdGxpc3QuaGludCc6ICdXZSBvbmx5IGVtYWlsIHlvdSBhYm91dCBhdmFpbGFiaWxpdHkuJywKICAgICAgICAnbm90aWNlLnNvbGRPdXQnOiAnQWxsIE1hY3Mge2luSGVyZX0gYXJlIGN1cnJlbnRseSBhbGxvY2F0ZWQuIEF2YWlsYWJsZSBub3cgaW4ge2xpbmtzfSwgb3Igam9pbiB0aGUge2hlcmV9IHdhaXRsaXN0IGJlbG93LicsCiAgICAgICAgJ25vdGljZS5tb2RlbFNvbGRPdXQnOiAnRXZlcnkge21vZGVsfSB7aW5IZXJlfSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLiBBdmFpbGFibGUgbm93IGluIHtsaW5rc30sIG9yIGpvaW4gdGhlIHtoZXJlfSB3YWl0bGlzdCBiZWxvdy4nLAogICAgICAgICdub3RpY2UuY3RhQWx0JzogJ29yIHtsaW5rfScsCiAgICAgICAgJ25vdGljZS5jdGFBbHRMaW5rJzogJ2dldCBhIE1hYyB7aW5SZWdpb259IG5vdycsCiAgICAgICAgJ25vdGljZS5kYWlseVNvbGRPdXQnOiAnRGFpbHkgcGxhbiBpcyBzb2xkIG91dCB7aW5IZXJlfS4gQXZhaWxhYmxlIG5vdyBpbiB7bGlua3N9LCBvciB7d2FpdGxpc3R9LicsCiAgICAgICAgJ25vdGljZS5qb2luV2FpdGxpc3QnOiAnam9pbiB0aGUgd2FpdGxpc3QnLAogICAgICAgICdlbnRlcnByaXNlLm9mZic6ICd7cGN0fSUgT0ZGJywKICAgICAgICAnZW50ZXJwcmlzZS5hcHBsaWVkJzogJ3twY3R9JSBkaXNjb3VudCBhcHBsaWVkJywKICAgICAgICAnZW50ZXJwcmlzZS5zdGFuZGFyZCc6ICdTdGFuZGFyZCBwcmljaW5nJywKICAgICAgICAnZW50ZXJwcmlzZS5wZXJJbnN0YW5jZSc6ICd7cHJpY2V9L21vbnRoIHBlciBpbnN0YW5jZScsCiAgICAgICAgJ2VudGVycHJpc2Uudm9sdW1lUHJpY2luZyc6ICdWb2x1bWUgcHJpY2luZycsCiAgICAgICAgJ3RpbGUucGVyLmRhaWx5JzogJy9kYXknLAogICAgICAgICd0aWxlLnBlci53ZWVrbHknOiAnL3dlZWsnLAogICAgICAgICd0aWxlLnBlci5tb250aGx5JzogJy9tbycsCiAgICAgICAgJ3RpbGUucGVyLjNtb250aCc6ICcvMyBtbycsCiAgICAgICAgJ3RpbGUucGVyLjZtb250aCc6ICcvNiBtbycsCiAgICAgICAgJ3NwZWMuY2hpcE00JzogJ000IDEwLWNvcmUnLAogICAgICAgICdzcGVjLmNoaXBNNic6ICdNNiAxMi1jb3JlJywKICAgICAgICAnc3BlYy5yYW0nOiAnMTYgR0IgUkFNJywKICAgICAgICAnc3BlYy5zc2QnOiAnMjU2IEdCIFNTRCcsCiAgICAgICAgJ3NwZWMubWFjb3MnOiAnbWFjT1MgMjcnLAogICAgICAgICd0aXAuY2hpcE00JzogJ0FwcGxlIE00IGNoaXAgd2l0aCAxMC1jb3JlIENQVSAoNCBwZXJmb3JtYW5jZSBjb3JlcyArIDYgZWZmaWNpZW5jeSBjb3JlcykgYW5kIDEwLWNvcmUgR1BVLiBEZWxpdmVycyBleGNlcHRpb25hbCBzaW5nbGUtdGhyZWFkZWQgYW5kIG11bHRpLXRocmVhZGVkIHBlcmZvcm1hbmNlIGZvciBkZXZlbG9wbWVudCwgYnVpbGRzLCBhbmQgY3JlYXRpdmUgd29ya2xvYWRzLicsCiAgICAgICAgJ3RpcC5jaGlwTTYnOiAnQXBwbGUgTTYgY2hpcCwgYnVpbHQgb24gMiBubSwgd2l0aCBhIDEyLWNvcmUgQ1BVICgyIHN1cGVyLCA0IHBlcmZvcm1hbmNlIGFuZCA2IGVmZmljaWVuY3kgY29yZXMpIGFuZCBhIDEyLWNvcmUgR1BVIHdpdGggYSBOZXVyYWwgQWNjZWxlcmF0b3IgaW4gZXZlcnkgY29yZSwgcGx1cyBhIGR1YWwgMTYtY29yZSBOZXVyYWwgRW5naW5lLiBBcHBsZSBxdW90ZXMgdXAgdG8gNMOXIGZhc3RlciBBSSB0YXNrcyB0aGFuIHRoZSBNYWMgbWluaSB3aXRoIE00LCB3aGljaCBtYWtlcyBpdCBhIHN0cm9uZyBmaXQgZm9yIHJ1bm5pbmcgQUkgbW9kZWxzIGFuZCBMTE0gaW5mZXJlbmNlIG9uIHRoZSBNYWMuJywKICAgICAgICAndGlwLnJhbSc6ICcxNiBHQiBvZiB1bmlmaWVkIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBDUFUgYW5kIEdQVS4gVW5saWtlIHRyYWRpdGlvbmFsIFJBTSwgdW5pZmllZCBtZW1vcnkgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBjb3B5IGRhdGEgYmV0d2VlbiBwcm9jZXNzb3JzLCByZXN1bHRpbmcgaW4gZmFzdGVyIHBlcmZvcm1hbmNlIGFuZCBiZXR0ZXIgZWZmaWNpZW5jeS4nLAogICAgICAgICd0aXAuc3NkJzogJzI1NiBHQiBpbnRlcm5hbCBOVk1lIHNvbGlkLXN0YXRlIGRyaXZlIHdpdGggcmVhZCBzcGVlZHMgdXAgdG8gMy40IEdCL3MuIEZhc3QgZW5vdWdoIGZvciBYY29kZSBidWlsZHMsIERvY2tlciBjb250YWluZXJzLCBhbmQgbGFyZ2UgcHJvamVjdCBmaWxlcy4gQWRkaXRpb25hbCBleHRlcm5hbCBzdG9yYWdlIGF2YWlsYWJsZSBhcyBhZGQtb24uJywKICAgICAgICAndGlwLm1hY29zJzogJ21hY09TIDI3ICh2ZXJzaW9uIDI3LjAgb3IgbGF0ZXIpIOKAlCBBcHBsZVwncyBsYXRlc3Qgb3BlcmF0aW5nIHN5c3RlbS4gSW5jbHVkZXMgdGhlIG5ld2VzdCBYY29kZSwgU3dpZnQsIGFuZCBkZXZlbG9wbWVudCB0b29scy4gQWx3YXlzIGtlcHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcy4nLAogICAgICAgICd0aXAuYWNjZXNzJzogJ0NvbnRpbnVvdXMgMjQvNyBhY2Nlc3Mg4oCUIG5vdCB3b3JraW5nIGRheXMgb3IgbGltaXRlZCBob3Vycy4gWW91ciBhY2Nlc3Mgc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHBheW1lbnQgYW5kIGF1dG8tcmVuZXdzIHVubGVzcyB5b3UgY2FuY2VsIGZyb20gdGhlIFVzZXIgUG9ydGFsLicsCiAgICAgICAgJ3RpcC5yZW1vdGVEZXNrdG9wJzogJ0Nvbm5lY3QgdmlhIERlc2tJbiByZW1vdGUgZGVza3RvcCBzb2Z0d2FyZS4gQWZ0ZXIgcHVyY2hhc2UsIHlvdVwnbGwgcmVjZWl2ZSBjcmVkZW50aWFscyBieSBlbWFpbC4gRGVza0luIG9mZmVycyB0aGUgaGlnaGVzdCBmcmFtZSByYXRlIGFuZCBsb3dlc3QgbGF0ZW5jeSBhbW9uZyByZW1vdGUgZGVza3RvcCBwcm9kdWN0cy4nLAogICAgICAgICd0aXAuc3NoJzogJ0Z1bGwgU1NIIHRlcm1pbmFsIGFjY2VzcyB0byB5b3VyIE1hYyBmb3IgcmVtb3RlIGRldmVsb3BtZW50LCBydW5uaW5nIGJ1aWxkcywgYW5kIGZpbGUgdHJhbnNmZXJzIChzY3Avc2Z0cCkuIENvbm5lY3QgZnJvbSBhbnkgdGVybWluYWwgdXNpbmcgdGhlIGNyZWRlbnRpYWxzIHByb3ZpZGVkIGFmdGVyIHB1cmNoYXNlLicsCiAgICAgICAgJ3RpcC5hZG1pbic6ICdGdWxsIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyAoUm9vdCBhY2Nlc3MpIHdpdGggbm8gcmVzdHJpY3Rpb25zLiBJbnN0YWxsIGFueSBzb2Z0d2FyZSwgY29uZmlndXJlIGRldmVsb3BtZW50IGVudmlyb25tZW50cywgYW5kIGhhdmUgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBzeXN0ZW0uJywKICAgICAgICAndGlwLmRlZGljYXRlZCc6ICdUaGUge21vZGVsfSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8geW91IOKAlCBubyB2aXJ0dWFsIG1hY2hpbmVzIG9yIG11bHRpLXVzZXIgZW52aXJvbm1lbnQuIFlvdSBnZXQgdGhlIGVudGlyZSBwaHlzaWNhbCBtYWNoaW5lIGV4Y2x1c2l2ZWx5IGZvciB5b3VyIHVzZS4nLAogICAgICAgICd0aXAuaW1tZWRpYXRlJzogJ0luc3RhbmNlcyBhcmUgYWxyZWFkeSBydW5uaW5nLiBZb3VcJ2xsIHJlY2VpdmUgeW91ciBjcmVkZW50aWFscyBpbW1lZGlhdGVseSBhZnRlciBwYXltZW50IGFuZCBjYW4gc3RhcnQgdXNpbmcgeW91ciBNYWMgcmlnaHQgYXdheSDigJQgbm8gd2FpdGluZyB0aW1lLicsCiAgICAgICAgJ3RpcC5uZXR3b3JrJzogJ0hpZ2gtc3BlZWQgY29ubmVjdGlvbiBmcm9tIG91ciBDeXBydXMgZGF0YWNlbnRlcjogdXAgdG8gMSBHYnBzIGRvd25sb2FkIGFuZCB+MjAwIE1icHMgdXBsb2FkLiBQZXJmZWN0IGZvciBsYXJnZSBmaWxlIHRyYW5zZmVycyBhbmQgQ0kvQ0Qgd29ya2Zsb3dzLicsCiAgICAgICAgJ3RpcC54Y29kZSc6ICdFdmVyeSBNYWMgY29tZXMgd2l0aCBYY29kZSBhbHJlYWR5IGluc3RhbGxlZCBhbmQgcmVhZHkgdG8gdXNlLiBTdGFydCBidWlsZGluZyBhbmQgcnVubmluZyBpT1MgYW5kIG1hY09TIGFwcHMgaW1tZWRpYXRlbHksIHdpdGggbm8gbGVuZ3RoeSBkb3dubG9hZCBvciBzZXR1cC4nLAogICAgICAgICd0aXAuc2lwJzogJ1NpbmNlIFNJUCBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgaGFyZHdhcmUgcmlzaywgd2Ugb2ZmZXIgY3VzdG9taXphdGlvbiBvbmx5IG9uIDYtbW9udGggcGxhbnMuIEFmdGVyIHB1cmNoYXNlLCBjb250YWN0IHN1cHBvcnQgdG8gaGF2ZSBpdCBlbmFibGVkIGFzIGl0IHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24uJywKICAgICAgICAnc3BlYy5hY2Nlc3MnOiAnQWNjZXNzJywKICAgICAgICAnc3BlYy5tYWNoaW5lJzogJ01hY2hpbmUnLAogICAgICAgICdzcGVjLm5ldHdvcmsnOiAnTmV0d29yaycsCiAgICAgICAgJ3NwZWMucGxhbic6ICdQbGFuJywKICAgICAgICAnc3BlYy5leHRyYSc6ICdFeHRyYScsCiAgICAgICAgJ3NwZWMucmVtb3RlRGVza3RvcCc6ICdSZW1vdGUgZGVza3RvcCcsCiAgICAgICAgJ3NwZWMuZGVkaWNhdGVkJzogJ0RlZGljYXRlZCBNYWMgbWluaScsCiAgICAgICAgJ3NwZWMuaW5zdGFudFNldHVwJzogJ0luc3RhbnQgc2V0dXAnLAogICAgICAgICdzcGVjLm5ldHdvcmtWYWx1ZSc6ICcxIEdicHMgZG93biDCtyAyMDAgTWJwcyB1cCcsCiAgICAgICAgJ3NwZWMuc2lwJzogJ1NJUCBjdXN0b21pemF0aW9uJwogICAgICB9LAogICAgICBlczogewogICAgICAgICdjeWNsZS5kYWlseSc6ICdEaWFyaW8nLAogICAgICAgICdjeWNsZS53ZWVrbHknOiAnU2VtYW5hbCcsCiAgICAgICAgJ2N5Y2xlLm1vbnRobHknOiAnTWVuc3VhbCcsCiAgICAgICAgJ2N5Y2xlLjNtb250aCc6ICczIG1lc2VzJywKICAgICAgICAnY3ljbGUuNm1vbnRoJzogJzYgbWVzZXMnLAogICAgICAgICdiaWxsZWQuZGFpbHknOiAnRmFjdHVyYWNpw7NuIGRpYXJpYScsCiAgICAgICAgJ2JpbGxlZC53ZWVrbHknOiAnRmFjdHVyYWNpw7NuIHNlbWFuYWwnLAogICAgICAgICdiaWxsZWQubW9udGhseSc6ICdGYWN0dXJhY2nDs24gbWVuc3VhbCcsCiAgICAgICAgJ2JpbGxlZC4zbW9udGgnOiAnRmFjdHVyYWNpw7NuIGNhZGEgMyBtZXNlcycsCiAgICAgICAgJ2JpbGxlZC42bW9udGgnOiAnRmFjdHVyYWNpw7NuIGNhZGEgNiBtZXNlcycsCiAgICAgICAgJ2FjY2Vzcy5kYWlseSc6ICcyNCBob3JhcyBkZSBhY2Nlc28nLAogICAgICAgICdhY2Nlc3Mud2Vla2x5JzogJzcgZMOtYXMgZGUgYWNjZXNvJywKICAgICAgICAnYWNjZXNzLm1vbnRobHknOiAnMSBtZXMgZGUgYWNjZXNvJywKICAgICAgICAnYWNjZXNzLjNtb250aCc6ICczIG1lc2VzIGRlIGFjY2VzbycsCiAgICAgICAgJ2FjY2Vzcy42bW9udGgnOiAnNiBtZXNlcyBkZSBhY2Nlc28nLAogICAgICAgICdyZW5ld3MuZGFpbHknOiAnU2UgcmVudWV2YSBjYWRhIGTDrWEnLAogICAgICAgICdyZW5ld3Mud2Vla2x5JzogJ1NlIHJlbnVldmEgY2FkYSBzZW1hbmEnLAogICAgICAgICdyZW5ld3MubW9udGhseSc6ICdTZSByZW51ZXZhIGNhZGEgbWVzJywKICAgICAgICAncmVuZXdzLjNtb250aCc6ICdTZSByZW51ZXZhIGNhZGEgMyBtZXNlcycsCiAgICAgICAgJ3JlbmV3cy42bW9udGgnOiAnU2UgcmVudWV2YSBjYWRhIDYgbWVzZXMnLAogICAgICAgICdyZW5ld0xpbmUnOiAne3JlbmV3c30gwrcgQ2FuY2VsZSBjdWFuZG8gcXVpZXJhJywKICAgICAgICAncGVyRGF5JzogJ3twcmljZX0vZMOtYScsCiAgICAgICAgJ3BvcHVsYXInOiAnUG9wdWxhcicsCiAgICAgICAgJ3NhdmUnOiAnQWhvcnJlIHtwY3R9JScsCiAgICAgICAgJ3N0b3JhZ2Uuc2l6ZSc6ICd7c2l6ZX0gR0InLAogICAgICAgICdzdG9yYWdlLmJhc2UnOiAnU1NEIGludGVybm8nLAogICAgICAgICdzdG9yYWdlLmFkZG9uMjU2JzogJzI1NiBHQiArIDI1NiBHQiBleHRlcm5vJywKICAgICAgICAnc3RvcmFnZS5hZGRvbjUxMic6ICcyNTYgR0IgKyA1MTIgR0IgZXh0ZXJubycsCiAgICAgICAgJ3N0b3JhZ2Uuc29sZE91dCc6ICdBZ290YWRvJywKICAgICAgICAnc3RvcmFnZS5wZXJNb250aCc6ICcre3ByaWNlfS9tZXMnLAogICAgICAgICdzdG9yYWdlLmluY2x1ZGVkJzogJ0luY2x1aWRvJywKICAgICAgICAnc3RvcmFnZS5kZWZhdWx0JzogJ1ByZWRldGVybWluYWRvJywKICAgICAgICAnc3RvcmFnZS5ub3RlJzogJ0luY2x1eWUgYWxtYWNlbmFtaWVudG8ge2xhYmVsfSAoK3twcmljZX0pJywKICAgICAgICAndGlwLnN0b3JhZ2VFbHNld2hlcmUnOiAnQWdvdGFkbyB7aW5IZXJlfS4gRGlzcG9uaWJsZSBlbiB7bmFtZXN9LicsCiAgICAgICAgJ3RpcC5zdG9yYWdlTm9uZSc6ICdObyBkaXNwb25pYmxlIHBvciBsYSBhbHRhIGRlbWFuZGEuJywKICAgICAgICAndGlwLmRhaWx5RWxzZXdoZXJlJzogJ0VsIHBsYW4gZGlhcmlvIGVzdMOhIGFnb3RhZG8ge2luSGVyZX0uIERpc3BvbmlibGUgZW4ge25hbWVzfS4nLAogICAgICAgICd0aXAuZGFpbHlOb25lJzogJ0Rlc2FjdGl2YWRvIGN1YW5kbyBsYSBkaXNwb25pYmlsaWRhZCBlcyBiYWphLiDDmm5hc2UgYSBsYSBsaXN0YSBkZSBlc3BlcmEgcGFyYSByZWNpYmlyIHVuIGF2aXNvLicsCiAgICAgICAgJ3RpcC5tb2RlbE5vdEhlcmUnOiAnRWwge21vZGVsfSBhw7puIG5vIGVzdMOhIGRpc3BvbmlibGUgYXF1w60nLAogICAgICAgICdjb250aW5lbnQuY3lwcnVzJzogJ0V1cm9wYScsCiAgICAgICAgJ2NvbnRpbmVudC51c2EnOiAnRXN0YWRvcyBVbmlkb3MnLAogICAgICAgICdjb250aW5lbnQuaW5kaWEnOiAnQXNpYScsCiAgICAgICAgJ2NvdW50cnkuY3lwcnVzJzogJ0NoaXByZScsCiAgICAgICAgJ2NvdW50cnkudXNhJzogJ0VFLlx1MDBhMFVVLlx1MDBhMMK3IFRleGFzJywKICAgICAgICAnY291bnRyeS5pbmRpYSc6ICdJbmRpYScsCiAgICAgICAgJ2luLmN5cHJ1cyc6ICdlbiB7bmFtZX0nLAogICAgICAgICdpbi51c2EnOiAnZW4ge25hbWV9JywKICAgICAgICAnaW4uaW5kaWEnOiAnZW4ge25hbWV9JywKICAgICAgICAndGhpc1JlZ2lvbic6ICdlc3RhIHJlZ2nDs24nLAogICAgICAgICdsaXN0U2VwJzogJywgJywKICAgICAgICAnbGlzdEFuZCc6ICcgeSAnLAogICAgICAgICdiYWRnZS5uZXcnOiAnTnVldm8nLAogICAgICAgICdiYWRnZS5zb29uJzogJ1Byw7N4aW1hbWVudGUnLAogICAgICAgICdub3RlLm00T25seSc6ICdQb3IgYWhvcmEsIHtpblJlZ2lvbn0gc29sbyBlc3TDoSBkaXNwb25pYmxlIGVsIE1hYyBtaW5pIE00LCBhc8OtIHF1ZSBsZSBoZW1vcyBjYW1iaWFkbyBhbCBNNC4nLAogICAgICAgICdub3RlLmxvY2F0aW9uU3dpdGNoZWQnOiAnRWwge21vZGVsfSBhw7puIG5vIGVzdMOhIGRpc3BvbmlibGUge2luUHJldmlvdXN9LCBhc8OtIHF1ZSBoZW1vcyBjYW1iaWFkbyBzdSB1YmljYWNpw7NuIGEge3JlZ2lvbn0uJywKICAgICAgICAnY3RhLmJ1eSc6ICdDb21wcmFyIHBsYW4nLAogICAgICAgICdjdGEud2FpdGxpc3QnOiAnVW5pcnNlIGEgbGEgbGlzdGEgZGUgZXNwZXJhJywKICAgICAgICAnY3RhLnN0YXJ0aW5nJzogJ0luaWNpYW5kbyBlbCBwYWdv4oCmJywKICAgICAgICAnY2hlY2tvdXQubm9Mb2NhdGlvbic6ICdFc2EgdWJpY2FjacOzbiBhw7puIG5vIGVzdMOhIGRpc3BvbmlibGUuJywKICAgICAgICAnY2hlY2tvdXQuZmFpbGVkJzogJ05vIHNlIGhhIHBvZGlkbyBpbmljaWFyIGVsIHBhZ28uIEludMOpbnRlbG8gZGUgbnVldm8uJywKICAgICAgICAnY2hlY2tvdXQudG9vTWFueSc6ICdEZW1hc2lhZG9zIGludGVudG9zIGRlIHBhZ28uIEVzcGVyZSB1biBtb21lbnRvIGUgaW50w6ludGVsbyBkZSBudWV2by4nLAogICAgICAgICdkaWFsb2cuc29vblRpdGxlJzogJ0VsIHttb2RlbH0gbGxlZ2Fyw6EgbXV5IHByb250bycsCiAgICAgICAgJ2RpYWxvZy5zb29uRGVzYyc6ICdEZWplIHN1IGNvcnJlbyBlbGVjdHLDs25pY28gYSBjb250aW51YWNpw7NuIHkgbGUgYXZpc2FyZW1vcyBlbiBjdWFudG8gZXN0w6kgZGlzcG9uaWJsZS4nLAogICAgICAgICdkaWFsb2cuZGFpbHlUaXRsZSc6ICdQbGFuIGRpYXJpbyBubyBkaXNwb25pYmxlIHRlbXBvcmFsbWVudGUnLAogICAgICAgICdkaWFsb2cuZGFpbHlEZXNjJzogJ0VsIHBsYW4gZGlhcmlvIG5vIGVzdMOhIGRpc3BvbmlibGUgZW4gZXN0ZSBtb21lbnRvIGRlYmlkbyBhIGxhIGFsdGEgZGVtYW5kYS4nLAogICAgICAgICdkaWFsb2cuZGFpbHlEZXNjSGVyZSc6ICdFbCBwbGFuIGRpYXJpbyBubyBlc3TDoSBkaXNwb25pYmxlIHtpbkhlcmV9IGVuIGVzdGUgbW9tZW50byBkZWJpZG8gYSBsYSBhbHRhIGRlbWFuZGEuJywKICAgICAgICAnZGlhbG9nLmRhaWx5T3RoZXJzJzogJyBMb3MgcGxhbmVzIHNlbWFuYWxlcywgbWVuc3VhbGVzIHkgbcOhcyBsYXJnb3Mgc2lndWVuIGRpc3BvbmlibGVzLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU5vdGlmeSc6ICcgRGVqZSBzdSBjb3JyZW8gZWxlY3Ryw7NuaWNvIGEgY29udGludWFjacOzbiB5IGxlIGF2aXNhcmVtb3MgZW4gY3VhbnRvIGVsIHBsYW4gZGlhcmlvIHZ1ZWx2YSBhIGVzdGFyIGRpc3BvbmlibGUuJywKICAgICAgICAnZGlhbG9nLnN0b3JhZ2VUaXRsZSc6ICdFc3RhIG9wY2nDs24gZGUgYWxtYWNlbmFtaWVudG8gbm8gZXN0w6EgZGlzcG9uaWJsZSBlbiBlc3RlIG1vbWVudG8nLAogICAgICAgICdkaWFsb2cuc3RvcmFnZURlc2MnOiAnVG9kb3MgbG9zIE1hYyBjb24gZXN0YSBjb25maWd1cmFjacOzbiBkZSBkaXNjbyB7aW5IZXJlfSBlc3TDoW4gYXNpZ25hZG9zIGFob3JhIG1pc21vLiBEZWplIHN1IGNvcnJlbyBlbGVjdHLDs25pY28gYSBjb250aW51YWNpw7NuIHkgbGUgYXZpc2FyZW1vcyBlbiBjdWFudG8gc2UgbGliZXJlIHVuby4nLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGUnOiAnVG9kYXMgbGFzIGluc3RhbmNpYXMgZXN0w6FuIGFjdHVhbG1lbnRlIGFzaWduYWRhcycsCiAgICAgICAgJ2RpYWxvZy5hbGxUaXRsZUhlcmUnOiAnVG9kYXMgbGFzIGluc3RhbmNpYXMge2luSGVyZX0gZXN0w6FuIGFjdHVhbG1lbnRlIGFzaWduYWRhcycsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlJzogJ1RvZGFzIGxhcyBpbnN0YW5jaWFzIGRlIHttb2RlbH0gZXN0w6FuIGFjdHVhbG1lbnRlIGFzaWduYWRhcycsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlSGVyZSc6ICdUb2RhcyBsYXMgaW5zdGFuY2lhcyBkZSB7bW9kZWx9IHtpbkhlcmV9IGVzdMOhbiBhY3R1YWxtZW50ZSBhc2lnbmFkYXMnLAogICAgICAgICdkaWFsb2cuYWxsRGVzYyc6ICdFc3RhbW9zIGFsIG3DoXhpbW8gZGUgbnVlc3RyYSBjYXBhY2lkYWQgZW4gZXN0ZSBtb21lbnRvLCBwZXJvIHBvZGVtb3MgYXZpc2FybGUgZW4gY3VhbnRvIHZ1ZWx2YSBhIGhhYmVyIHVuIE1hYyBkaXNwb25pYmxlLiBEZWplIHN1IGNvcnJlbyBlbGVjdHLDs25pY28gYSBjb250aW51YWNpw7NuIHkgc2Vyw6EgZWwgcHJpbWVybyBkZSBsYSBsaXN0YSBjdWFuZG8gYWN0aXZlbW9zIG51ZXZhcyBpbnN0YW5jaWFzLicsCiAgICAgICAgJ2RpYWxvZy5hbGxEZXNjSGVyZSc6ICdFc3RhbW9zIGFsIG3DoXhpbW8gZGUgbnVlc3RyYSBjYXBhY2lkYWQge2luSGVyZX0gZW4gZXN0ZSBtb21lbnRvLCBwZXJvIHBvZGVtb3MgYXZpc2FybGUgZW4gY3VhbnRvIHZ1ZWx2YSBhIGhhYmVyIHVuIE1hYyBkaXNwb25pYmxlLiBEZWplIHN1IGNvcnJlbyBlbGVjdHLDs25pY28gYSBjb250aW51YWNpw7NuIHkgc2Vyw6EgZWwgcHJpbWVybyBkZSBsYSBsaXN0YSBjdWFuZG8gYWN0aXZlbW9zIG51ZXZhcyBpbnN0YW5jaWFzLicsCiAgICAgICAgJ2FsdC5kYWlseSc6ICfCv1ByZWZpZXJlIG5vIGVzcGVyYXI\/IEVsIHBsYW4gZGlhcmlvIGVzdMOhIGRpc3BvbmlibGUgYWhvcmEgZW4ge25hbWVzfS4nLAogICAgICAgICdhbHQuY29uZmlnJzogJ8K\/UHJlZmllcmUgbm8gZXNwZXJhcj8gRXN0YSBjb25maWd1cmFjacOzbiBlc3TDoSBkaXNwb25pYmxlIGFob3JhIGVuIHtuYW1lc30uJywKICAgICAgICAnYWx0LmFueSc6ICfCv1ByZWZpZXJlIG5vIGVzcGVyYXI\/IEhheSBNYWMgZGlzcG9uaWJsZXMgYWhvcmEgZW4ge25hbWVzfS4nLAogICAgICAgICdhbHQuc3dpdGNoJzogJ0NhbWJpYXIgYSB7cmVnaW9ufScsCiAgICAgICAgJ3hhbHQubGVhZFJlZ2lvbic6ICdFbCB7bW9kZWx9IGVzdMOhIGFnb3RhZG8ge2luSGVyZX0uJywKICAgICAgICAneGFsdC5hdmFpbGFibGVOb3cnOiAnRGlzcG9uaWJsZSBhaG9yYTonLAogICAgICAgICd4YWx0LmxlYWREYWlseSc6ICdFbCBwbGFuIGRpYXJpbyBkZWwge21vZGVsfSBlc3TDoSBhZ290YWRvIHtpbkhlcmV9LicsCiAgICAgICAgJ3hhbHQubGVhZEJhc2UnOiAnRWwge21vZGVsfSBzaW4gZGlzY28gZXh0ZXJubyBlc3TDoSBhZ290YWRvIHtpbkhlcmV9LicsCiAgICAgICAgJ3hhbHQubGVhZFN0b3JhZ2UnOiAnRWwge21vZGVsfSBjb24ge3N0b3JhZ2V9IGVzdMOhIGFnb3RhZG8ge2luSGVyZX0uJywKICAgICAgICAnd2FpdGxpc3Qubm90aWZ5JzogJ05vdGlmaWNhcm1lJywKICAgICAgICAnd2FpdGxpc3QuY2xvc2UnOiAnQ2VycmFyJywKICAgICAgICAnd2FpdGxpc3QuaW52YWxpZEVtYWlsJzogJ0ludHJvZHV6Y2EgdW5hIGRpcmVjY2nDs24gZGUgY29ycmVvIGVsZWN0csOzbmljbyB2w6FsaWRhLicsCiAgICAgICAgJ3dhaXRsaXN0LnNhdmluZyc6ICdHdWFyZGFuZG8gc3Ugc29saWNpdHVkLi4uJywKICAgICAgICAnd2FpdGxpc3QudG9vRmFzdCc6ICdEZW1hc2lhZG9zIGludGVudG9zLiBJbnTDqW50ZWxvIGRlIG51ZXZvIG3DoXMgdGFyZGUuJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkTGF0ZXInOiAnTG8gc2VudGltb3MsIGFsZ28gaGEgZmFsbGFkby4gSW50w6ludGVsbyBkZSBudWV2byBtw6FzIHRhcmRlLicsCiAgICAgICAgJ3dhaXRsaXN0LmZhaWxlZCc6ICdMbyBzZW50aW1vcywgYWxnbyBoYSBmYWxsYWRvLicsCiAgICAgICAgJ3dhaXRsaXN0LnN1Y2Nlc3MnOiAnwqFZYSBlc3TDoSBlbiBsYSBsaXN0YSEgTGUgZXNjcmliaXJlbW9zIGVuIGN1YW50byBoYXlhIHVuIE1hYyBkaXNwb25pYmxlLicsCiAgICAgICAgJ3dhaXRsaXN0LmhpbnQnOiAnU29sbyBsZSBlc2NyaWJpcmVtb3MgcGFyYSBpbmZvcm1hcmxlIGRlIGxhIGRpc3BvbmliaWxpZGFkLicsCiAgICAgICAgJ25vdGljZS5zb2xkT3V0JzogJ1RvZG9zIGxvcyBNYWMge2luSGVyZX0gZXN0w6FuIGFzaWduYWRvcyBlbiBlc3RlIG1vbWVudG8uIERpc3BvbmlibGVzIGFob3JhIGVuIHtsaW5rc30sIG8gw7puYXNlIG3DoXMgYWJham8gYSBsYSBsaXN0YSBkZSBlc3BlcmEgZGUge2hlcmV9LicsCiAgICAgICAgJ25vdGljZS5tb2RlbFNvbGRPdXQnOiAnVG9kb3MgbG9zIHttb2RlbH0ge2luSGVyZX0gZXN0w6FuIGFzaWduYWRvcyBlbiBlc3RlIG1vbWVudG8uIERpc3BvbmlibGVzIGFob3JhIGVuIHtsaW5rc30sIG8gw7puYXNlIG3DoXMgYWJham8gYSBsYSBsaXN0YSBkZSBlc3BlcmEgZGUge2hlcmV9LicsCiAgICAgICAgJ25vdGljZS5jdGFBbHQnOiAnbyB7bGlua30nLAogICAgICAgICdub3RpY2UuY3RhQWx0TGluayc6ICdjb25zaWdhIHlhIHVuIE1hYyB7aW5SZWdpb259JywKICAgICAgICAnbm90aWNlLmRhaWx5U29sZE91dCc6ICdFbCBwbGFuIGRpYXJpbyBlc3TDoSBhZ290YWRvIHtpbkhlcmV9LiBEaXNwb25pYmxlIGFob3JhIGVuIHtsaW5rc30sIG8ge3dhaXRsaXN0fS4nLAogICAgICAgICdub3RpY2Uuam9pbldhaXRsaXN0JzogJ8O6bmFzZSBhIGxhIGxpc3RhIGRlIGVzcGVyYScsCiAgICAgICAgJ2VudGVycHJpc2Uub2ZmJzogJ3twY3R9JSBEVE8uJywKICAgICAgICAnZW50ZXJwcmlzZS5hcHBsaWVkJzogJ0Rlc2N1ZW50byBkZWwge3BjdH0lIGFwbGljYWRvJywKICAgICAgICAnZW50ZXJwcmlzZS5zdGFuZGFyZCc6ICdQcmVjaW9zIGVzdMOhbmRhcicsCiAgICAgICAgJ2VudGVycHJpc2UucGVySW5zdGFuY2UnOiAne3ByaWNlfS9tZXMgcG9yIGluc3RhbmNpYScsCiAgICAgICAgJ2VudGVycHJpc2Uudm9sdW1lUHJpY2luZyc6ICdQcmVjaW9zIHBvciB2b2x1bWVuJywKICAgICAgICAndGlsZS5wZXIuZGFpbHknOiAnL2TDrWEnLAogICAgICAgICd0aWxlLnBlci53ZWVrbHknOiAnL3NlbWFuYScsCiAgICAgICAgJ3RpbGUucGVyLm1vbnRobHknOiAnL21lcycsCiAgICAgICAgJ3RpbGUucGVyLjNtb250aCc6ICcvMyBtZXNlcycsCiAgICAgICAgJ3RpbGUucGVyLjZtb250aCc6ICcvNiBtZXNlcycsCiAgICAgICAgJ3NwZWMuY2hpcE00JzogJ000IGRlIDEwIG7DumNsZW9zJywKICAgICAgICAnc3BlYy5jaGlwTTYnOiAnTTYgZGUgMTIgbsO6Y2xlb3MnLAogICAgICAgICdzcGVjLnJhbSc6ICcxNiBHQiBkZSBSQU0nLAogICAgICAgICdzcGVjLnNzZCc6ICdTU0QgZGUgMjU2IEdCJywKICAgICAgICAnc3BlYy5tYWNvcyc6ICdtYWNPUyAyNycsCiAgICAgICAgJ3RpcC5jaGlwTTQnOiAnQ2hpcCBBcHBsZSBNNCBjb24gQ1BVIGRlIDEwIG7DumNsZW9zICg0IGRlIHJlbmRpbWllbnRvICsgNiBkZSBlZmljaWVuY2lhKSB5IEdQVSBkZSAxMCBuw7pjbGVvcy4gT2ZyZWNlIHVuIHJlbmRpbWllbnRvIGV4Y2VwY2lvbmFsIGVuIHVuIHNvbG8gbsO6Y2xlbyB5IGVuIHZhcmlvcyBuw7pjbGVvcyBwYXJhIGRlc2Fycm9sbG8sIGNvbXBpbGFjaW9uZXMgeSB0cmFiYWpvIGNyZWF0aXZvLicsCiAgICAgICAgJ3RpcC5jaGlwTTYnOiAnQ2hpcCBBcHBsZSBNNiBmYWJyaWNhZG8gZW4gMiBubSwgY29uIENQVSBkZSAxMiBuw7pjbGVvcyAoMiBzw7pwZXIgbsO6Y2xlb3MsIDQgZGUgcmVuZGltaWVudG8geSA2IGRlIGVmaWNpZW5jaWEpIHkgR1BVIGRlIDEyIG7DumNsZW9zIGNvbiB1biBOZXVyYWwgQWNjZWxlcmF0b3IgZW4gY2FkYSBuw7pjbGVvLCBhZGVtw6FzIGRlIHVuIE5ldXJhbCBFbmdpbmUgZG9ibGUgZGUgMTYgbsO6Y2xlb3MuIEFwcGxlIGluZGljYSB0YXJlYXMgZGUgSUEgaGFzdGEgNCB2ZWNlcyBtw6FzIHLDoXBpZGFzIHF1ZSBlbiBlbCBNYWMgbWluaSBjb24gTTQsIGlkZWFsIHBhcmEgZWplY3V0YXIgbW9kZWxvcyBkZSBJQSBlIGluZmVyZW5jaWEgZGUgTExNIGVuIGVsIHByb3BpbyBNYWMuJywKICAgICAgICAndGlwLnJhbSc6ICcxNiBHQiBkZSBtZW1vcmlhIHVuaWZpY2FkYSBjb21wYXJ0aWRhIGVudHJlIGxhIENQVSB5IGxhIEdQVS4gQSBkaWZlcmVuY2lhIGRlIGxhIFJBTSB0cmFkaWNpb25hbCwgbGEgbWVtb3JpYSB1bmlmaWNhZGEgZXZpdGEgY29waWFyIGRhdG9zIGVudHJlIHByb2Nlc2Fkb3JlcywgbG8gcXVlIHNlIHRyYWR1Y2UgZW4gbcOhcyByZW5kaW1pZW50byB5IGVmaWNpZW5jaWEuJywKICAgICAgICAndGlwLnNzZCc6ICdVbmlkYWQgZGUgZXN0YWRvIHPDs2xpZG8gTlZNZSBpbnRlcm5hIGRlIDI1NiBHQiBjb24gdmVsb2NpZGFkZXMgZGUgbGVjdHVyYSBkZSBoYXN0YSAzLDQgR0Ivcy4gU3VmaWNpZW50ZSBwYXJhIGNvbXBpbGFjaW9uZXMgZGUgWGNvZGUsIGNvbnRlbmVkb3JlcyBEb2NrZXIgeSBwcm95ZWN0b3MgZ3JhbmRlcy4gQWxtYWNlbmFtaWVudG8gZXh0ZXJubyBhZGljaW9uYWwgZGlzcG9uaWJsZSBjb21vIGNvbXBsZW1lbnRvLicsCiAgICAgICAgJ3RpcC5tYWNvcyc6ICdtYWNPUyAyNyAodmVyc2nDs24gMjcuMCBvIHBvc3RlcmlvciksIGVsIHNpc3RlbWEgb3BlcmF0aXZvIG3DoXMgcmVjaWVudGUgZGUgQXBwbGUuIEluY2x1eWUgbGFzIMO6bHRpbWFzIHZlcnNpb25lcyBkZSBYY29kZSwgU3dpZnQgeSBsYXMgaGVycmFtaWVudGFzIGRlIGRlc2Fycm9sbG8uIFNpZW1wcmUgYWwgZMOtYSBjb24gbG9zIMO6bHRpbW9zIHBhcmNoZXMgZGUgc2VndXJpZGFkLicsCiAgICAgICAgJ3RpcC5hY2Nlc3MnOiAnQWNjZXNvIGNvbnRpbnVvIDI0LzcsIG5vIHNvbG8gZW4gZMOtYXMgbGFib3JhYmxlcyBuaSBlbiBob3JhcmlvIGxpbWl0YWRvLiBFbCBhY2Nlc28gZW1waWV6YSBqdXN0byBkZXNwdcOpcyBkZWwgcGFnbyB5IHNlIHJlbnVldmEgYXV0b23DoXRpY2FtZW50ZSBzYWx2byBxdWUgbG8gY2FuY2VsZSBkZXNkZSBlbCBQb3J0YWwgZGUgdXN1YXJpby4nLAogICAgICAgICd0aXAucmVtb3RlRGVza3RvcCc6ICdDb27DqWN0ZXNlIGNvbiBlbCBzb2Z0d2FyZSBkZSBlc2NyaXRvcmlvIHJlbW90byBEZXNrSW4uIFRyYXMgbGEgY29tcHJhIHJlY2liaXLDoSBsYXMgY3JlZGVuY2lhbGVzIHBvciBjb3JyZW8gZWxlY3Ryw7NuaWNvLiBEZXNrSW4gb2ZyZWNlIGxhIG1heW9yIHRhc2EgZGUgZm90b2dyYW1hcyB5IGxhIG1lbm9yIGxhdGVuY2lhIGVudHJlIGxvcyBwcm9ncmFtYXMgZGUgZXNjcml0b3JpbyByZW1vdG8uJywKICAgICAgICAndGlwLnNzaCc6ICdBY2Nlc28gY29tcGxldG8gcG9yIHRlcm1pbmFsIFNTSCBhIHN1IE1hYyBwYXJhIGRlc2Fycm9sbG8gcmVtb3RvLCBjb21waWxhY2lvbmVzIHkgdHJhbnNmZXJlbmNpYSBkZSBhcmNoaXZvcyAoc2NwL3NmdHApLiBDb27DqWN0ZXNlIGRlc2RlIGN1YWxxdWllciB0ZXJtaW5hbCBjb24gbGFzIGNyZWRlbmNpYWxlcyBxdWUgcmVjaWJpcsOhIHRyYXMgbGEgY29tcHJhLicsCiAgICAgICAgJ3RpcC5hZG1pbic6ICdQcml2aWxlZ2lvcyBjb21wbGV0b3MgZGUgYWRtaW5pc3RyYWRvciAoYWNjZXNvIHJvb3QpIHNpbiByZXN0cmljY2lvbmVzLiBJbnN0YWxlIGN1YWxxdWllciBzb2Z0d2FyZSwgY29uZmlndXJlIHN1cyBlbnRvcm5vcyBkZSBkZXNhcnJvbGxvIHkgdGVuZ2EgZWwgY29udHJvbCB0b3RhbCBkZWwgc2lzdGVtYS4nLAogICAgICAgICd0aXAuZGVkaWNhdGVkJzogJ0VsIHttb2RlbH0gZXN0w6EgZGVkaWNhZG8gcG9yIGNvbXBsZXRvIGEgdXN0ZWQ6IHNpbiBtw6FxdWluYXMgdmlydHVhbGVzIG5pIGVudG9ybm9zIG11bHRpdXN1YXJpby4gRGlzcG9uZSBkZSB0b2RhIGxhIG3DoXF1aW5hIGbDrXNpY2EgcGFyYSBzdSB1c28gZXhjbHVzaXZvLicsCiAgICAgICAgJ3RpcC5pbW1lZGlhdGUnOiAnTGFzIGluc3RhbmNpYXMgeWEgZXN0w6FuIGVuIG1hcmNoYS4gUmVjaWJpcsOhIHN1cyBjcmVkZW5jaWFsZXMganVzdG8gZGVzcHXDqXMgZGVsIHBhZ28geSBwb2Ryw6EgZW1wZXphciBhIHVzYXIgc3UgTWFjIGRlIGlubWVkaWF0bywgc2luIGVzcGVyYXMuJywKICAgICAgICAndGlwLm5ldHdvcmsnOiAnQ29uZXhpw7NuIGRlIGFsdGEgdmVsb2NpZGFkIGRlc2RlIG51ZXN0cm8gY2VudHJvIGRlIGRhdG9zIGRlIENoaXByZTogaGFzdGEgMSBHYnBzIGRlIGJhamFkYSB5IH4yMDAgTWJwcyBkZSBzdWJpZGEuIElkZWFsIHBhcmEgdHJhbnNmZXJpciBhcmNoaXZvcyBncmFuZGVzIHkgcGFyYSBmbHVqb3MgZGUgQ0kvQ0QuJywKICAgICAgICAndGlwLnhjb2RlJzogJ1RvZG9zIGxvcyBNYWMgdmllbmVuIGNvbiBYY29kZSBpbnN0YWxhZG8geSBsaXN0byBwYXJhIHVzYXIuIEVtcGllY2UgYSBjb21waWxhciB5IGVqZWN1dGFyIGFwcHMgZGUgaU9TIHkgbWFjT1MgZGUgaW5tZWRpYXRvLCBzaW4gbGFyZ2FzIGRlc2NhcmdhcyBuaSBjb25maWd1cmFjaW9uZXMuJywKICAgICAgICAndGlwLnNpcCc6ICdDb21vIFNJUCBzdXBvbmUgdW4gcmllc2dvIGFkaWNpb25hbCBwYXJhIGVsIGhhcmR3YXJlLCBzb2xvIG9mcmVjZW1vcyBzdSBwZXJzb25hbGl6YWNpw7NuIGVuIGxvcyBwbGFuZXMgZGUgNiBtZXNlcy4gVHJhcyBsYSBjb21wcmEsIGNvbnRhY3RlIGNvbiBzb3BvcnRlIHBhcmEgYWN0aXZhcmxhLCB5YSBxdWUgcmVxdWllcmUgdW5hIGludGVydmVuY2nDs24gbWFudWFsLicsCiAgICAgICAgJ3NwZWMuYWNjZXNzJzogJ0FjY2VzbycsCiAgICAgICAgJ3NwZWMubWFjaGluZSc6ICdFcXVpcG8nLAogICAgICAgICdzcGVjLm5ldHdvcmsnOiAnUmVkJywKICAgICAgICAnc3BlYy5wbGFuJzogJ1BsYW4nLAogICAgICAgICdzcGVjLmV4dHJhJzogJ0V4dHJhJywKICAgICAgICAnc3BlYy5yZW1vdGVEZXNrdG9wJzogJ0VzY3JpdG9yaW8gcmVtb3RvJywKICAgICAgICAnc3BlYy5kZWRpY2F0ZWQnOiAnTWFjIG1pbmkgZGVkaWNhZG8nLAogICAgICAgICdzcGVjLmluc3RhbnRTZXR1cCc6ICdDb25maWd1cmFjacOzbiBpbnN0YW50w6FuZWEnLAogICAgICAgICdzcGVjLm5ldHdvcmtWYWx1ZSc6ICcxIEdicHMgZGUgYmFqYWRhIMK3IDIwMCBNYnBzIGRlIHN1YmlkYScsCiAgICAgICAgJ3NwZWMuc2lwJzogJ1BlcnNvbmFsaXphY2nDs24gZGUgU0lQJwogICAgICB9LAogICAgICBmcjogewogICAgICAgICdjeWNsZS5kYWlseSc6ICdKb3VyJywKICAgICAgICAnY3ljbGUud2Vla2x5JzogJ1NlbWFpbmUnLAogICAgICAgICdjeWNsZS5tb250aGx5JzogJ01vaXMnLAogICAgICAgICdjeWNsZS4zbW9udGgnOiAnMyBtb2lzJywKICAgICAgICAnY3ljbGUuNm1vbnRoJzogJzYgbW9pcycsCiAgICAgICAgJ2JpbGxlZC5kYWlseSc6ICdGYWN0dXLDqSBjaGFxdWUgam91cicsCiAgICAgICAgJ2JpbGxlZC53ZWVrbHknOiAnRmFjdHVyw6kgY2hhcXVlIHNlbWFpbmUnLAogICAgICAgICdiaWxsZWQubW9udGhseSc6ICdGYWN0dXLDqSBjaGFxdWUgbW9pcycsCiAgICAgICAgJ2JpbGxlZC4zbW9udGgnOiAnRmFjdHVyw6kgdG91cyBsZXMgMyBtb2lzJywKICAgICAgICAnYmlsbGVkLjZtb250aCc6ICdGYWN0dXLDqSB0b3VzIGxlcyA2IG1vaXMnLAogICAgICAgICdhY2Nlc3MuZGFpbHknOiAnMjQgaGV1cmVzIGTigJlhY2PDqHMnLAogICAgICAgICdhY2Nlc3Mud2Vla2x5JzogJzcgam91cnMgZOKAmWFjY8OocycsCiAgICAgICAgJ2FjY2Vzcy5tb250aGx5JzogJzEgbW9pcyBk4oCZYWNjw6hzJywKICAgICAgICAnYWNjZXNzLjNtb250aCc6ICczIG1vaXMgZOKAmWFjY8OocycsCiAgICAgICAgJ2FjY2Vzcy42bW9udGgnOiAnNiBtb2lzIGTigJlhY2PDqHMnLAogICAgICAgICdyZW5ld3MuZGFpbHknOiAnUmVub3V2ZWzDqSBjaGFxdWUgam91cicsCiAgICAgICAgJ3JlbmV3cy53ZWVrbHknOiAnUmVub3V2ZWzDqSBjaGFxdWUgc2VtYWluZScsCiAgICAgICAgJ3JlbmV3cy5tb250aGx5JzogJ1Jlbm91dmVsw6kgY2hhcXVlIG1vaXMnLAogICAgICAgICdyZW5ld3MuM21vbnRoJzogJ1Jlbm91dmVsw6kgdG91cyBsZXMgMyBtb2lzJywKICAgICAgICAncmVuZXdzLjZtb250aCc6ICdSZW5vdXZlbMOpIHRvdXMgbGVzIDYgbW9pcycsCiAgICAgICAgJ3JlbmV3TGluZSc6ICd7cmVuZXdzfSDCtyBSw6lzaWxpYWJsZSDDoCB0b3V0IG1vbWVudCcsCiAgICAgICAgJ3BlckRheSc6ICd7cHJpY2V9L2pvdXInLAogICAgICAgICdwb3B1bGFyJzogJ1BvcHVsYWlyZScsCiAgICAgICAgJ3NhdmUnOiAnUmVtaXNlIHtwY3R9wqAlJywKICAgICAgICAnc3RvcmFnZS5zaXplJzogJ3tzaXplfSBHbycsCiAgICAgICAgJ3N0b3JhZ2UuYmFzZSc6ICdTU0QgaW50ZXJuZScsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb24yNTYnOiAnMjU2IEdvICsgMjU2IEdvIGV4dGVybmUnLAogICAgICAgICdzdG9yYWdlLmFkZG9uNTEyJzogJzI1NiBHbyArIDUxMiBHbyBleHRlcm5lJywKICAgICAgICAnc3RvcmFnZS5zb2xkT3V0JzogJ8OJcHVpc8OpJywKICAgICAgICAnc3RvcmFnZS5wZXJNb250aCc6ICcre3ByaWNlfS9tb2lzJywKICAgICAgICAnc3RvcmFnZS5pbmNsdWRlZCc6ICdJbmNsdXMnLAogICAgICAgICdzdG9yYWdlLmRlZmF1bHQnOiAnUGFyIGTDqWZhdXQnLAogICAgICAgICdzdG9yYWdlLm5vdGUnOiAnSW5jbHV0IGxlIHN0b2NrYWdlIHtsYWJlbH0gKCt7cHJpY2V9KScsCiAgICAgICAgJ3RpcC5zdG9yYWdlRWxzZXdoZXJlJzogJ8OJcHVpc8OpIHtpbkhlcmV9LiBEaXNwb25pYmxlwqA6IHtuYW1lc30uJywKICAgICAgICAndGlwLnN0b3JhZ2VOb25lJzogJ0luZGlzcG9uaWJsZSBlbiByYWlzb24gZOKAmXVuZSBmb3J0ZSBkZW1hbmRlLicsCiAgICAgICAgJ3RpcC5kYWlseUVsc2V3aGVyZSc6ICdMZSBmb3JmYWl0IGpvdXJuYWxpZXIgZXN0IMOpcHVpc8OpIHtpbkhlcmV9LiBEaXNwb25pYmxlwqA6IHtuYW1lc30uJywKICAgICAgICAndGlwLmRhaWx5Tm9uZSc6ICdEw6lzYWN0aXbDqSBsb3JzcXVlIGxhIGRpc3BvbmliaWxpdMOpIGVzdCBmYWlibGUuIEluc2NyaXZlei12b3VzIHN1ciBsYSBsaXN0ZSBk4oCZYXR0ZW50ZSBwb3VyIMOqdHJlIHByw6l2ZW51LicsCiAgICAgICAgJ3RpcC5tb2RlbE5vdEhlcmUnOiAnTGUge21vZGVsfSBu4oCZZXN0IHBhcyBlbmNvcmUgZGlzcG9uaWJsZSBpY2knLAogICAgICAgICdjb250aW5lbnQuY3lwcnVzJzogJ0V1cm9wZScsCiAgICAgICAgJ2NvbnRpbmVudC51c2EnOiAnw4l0YXRzLVVuaXMnLAogICAgICAgICdjb250aW5lbnQuaW5kaWEnOiAnQXNpZScsCiAgICAgICAgJ2NvdW50cnkuY3lwcnVzJzogJ0NoeXByZScsCiAgICAgICAgJ2NvdW50cnkudXNhJzogJ8OJdGF0cy1VbmlzXHUwMGEwwrcgVGV4YXMnLAogICAgICAgICdjb3VudHJ5LmluZGlhJzogJ0luZGUnLAogICAgICAgICdpbi5jeXBydXMnOiAnw6Age25hbWV9JywKICAgICAgICAnaW4udXNhJzogJ2F1eCB7bmFtZX0nLAogICAgICAgICdpbi5pbmRpYSc6ICdlbiB7bmFtZX0nLAogICAgICAgICd0aGlzUmVnaW9uJzogJ2NldHRlIHLDqWdpb24nLAogICAgICAgICdsaXN0U2VwJzogJywgJywKICAgICAgICAnbGlzdEFuZCc6ICcgZXQgJywKICAgICAgICAnYmFkZ2UubmV3JzogJ05vdXZlYXUnLAogICAgICAgICdiYWRnZS5zb29uJzogJ0JpZW50w7R0JywKICAgICAgICAnbm90ZS5tNE9ubHknOiAnUG91ciBs4oCZaW5zdGFudCwgc2V1bCBsZSBNYWMgbWluaSBNNCBlc3QgZGlzcG9uaWJsZSB7aW5SZWdpb259LCBub3VzIHZvdXMgYXZvbnMgZG9uYyBiYXNjdWzDqSBzdXIgbGUgTTQuJywKICAgICAgICAnbm90ZS5sb2NhdGlvblN3aXRjaGVkJzogJ0xlIHttb2RlbH0gbuKAmWVzdCBwYXMgZW5jb3JlIGRpc3BvbmlibGUge2luUHJldmlvdXN9LCBub3VzIGF2b25zIGRvbmMgc8OpbGVjdGlvbm7DqSB7cmVnaW9ufSBjb21tZSBlbXBsYWNlbWVudC4nLAogICAgICAgICdjdGEuYnV5JzogJ0FjaGV0ZXIgbGUgZm9yZmFpdCcsCiAgICAgICAgJ2N0YS53YWl0bGlzdCc6ICdSZWpvaW5kcmUgbGEgbGlzdGUgZOKAmWF0dGVudGUnLAogICAgICAgICdjdGEuc3RhcnRpbmcnOiAnT3V2ZXJ0dXJlIGR1IHBhaWVtZW504oCmJywKICAgICAgICAnY2hlY2tvdXQubm9Mb2NhdGlvbic6ICdDZXQgZW1wbGFjZW1lbnQgbuKAmWVzdCBwYXMgZW5jb3JlIGRpc3BvbmlibGUuJywKICAgICAgICAnY2hlY2tvdXQuZmFpbGVkJzogJ0ltcG9zc2libGUgZGUgbGFuY2VyIGxlIHBhaWVtZW50LiBWZXVpbGxleiByw6llc3NheWVyLicsCiAgICAgICAgJ2NoZWNrb3V0LnRvb01hbnknOiAnVHJvcCBkZSB0ZW50YXRpdmVzIGRlIHBhaWVtZW50LiBWZXVpbGxleiBwYXRpZW50ZXIgdW4gaW5zdGFudCwgcHVpcyByw6llc3NheWVyLicsCiAgICAgICAgJ2RpYWxvZy5zb29uVGl0bGUnOiAnTGUge21vZGVsfSBhcnJpdmUgYmllbnTDtHQnLAogICAgICAgICdkaWFsb2cuc29vbkRlc2MnOiAnTGFpc3NleiB2b3RyZSBhZHJlc3NlIGUtbWFpbCBjaS1kZXNzb3VzIGV0IG5vdXMgdm91cyBwcsOpdmllbmRyb25zIGTDqHMgcXXigJlpbCBzZXJhIGRpc3BvbmlibGUuJywKICAgICAgICAnZGlhbG9nLmRhaWx5VGl0bGUnOiAnRm9yZmFpdCBqb3VybmFsaWVyIHRlbXBvcmFpcmVtZW50IGluZGlzcG9uaWJsZScsCiAgICAgICAgJ2RpYWxvZy5kYWlseURlc2MnOiAnTGUgZm9yZmFpdCBqb3VybmFsaWVyIGVzdCBhY3R1ZWxsZW1lbnQgaW5kaXNwb25pYmxlIGVuIHJhaXNvbiBk4oCZdW5lIGZvcnRlIGRlbWFuZGUuJywKICAgICAgICAnZGlhbG9nLmRhaWx5RGVzY0hlcmUnOiAnTGUgZm9yZmFpdCBqb3VybmFsaWVyIGVzdCBhY3R1ZWxsZW1lbnQgaW5kaXNwb25pYmxlIHtpbkhlcmV9IGVuIHJhaXNvbiBk4oCZdW5lIGZvcnRlIGRlbWFuZGUuJywKICAgICAgICAnZGlhbG9nLmRhaWx5T3RoZXJzJzogJyBMZXMgZm9yZmFpdHMgaGViZG9tYWRhaXJlcywgbWVuc3VlbHMgZXQgcGx1cyBsb25ncyByZXN0ZW50IGRpc3BvbmlibGVzLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU5vdGlmeSc6ICcgTGFpc3NleiB2b3RyZSBhZHJlc3NlIGUtbWFpbCBjaS1kZXNzb3VzIGV0IG5vdXMgdm91cyBwcsOpdmllbmRyb25zIGTDqHMgbGUgcmV0b3VyIGR1IGZvcmZhaXQgam91cm5hbGllci4nLAogICAgICAgICdkaWFsb2cuc3RvcmFnZVRpdGxlJzogJ0NldHRlIG9wdGlvbiBkZSBzdG9ja2FnZSBlc3QgYWN0dWVsbGVtZW50IGluZGlzcG9uaWJsZScsCiAgICAgICAgJ2RpYWxvZy5zdG9yYWdlRGVzYyc6ICdUb3VzIGxlcyBNYWMgZG90w6lzIGRlIGNldHRlIGNvbmZpZ3VyYXRpb24gZGUgZGlzcXVlIHtpbkhlcmV9IHNvbnQgYXR0cmlidcOpcyBwb3VyIGxlIG1vbWVudC4gTGFpc3NleiB2b3RyZSBhZHJlc3NlIGUtbWFpbCBjaS1kZXNzb3VzIGV0IG5vdXMgdm91cyBwcsOpdmllbmRyb25zIGTDqHMgcXXigJl1biBNYWMgc2UgbGliw6hyZS4nLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGUnOiAnVG91dGVzIGxlcyBpbnN0YW5jZXMgc29udCBhY3R1ZWxsZW1lbnQgYXR0cmlidcOpZXMnLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGVIZXJlJzogJ1RvdXRlcyBsZXMgaW5zdGFuY2VzIHtpbkhlcmV9IHNvbnQgYWN0dWVsbGVtZW50IGF0dHJpYnXDqWVzJywKICAgICAgICAnZGlhbG9nLm1vZGVsVGl0bGUnOiAnVG91dGVzIGxlcyBpbnN0YW5jZXMge21vZGVsfSBzb250IGFjdHVlbGxlbWVudCBhdHRyaWJ1w6llcycsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlSGVyZSc6ICdUb3V0ZXMgbGVzIGluc3RhbmNlcyB7bW9kZWx9IHtpbkhlcmV9IHNvbnQgYWN0dWVsbGVtZW50IGF0dHJpYnXDqWVzJywKICAgICAgICAnZGlhbG9nLmFsbERlc2MnOiAnTm91cyBmb25jdGlvbm5vbnMgw6AgcGxlaW5lIGNhcGFjaXTDqSBlbiBjZSBtb21lbnQsIG1haXMgbm91cyBwb3V2b25zIHZvdXMgcHLDqXZlbmlyIGTDqHMgcXXigJl1biBNYWMgcmVkZXZpZW50IGRpc3BvbmlibGUuIExhaXNzZXogdm90cmUgYWRyZXNzZSBlLW1haWwgY2ktZGVzc291cyBldCB2b3VzIHNlcmV6IGxlIHByZW1pZXIgaW5mb3Jtw6kgbG9yc3F1ZSBub3VzIG1ldHRyb25zIGVuIHNlcnZpY2UgZGUgbm91dmVsbGVzIGluc3RhbmNlcy4nLAogICAgICAgICdkaWFsb2cuYWxsRGVzY0hlcmUnOiAnTm91cyBmb25jdGlvbm5vbnMgw6AgcGxlaW5lIGNhcGFjaXTDqSB7aW5IZXJlfSBlbiBjZSBtb21lbnQsIG1haXMgbm91cyBwb3V2b25zIHZvdXMgcHLDqXZlbmlyIGTDqHMgcXXigJl1biBNYWMgcmVkZXZpZW50IGRpc3BvbmlibGUuIExhaXNzZXogdm90cmUgYWRyZXNzZSBlLW1haWwgY2ktZGVzc291cyBldCB2b3VzIHNlcmV6IGxlIHByZW1pZXIgaW5mb3Jtw6kgbG9yc3F1ZSBub3VzIG1ldHRyb25zIGVuIHNlcnZpY2UgZGUgbm91dmVsbGVzIGluc3RhbmNlcy4nLAogICAgICAgICdhbHQuZGFpbHknOiAnVm91cyBwcsOpZsOpcmV6IG5lIHBhcyBhdHRlbmRyZcKgPyBMZSBmb3JmYWl0IGpvdXJuYWxpZXIgZXN0IGRpc3BvbmlibGUgZMOocyBtYWludGVuYW50wqA6IHtuYW1lc30uJywKICAgICAgICAnYWx0LmNvbmZpZyc6ICdWb3VzIHByw6lmw6lyZXogbmUgcGFzIGF0dGVuZHJlwqA\/IENldHRlIGNvbmZpZ3VyYXRpb24gZXN0IGRpc3BvbmlibGUgZMOocyBtYWludGVuYW50wqA6IHtuYW1lc30uJywKICAgICAgICAnYWx0LmFueSc6ICdWb3VzIHByw6lmw6lyZXogbmUgcGFzIGF0dGVuZHJlwqA\/IERlcyBNYWMgc29udCBkaXNwb25pYmxlcyBkw6hzIG1haW50ZW5hbnTCoDoge25hbWVzfS4nLAogICAgICAgICdhbHQuc3dpdGNoJzogJ0Nob2lzaXIge3JlZ2lvbn0nLAogICAgICAgICd4YWx0LmxlYWRSZWdpb24nOiAnTGUge21vZGVsfSBlc3Qgw6lwdWlzw6kge2luSGVyZX0uJywKICAgICAgICAneGFsdC5hdmFpbGFibGVOb3cnOiAnRGlzcG9uaWJsZSBkw6hzIG1haW50ZW5hbnQgOicsCiAgICAgICAgJ3hhbHQubGVhZERhaWx5JzogJ0xlIGZvcmZhaXQgam91cm5hbGllciBkdSB7bW9kZWx9IGVzdCDDqXB1aXPDqSB7aW5IZXJlfS4nLAogICAgICAgICd4YWx0LmxlYWRCYXNlJzogJ0xlIHttb2RlbH0gc2FucyBkaXNxdWUgZXh0ZXJuZSBlc3Qgw6lwdWlzw6kge2luSGVyZX0uJywKICAgICAgICAneGFsdC5sZWFkU3RvcmFnZSc6ICdMZSB7bW9kZWx9IGF2ZWMge3N0b3JhZ2V9IGVzdCDDqXB1aXPDqSB7aW5IZXJlfS4nLAogICAgICAgICd3YWl0bGlzdC5ub3RpZnknOiAnTWUgcHLDqXZlbmlyJywKICAgICAgICAnd2FpdGxpc3QuY2xvc2UnOiAnRmVybWVyJywKICAgICAgICAnd2FpdGxpc3QuaW52YWxpZEVtYWlsJzogJ1ZldWlsbGV6IHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlLicsCiAgICAgICAgJ3dhaXRsaXN0LnNhdmluZyc6ICdFbnJlZ2lzdHJlbWVudCBkZSB2b3RyZSBkZW1hbmRlLi4uJywKICAgICAgICAnd2FpdGxpc3QudG9vRmFzdCc6ICdUcm9wIGRlIHRlbnRhdGl2ZXMuIFZldWlsbGV6IHLDqWVzc2F5ZXIgcGx1cyB0YXJkLicsCiAgICAgICAgJ3dhaXRsaXN0LmZhaWxlZExhdGVyJzogJ0TDqXNvbMOpLCB1bmUgZXJyZXVyIHPigJllc3QgcHJvZHVpdGUuIFZldWlsbGV6IHLDqWVzc2F5ZXIgcGx1cyB0YXJkLicsCiAgICAgICAgJ3dhaXRsaXN0LmZhaWxlZCc6ICdEw6lzb2zDqSwgdW5lIGVycmV1ciBz4oCZZXN0IHByb2R1aXRlLicsCiAgICAgICAgJ3dhaXRsaXN0LnN1Y2Nlc3MnOiAnVm91cyDDqnRlcyBzdXIgbGEgbGlzdGXCoCEgTm91cyB2b3VzIMOpY3Jpcm9ucyBkw6hzIHF14oCZdW4gTWFjIHNlcmEgZGlzcG9uaWJsZS4nLAogICAgICAgICd3YWl0bGlzdC5oaW50JzogJ05vdXMgdm91cyDDqWNyaXZvbnMgdW5pcXVlbWVudCBhdSBzdWpldCBkZSBsYSBkaXNwb25pYmlsaXTDqS4nLAogICAgICAgICdub3RpY2Uuc29sZE91dCc6ICdUb3VzIGxlcyBNYWMge2luSGVyZX0gc29udCBhY3R1ZWxsZW1lbnQgYXR0cmlidcOpcy4gRGlzcG9uaWJsZXMgZMOocyBtYWludGVuYW50wqA6IHtsaW5rc30sIG91IHJlam9pZ25leiBsYSBsaXN0ZSBk4oCZYXR0ZW50ZSAoe2hlcmV9KSBjaS1kZXNzb3VzLicsCiAgICAgICAgJ25vdGljZS5tb2RlbFNvbGRPdXQnOiAnVG91cyBsZXMge21vZGVsfSB7aW5IZXJlfSBzb250IGFjdHVlbGxlbWVudCBhdHRyaWJ1w6lzLiBEaXNwb25pYmxlcyBkw6hzIG1haW50ZW5hbnTCoDoge2xpbmtzfSwgb3UgcmVqb2lnbmV6IGxhIGxpc3RlIGTigJlhdHRlbnRlICh7aGVyZX0pIGNpLWRlc3NvdXMuJywKICAgICAgICAnbm90aWNlLmN0YUFsdCc6ICdvdSB7bGlua30nLAogICAgICAgICdub3RpY2UuY3RhQWx0TGluayc6ICdvYnRlbmV6IGTDqHMgbWFpbnRlbmFudCB1biBNYWMge2luUmVnaW9ufScsCiAgICAgICAgJ25vdGljZS5kYWlseVNvbGRPdXQnOiAnTGUgZm9yZmFpdCBqb3VybmFsaWVyIGVzdCDDqXB1aXPDqSB7aW5IZXJlfS4gRGlzcG9uaWJsZSBkw6hzIG1haW50ZW5hbnTCoDoge2xpbmtzfSwgb3Uge3dhaXRsaXN0fS4nLAogICAgICAgICdub3RpY2Uuam9pbldhaXRsaXN0JzogJ3Jlam9pZ25leiBsYSBsaXN0ZSBk4oCZYXR0ZW50ZScsCiAgICAgICAgJ2VudGVycHJpc2Uub2ZmJzogJy17cGN0fcKgJScsCiAgICAgICAgJ2VudGVycHJpc2UuYXBwbGllZCc6ICdSZW1pc2UgZGUge3BjdH3CoCUgYXBwbGlxdcOpZScsCiAgICAgICAgJ2VudGVycHJpc2Uuc3RhbmRhcmQnOiAnUHJpeCBzdGFuZGFyZCcsCiAgICAgICAgJ2VudGVycHJpc2UucGVySW5zdGFuY2UnOiAne3ByaWNlfS9tb2lzIHBhciBpbnN0YW5jZScsCiAgICAgICAgJ2VudGVycHJpc2Uudm9sdW1lUHJpY2luZyc6ICdUYXJpZnMgZMOpZ3Jlc3NpZnMnLAogICAgICAgICd0aWxlLnBlci5kYWlseSc6ICcvam91cicsCiAgICAgICAgJ3RpbGUucGVyLndlZWtseSc6ICcvc2VtYWluZScsCiAgICAgICAgJ3RpbGUucGVyLm1vbnRobHknOiAnL21vaXMnLAogICAgICAgICd0aWxlLnBlci4zbW9udGgnOiAnLzMgbW9pcycsCiAgICAgICAgJ3RpbGUucGVyLjZtb250aCc6ICcvNiBtb2lzJywKICAgICAgICAnc3BlYy5jaGlwTTQnOiAnTTQgMTAgY8WTdXJzJywKICAgICAgICAnc3BlYy5jaGlwTTYnOiAnTTYgMTIgY8WTdXJzJywKICAgICAgICAnc3BlYy5yYW0nOiAnMTYgR28gZGUgUkFNJywKICAgICAgICAnc3BlYy5zc2QnOiAnU1NEIGRlIDI1NiBHbycsCiAgICAgICAgJ3NwZWMubWFjb3MnOiAnbWFjT1MgMjcnLAogICAgICAgICd0aXAuY2hpcE00JzogJ1B1Y2UgQXBwbGUgTTQgYXZlYyBDUFUgMTAgY8WTdXJzICg0IGPFk3VycyBwZXJmb3JtYW5jZSArIDYgY8WTdXJzIGVmZmljYWNpdMOpKSBldCBHUFUgMTAgY8WTdXJzLiBEZXMgcGVyZm9ybWFuY2VzIGV4Y2VwdGlvbm5lbGxlcyBlbiBtb25vY8WTdXIgY29tbWUgZW4gbXVsdGljxZN1ciBwb3VyIGxlIGTDqXZlbG9wcGVtZW50LCBsZXMgYnVpbGRzIGV0IGxlcyB0w6JjaGVzIGNyw6lhdGl2ZXMuJywKICAgICAgICAndGlwLmNoaXBNNic6ICdQdWNlIEFwcGxlIE02IGdyYXbDqWUgZW4gMiBubSwgYXZlYyB1biBDUFUgMTIgY8WTdXJzICgyIHN1cGVyIGPFk3VycywgNCBjxZN1cnMgcGVyZm9ybWFuY2UgZXQgNiBjxZN1cnMgZWZmaWNhY2l0w6kpIGV0IHVuIEdQVSAxMiBjxZN1cnMgZG90w6kgZOKAmXVuIE5ldXJhbCBBY2NlbGVyYXRvciBkYW5zIGNoYXF1ZSBjxZN1ciwgYWluc2kgcXXigJl1biBkb3VibGUgTmV1cmFsIEVuZ2luZSAxNiBjxZN1cnMuIEFwcGxlIGFubm9uY2UgZGVzIHTDomNoZXMgZOKAmUlBIGp1c3F14oCZw6AgNCBmb2lzIHBsdXMgcmFwaWRlcyBxdWUgc3VyIGxlIE1hYyBtaW5pIE00LCBpZMOpYWwgcG91ciBmYWlyZSB0b3VybmVyIGRlcyBtb2TDqGxlcyBk4oCZSUEgZXQgbOKAmWluZsOpcmVuY2UgZGUgTExNIGRpcmVjdGVtZW50IHN1ciBsZSBNYWMuJywKICAgICAgICAndGlwLnJhbSc6ICcxNiBHbyBkZSBtw6ltb2lyZSB1bmlmacOpZSBwYXJ0YWfDqWUgZW50cmUgbGUgQ1BVIGV0IGxlIEdQVS4gQ29udHJhaXJlbWVudCDDoCBsYSBSQU0gY2xhc3NpcXVlLCBsYSBtw6ltb2lyZSB1bmlmacOpZSDDqXZpdGUgZGUgY29waWVyIGxlcyBkb25uw6llcyBk4oCZdW4gcHJvY2Vzc2V1ciDDoCBs4oCZYXV0cmUsIHBvdXIgcGx1cyBkZSBwZXJmb3JtYW5jZXMgZXQgZOKAmWVmZmljYWNpdMOpLicsCiAgICAgICAgJ3RpcC5zc2QnOiAnU1NEIE5WTWUgaW50ZXJuZSBkZSAyNTYgR28gYXZlYyBkZXMgdml0ZXNzZXMgZGUgbGVjdHVyZSBqdXNxdeKAmcOgIDMsNCBHby9zLiBBc3NleiByYXBpZGUgcG91ciBsZXMgYnVpbGRzIFhjb2RlLCBsZXMgY29udGVuZXVycyBEb2NrZXIgZXQgbGVzIGdyb3MgcHJvamV0cy4gU3RvY2thZ2UgZXh0ZXJuZSBzdXBwbMOpbWVudGFpcmUgZGlzcG9uaWJsZSBlbiBvcHRpb24uJywKICAgICAgICAndGlwLm1hY29zJzogJ21hY09TIDI3ICh2ZXJzaW9uIDI3LjAgb3UgdWx0w6lyaWV1cmUpLCBsZSBzeXN0w6htZSBk4oCZZXhwbG9pdGF0aW9uIGxlIHBsdXMgcsOpY2VudCBk4oCZQXBwbGUuIEF2ZWMgbGVzIGRlcm5pw6hyZXMgdmVyc2lvbnMgZGUgWGNvZGUsIGRlIFN3aWZ0IGV0IGRlcyBvdXRpbHMgZGUgZMOpdmVsb3BwZW1lbnQuIFRvdWpvdXJzIMOgIGpvdXIgYXZlYyBsZXMgZGVybmllcnMgY29ycmVjdGlmcyBkZSBzw6ljdXJpdMOpLicsCiAgICAgICAgJ3RpcC5hY2Nlc3MnOiAnQWNjw6hzIGNvbnRpbnUgMjQgaC8yNCwgNyBqLzcsIHBhcyBzZXVsZW1lbnQgbGVzIGpvdXJzIG91dnLDqXMgbmkgw6AgaG9yYWlyZXMgbGltaXTDqXMuIFZvdHJlIGFjY8OocyBjb21tZW5jZSBkw6hzIGxlIHBhaWVtZW50IGV0IHNlIHJlbm91dmVsbGUgYXV0b21hdGlxdWVtZW50LCBzYXVmIHNpIHZvdXMgbOKAmWFubnVsZXogZGVwdWlzIGxlIFBvcnRhaWwgdXRpbGlzYXRldXIuJywKICAgICAgICAndGlwLnJlbW90ZURlc2t0b3AnOiAnQ29ubmVjdGV6LXZvdXMgYXZlYyBsZSBsb2dpY2llbCBkZSBidXJlYXUgw6AgZGlzdGFuY2UgRGVza0luLiBBcHLDqHMgbOKAmWFjaGF0LCB2b3VzIHJlY2V2cmV6IHZvcyBpZGVudGlmaWFudHMgcGFyIGUtbWFpbC4gRGVza0luIG9mZnJlIGxhIGZyw6lxdWVuY2UgZOKAmWltYWdlcyBsYSBwbHVzIMOpbGV2w6llIGV0IGxhIGxhdGVuY2UgbGEgcGx1cyBmYWlibGUgZGVzIGxvZ2ljaWVscyBkZSBidXJlYXUgw6AgZGlzdGFuY2UuJywKICAgICAgICAndGlwLnNzaCc6ICdBY2PDqHMgY29tcGxldCBhdSB0ZXJtaW5hbCBTU0ggZGUgdm90cmUgTWFjIHBvdXIgbGUgZMOpdmVsb3BwZW1lbnQgw6AgZGlzdGFuY2UsIGxlcyBidWlsZHMgZXQgbGVzIHRyYW5zZmVydHMgZGUgZmljaGllcnMgKHNjcC9zZnRwKS4gQ29ubmVjdGV6LXZvdXMgZGVwdWlzIG7igJlpbXBvcnRlIHF1ZWwgdGVybWluYWwgYXZlYyBsZXMgaWRlbnRpZmlhbnRzIGZvdXJuaXMgYXByw6hzIGzigJlhY2hhdC4nLAogICAgICAgICd0aXAuYWRtaW4nOiAnUHJpdmlsw6hnZXMgYWRtaW5pc3RyYXRldXIgY29tcGxldHMgKGFjY8OocyByb290KSwgc2FucyByZXN0cmljdGlvbi4gSW5zdGFsbGV6IG7igJlpbXBvcnRlIHF1ZWwgbG9naWNpZWwsIGNvbmZpZ3VyZXogdm9zIGVudmlyb25uZW1lbnRzIGRlIGTDqXZlbG9wcGVtZW50IGV0IGdhcmRleiBsZSBjb250csO0bGUgdG90YWwgZHUgc3lzdMOobWUuJywKICAgICAgICAndGlwLmRlZGljYXRlZCc6ICdMZSB7bW9kZWx9IHZvdXMgZXN0IGVudGnDqHJlbWVudCBkw6lkacOpIDogcGFzIGRlIG1hY2hpbmUgdmlydHVlbGxlIG5pIGTigJllbnZpcm9ubmVtZW50IG11bHRpLXV0aWxpc2F0ZXVyLiBUb3V0ZSBsYSBtYWNoaW5lIHBoeXNpcXVlIGVzdCDDoCB2b3RyZSB1c2FnZSBleGNsdXNpZi4nLAogICAgICAgICd0aXAuaW1tZWRpYXRlJzogJ0xlcyBpbnN0YW5jZXMgdG91cm5lbnQgZMOpasOgLiBWb3VzIHJlY2V2ZXogdm9zIGlkZW50aWZpYW50cyBkw6hzIGxlIHBhaWVtZW50IGV0IHBvdXZleiB1dGlsaXNlciB2b3RyZSBNYWMgaW1tw6lkaWF0ZW1lbnQsIHNhbnMgYXR0ZW50ZS4nLAogICAgICAgICd0aXAubmV0d29yayc6ICdDb25uZXhpb24gaGF1dCBkw6liaXQgZGVwdWlzIG5vdHJlIGRhdGFjZW50ZXIgZGUgQ2h5cHJlIDoganVzcXXigJnDoCAxIEdiaXQvcyBlbiB0w6lsw6ljaGFyZ2VtZW50IGV0IH4yMDAgTWJpdC9zIGVuIGVudm9pLiBJZMOpYWwgcG91ciBsZXMgZ3JvcyB0cmFuc2ZlcnRzIGRlIGZpY2hpZXJzIGV0IGxlcyB3b3JrZmxvd3MgQ0kvQ0QuJywKICAgICAgICAndGlwLnhjb2RlJzogJ0NoYXF1ZSBNYWMgZXN0IGxpdnLDqSBhdmVjIFhjb2RlIGTDqWrDoCBpbnN0YWxsw6kgZXQgcHLDqnQgw6AgbOKAmWVtcGxvaS4gQ29tcGlsZXogZXQgbGFuY2V6IHZvcyBhcHBzIGlPUyBldCBtYWNPUyB0b3V0IGRlIHN1aXRlLCBzYW5zIGxvbmcgdMOpbMOpY2hhcmdlbWVudCBuaSBjb25maWd1cmF0aW9uLicsCiAgICAgICAgJ3RpcC5zaXAnOiAnQ29tbWUgU0lQIGludHJvZHVpdCB1biByaXNxdWUgbWF0w6lyaWVsIHN1cHBsw6ltZW50YWlyZSwgbm91cyBuZSBwcm9wb3NvbnMgc2EgcGVyc29ubmFsaXNhdGlvbiBxdWUgc3VyIGxlcyBmb3JmYWl0cyBkZSA2IG1vaXMuIEFwcsOocyBs4oCZYWNoYXQsIGNvbnRhY3RleiBsZSBzdXBwb3J0IHBvdXIgbOKAmWFjdGl2ZXIsIGNhciBlbGxlIG7DqWNlc3NpdGUgdW5lIGludGVydmVudGlvbiBtYW51ZWxsZS4nLAogICAgICAgICdzcGVjLmFjY2Vzcyc6ICdBY2PDqHMnLAogICAgICAgICdzcGVjLm1hY2hpbmUnOiAnTWFjaGluZScsCiAgICAgICAgJ3NwZWMubmV0d29yayc6ICdSw6lzZWF1JywKICAgICAgICAnc3BlYy5wbGFuJzogJ0ZvcmZhaXQnLAogICAgICAgICdzcGVjLmV4dHJhJzogJ0JvbnVzJywKICAgICAgICAnc3BlYy5yZW1vdGVEZXNrdG9wJzogJ0J1cmVhdSDDoCBkaXN0YW5jZScsCiAgICAgICAgJ3NwZWMuZGVkaWNhdGVkJzogJ01hYyBtaW5pIGTDqWRpw6knLAogICAgICAgICdzcGVjLmluc3RhbnRTZXR1cCc6ICdNaXNlIGVuIHNlcnZpY2UgaW1tw6lkaWF0ZScsCiAgICAgICAgJ3NwZWMubmV0d29ya1ZhbHVlJzogJzEgR2JpdC9zIGRlc2NlbmRhbnQgwrcgMjAwIE1iaXQvcyBtb250YW50JywKICAgICAgICAnc3BlYy5zaXAnOiAnUGVyc29ubmFsaXNhdGlvbiBkZSBTSVAnCiAgICAgIH0sCiAgICAgIHB0OiB7CiAgICAgICAgJ2N5Y2xlLmRhaWx5JzogJ0Rpw6FyaW8nLAogICAgICAgICdjeWNsZS53ZWVrbHknOiAnU2VtYW5hbCcsCiAgICAgICAgJ2N5Y2xlLm1vbnRobHknOiAnTWVuc2FsJywKICAgICAgICAnY3ljbGUuM21vbnRoJzogJzMgbWVzZXMnLAogICAgICAgICdjeWNsZS42bW9udGgnOiAnNiBtZXNlcycsCiAgICAgICAgJ2JpbGxlZC5kYWlseSc6ICdDb2JyYWRvIGRpYXJpYW1lbnRlJywKICAgICAgICAnYmlsbGVkLndlZWtseSc6ICdDb2JyYWRvIHNlbWFuYWxtZW50ZScsCiAgICAgICAgJ2JpbGxlZC5tb250aGx5JzogJ0NvYnJhZG8gbWVuc2FsbWVudGUnLAogICAgICAgICdiaWxsZWQuM21vbnRoJzogJ0NvYnJhZG8gYSBjYWRhIDMgbWVzZXMnLAogICAgICAgICdiaWxsZWQuNm1vbnRoJzogJ0NvYnJhZG8gYSBjYWRhIDYgbWVzZXMnLAogICAgICAgICdhY2Nlc3MuZGFpbHknOiAnMjQgaG9yYXMgZGUgYWNlc3NvJywKICAgICAgICAnYWNjZXNzLndlZWtseSc6ICc3IGRpYXMgZGUgYWNlc3NvJywKICAgICAgICAnYWNjZXNzLm1vbnRobHknOiAnMSBtw6pzIGRlIGFjZXNzbycsCiAgICAgICAgJ2FjY2Vzcy4zbW9udGgnOiAnMyBtZXNlcyBkZSBhY2Vzc28nLAogICAgICAgICdhY2Nlc3MuNm1vbnRoJzogJzYgbWVzZXMgZGUgYWNlc3NvJywKICAgICAgICAncmVuZXdzLmRhaWx5JzogJ1Jlbm92YSBkaWFyaWFtZW50ZScsCiAgICAgICAgJ3JlbmV3cy53ZWVrbHknOiAnUmVub3ZhIHNlbWFuYWxtZW50ZScsCiAgICAgICAgJ3JlbmV3cy5tb250aGx5JzogJ1Jlbm92YSBtZW5zYWxtZW50ZScsCiAgICAgICAgJ3JlbmV3cy4zbW9udGgnOiAnUmVub3ZhIGEgY2FkYSAzIG1lc2VzJywKICAgICAgICAncmVuZXdzLjZtb250aCc6ICdSZW5vdmEgYSBjYWRhIDYgbWVzZXMnLAogICAgICAgICdyZW5ld0xpbmUnOiAne3JlbmV3c30gwrcgQ2FuY2VsZSBxdWFuZG8gcXVpc2VyJywKICAgICAgICAncGVyRGF5JzogJ3twcmljZX0vZGlhJywKICAgICAgICAncG9wdWxhcic6ICdQb3B1bGFyJywKICAgICAgICAnc2F2ZSc6ICdFY29ub21pemUge3BjdH0lJywKICAgICAgICAnc3RvcmFnZS5zaXplJzogJ3tzaXplfSBHQicsCiAgICAgICAgJ3N0b3JhZ2UuYmFzZSc6ICdTU0QgaW50ZXJubycsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb24yNTYnOiAnMjU2IEdCICsgMjU2IEdCIGV4dGVybm8nLAogICAgICAgICdzdG9yYWdlLmFkZG9uNTEyJzogJzI1NiBHQiArIDUxMiBHQiBleHRlcm5vJywKICAgICAgICAnc3RvcmFnZS5zb2xkT3V0JzogJ0VzZ290YWRvJywKICAgICAgICAnc3RvcmFnZS5wZXJNb250aCc6ICcre3ByaWNlfS9tw6pzJywKICAgICAgICAnc3RvcmFnZS5pbmNsdWRlZCc6ICdJbmNsdcOtZG8nLAogICAgICAgICdzdG9yYWdlLmRlZmF1bHQnOiAnUGFkcsOjbycsCiAgICAgICAgJ3N0b3JhZ2Uubm90ZSc6ICdJbmNsdWkgYXJtYXplbmFtZW50byB7bGFiZWx9ICgre3ByaWNlfSknLAogICAgICAgICd0aXAuc3RvcmFnZUVsc2V3aGVyZSc6ICdFc2dvdGFkbyB7aW5IZXJlfS4gRGlzcG9uw612ZWwgZW06IHtuYW1lc30uJywKICAgICAgICAndGlwLnN0b3JhZ2VOb25lJzogJ0luZGlzcG9uw612ZWwgZGV2aWRvIMOgIGFsdGEgZGVtYW5kYS4nLAogICAgICAgICd0aXAuZGFpbHlFbHNld2hlcmUnOiAnTyBwbGFubyBkacOhcmlvIGVzdMOhIGVzZ290YWRvIHtpbkhlcmV9LiBEaXNwb27DrXZlbCBlbToge25hbWVzfS4nLAogICAgICAgICd0aXAuZGFpbHlOb25lJzogJ0Rlc2F0aXZhZG8gcXVhbmRvIGEgZGlzcG9uaWJpbGlkYWRlIGVzdMOhIGJhaXhhLiBFbnRyZSBuYSBsaXN0YSBkZSBlc3BlcmEgcGFyYSBzZXIgYXZpc2Fkby4nLAogICAgICAgICd0aXAubW9kZWxOb3RIZXJlJzogJ08ge21vZGVsfSBhaW5kYSBuw6NvIGVzdMOhIGRpc3BvbsOtdmVsIGFxdWknLAogICAgICAgICdjb250aW5lbnQuY3lwcnVzJzogJ0V1cm9wYScsCiAgICAgICAgJ2NvbnRpbmVudC51c2EnOiAnRXN0YWRvcyBVbmlkb3MnLAogICAgICAgICdjb250aW5lbnQuaW5kaWEnOiAnw4FzaWEnLAogICAgICAgICdjb3VudHJ5LmN5cHJ1cyc6ICdDaGlwcmUnLAogICAgICAgICdjb3VudHJ5LnVzYSc6ICdFVUFcdTAwYTDCtyBUZXhhcycsCiAgICAgICAgJ2NvdW50cnkuaW5kaWEnOiAnw41uZGlhJywKICAgICAgICAnaW4uY3lwcnVzJzogJ2VtIHtuYW1lfScsCiAgICAgICAgJ2luLnVzYSc6ICdub3Mge25hbWV9JywKICAgICAgICAnaW4uaW5kaWEnOiAnbmEge25hbWV9JywKICAgICAgICAndGhpc1JlZ2lvbic6ICdlc3RhIHJlZ2nDo28nLAogICAgICAgICdsaXN0U2VwJzogJywgJywKICAgICAgICAnbGlzdEFuZCc6ICcgZSAnLAogICAgICAgICdiYWRnZS5uZXcnOiAnTm92bycsCiAgICAgICAgJ2JhZGdlLnNvb24nOiAnRW0gYnJldmUnLAogICAgICAgICdub3RlLm00T25seSc6ICdQb3IgZW5xdWFudG8sIHPDsyB0ZW1vcyBvIE1hYyBtaW5pIE00IHtpblJlZ2lvbn0sIGVudMOjbyBtdWRhbW9zIHZvY8OqIHBhcmEgbyBNNC4nLAogICAgICAgICdub3RlLmxvY2F0aW9uU3dpdGNoZWQnOiAnTyB7bW9kZWx9IGFpbmRhIG7Do28gZXN0w6EgZGlzcG9uw612ZWwge2luUHJldmlvdXN9LCBlbnTDo28gc2VsZWNpb25hbW9zIHtyZWdpb259IGNvbW8gc3VhIGxvY2FsaXphw6fDo28uJywKICAgICAgICAnY3RhLmJ1eSc6ICdDb21wcmFyIHBsYW5vJywKICAgICAgICAnY3RhLndhaXRsaXN0JzogJ0VudHJhciBuYSBsaXN0YSBkZSBlc3BlcmEnLAogICAgICAgICdjdGEuc3RhcnRpbmcnOiAnSW5pY2lhbmRvIG8gY2hlY2tvdXTigKYnLAogICAgICAgICdjaGVja291dC5ub0xvY2F0aW9uJzogJ0Vzc2EgbG9jYWxpemHDp8OjbyBhaW5kYSBuw6NvIGVzdMOhIGRpc3BvbsOtdmVsLicsCiAgICAgICAgJ2NoZWNrb3V0LmZhaWxlZCc6ICdOw6NvIGZvaSBwb3Nzw612ZWwgaW5pY2lhciBvIGNoZWNrb3V0LiBUZW50ZSBub3ZhbWVudGUuJywKICAgICAgICAnY2hlY2tvdXQudG9vTWFueSc6ICdNdWl0YXMgdGVudGF0aXZhcyBkZSBjaGVja291dC4gQWd1YXJkZSB1bSBtb21lbnRvIGUgdGVudGUgbm92YW1lbnRlLicsCiAgICAgICAgJ2RpYWxvZy5zb29uVGl0bGUnOiAnTyB7bW9kZWx9IGNoZWdhIGVtIGJyZXZlJywKICAgICAgICAnZGlhbG9nLnNvb25EZXNjJzogJ0RlaXhlIHNldSBlLW1haWwgYWJhaXhvIGUgYXZpc2FyZW1vcyB2b2PDqiBhc3NpbSBxdWUgZWxlIGVzdGl2ZXIgZGlzcG9uw612ZWwuJywKICAgICAgICAnZGlhbG9nLmRhaWx5VGl0bGUnOiAnUGxhbm8gZGnDoXJpbyB0ZW1wb3JhcmlhbWVudGUgaW5kaXNwb27DrXZlbCcsCiAgICAgICAgJ2RpYWxvZy5kYWlseURlc2MnOiAnTyBwbGFubyBkacOhcmlvIGVzdMOhIGluZGlzcG9uw612ZWwgbm8gbW9tZW50byBkZXZpZG8gw6AgYWx0YSBkZW1hbmRhLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseURlc2NIZXJlJzogJ08gcGxhbm8gZGnDoXJpbyBlc3TDoSBpbmRpc3BvbsOtdmVsIHtpbkhlcmV9IG5vIG1vbWVudG8gZGV2aWRvIMOgIGFsdGEgZGVtYW5kYS4nLAogICAgICAgICdkaWFsb2cuZGFpbHlPdGhlcnMnOiAnIE9zIHBsYW5vcyBzZW1hbmFsLCBtZW5zYWwgZSBtYWlzIGxvbmdvcyBjb250aW51YW0gZGlzcG9uw612ZWlzLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU5vdGlmeSc6ICcgRGVpeGUgc2V1IGUtbWFpbCBhYmFpeG8gZSBhdmlzYXJlbW9zIHZvY8OqIGFzc2ltIHF1ZSBvIHBsYW5vIGRpw6FyaW8gdm9sdGFyLicsCiAgICAgICAgJ2RpYWxvZy5zdG9yYWdlVGl0bGUnOiAnRXN0YSBvcMOnw6NvIGRlIGFybWF6ZW5hbWVudG8gZXN0w6EgaW5kaXNwb27DrXZlbCBubyBtb21lbnRvJywKICAgICAgICAnZGlhbG9nLnN0b3JhZ2VEZXNjJzogJ1RvZG9zIG9zIE1hY3MgY29tIGVzdGEgY29uZmlndXJhw6fDo28gZGUgZGlzY28ge2luSGVyZX0gZXN0w6NvIGFsb2NhZG9zIGFnb3JhLiBEZWl4ZSBzZXUgZS1tYWlsIGFiYWl4byBlIGF2aXNhcmVtb3Mgdm9jw6ogYXNzaW0gcXVlIHVtIGRlbGVzIGZvciBsaWJlcmFkby4nLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGUnOiAnVG9kYXMgYXMgaW5zdMOibmNpYXMgZXN0w6NvIGFsb2NhZGFzIG5vIG1vbWVudG8nLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGVIZXJlJzogJ1RvZGFzIGFzIGluc3TDom5jaWFzIHtpbkhlcmV9IGVzdMOjbyBhbG9jYWRhcyBubyBtb21lbnRvJywKICAgICAgICAnZGlhbG9nLm1vZGVsVGl0bGUnOiAnVG9kYXMgYXMgaW5zdMOibmNpYXMgZG8ge21vZGVsfSBlc3TDo28gYWxvY2FkYXMgbm8gbW9tZW50bycsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlSGVyZSc6ICdUb2RhcyBhcyBpbnN0w6JuY2lhcyBkbyB7bW9kZWx9IHtpbkhlcmV9IGVzdMOjbyBhbG9jYWRhcyBubyBtb21lbnRvJywKICAgICAgICAnZGlhbG9nLmFsbERlc2MnOiAnRXN0YW1vcyBjb20gYSBjYXBhY2lkYWRlIG3DoXhpbWEgbm8gbW9tZW50bywgbWFzIHBvZGVtb3MgYXZpc2FyIHZvY8OqIGFzc2ltIHF1ZSB1bSBNYWMgZmljYXIgZGlzcG9uw612ZWwgbm92YW1lbnRlLiBEZWl4ZSBzZXUgZS1tYWlsIGFiYWl4byBlIHZvY8OqIHNlcsOhIG8gcHJpbWVpcm8gZGEgZmlsYSBxdWFuZG8gYXRpdmFybW9zIG5vdmFzIGluc3TDom5jaWFzLicsCiAgICAgICAgJ2RpYWxvZy5hbGxEZXNjSGVyZSc6ICdFc3RhbW9zIGNvbSBhIGNhcGFjaWRhZGUgbcOheGltYSB7aW5IZXJlfSBubyBtb21lbnRvLCBtYXMgcG9kZW1vcyBhdmlzYXIgdm9jw6ogYXNzaW0gcXVlIHVtIE1hYyBmaWNhciBkaXNwb27DrXZlbCBub3ZhbWVudGUuIERlaXhlIHNldSBlLW1haWwgYWJhaXhvIGUgdm9jw6ogc2Vyw6EgbyBwcmltZWlybyBkYSBmaWxhIHF1YW5kbyBhdGl2YXJtb3Mgbm92YXMgaW5zdMOibmNpYXMuJywKICAgICAgICAnYWx0LmRhaWx5JzogJ1ByZWZlcmUgbsOjbyBlc3BlcmFyPyBPIHBsYW5vIGRpw6FyaW8gZXN0w6EgZGlzcG9uw612ZWwgYWdvcmEgZW06IHtuYW1lc30uJywKICAgICAgICAnYWx0LmNvbmZpZyc6ICdQcmVmZXJlIG7Do28gZXNwZXJhcj8gRXN0YSBjb25maWd1cmHDp8OjbyBlc3TDoSBkaXNwb27DrXZlbCBhZ29yYSBlbToge25hbWVzfS4nLAogICAgICAgICdhbHQuYW55JzogJ1ByZWZlcmUgbsOjbyBlc3BlcmFyPyBIw6EgTWFjcyBkaXNwb27DrXZlaXMgYWdvcmEgZW06IHtuYW1lc30uJywKICAgICAgICAnYWx0LnN3aXRjaCc6ICdFc2NvbGhlciB7cmVnaW9ufScsCiAgICAgICAgJ3hhbHQubGVhZFJlZ2lvbic6ICdPIHttb2RlbH0gZXN0w6EgZXNnb3RhZG8ge2luSGVyZX0uJywKICAgICAgICAneGFsdC5hdmFpbGFibGVOb3cnOiAnRGlzcG9uw612ZWwgYWdvcmE6JywKICAgICAgICAneGFsdC5sZWFkRGFpbHknOiAnTyBwbGFubyBkacOhcmlvIGRvIHttb2RlbH0gZXN0w6EgZXNnb3RhZG8ge2luSGVyZX0uJywKICAgICAgICAneGFsdC5sZWFkQmFzZSc6ICdPIHttb2RlbH0gc2VtIGRpc2NvIGV4dGVybm8gZXN0w6EgZXNnb3RhZG8ge2luSGVyZX0uJywKICAgICAgICAneGFsdC5sZWFkU3RvcmFnZSc6ICdPIHttb2RlbH0gY29tIHtzdG9yYWdlfSBlc3TDoSBlc2dvdGFkbyB7aW5IZXJlfS4nLAogICAgICAgICd3YWl0bGlzdC5ub3RpZnknOiAnTm90aWZpcXVlLW1lJywKICAgICAgICAnd2FpdGxpc3QuY2xvc2UnOiAnRmVjaGFyJywKICAgICAgICAnd2FpdGxpc3QuaW52YWxpZEVtYWlsJzogJ0luc2lyYSB1bSBlbmRlcmXDp28gZGUgZS1tYWlsIHbDoWxpZG8uJywKICAgICAgICAnd2FpdGxpc3Quc2F2aW5nJzogJ1NhbHZhbmRvIHN1YSBzb2xpY2l0YcOnw6NvLi4uJywKICAgICAgICAnd2FpdGxpc3QudG9vRmFzdCc6ICdNdWl0YXMgdGVudGF0aXZhcy4gVGVudGUgbm92YW1lbnRlIG1haXMgdGFyZGUuJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkTGF0ZXInOiAnRGVzY3VscGUsIGFsZ28gZGV1IGVycmFkby4gVGVudGUgbm92YW1lbnRlIG1haXMgdGFyZGUuJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkJzogJ0Rlc2N1bHBlLCBhbGdvIGRldSBlcnJhZG8uJywKICAgICAgICAnd2FpdGxpc3Quc3VjY2Vzcyc6ICdWb2PDqiBlc3TDoSBuYSBsaXN0YSEgRW52aWFyZW1vcyB1bSBlLW1haWwgYXNzaW0gcXVlIHVtIE1hYyBmaWNhciBkaXNwb27DrXZlbC4nLAogICAgICAgICd3YWl0bGlzdC5oaW50JzogJ1PDsyBlbnZpYW1vcyBlLW1haWxzIHNvYnJlIGRpc3BvbmliaWxpZGFkZS4nLAogICAgICAgICdub3RpY2Uuc29sZE91dCc6ICdUb2RvcyBvcyBNYWNzIHtpbkhlcmV9IGVzdMOjbyBhbG9jYWRvcyBubyBtb21lbnRvLiBEaXNwb27DrXZlaXMgYWdvcmEgZW06IHtsaW5rc30uIE91IGVudHJlIG5hIGxpc3RhIGRlIGVzcGVyYSAoe2hlcmV9KSBhYmFpeG8uJywKICAgICAgICAnbm90aWNlLm1vZGVsU29sZE91dCc6ICdUb2RvcyBvcyB7bW9kZWx9IHtpbkhlcmV9IGVzdMOjbyBhbG9jYWRvcyBubyBtb21lbnRvLiBEaXNwb27DrXZlaXMgYWdvcmEgZW06IHtsaW5rc30uIE91IGVudHJlIG5hIGxpc3RhIGRlIGVzcGVyYSAoe2hlcmV9KSBhYmFpeG8uJywKICAgICAgICAnbm90aWNlLmN0YUFsdCc6ICdvdSB7bGlua30nLAogICAgICAgICdub3RpY2UuY3RhQWx0TGluayc6ICdnYXJhbnRhIGFnb3JhIHVtIE1hYyB7aW5SZWdpb259JywKICAgICAgICAnbm90aWNlLmRhaWx5U29sZE91dCc6ICdPIHBsYW5vIGRpw6FyaW8gZXN0w6EgZXNnb3RhZG8ge2luSGVyZX0uIERpc3BvbsOtdmVsIGFnb3JhIGVtOiB7bGlua3N9LiBPdSB7d2FpdGxpc3R9LicsCiAgICAgICAgJ25vdGljZS5qb2luV2FpdGxpc3QnOiAnZW50cmUgbmEgbGlzdGEgZGUgZXNwZXJhJywKICAgICAgICAnZW50ZXJwcmlzZS5vZmYnOiAne3BjdH0lIE9GRicsCiAgICAgICAgJ2VudGVycHJpc2UuYXBwbGllZCc6ICdEZXNjb250byBkZSB7cGN0fSUgYXBsaWNhZG8nLAogICAgICAgICdlbnRlcnByaXNlLnN0YW5kYXJkJzogJ1ByZcOnbyBwYWRyw6NvJywKICAgICAgICAnZW50ZXJwcmlzZS5wZXJJbnN0YW5jZSc6ICd7cHJpY2V9L23DqnMgcG9yIGluc3TDom5jaWEnLAogICAgICAgICdlbnRlcnByaXNlLnZvbHVtZVByaWNpbmcnOiAnUHJlw6dvcyBwb3Igdm9sdW1lJywKICAgICAgICAndGlsZS5wZXIuZGFpbHknOiAnL2RpYScsCiAgICAgICAgJ3RpbGUucGVyLndlZWtseSc6ICcvc2VtYW5hJywKICAgICAgICAndGlsZS5wZXIubW9udGhseSc6ICcvbcOqcycsCiAgICAgICAgJ3RpbGUucGVyLjNtb250aCc6ICcvMyBtZXNlcycsCiAgICAgICAgJ3RpbGUucGVyLjZtb250aCc6ICcvNiBtZXNlcycsCiAgICAgICAgJ3NwZWMuY2hpcE00JzogJ000IGRlIDEwIG7DumNsZW9zJywKICAgICAgICAnc3BlYy5jaGlwTTYnOiAnTTYgZGUgMTIgbsO6Y2xlb3MnLAogICAgICAgICdzcGVjLnJhbSc6ICcxNiBHQiBkZSBSQU0nLAogICAgICAgICdzcGVjLnNzZCc6ICdTU0QgZGUgMjU2IEdCJywKICAgICAgICAnc3BlYy5tYWNvcyc6ICdtYWNPUyAyNycsCiAgICAgICAgJ3RpcC5jaGlwTTQnOiAnQ2hpcCBBcHBsZSBNNCBjb20gQ1BVIGRlIDEwIG7DumNsZW9zICg0IGRlIGRlc2VtcGVuaG8gKyA2IGRlIGVmaWNpw6puY2lhKSBlIEdQVSBkZSAxMCBuw7pjbGVvcy4gT2ZlcmVjZSBkZXNlbXBlbmhvIGV4Y2VwY2lvbmFsIGVtIHVtIG91IHbDoXJpb3MgbsO6Y2xlb3MgcGFyYSBkZXNlbnZvbHZpbWVudG8sIGJ1aWxkcyBlIHRyYWJhbGhvcyBjcmlhdGl2b3MuJywKICAgICAgICAndGlwLmNoaXBNNic6ICdDaGlwIEFwcGxlIE02IGZhYnJpY2FkbyBlbSAyIG5tLCBjb20gQ1BVIGRlIDEyIG7DumNsZW9zICgyIHN1cGVyIG7DumNsZW9zLCA0IGRlIGRlc2VtcGVuaG8gZSA2IGRlIGVmaWNpw6puY2lhKSBlIEdQVSBkZSAxMiBuw7pjbGVvcyBjb20gdW0gTmV1cmFsIEFjY2VsZXJhdG9yIGVtIGNhZGEgbsO6Y2xlbywgYWzDqW0gZGUgdW0gTmV1cmFsIEVuZ2luZSBkdXBsbyBkZSAxNiBuw7pjbGVvcy4gQSBBcHBsZSBjaXRhIHRhcmVmYXMgZGUgSUEgYXTDqSA0IHZlemVzIG1haXMgcsOhcGlkYXMgcXVlIG5vIE1hYyBtaW5pIGNvbSBNNCwgaWRlYWwgcGFyYSByb2RhciBtb2RlbG9zIGRlIElBIGUgaW5mZXLDqm5jaWEgZGUgTExNIG5vIHByw7NwcmlvIE1hYy4nLAogICAgICAgICd0aXAucmFtJzogJzE2IEdCIGRlIG1lbcOzcmlhIHVuaWZpY2FkYSBjb21wYXJ0aWxoYWRhIGVudHJlIENQVSBlIEdQVS4gQW8gY29udHLDoXJpbyBkYSBSQU0gdHJhZGljaW9uYWwsIGEgbWVtw7NyaWEgdW5pZmljYWRhIGRpc3BlbnNhIGEgY8OzcGlhIGRlIGRhZG9zIGVudHJlIHByb2Nlc3NhZG9yZXMsIG8gcXVlIHRyYXogbWFpcyBkZXNlbXBlbmhvIGUgZWZpY2nDqm5jaWEuJywKICAgICAgICAndGlwLnNzZCc6ICdTU0QgTlZNZSBpbnRlcm5vIGRlIDI1NiBHQiBjb20gdmVsb2NpZGFkZSBkZSBsZWl0dXJhIGRlIGF0w6kgMyw0IEdCL3MuIFLDoXBpZG8gbyBiYXN0YW50ZSBwYXJhIGJ1aWxkcyBkbyBYY29kZSwgY29udMOqaW5lcmVzIERvY2tlciBlIHByb2pldG9zIGdyYW5kZXMuIEFybWF6ZW5hbWVudG8gZXh0ZXJubyBhZGljaW9uYWwgZGlzcG9uw612ZWwgY29tbyBjb21wbGVtZW50by4nLAogICAgICAgICd0aXAubWFjb3MnOiAnbWFjT1MgMjcgKHZlcnPDo28gMjcuMCBvdSBwb3N0ZXJpb3IpLCBvIHNpc3RlbWEgb3BlcmFjaW9uYWwgbWFpcyByZWNlbnRlIGRhIEFwcGxlLiBJbmNsdWkgYXMgdmVyc8O1ZXMgbWFpcyBub3ZhcyBkbyBYY29kZSwgZG8gU3dpZnQgZSBkYXMgZmVycmFtZW50YXMgZGUgZGVzZW52b2x2aW1lbnRvLiBTZW1wcmUgYXR1YWxpemFkbyBjb20gb3MgcGF0Y2hlcyBkZSBzZWd1cmFuw6dhIG1haXMgcmVjZW50ZXMuJywKICAgICAgICAndGlwLmFjY2Vzcyc6ICdBY2Vzc28gY29udMOtbnVvIDI0LzcsIG7Do28gYXBlbmFzIGVtIGRpYXMgw7p0ZWlzIG91IGVtIGhvcsOhcmlvIGxpbWl0YWRvLiBTZXUgYWNlc3NvIGNvbWXDp2EgbG9nbyBhcMOzcyBvIHBhZ2FtZW50byBlIMOpIHJlbm92YWRvIGF1dG9tYXRpY2FtZW50ZSwgYSBtZW5vcyBxdWUgdm9jw6ogY2FuY2VsZSBubyBQb3J0YWwgZG8gVXN1w6FyaW8uJywKICAgICAgICAndGlwLnJlbW90ZURlc2t0b3AnOiAnQ29uZWN0ZS1zZSBwZWxvIHNvZnR3YXJlIGRlIMOhcmVhIGRlIHRyYWJhbGhvIHJlbW90YSBEZXNrSW4uIEFww7NzIGEgY29tcHJhLCB2b2PDqiByZWNlYmVyw6EgYXMgY3JlZGVuY2lhaXMgcG9yIGUtbWFpbC4gTyBEZXNrSW4gb2ZlcmVjZSBhIG1haW9yIHRheGEgZGUgcXVhZHJvcyBlIGEgbWVub3IgbGF0w6puY2lhIGVudHJlIG9zIHByb2dyYW1hcyBkZSDDoXJlYSBkZSB0cmFiYWxobyByZW1vdGEuJywKICAgICAgICAndGlwLnNzaCc6ICdBY2Vzc28gY29tcGxldG8gYW8gdGVybWluYWwgU1NIIGRvIHNldSBNYWMgcGFyYSBkZXNlbnZvbHZpbWVudG8gcmVtb3RvLCBidWlsZHMgZSB0cmFuc2ZlcsOqbmNpYSBkZSBhcnF1aXZvcyAoc2NwL3NmdHApLiBDb25lY3RlLXNlIGRlIHF1YWxxdWVyIHRlcm1pbmFsIGNvbSBhcyBjcmVkZW5jaWFpcyBmb3JuZWNpZGFzIGFww7NzIGEgY29tcHJhLicsCiAgICAgICAgJ3RpcC5hZG1pbic6ICdQcml2aWzDqWdpb3MgdG90YWlzIGRlIGFkbWluaXN0cmFkb3IgKGFjZXNzbyByb290KSwgc2VtIHJlc3RyacOnw7Vlcy4gSW5zdGFsZSBxdWFscXVlciBzb2Z0d2FyZSwgY29uZmlndXJlIHNldXMgYW1iaWVudGVzIGRlIGRlc2Vudm9sdmltZW50byBlIHRlbmhhIGNvbnRyb2xlIHRvdGFsIGRvIHNpc3RlbWEuJywKICAgICAgICAndGlwLmRlZGljYXRlZCc6ICdPIHttb2RlbH0gw6kgdG90YWxtZW50ZSBkZWRpY2FkbyBhIHZvY8OqOiBzZW0gbcOhcXVpbmFzIHZpcnR1YWlzIG5lbSBhbWJpZW50ZSBtdWx0aXVzdcOhcmlvLiBBIG3DoXF1aW5hIGbDrXNpY2EgaW50ZWlyYSBmaWNhIHBhcmEgc2V1IHVzbyBleGNsdXNpdm8uJywKICAgICAgICAndGlwLmltbWVkaWF0ZSc6ICdBcyBpbnN0w6JuY2lhcyBqw6EgZXN0w6NvIGVtIGZ1bmNpb25hbWVudG8uIFZvY8OqIHJlY2ViZSBhcyBjcmVkZW5jaWFpcyBsb2dvIGFww7NzIG8gcGFnYW1lbnRvIGUgcG9kZSBjb21lw6dhciBhIHVzYXIgc2V1IE1hYyBuYSBob3JhLCBzZW0gZXNwZXJhLicsCiAgICAgICAgJ3RpcC5uZXR3b3JrJzogJ0NvbmV4w6NvIGRlIGFsdGEgdmVsb2NpZGFkZSBhIHBhcnRpciBkbyBub3NzbyBkYXRhY2VudGVyIGVtIENoaXByZTogYXTDqSAxIEdicHMgZGUgZG93bmxvYWQgZSB+MjAwIE1icHMgZGUgdXBsb2FkLiBJZGVhbCBwYXJhIHRyYW5zZmVyaXIgYXJxdWl2b3MgZ3JhbmRlcyBlIHBhcmEgZmx1eG9zIGRlIENJL0NELicsCiAgICAgICAgJ3RpcC54Y29kZSc6ICdUb2RvIE1hYyB2ZW0gY29tIG8gWGNvZGUgasOhIGluc3RhbGFkbyBlIHByb250byBwYXJhIHVzby4gQ29tZWNlIGEgY29tcGlsYXIgZSBleGVjdXRhciBhcHBzIHBhcmEgaU9TIGUgbWFjT1MgaW1lZGlhdGFtZW50ZSwgc2VtIGRvd25sb2FkcyBvdSBjb25maWd1cmHDp8O1ZXMgZGVtb3JhZGFzLicsCiAgICAgICAgJ3RpcC5zaXAnOiAnQ29tbyBvIFNJUCB0cmF6IHVtIHJpc2NvIGFkaWNpb25hbCBhbyBoYXJkd2FyZSwgb2ZlcmVjZW1vcyBhIHBlcnNvbmFsaXphw6fDo28gYXBlbmFzIG5vcyBwbGFub3MgZGUgNiBtZXNlcy4gQXDDs3MgYSBjb21wcmEsIGZhbGUgY29tIG8gc3Vwb3J0ZSBwYXJhIGF0aXbDoS1sYSwgcG9pcyBlbGEgZXhpZ2UgaW50ZXJ2ZW7Dp8OjbyBtYW51YWwuJywKICAgICAgICAnc3BlYy5hY2Nlc3MnOiAnQWNlc3NvJywKICAgICAgICAnc3BlYy5tYWNoaW5lJzogJ03DoXF1aW5hJywKICAgICAgICAnc3BlYy5uZXR3b3JrJzogJ1JlZGUnLAogICAgICAgICdzcGVjLnBsYW4nOiAnUGxhbm8nLAogICAgICAgICdzcGVjLmV4dHJhJzogJ0V4dHJhJywKICAgICAgICAnc3BlYy5yZW1vdGVEZXNrdG9wJzogJ8OBcmVhIGRlIHRyYWJhbGhvIHJlbW90YScsCiAgICAgICAgJ3NwZWMuZGVkaWNhdGVkJzogJ01hYyBtaW5pIGRlZGljYWRvJywKICAgICAgICAnc3BlYy5pbnN0YW50U2V0dXAnOiAnQ29uZmlndXJhw6fDo28gaW5zdGFudMOibmVhJywKICAgICAgICAnc3BlYy5uZXR3b3JrVmFsdWUnOiAnMSBHYnBzIGRlIGRvd25sb2FkIMK3IDIwMCBNYnBzIGRlIHVwbG9hZCcsCiAgICAgICAgJ3NwZWMuc2lwJzogJ1BlcnNvbmFsaXphw6fDo28gZG8gU0lQJwogICAgICB9LAogICAgICB0cjogewogICAgICAgICdjeWNsZS5kYWlseSc6ICdHw7xubMO8aycsCiAgICAgICAgJ2N5Y2xlLndlZWtseSc6ICdIYWZ0YWzEsWsnLAogICAgICAgICdjeWNsZS5tb250aGx5JzogJ0F5bMSxaycsCiAgICAgICAgJ2N5Y2xlLjNtb250aCc6ICczIEF5bMSxaycsCiAgICAgICAgJ2N5Y2xlLjZtb250aCc6ICc2IEF5bMSxaycsCiAgICAgICAgJ2JpbGxlZC5kYWlseSc6ICdHw7xubMO8ayBmYXR1cmFsYW5kxLFyxLFsxLFyJywKICAgICAgICAnYmlsbGVkLndlZWtseSc6ICdIYWZ0YWzEsWsgZmF0dXJhbGFuZMSxcsSxbMSxcicsCiAgICAgICAgJ2JpbGxlZC5tb250aGx5JzogJ0F5bMSxayBmYXR1cmFsYW5kxLFyxLFsxLFyJywKICAgICAgICAnYmlsbGVkLjNtb250aCc6ICczIGF5ZGEgYmlyIGZhdHVyYWxhbmTEsXLEsWzEsXInLAogICAgICAgICdiaWxsZWQuNm1vbnRoJzogJzYgYXlkYSBiaXIgZmF0dXJhbGFuZMSxcsSxbMSxcicsCiAgICAgICAgJ2FjY2Vzcy5kYWlseSc6ICcyNCBzYWF0IGVyacWfaW0nLAogICAgICAgICdhY2Nlc3Mud2Vla2x5JzogJzcgZ8O8biBlcmnFn2ltJywKICAgICAgICAnYWNjZXNzLm1vbnRobHknOiAnMSBheWzEsWsgZXJpxZ9pbScsCiAgICAgICAgJ2FjY2Vzcy4zbW9udGgnOiAnMyBheWzEsWsgZXJpxZ9pbScsCiAgICAgICAgJ2FjY2Vzcy42bW9udGgnOiAnNiBheWzEsWsgZXJpxZ9pbScsCiAgICAgICAgJ3JlbmV3cy5kYWlseSc6ICdIZXIgZ8O8biB5ZW5pbGVuaXInLAogICAgICAgICdyZW5ld3Mud2Vla2x5JzogJ0hlciBoYWZ0YSB5ZW5pbGVuaXInLAogICAgICAgICdyZW5ld3MubW9udGhseSc6ICdIZXIgYXkgeWVuaWxlbmlyJywKICAgICAgICAncmVuZXdzLjNtb250aCc6ICczIGF5ZGEgYmlyIHllbmlsZW5pcicsCiAgICAgICAgJ3JlbmV3cy42bW9udGgnOiAnNiBheWRhIGJpciB5ZW5pbGVuaXInLAogICAgICAgICdyZW5ld0xpbmUnOiAne3JlbmV3c30gwrcgxLBzdGVkacSfaW5peiB6YW1hbiBpcHRhbCBlZGluJywKICAgICAgICAncGVyRGF5JzogJ3twcmljZX0vZ8O8bicsCiAgICAgICAgJ3BvcHVsYXInOiAnUG9ww7xsZXInLAogICAgICAgICdzYXZlJzogJyV7cGN0fSB0YXNhcnJ1ZicsCiAgICAgICAgJ3N0b3JhZ2Uuc2l6ZSc6ICd7c2l6ZX0gR0InLAogICAgICAgICdzdG9yYWdlLmJhc2UnOiAnRGFoaWxpIFNTRCcsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb24yNTYnOiAnMjU2IEdCICsgMjU2IEdCIGhhcmljaScsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb241MTInOiAnMjU2IEdCICsgNTEyIEdCIGhhcmljaScsCiAgICAgICAgJ3N0b3JhZ2Uuc29sZE91dCc6ICdUw7xrZW5kaScsCiAgICAgICAgJ3N0b3JhZ2UucGVyTW9udGgnOiAnK3twcmljZX0vYXknLAogICAgICAgICdzdG9yYWdlLmluY2x1ZGVkJzogJ0RhaGlsJywKICAgICAgICAnc3RvcmFnZS5kZWZhdWx0JzogJ1ZhcnNhecSxbGFuJywKICAgICAgICAnc3RvcmFnZS5ub3RlJzogJ3tsYWJlbH0gZGVwb2xhbWEgZGFoaWwgKCt7cHJpY2V9KScsCiAgICAgICAgJ3RpcC5zdG9yYWdlRWxzZXdoZXJlJzogJ3tpbkhlcmV9IHTDvGtlbmRpLiBNZXZjdXQgb2xkdcSfdSBrb251bWxhcjoge25hbWVzfS4nLAogICAgICAgICd0aXAuc3RvcmFnZU5vbmUnOiAnWW\/En3VuIHRhbGVwIG5lZGVuaXlsZSBtZXZjdXQgZGXEn2lsLicsCiAgICAgICAgJ3RpcC5kYWlseUVsc2V3aGVyZSc6ICdHw7xubMO8ayBwbGFuIHtpbkhlcmV9IHTDvGtlbmRpLiBNZXZjdXQgb2xkdcSfdSBrb251bWxhcjoge25hbWVzfS4nLAogICAgICAgICd0aXAuZGFpbHlOb25lJzogJ03DvHNhaXRsaWsgZMO8xZ\/DvGsgb2xkdcSfdW5kYSBkZXZyZSBkxLHFn8SxIGthbMSxci4gSGFiZXIgYWxtYWsgacOnaW4gYmVrbGVtZSBsaXN0ZXNpbmUga2F0xLFsxLFuLicsCiAgICAgICAgJ3RpcC5tb2RlbE5vdEhlcmUnOiAne21vZGVsfSBoZW7DvHogYnVyYWRhIG1ldmN1dCBkZcSfaWwnLAogICAgICAgICdjb250aW5lbnQuY3lwcnVzJzogJ0F2cnVwYScsCiAgICAgICAgJ2NvbnRpbmVudC51c2EnOiAnQUJEJywKICAgICAgICAnY29udGluZW50LmluZGlhJzogJ0FzeWEnLAogICAgICAgICdjb3VudHJ5LmN5cHJ1cyc6ICdLxLFicsSxcycsCiAgICAgICAgJ2NvdW50cnkudXNhJzogJ0FCRFx1MDBhMMK3IFRla3NhcycsCiAgICAgICAgJ2NvdW50cnkuaW5kaWEnOiAnSGluZGlzdGFuJywKICAgICAgICAnaW4uY3lwcnVzJzogJ3tuYW1lfeKAmXRhJywKICAgICAgICAnaW4udXNhJzogJ3tuYW1lfeKAmXRhJywKICAgICAgICAnaW4uaW5kaWEnOiAne25hbWV94oCZZGEnLAogICAgICAgICd0aGlzUmVnaW9uJzogJ2J1IGLDtmxnZScsCiAgICAgICAgJ2xpc3RTZXAnOiAnLCAnLAogICAgICAgICdsaXN0QW5kJzogJyB2ZSAnLAogICAgICAgICdiYWRnZS5uZXcnOiAnWWVuaScsCiAgICAgICAgJ2JhZGdlLnNvb24nOiAnw4dvayB5YWvEsW5kYScsCiAgICAgICAgJ25vdGUubTRPbmx5JzogJ3tpblJlZ2lvbn0gxZ9pbWRpbGlrIHlhbG7EsXpjYSBNYWMgbWluaSBNNCB2YXIsIGJ1IHnDvHpkZW4gc2l6aSBNNOKAmWUgZ2XDp2lyZGlrLicsCiAgICAgICAgJ25vdGUubG9jYXRpb25Td2l0Y2hlZCc6ICd7bW9kZWx9IGhlbsO8eiB7aW5QcmV2aW91c30gbWV2Y3V0IGRlxJ9pbCwgYnUgecO8emRlbiBrb251bXVudXp1IHtyZWdpb259IG9sYXJhayBkZcSfacWfdGlyZGlrLicsCiAgICAgICAgJ2N0YS5idXknOiAnUGxhbsSxIFNhdMSxbiBBbCcsCiAgICAgICAgJ2N0YS53YWl0bGlzdCc6ICdCZWtsZW1lIExpc3Rlc2luZSBLYXTEsWwnLAogICAgICAgICdjdGEuc3RhcnRpbmcnOiAnw5ZkZW1lIGJhxZ9sYXTEsWzEsXlvcuKApicsCiAgICAgICAgJ2NoZWNrb3V0Lm5vTG9jYXRpb24nOiAnQnUga29udW0gaGVuw7x6IGt1bGxhbsSxbGFtxLF5b3IuJywKICAgICAgICAnY2hlY2tvdXQuZmFpbGVkJzogJ8OWZGVtZSBiYcWfbGF0xLFsYW1hZMSxLiBMw7x0ZmVuIHRla3JhciBkZW5leWluLicsCiAgICAgICAgJ2NoZWNrb3V0LnRvb01hbnknOiAnw4dvayBmYXpsYSDDtmRlbWUgZGVuZW1lc2kgeWFwxLFsZMSxLiBMw7x0ZmVuIGJpcmF6IGJla2xleWlwIHRla3JhciBkZW5leWluLicsCiAgICAgICAgJ2RpYWxvZy5zb29uVGl0bGUnOiAne21vZGVsfSDDp29rIHlha8SxbmRhJywKICAgICAgICAnZGlhbG9nLnNvb25EZXNjJzogJ0UtcG9zdGEgYWRyZXNpbml6aSBhxZ9hxJ\/EsXlhIGLEsXJha8Sxbiwga3VsbGFuxLFtYSBzdW51bGR1xJ91IGFuZGEgc2l6ZSBoYWJlciB2ZXJlbGltLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseVRpdGxlJzogJ0fDvG5sw7xrIHBsYW4gZ2XDp2ljaSBvbGFyYWsga3VsbGFuxLFsYW3EsXlvcicsCiAgICAgICAgJ2RpYWxvZy5kYWlseURlc2MnOiAnWW\/En3VuIHRhbGVwIG5lZGVuaXlsZSBnw7xubMO8ayBwbGFuIMWfdSBhbmRhIGt1bGxhbsSxbGFtxLF5b3IuJywKICAgICAgICAnZGlhbG9nLmRhaWx5RGVzY0hlcmUnOiAnWW\/En3VuIHRhbGVwIG5lZGVuaXlsZSBnw7xubMO8ayBwbGFuIMWfdSBhbmRhIHtpbkhlcmV9IGt1bGxhbsSxbGFtxLF5b3IuJywKICAgICAgICAnZGlhbG9nLmRhaWx5T3RoZXJzJzogJyBIYWZ0YWzEsWssIGF5bMSxayB2ZSBkYWhhIHV6dW4gcGxhbmxhciBow6Jsw6IgbWV2Y3V0LicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU5vdGlmeSc6ICcgRS1wb3N0YSBhZHJlc2luaXppIGHFn2HEn8SxeWEgYsSxcmFrxLFuLCBnw7xubMO8ayBwbGFuIGdlcmkgZ2VsZGnEn2luZGUgc2l6ZSBoZW1lbiBoYWJlciB2ZXJlbGltLicsCiAgICAgICAgJ2RpYWxvZy5zdG9yYWdlVGl0bGUnOiAnQnUgZGVwb2xhbWEgc2XDp2VuZcSfaSDFn3UgYW5kYSBrdWxsYW7EsWxhbcSxeW9yJywKICAgICAgICAnZGlhbG9nLnN0b3JhZ2VEZXNjJzogJ3tpbkhlcmV9IGJ1IGRpc2sgeWFwxLFsYW5kxLFybWFzxLFuYSBzYWhpcCB0w7xtIE1hY+KAmWxlciDFn3UgYW5kYSB0YWhzaXMgZWRpbG1pxZ8gZHVydW1kYS4gRS1wb3N0YSBhZHJlc2luaXppIGHFn2HEn8SxeWEgYsSxcmFrxLFuLCBiaXJpIGJvxZ9hbGTEscSfxLEgYW5kYSBzaXplIGhhYmVyIHZlcmVsaW0uJywKICAgICAgICAnZGlhbG9nLmFsbFRpdGxlJzogJ1TDvG0gc3VudWN1bGFyIMWfdSBhbmRhIHRhaHNpcyBlZGlsbWnFnyBkdXJ1bWRhJywKICAgICAgICAnZGlhbG9nLmFsbFRpdGxlSGVyZSc6ICd7aW5IZXJlfSB0w7xtIHN1bnVjdWxhciDFn3UgYW5kYSB0YWhzaXMgZWRpbG1pxZ8gZHVydW1kYScsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlJzogJ1TDvG0ge21vZGVsfSBzdW51Y3VsYXLEsSDFn3UgYW5kYSB0YWhzaXMgZWRpbG1pxZ8gZHVydW1kYScsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlSGVyZSc6ICd7aW5IZXJlfSB0w7xtIHttb2RlbH0gc3VudWN1bGFyxLEgxZ91IGFuZGEgdGFoc2lzIGVkaWxtacWfIGR1cnVtZGEnLAogICAgICAgICdkaWFsb2cuYWxsRGVzYyc6ICfFnnUgYW5kYSB0YW0ga2FwYXNpdGVkZXlpeiwgYW5jYWsgYmlyIE1hYyB5ZW5pZGVuIG3DvHNhaXQgb2xkdcSfdSBhbmRhIHNpemUgaGFiZXIgdmVyZWJpbGlyaXouIEUtcG9zdGEgYWRyZXNpbml6aSBhxZ9hxJ\/EsXlhIGLEsXJha8SxbjsgeWVuaSBzdW51Y3VsYXLEsSBkZXZyZXllIGFsZMSxxJ\/EsW3EsXpkYSBzxLFyYW7EsW4gYmHFn8SxbmRhIHNpeiBvbHVuLicsCiAgICAgICAgJ2RpYWxvZy5hbGxEZXNjSGVyZSc6ICfFnnUgYW5kYSB7aW5IZXJlfSB0YW0ga2FwYXNpdGVkZXlpeiwgYW5jYWsgYmlyIE1hYyB5ZW5pZGVuIG3DvHNhaXQgb2xkdcSfdSBhbmRhIHNpemUgaGFiZXIgdmVyZWJpbGlyaXouIEUtcG9zdGEgYWRyZXNpbml6aSBhxZ9hxJ\/EsXlhIGLEsXJha8SxbjsgeWVuaSBzdW51Y3VsYXLEsSBkZXZyZXllIGFsZMSxxJ\/EsW3EsXpkYSBzxLFyYW7EsW4gYmHFn8SxbmRhIHNpeiBvbHVuLicsCiAgICAgICAgJ2FsdC5kYWlseSc6ICdCZWtsZW1layBpc3RlbWl5b3IgbXVzdW51ej8gR8O8bmzDvGsgcGxhbiDFn3UgYW5kYSDFn3Uga29udW1sYXJkYSBtZXZjdXQ6IHtuYW1lc30uJywKICAgICAgICAnYWx0LmNvbmZpZyc6ICdCZWtsZW1layBpc3RlbWl5b3IgbXVzdW51ej8gQnUgeWFwxLFsYW5kxLFybWEgxZ91IGFuZGEgxZ91IGtvbnVtbGFyZGEgbWV2Y3V0OiB7bmFtZXN9LicsCiAgICAgICAgJ2FsdC5hbnknOiAnQmVrbGVtZWsgaXN0ZW1peW9yIG11c3VudXo\/IMWedSBrb251bWxhcmRhIGhlbWVuIE1hYyBtZXZjdXQ6IHtuYW1lc30uJywKICAgICAgICAnYWx0LnN3aXRjaCc6ICd7cmVnaW9ufSBrb251bXVuYSBnZcOnJywKICAgICAgICAneGFsdC5sZWFkUmVnaW9uJzogJ3ttb2RlbH0ge2luSGVyZX0gdMO8a2VuZGkuJywKICAgICAgICAneGFsdC5hdmFpbGFibGVOb3cnOiAnSGVtZW4gYWxhYmlsZWNlxJ9pbml6IHNlw6dlbmVrbGVyOicsCiAgICAgICAgJ3hhbHQubGVhZERhaWx5JzogJ3ttb2RlbH0gacOnaW4gZ8O8bmzDvGsgcGxhbiB7aW5IZXJlfSB0w7xrZW5kaS4nLAogICAgICAgICd4YWx0LmxlYWRCYXNlJzogJ0hhcmljaSBkaXNraSBvbG1heWFuIHttb2RlbH0ge2luSGVyZX0gdMO8a2VuZGkuJywKICAgICAgICAneGFsdC5sZWFkU3RvcmFnZSc6ICd7c3RvcmFnZX0gZGVwb2xhbWFsxLEge21vZGVsfSB7aW5IZXJlfSB0w7xrZW5kaS4nLAogICAgICAgICd3YWl0bGlzdC5ub3RpZnknOiAnQmVuaSBiaWxnaWxlbmRpcicsCiAgICAgICAgJ3dhaXRsaXN0LmNsb3NlJzogJ0thcGF0JywKICAgICAgICAnd2FpdGxpc3QuaW52YWxpZEVtYWlsJzogJ0zDvHRmZW4gZ2XDp2VybGkgYmlyIGUtcG9zdGEgYWRyZXNpIGdpcmluLicsCiAgICAgICAgJ3dhaXRsaXN0LnNhdmluZyc6ICdUYWxlYmluaXoga2F5ZGVkaWxpeW9yLi4uJywKICAgICAgICAnd2FpdGxpc3QudG9vRmFzdCc6ICfDh29rIGjEsXpsxLEgZ2lkaXlvcnN1bnV6LiBMw7x0ZmVuIGRhaGEgc29ucmEgdGVrcmFyIGRlbmV5aW4uJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkTGF0ZXInOiAnw5x6Z8O8bsO8eiwgYmlyIHNvcnVuIG9sdcWfdHUuIEzDvHRmZW4gZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbi4nLAogICAgICAgICd3YWl0bGlzdC5mYWlsZWQnOiAnw5x6Z8O8bsO8eiwgYmlyIHNvcnVuIG9sdcWfdHUuJywKICAgICAgICAnd2FpdGxpc3Quc3VjY2Vzcyc6ICdMaXN0ZWRlc2luaXohIEJpciBNYWMgbcO8c2FpdCBvbGR1xJ91IGFuZGEgc2l6ZSBlLXBvc3RhIGfDtm5kZXJlY2XEn2l6LicsCiAgICAgICAgJ3dhaXRsaXN0LmhpbnQnOiAnU2l6ZSB5YWxuxLF6Y2EgbcO8c2FpdGxpayBoYWtrxLFuZGEgZS1wb3N0YSBnw7ZuZGVyaXJpei4nLAogICAgICAgICdub3RpY2Uuc29sZE91dCc6ICd7aW5IZXJlfSB0w7xtIE1hY+KAmWxlciDFn3UgYW5kYSB0YWhzaXMgZWRpbG1pxZ8gZHVydW1kYS4gSGVtZW4gYWxhYmlsZWNlxJ9pbml6IGtvbnVtbGFyOiB7bGlua3N9LiBEaWxlcnNlbml6IGHFn2HEn8SxZGFuIHtoZXJlfSBiZWtsZW1lIGxpc3Rlc2luZSBrYXTEsWzEsW4uJywKICAgICAgICAnbm90aWNlLm1vZGVsU29sZE91dCc6ICd7aW5IZXJlfSB0w7xtIHttb2RlbH0gY2loYXpsYXLEsSDFn3UgYW5kYSB0YWhzaXMgZWRpbG1pxZ8gZHVydW1kYS4gSGVtZW4gYWxhYmlsZWNlxJ9pbml6IGtvbnVtbGFyOiB7bGlua3N9LiBEaWxlcnNlbml6IGHFn2HEn8SxZGFuIHtoZXJlfSBiZWtsZW1lIGxpc3Rlc2luZSBrYXTEsWzEsW4uJywKICAgICAgICAnbm90aWNlLmN0YUFsdCc6ICd2ZXlhIHtsaW5rfScsCiAgICAgICAgJ25vdGljZS5jdGFBbHRMaW5rJzogJ2hlbWVuIHtpblJlZ2lvbn0gYmlyIE1hYyBlZGluaW4nLAogICAgICAgICdub3RpY2UuZGFpbHlTb2xkT3V0JzogJ0fDvG5sw7xrIHBsYW4ge2luSGVyZX0gdMO8a2VuZGkuIEhlbWVuIGFsYWJpbGVjZcSfaW5peiBrb251bWxhcjoge2xpbmtzfS4gRGlsZXJzZW5peiB7d2FpdGxpc3R9LicsCiAgICAgICAgJ25vdGljZS5qb2luV2FpdGxpc3QnOiAnYmVrbGVtZSBsaXN0ZXNpbmUga2F0xLFsxLFuJywKICAgICAgICAnZW50ZXJwcmlzZS5vZmYnOiAnJXtwY3R9IMSwTkTEsFLEsE0nLAogICAgICAgICdlbnRlcnByaXNlLmFwcGxpZWQnOiAnJXtwY3R9IGluZGlyaW0gdXlndWxhbmTEsScsCiAgICAgICAgJ2VudGVycHJpc2Uuc3RhbmRhcmQnOiAnU3RhbmRhcnQgZml5YXRsYW5kxLFybWEnLAogICAgICAgICdlbnRlcnByaXNlLnBlckluc3RhbmNlJzogJ1N1bnVjdSBiYcWfxLFuYSB7cHJpY2V9L2F5JywKICAgICAgICAnZW50ZXJwcmlzZS52b2x1bWVQcmljaW5nJzogJ1RvcGx1IGt1bGxhbsSxbSBmaXlhdGxhcsSxJywKICAgICAgICAndGlsZS5wZXIuZGFpbHknOiAnL2fDvG4nLAogICAgICAgICd0aWxlLnBlci53ZWVrbHknOiAnL2hhZnRhJywKICAgICAgICAndGlsZS5wZXIubW9udGhseSc6ICcvYXknLAogICAgICAgICd0aWxlLnBlci4zbW9udGgnOiAnLzMgYXknLAogICAgICAgICd0aWxlLnBlci42bW9udGgnOiAnLzYgYXknLAogICAgICAgICdzcGVjLmNoaXBNNCc6ICdNNCAxMCDDp2VraXJkZWsnLAogICAgICAgICdzcGVjLmNoaXBNNic6ICdNNiAxMiDDp2VraXJkZWsnLAogICAgICAgICdzcGVjLnJhbSc6ICcxNiBHQiBSQU0nLAogICAgICAgICdzcGVjLnNzZCc6ICcyNTYgR0IgU1NEJywKICAgICAgICAnc3BlYy5tYWNvcyc6ICdtYWNPUyAyNycsCiAgICAgICAgJ3RpcC5jaGlwTTQnOiAnMTAgw6dla2lyZGVrbGkgQ1BVICg0IHBlcmZvcm1hbnMgKyA2IHZlcmltbGlsaWsgw6dla2lyZGXEn2kpIHZlIDEwIMOnZWtpcmRla2xpIEdQVeKAmXlhIHNhaGlwIEFwcGxlIE00IMOnaXAuIEdlbGnFn3Rpcm1lLCBkZXJsZW1lIHZlIHlhcmF0xLFjxLEgacWfbGVyIGnDp2luIHRlayDDp2VraXJkZWt0ZSBkZSDDp29rIMOnZWtpcmRla3RlIGRlIG9sYcSfYW7DvHN0w7wgcGVyZm9ybWFucyBzdW5hci4nLAogICAgICAgICd0aXAuY2hpcE02JzogJzIgbm0gaWxlIMO8cmV0aWxlbiBBcHBsZSBNNiDDp2lwOiAxMiDDp2VraXJkZWtsaSBDUFUgKDIgc8O8cGVyLCA0IHBlcmZvcm1hbnMgdmUgNiB2ZXJpbWxpbGlrIMOnZWtpcmRlxJ9pKSwgaGVyIMOnZWtpcmRlxJ9pbmRlIE5ldXJhbCBBY2NlbGVyYXRvciBidWx1bmFuIDEyIMOnZWtpcmRla2xpIEdQVSB2ZSDDp2lmdCAxNiDDp2VraXJkZWtsaSBOZXVyYWwgRW5naW5lLiBBcHBsZSwgTTTigJlsw7wgTWFjIG1pbmnigJl5ZSBnw7ZyZSB5YXBheSB6ZWvDoiBnw7ZyZXZsZXJpbmRlIDQga2F0YSBrYWRhciBkYWhhIGjEsXpsxLEgb2xkdcSfdW51IGJlbGlydGl5b3I7IHlhcGF5IHpla8OiIG1vZGVsbGVyaW5pIHZlIExMTSDDp8Sxa2FyxLFtxLFuxLEgZG\/En3J1ZGFuIE1hY+KAmXRlIMOnYWzEscWfdMSxcm1hayBpw6dpbiBpZGVhbC4nLAogICAgICAgICd0aXAucmFtJzogJ0NQVSB2ZSBHUFUgYXJhc8SxbmRhIHBheWxhxZ\/EsWxhbiAxNiBHQiBiaXJsZcWfaWsgYmVsbGVrLiBHZWxlbmVrc2VsIFJBTeKAmWluIGFrc2luZSBiaXJsZcWfaWsgYmVsbGVrLCB2ZXJpbGVyaW4gacWfbGVtY2lsZXIgYXJhc8SxbmRhIGtvcHlhbGFubWFzxLFuxLEgZ2VyZWtzaXoga8SxbGFyOyBiw7Z5bGVjZSBkYWhhIGjEsXpsxLEgdmUgZGFoYSB2ZXJpbWxpIMOnYWzEscWfxLFyLicsCiAgICAgICAgJ3RpcC5zc2QnOiAnT2t1bWEgaMSxesSxIDMsNCBHQi9zbuKAmXllIGthZGFyIMOnxLFrYW4gMjU2IEdCIGRhaGlsaSBOVk1lIFNTRC4gWGNvZGUgZGVybGVtZWxlcmksIERvY2tlciBrb250ZXluZXJsZXJpIHZlIGLDvHnDvGsgcHJvamVsZXIgacOnaW4geWV0ZXJpbmNlIGjEsXpsxLEuIEVrIGhhcmljaSBkZXBvbGFtYSwgZWtsZW50aSBvbGFyYWsgc3VudWx1ci4nLAogICAgICAgICd0aXAubWFjb3MnOiAnbWFjT1MgMjcgKDI3LjAgdmV5YSDDvHplcmkgc8O8csO8bSksIEFwcGxl4oCZxLFuIGVuIHllbmkgacWfbGV0aW0gc2lzdGVtaS4gRW4geWVuaSBYY29kZSwgU3dpZnQgdmUgZ2VsacWfdGlybWUgYXJhw6dsYXLEsW7EsSBpw6dlcmlyLiBIZXIgemFtYW4gZW4gc29uIGfDvHZlbmxpayB5YW1hbGFyxLF5bGEgZ8O8bmNlbCB0dXR1bHVyLicsCiAgICAgICAgJ3RpcC5hY2Nlc3MnOiAnS2VzaW50aXNpeiA3LzI0IGVyacWfaW07IHlhbG7EsXpjYSBpxZ8gZ8O8bmxlcmkgdmV5YSBzxLFuxLFybMSxIHNhYXRsZXIgZGXEn2lsLiBFcmnFn2ltaW5peiDDtmRlbWVkZW4gaGVtZW4gc29ucmEgYmHFn2xhciB2ZSBLdWxsYW7EsWPEsSBQb3J0YWzEseKAmW5kYW4gaXB0YWwgZXRtZWRpxJ9pbml6IHPDvHJlY2Ugb3RvbWF0aWsgb2xhcmFrIHllbmlsZW5pci4nLAogICAgICAgICd0aXAucmVtb3RlRGVza3RvcCc6ICdEZXNrSW4gdXphayBtYXNhw7xzdMO8IHlhesSxbMSxbcSxeWxhIGJhxJ9sYW7EsW4uIFNhdMSxbiBhbG1hIHNvbnJhc8SxbmRhIGtpbWxpayBiaWxnaWxlcmluaXogZS1wb3N0YXlsYSBnw7ZuZGVyaWxpci4gRGVza0luLCB1emFrIG1hc2HDvHN0w7wgw7xyw7xubGVyaSBhcmFzxLFuZGEgZW4gecO8a3NlayBrYXJlIGjEsXrEsW7EsSB2ZSBlbiBkw7zFn8O8ayBnZWNpa21leWkgc3VuYXIuJywKICAgICAgICAndGlwLnNzaCc6ICdVemFrdGFuIGdlbGnFn3Rpcm1lLCBkZXJsZW1lIHZlIGRvc3lhIGFrdGFyxLFtxLEgKHNjcC9zZnRwKSBpw6dpbiBNYWPigJlpbml6ZSB0YW0gU1NIIHRlcm1pbmFsIGVyacWfaW1pLiBTYXTEsW4gYWxtYSBzb25yYXPEsW5kYSB2ZXJpbGVuIGtpbWxpayBiaWxnaWxlcml5bGUgaGVyaGFuZ2kgYmlyIHRlcm1pbmFsZGVuIGJhxJ9sYW7EsW4uJywKICAgICAgICAndGlwLmFkbWluJzogJ0vEsXPEsXRsYW1hIG9sbWFkYW4gdGFtIHnDtm5ldGljaSB5ZXRraWxlcmkgKHJvb3QgZXJpxZ9pbWkpLiDEsHN0ZWRpxJ9pbml6IHlhesSxbMSxbcSxIHnDvGtsZXlpbiwgZ2VsacWfdGlybWUgb3J0YW1sYXLEsW7EsXrEsSB5YXDEsWxhbmTEsXLEsW4gdmUgc2lzdGVtaW4gdGFtIGtvbnRyb2zDvG7DvCBlbGluaXplIGFsxLFuLicsCiAgICAgICAgJ3RpcC5kZWRpY2F0ZWQnOiAne21vZGVsfSB0YW1hbWVuIHNpemUgYXlyxLFsbcSxxZ90xLFyOiBzYW5hbCBtYWtpbmUgdmV5YSDDp29rIGt1bGxhbsSxY8SxbMSxIG9ydGFtIHlva3R1ci4gRml6aWtzZWwgbWFraW5lbmluIHRhbWFtxLEgeWFsbsSxemNhIHNpemluIGt1bGxhbsSxbcSxbsSxemRhZMSxci4nLAogICAgICAgICd0aXAuaW1tZWRpYXRlJzogJ01ha2luZWxlciB6YXRlbiDDp2FsxLHFn8SxciBkdXJ1bWRhLiBLaW1saWsgYmlsZ2lsZXJpbml6IMO2ZGVtZWRlbiBoZW1lbiBzb25yYSBnw7ZuZGVyaWxpciB2ZSBNYWPigJlpbml6aSBiZWtsZW1lZGVuIGhlbWVuIGt1bGxhbm1heWEgYmHFn2xheWFiaWxpcnNpbml6LicsCiAgICAgICAgJ3RpcC5uZXR3b3JrJzogJ0vEsWJyxLFzIHZlcmkgbWVya2V6aW1pemRlbiB5w7xrc2VrIGjEsXpsxLEgYmHEn2xhbnTEsTogMSBHYnBz4oCZeWUga2FkYXIgaW5kaXJtZSB2ZSB+MjAwIE1icHMgecO8a2xlbWUuIELDvHnDvGsgZG9zeWEgYWt0YXLEsW1sYXLEsSB2ZSBDSS9DRCBpxZ8gYWvEscWfbGFyxLEgacOnaW4gaWRlYWwuJywKICAgICAgICAndGlwLnhjb2RlJzogJ0hlciBNYWMsIFhjb2RlIHnDvGtsw7wgdmUga3VsbGFuxLFtYSBoYXrEsXIgZ2VsaXIuIFV6dW4gaW5kaXJtZSB2ZXlhIGt1cnVsdW1sYXJsYSB1xJ9yYcWfbWFkYW4gaU9TIHZlIG1hY09TIHV5Z3VsYW1hbGFyxLFuxLEgaGVtZW4gZGVybGV5aXAgw6dhbMSxxZ90xLFybWF5YSBiYcWfbGF5xLFuLicsCiAgICAgICAgJ3RpcC5zaXAnOiAnU0lQIGVrIGJpciBkb25hbsSxbSByaXNraSBnZXRpcmRpxJ9pIGnDp2luIMO2emVsbGXFn3Rpcm1leWkgeWFsbsSxemNhIDYgYXlsxLFrIHBsYW5sYXJkYSBzdW51eW9ydXouIE1hbnVlbCBtw7xkYWhhbGUgZ2VyZWt0aXJkacSfaW5kZW4sIHNhdMSxbiBhbG1hIHNvbnJhc8SxbmRhIGV0a2lubGXFn3Rpcm1layBpw6dpbiBkZXN0ZWsgZWtpYml5bGUgaWxldGnFn2ltZSBnZcOnaW4uJywKICAgICAgICAnc3BlYy5hY2Nlc3MnOiAnRXJpxZ9pbScsCiAgICAgICAgJ3NwZWMubWFjaGluZSc6ICdNYWtpbmUnLAogICAgICAgICdzcGVjLm5ldHdvcmsnOiAnQcSfJywKICAgICAgICAnc3BlYy5wbGFuJzogJ1BsYW4nLAogICAgICAgICdzcGVjLmV4dHJhJzogJ0Vrc3RyYScsCiAgICAgICAgJ3NwZWMucmVtb3RlRGVza3RvcCc6ICdVemFrIG1hc2HDvHN0w7wnLAogICAgICAgICdzcGVjLmRlZGljYXRlZCc6ICdTaXplIMO2emVsIE1hYyBtaW5pJywKICAgICAgICAnc3BlYy5pbnN0YW50U2V0dXAnOiAnQW7EsW5kYSBrdXJ1bHVtJywKICAgICAgICAnc3BlYy5uZXR3b3JrVmFsdWUnOiAnMSBHYnBzIGluZGlybWUgwrcgMjAwIE1icHMgecO8a2xlbWUnLAogICAgICAgICdzcGVjLnNpcCc6ICdTSVAgw7Z6ZWxsZcWfdGlybWVzaScKICAgICAgfSwKICAgICAgYXI6IHsKICAgICAgICAnY3ljbGUuZGFpbHknOiAn2YrZiNmF2YonLAogICAgICAgICdjeWNsZS53ZWVrbHknOiAn2KPYs9io2YjYudmKJywKICAgICAgICAnY3ljbGUubW9udGhseSc6ICfYtNmH2LHZiicsCiAgICAgICAgJ2N5Y2xlLjNtb250aCc6ICczINij2LTZh9ixJywKICAgICAgICAnY3ljbGUuNm1vbnRoJzogJzYg2KPYtNmH2LEnLAogICAgICAgICdiaWxsZWQuZGFpbHknOiAn2YrZj9mB2YjYqtmO2LEg2YrZiNmF2YrZi9inJywKICAgICAgICAnYmlsbGVkLndlZWtseSc6ICfZitmP2YHZiNiq2Y7YsSDYo9iz2KjZiNi52YrZi9inJywKICAgICAgICAnYmlsbGVkLm1vbnRobHknOiAn2YrZj9mB2YjYqtmO2LEg2LTZh9ix2YrZi9inJywKICAgICAgICAnYmlsbGVkLjNtb250aCc6ICfZitmP2YHZiNiq2Y7YsSDZg9mEIDMg2KPYtNmH2LEnLAogICAgICAgICdiaWxsZWQuNm1vbnRoJzogJ9mK2Y\/ZgdmI2KrZjtixINmD2YQgNiDYo9i02YfYsScsCiAgICAgICAgJ2FjY2Vzcy5kYWlseSc6ICfZiNi12YjZhCDZhNmF2K\/YqSAyNCDYs9in2LnYqScsCiAgICAgICAgJ2FjY2Vzcy53ZWVrbHknOiAn2YjYtdmI2YQg2YTZhdiv2KkgNyDYo9mK2KfZhScsCiAgICAgICAgJ2FjY2Vzcy5tb250aGx5JzogJ9mI2LXZiNmEINmE2YXYr9ipINi02YfYsSDZiNin2K3YrycsCiAgICAgICAgJ2FjY2Vzcy4zbW9udGgnOiAn2YjYtdmI2YQg2YTZhdiv2KkgMyDYo9i02YfYsScsCiAgICAgICAgJ2FjY2Vzcy42bW9udGgnOiAn2YjYtdmI2YQg2YTZhdiv2KkgNiDYo9i02YfYsScsCiAgICAgICAgJ3JlbmV3cy5kYWlseSc6ICfZitiq2KzYr9ivINmK2YjZhdmK2YvYpycsCiAgICAgICAgJ3JlbmV3cy53ZWVrbHknOiAn2YrYqtis2K\/YryDYo9iz2KjZiNi52YrZi9inJywKICAgICAgICAncmVuZXdzLm1vbnRobHknOiAn2YrYqtis2K\/YryDYtNmH2LHZitmL2KcnLAogICAgICAgICdyZW5ld3MuM21vbnRoJzogJ9mK2KrYrNiv2K8g2YPZhCAzINij2LTZh9ixJywKICAgICAgICAncmVuZXdzLjZtb250aCc6ICfZitiq2KzYr9ivINmD2YQgNiDYo9i02YfYsScsCiAgICAgICAgJ3JlbmV3TGluZSc6ICd7cmVuZXdzfSDCtyDZitmF2YPZhtmDINin2YTYpdmE2LrYp9ihINmB2Yog2KPZiiDZiNmC2KonLAogICAgICAgICdwZXJEYXknOiAne3ByaWNlfS\/ZitmI2YUnLAogICAgICAgICdwb3B1bGFyJzogJ9in2YTYo9mD2KvYsSDYt9mE2KjZi9inJywKICAgICAgICAnc2F2ZSc6ICfZiNmB2ZHYsSB7cGN0fSUnLAogICAgICAgICdzdG9yYWdlLnNpemUnOiAne3NpemV9IEdCJywKICAgICAgICAnc3RvcmFnZS5iYXNlJzogJ1NTRCDYr9in2K7ZhNmKJywKICAgICAgICAnc3RvcmFnZS5hZGRvbjI1Nic6ICcyNTYgR0IgKyAyNTYgR0Ig2K7Yp9ix2KzZiicsCiAgICAgICAgJ3N0b3JhZ2UuYWRkb241MTInOiAnMjU2IEdCICsgNTEyIEdCINiu2KfYsdis2YonLAogICAgICAgICdzdG9yYWdlLnNvbGRPdXQnOiAn2YbZgdiv2Kog2KfZhNmD2YXZitipJywKICAgICAgICAnc3RvcmFnZS5wZXJNb250aCc6ICcre3ByaWNlfS\/YtNmH2LEnLAogICAgICAgICdzdG9yYWdlLmluY2x1ZGVkJzogJ9mF2LTZhdmI2YQnLAogICAgICAgICdzdG9yYWdlLmRlZmF1bHQnOiAn2KfZgdiq2LHYp9i22YonLAogICAgICAgICdzdG9yYWdlLm5vdGUnOiAn2YrYtNmF2YQg2KrYrtiy2YrZhiB7bGFiZWx9ICgre3ByaWNlfSknLAogICAgICAgICd0aXAuc3RvcmFnZUVsc2V3aGVyZSc6ICfZhtmB2K\/YqiDYp9mE2YPZhdmK2Kkge2luSGVyZX0uINmF2KrZiNmB2LEg2YHZiiB7bmFtZXN9LicsCiAgICAgICAgJ3RpcC5zdG9yYWdlTm9uZSc6ICfYutmK2LEg2YXYqtmI2YHYsSDYqNiz2KjYqCDYp9ix2KrZgdin2Lkg2KfZhNi32YTYqC4nLAogICAgICAgICd0aXAuZGFpbHlFbHNld2hlcmUnOiAn2YbZgdiv2Kog2KfZhNiu2LfYqSDYp9mE2YrZiNmF2YrYqSB7aW5IZXJlfS4g2YXYqtmI2YHYsdipINmB2Yoge25hbWVzfS4nLAogICAgICAgICd0aXAuZGFpbHlOb25lJzogJ9iq2Y\/Yudi32Y7ZkdmEINi52YbYryDYp9mG2K7Zgdin2LYg2KfZhNiq2YjZgdixLiDYp9mG2LbZhSDYpdmE2Ykg2YLYp9im2YXYqSDYp9mE2KfZhtiq2LjYp9ixINmE2YrYtdmE2YMg2KXYtNi52KfYsS4nLAogICAgICAgICd0aXAubW9kZWxOb3RIZXJlJzogJ3ttb2RlbH0g2LrZitixINmF2KrZiNmB2LEg2YfZhtinINio2LnYrycsCiAgICAgICAgJ2NvbnRpbmVudC5jeXBydXMnOiAn2KPZiNix2YjYqNinJywKICAgICAgICAnY29udGluZW50LnVzYSc6ICfYp9mE2YjZhNin2YrYp9iqINin2YTZhdiq2K3Yr9ipJywKICAgICAgICAnY29udGluZW50LmluZGlhJzogJ9ii2LPZitinJywKICAgICAgICAnY291bnRyeS5jeXBydXMnOiAn2YLYqNix2LUnLAogICAgICAgICdjb3VudHJ5LnVzYSc6ICfYp9mE2YjZhNin2YrYp9iqINin2YTZhdiq2K3Yr9ipXHUwMGEwwrcg2KrZg9iz2KfYsycsCiAgICAgICAgJ2NvdW50cnkuaW5kaWEnOiAn2KfZhNmH2YbYrycsCiAgICAgICAgJ2luLmN5cHJ1cyc6ICfZgdmKIHtuYW1lfScsCiAgICAgICAgJ2luLnVzYSc6ICfZgdmKIHtuYW1lfScsCiAgICAgICAgJ2luLmluZGlhJzogJ9mB2Yoge25hbWV9JywKICAgICAgICAndGhpc1JlZ2lvbic6ICfZh9iw2Ycg2KfZhNmF2YbYt9mC2KknLAogICAgICAgICdsaXN0U2VwJzogJ9iMICcsCiAgICAgICAgJ2xpc3RBbmQnOiAnINmIJywKICAgICAgICAnYmFkZ2UubmV3JzogJ9is2K\/ZitivJywKICAgICAgICAnYmFkZ2Uuc29vbic6ICfZgtix2YrYqNmL2KcnLAogICAgICAgICdub3RlLm00T25seSc6ICfZitiq2YjZgdixINit2KfZhNmK2YvYpyBNYWMgbWluaSBNNCDZgdmC2Lcge2luUmVnaW9ufdiMINmE2LDYpyDZhtmC2YTZhtin2YMg2KXZhNmJIE00LicsCiAgICAgICAgJ25vdGUubG9jYXRpb25Td2l0Y2hlZCc6ICd7bW9kZWx9INi62YrYsSDZhdiq2YjZgdixIHtpblByZXZpb3VzfSDYqNi52K\/YjCDZhNiw2Kcg2LrZitmR2LHZhtinINmF2YjZgti52YMg2KXZhNmJIHtyZWdpb259LicsCiAgICAgICAgJ2N0YS5idXknOiAn2KfYtNiq2LHZkCDYp9mE2K7Yt9ipJywKICAgICAgICAnY3RhLndhaXRsaXN0JzogJ9in2YbYttmFINil2YTZiSDZgtin2KbZhdipINin2YTYp9mG2KrYuNin2LEnLAogICAgICAgICdjdGEuc3RhcnRpbmcnOiAn2KzYp9ix2Y0g2KjYr9ihINin2YTYr9mB2LnigKYnLAogICAgICAgICdjaGVja291dC5ub0xvY2F0aW9uJzogJ9mH2LDYpyDYp9mE2YXZiNmC2Lkg2LrZitixINmF2KrYp9itINio2LnYry4nLAogICAgICAgICdjaGVja291dC5mYWlsZWQnOiAn2KrYudiw2ZHYsSDYqNiv2KEg2LnZhdmE2YrYqSDYp9mE2K\/Zgdi5LiDZitmP2LHYrNmJINin2YTZhdit2KfZiNmE2Kkg2YXYsdipINij2K7YsdmJLicsCiAgICAgICAgJ2NoZWNrb3V0LnRvb01hbnknOiAn2YXYrdin2YjZhNin2Kog2K\/Zgdi5INmD2KvZitix2Kkg2KzYr9mL2KcuINmK2Y\/Ysdis2Ykg2KfZhNin2YbYqti42KfYsSDZgtmE2YrZhNmL2Kcg2KvZhSDYp9mE2YXYrdin2YjZhNipINmF2LHYqSDYo9iu2LHZiS4nLAogICAgICAgICdkaWFsb2cuc29vblRpdGxlJzogJ3ttb2RlbH0g2YLYp9iv2YUg2YLYsdmK2KjZi9inJywKICAgICAgICAnZGlhbG9nLnNvb25EZXNjJzogJ9in2KrYsdmDINio2LHZitiv2YMg2KfZhNil2YTZg9iq2LHZiNmG2Yog2KPYr9mG2KfZhyDZiNiz2YbZj9i52YTZhdmDINmB2YjYsSDYqtmI2YHYsdmHLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseVRpdGxlJzogJ9in2YTYrti32Kkg2KfZhNmK2YjZhdmK2Kkg2LrZitixINmF2KrYp9it2Kkg2YXYpNmC2KrZi9inJywKICAgICAgICAnZGlhbG9nLmRhaWx5RGVzYyc6ICfYp9mE2K7Yt9ipINin2YTZitmI2YXZitipINi62YrYsSDZhdiq2KfYrdipINit2KfZhNmK2YvYpyDYqNiz2KjYqCDYp9ix2KrZgdin2Lkg2KfZhNi32YTYqC4nLAogICAgICAgICdkaWFsb2cuZGFpbHlEZXNjSGVyZSc6ICfYp9mE2K7Yt9ipINin2YTZitmI2YXZitipINi62YrYsSDZhdiq2KfYrdipINit2KfZhNmK2YvYpyB7aW5IZXJlfSDYqNiz2KjYqCDYp9ix2KrZgdin2Lkg2KfZhNi32YTYqC4nLAogICAgICAgICdkaWFsb2cuZGFpbHlPdGhlcnMnOiAnINin2YTYrti32Lcg2KfZhNij2LPYqNmI2LnZitipINmI2KfZhNi02YfYsdmK2Kkg2YjYp9mE2KPYt9mI2YQg2YTYpyDYqtiy2KfZhCDZhdiq2KfYrdipLicsCiAgICAgICAgJ2RpYWxvZy5kYWlseU5vdGlmeSc6ICcg2KfYqtix2YMg2KjYsdmK2K\/ZgyDYp9mE2KXZhNmD2KrYsdmI2YbZiiDYo9iv2YbYp9mHINmI2LPZhtmP2LnZhNmF2YMg2YHZiNixINi52YjYr9ipINin2YTYrti32Kkg2KfZhNmK2YjZhdmK2KkuJywKICAgICAgICAnZGlhbG9nLnN0b3JhZ2VUaXRsZSc6ICfYrtmK2KfYsSDYp9mE2KrYrtiy2YrZhiDZh9iw2Kcg2LrZitixINmF2KrYp9itINit2KfZhNmK2YvYpycsCiAgICAgICAgJ2RpYWxvZy5zdG9yYWdlRGVzYyc6ICfYrNmF2YrYuSDYo9is2YfYstipIE1hYyDYp9mE2YXYstmI2K\/YqSDYqNiq2YPZiNmK2YYg2KfZhNmC2LHYtSDZh9iw2Kcge2luSGVyZX0g2YXYrdis2YjYstipINit2KfZhNmK2YvYpy4g2KfYqtix2YMg2KjYsdmK2K\/ZgyDYp9mE2KXZhNmD2KrYsdmI2YbZiiDYo9iv2YbYp9mHINmI2LPZhtmP2LnZhNmF2YMg2YHZiNixINiq2YjZgdixINij2K3Yr9mH2KcuJywKICAgICAgICAnZGlhbG9nLmFsbFRpdGxlJzogJ9is2YXZiti5INin2YTYo9is2YfYstipINmF2K3YrNmI2LLYqSDYrdin2YTZitmL2KcnLAogICAgICAgICdkaWFsb2cuYWxsVGl0bGVIZXJlJzogJ9is2YXZiti5INin2YTYo9is2YfYstipIHtpbkhlcmV9INmF2K3YrNmI2LLYqSDYrdin2YTZitmL2KcnLAogICAgICAgICdkaWFsb2cubW9kZWxUaXRsZSc6ICfYrNmF2YrYuSDYo9is2YfYstipIHttb2RlbH0g2YXYrdis2YjYstipINit2KfZhNmK2YvYpycsCiAgICAgICAgJ2RpYWxvZy5tb2RlbFRpdGxlSGVyZSc6ICfYrNmF2YrYuSDYo9is2YfYstipIHttb2RlbH0ge2luSGVyZX0g2YXYrdis2YjYstipINit2KfZhNmK2YvYpycsCiAgICAgICAgJ2RpYWxvZy5hbGxEZXNjJzogJ9mG2LnZhdmEINio2YPYp9mF2YQg2LfYp9mC2KrZhtinINit2KfZhNmK2YvYp9iMINmE2YPZhiDZitmF2YPZhtmG2Kcg2KXYudmE2KfZhdmDINmB2YjYsSDYqtmI2YHYsSDYrNmH2KfYsiBNYWMg2YXZhiDYrNiv2YrYry4g2KfYqtix2YMg2KjYsdmK2K\/ZgyDYp9mE2KXZhNmD2KrYsdmI2YbZiiDYo9iv2YbYp9mHINmI2LPYqtmD2YjZhiDYo9mI2YQg2YXZhiDZiti52YTZhSDYudmG2K8g2KrYtNi62YrZhCDYo9is2YfYstipINis2K\/Zitiv2KkuJywKICAgICAgICAnZGlhbG9nLmFsbERlc2NIZXJlJzogJ9mG2LnZhdmEINio2YPYp9mF2YQg2LfYp9mC2KrZhtinIHtpbkhlcmV9INit2KfZhNmK2YvYp9iMINmE2YPZhiDZitmF2YPZhtmG2Kcg2KXYudmE2KfZhdmDINmB2YjYsSDYqtmI2YHYsSDYrNmH2KfYsiBNYWMg2YXZhiDYrNiv2YrYry4g2KfYqtix2YMg2KjYsdmK2K\/ZgyDYp9mE2KXZhNmD2KrYsdmI2YbZiiDYo9iv2YbYp9mHINmI2LPYqtmD2YjZhiDYo9mI2YQg2YXZhiDZiti52YTZhSDYudmG2K8g2KrYtNi62YrZhCDYo9is2YfYstipINis2K\/Zitiv2KkuJywKICAgICAgICAnYWx0LmRhaWx5JzogJ9mE2Kcg2KrYsdmK2K8g2KfZhNin2YbYqti42KfYsdifINin2YTYrti32Kkg2KfZhNmK2YjZhdmK2Kkg2YXYqtmI2YHYsdipINin2YTYotmGINmB2Yoge25hbWVzfS4nLAogICAgICAgICdhbHQuY29uZmlnJzogJ9mE2Kcg2KrYsdmK2K8g2KfZhNin2YbYqti42KfYsdifINmH2LDYpyDYp9mE2KrZg9mI2YrZhiDZhdiq2YjZgdixINin2YTYotmGINmB2Yoge25hbWVzfS4nLAogICAgICAgICdhbHQuYW55JzogJ9mE2Kcg2KrYsdmK2K8g2KfZhNin2YbYqti42KfYsdifINij2KzZh9iy2KkgTWFjINmF2KrZiNmB2LHYqSDYp9mE2KLZhiDZgdmKIHtuYW1lc30uJywKICAgICAgICAnYWx0LnN3aXRjaCc6ICfYp9mE2KfZhtiq2YLYp9mEINil2YTZiSB7cmVnaW9ufScsCiAgICAgICAgJ3hhbHQubGVhZFJlZ2lvbic6ICfZhtmB2K8ge21vZGVsfSB7aW5IZXJlfS4nLAogICAgICAgICd4YWx0LmF2YWlsYWJsZU5vdyc6ICfZhdiq2YjZgdixINin2YTYotmGOicsCiAgICAgICAgJ3hhbHQubGVhZERhaWx5JzogJ9mG2YHYr9iqINin2YTYrti32Kkg2KfZhNmK2YjZhdmK2Kkg2YTYrNmH2KfYsiB7bW9kZWx9IHtpbkhlcmV9LicsCiAgICAgICAgJ3hhbHQubGVhZEJhc2UnOiAn2YbZgdivIHttb2RlbH0g2KjYr9mI2YYg2YLYsdi1INiu2KfYsdis2Yoge2luSGVyZX0uJywKICAgICAgICAneGFsdC5sZWFkU3RvcmFnZSc6ICfZhtmB2K8ge21vZGVsfSDZhdi5IHtzdG9yYWdlfSB7aW5IZXJlfS4nLAogICAgICAgICd3YWl0bGlzdC5ub3RpZnknOiAn2KPYudmE2YXZhtmKJywKICAgICAgICAnd2FpdGxpc3QuY2xvc2UnOiAn2KXYutmE2KfZgicsCiAgICAgICAgJ3dhaXRsaXN0LmludmFsaWRFbWFpbCc6ICfZitmP2LHYrNmJINil2K\/Yrtin2YQg2LnZhtmI2KfZhiDYqNix2YrYryDYpdmE2YPYqtix2YjZhtmKINi12KfZhNitLicsCiAgICAgICAgJ3dhaXRsaXN0LnNhdmluZyc6ICfYrNin2LHZjSDYrdmB2Lgg2LfZhNio2YMuLi4nLAogICAgICAgICd3YWl0bGlzdC50b29GYXN0JzogJ9mF2K3Yp9mI2YTYp9iqINmD2KvZitix2Kkg2KzYr9mL2KcuINmK2Y\/Ysdis2Ykg2KfZhNmF2K3Yp9mI2YTYqSDZhNin2K3ZgtmL2KcuJywKICAgICAgICAnd2FpdGxpc3QuZmFpbGVkTGF0ZXInOiAn2LnYsNix2YvYp9iMINit2K\/YqyDYrti32KMg2YXYpy4g2YrZj9ix2KzZiSDYp9mE2YXYrdin2YjZhNipINmE2KfYrdmC2YvYpy4nLAogICAgICAgICd3YWl0bGlzdC5mYWlsZWQnOiAn2LnYsNix2YvYp9iMINit2K\/YqyDYrti32KMg2YXYpy4nLAogICAgICAgICd3YWl0bGlzdC5zdWNjZXNzJzogJ9iq2YXYqiDYpdi22KfZgdiq2YMg2KXZhNmJINin2YTZgtin2KbZhdipISDYs9mG2LHYp9iz2YTZgyDZgdmI2LEg2KrZiNmB2LEg2KzZh9in2LIgTWFjLicsCiAgICAgICAgJ3dhaXRsaXN0LmhpbnQnOiAn2YTZhiDZhtix2KfYs9mE2YMg2KXZhNinINio2LTYo9mGINin2YTYqtmI2YHYsS4nLAogICAgICAgICdub3RpY2Uuc29sZE91dCc6ICfYrNmF2YrYuSDYo9is2YfYstipIE1hYyB7aW5IZXJlfSDZhdit2KzZiNiy2Kkg2K3Yp9mE2YrZi9inLiDZhdiq2YjZgdix2Kkg2KfZhNii2YYg2YHZiiB7bGlua3N92Iwg2KPZiCDYp9mG2LbZhSDYpdmE2Ykg2YLYp9im2YXYqSDYp9mG2KrYuNin2LEge2hlcmV9INij2K\/Zhtin2YcuJywKICAgICAgICAnbm90aWNlLm1vZGVsU29sZE91dCc6ICfYrNmF2YrYuSDYo9is2YfYstipIHttb2RlbH0ge2luSGVyZX0g2YXYrdis2YjYstipINit2KfZhNmK2YvYpy4g2YXYqtmI2YHYsdipINin2YTYotmGINmB2Yoge2xpbmtzfdiMINij2Ygg2KfZhti22YUg2KXZhNmJINmC2KfYptmF2Kkg2KfZhtiq2LjYp9ixIHtoZXJlfSDYo9iv2YbYp9mHLicsCiAgICAgICAgJ25vdGljZS5jdGFBbHQnOiAn2KPZiCB7bGlua30nLAogICAgICAgICdub3RpY2UuY3RhQWx0TGluayc6ICfYp9it2LXZhCDYudmE2Ykg2KzZh9in2LIgTWFjIHtpblJlZ2lvbn0g2KfZhNii2YYnLAogICAgICAgICdub3RpY2UuZGFpbHlTb2xkT3V0JzogJ9mG2YHYr9iqINin2YTYrti32Kkg2KfZhNmK2YjZhdmK2Kkge2luSGVyZX0uINmF2KrZiNmB2LHYqSDYp9mE2KLZhiDZgdmKIHtsaW5rc33YjCDYo9mIIHt3YWl0bGlzdH0uJywKICAgICAgICAnbm90aWNlLmpvaW5XYWl0bGlzdCc6ICfYp9mG2LbZhSDYpdmE2Ykg2YLYp9im2YXYqSDYp9mE2KfZhtiq2LjYp9ixJywKICAgICAgICAnZW50ZXJwcmlzZS5vZmYnOiAn2K7YtdmFIHtwY3R9JScsCiAgICAgICAgJ2VudGVycHJpc2UuYXBwbGllZCc6ICfYqtmFINiq2LfYqNmK2YIg2K7YtdmFIHtwY3R9JScsCiAgICAgICAgJ2VudGVycHJpc2Uuc3RhbmRhcmQnOiAn2KfZhNiq2LPYudmK2LEg2KfZhNmC2YrYp9iz2YonLAogICAgICAgICdlbnRlcnByaXNlLnBlckluc3RhbmNlJzogJ3twcmljZX0v2LTZh9ixINmE2YPZhCDYrNmH2KfYsicsCiAgICAgICAgJ2VudGVycHJpc2Uudm9sdW1lUHJpY2luZyc6ICfYo9iz2LnYp9ixINin2YTZg9mF2YrYp9iqJywKICAgICAgICAndGlsZS5wZXIuZGFpbHknOiAnL9mK2YjZhScsCiAgICAgICAgJ3RpbGUucGVyLndlZWtseSc6ICcv2KPYs9io2YjYuScsCiAgICAgICAgJ3RpbGUucGVyLm1vbnRobHknOiAnL9i02YfYsScsCiAgICAgICAgJ3RpbGUucGVyLjNtb250aCc6ICcvMyDYo9i02YfYsScsCiAgICAgICAgJ3RpbGUucGVyLjZtb250aCc6ICcvNiDYo9i02YfYsScsCiAgICAgICAgJ3NwZWMuY2hpcE00JzogJ000INio2YAgMTAg2KPZhtmI2YrYqScsCiAgICAgICAgJ3NwZWMuY2hpcE02JzogJ002INio2YAgMTIg2YbZiNin2KknLAogICAgICAgICdzcGVjLnJhbSc6ICcxNiBHQiBSQU0nLAogICAgICAgICdzcGVjLnNzZCc6ICcyNTYgR0IgU1NEJywKICAgICAgICAnc3BlYy5tYWNvcyc6ICdtYWNPUyAyNycsCiAgICAgICAgJ3RpcC5jaGlwTTQnOiAn2LTYsdmK2K3YqSBBcHBsZSBNNCDYqNmF2LnYp9mE2KwgQ1BVINmF2YYgMTAg2KPZhtmI2YrYqSAoNCDYo9mG2YjZitipINij2K\/Yp9ihICsgNiDYo9mG2YjZitipINmD2YHYp9ih2KkpINmI2YXYudin2YTYrCDYsdiz2YjZhdin2KogR1BVINmF2YYgMTAg2KPZhtmI2YrYqS4g2KrZgtiv2YUg2KPYr9in2KHZiyDYp9iz2KrYq9mG2KfYptmK2YvYpyDYo9it2KfYr9mKINin2YTZhtmI2KfYqSDZiNmF2KrYudiv2K8g2KfZhNij2YbZiNmK2Kkg2YTZhNiq2LfZiNmK2LEg2YjYp9mE2KjZhtin2KEg2YjYp9mE2KPYudmF2KfZhCDYp9mE2KXYqNiv2KfYudmK2KkuJywKICAgICAgICAndGlwLmNoaXBNNic6ICfYtNix2YrYrdipIEFwcGxlIE02INin2YTZhdi12YbZkdi52Kkg2KjYqtmC2YbZitipIDIg2YbYp9mG2YjZhdiq2LHYjCDZhdi5INmF2LnYp9mE2KwgQ1BVINmF2YYgMTIg2YbZiNin2KkgKNmG2YjYp9iq2KfZhiDZgdin2KbZgtiq2KfZhiDZiDQg2KPZhtmI2YrYqSDYo9iv2KfYoSDZiDYg2KPZhtmI2YrYqSDZg9mB2KfYodipKSDZiNmF2LnYp9mE2Kwg2LHYs9mI2YXYp9iqIEdQVSDZhdmGIDEyINmG2YjYp9ipINmF2LkgTmV1cmFsIEFjY2VsZXJhdG9yINmB2Yog2YPZhCDZhtmI2KfYqdiMINil2LbYp9mB2KnZiyDYpdmE2YkgTmV1cmFsIEVuZ2luZSDZhdiy2K\/ZiNisINmF2YYgMTYg2YbZiNin2KkuINiq2LDZg9ixIEFwcGxlINij2YYg2YXZh9in2YUg2KfZhNiw2YPYp9ihINin2YTYp9i12LfZhtin2LnZiiDYo9iz2LHYuSDYrdiq2YkgNCDZhdix2KfYqiDZhdmC2KfYsdmG2KnZiyDYqNis2YfYp9iyIE1hYyBtaW5pINio2LTYsdmK2K3YqSBNNNiMINmF2Kcg2YrYrNi52YTZh9inINmF2KvYp9mE2YrYqSDZhNiq2LTYutmK2YQg2YbZhdin2LDYrCDYp9mE2LDZg9in2KEg2KfZhNin2LXYt9mG2KfYudmKINmI2KfYs9iq2K\/ZhNin2YQg2YbZhdin2LDYrCBMTE0g2YXYqNin2LTYsdip2Ysg2LnZhNmJINin2YTZgCBNYWMuJywKICAgICAgICAndGlwLnJhbSc6ICfYsNin2YPYsdipINmF2YjYrdiv2Kkg2KjYs9i52KkgMTYgR0Ig2YXYtNiq2LHZg9ipINio2YrZhiBDUFUg2YhHUFUuINi52YTZiSDYudmD2LMg2LDYp9mD2LHYqSBSQU0g2KfZhNiq2YLZhNmK2K\/Zitip2Iwg2KrZj9i62YbZiiDYp9mE2LDYp9mD2LHYqSDYp9mE2YXZiNit2K\/YqSDYudmGINmG2LPYriDYp9mE2KjZitin2YbYp9iqINio2YrZhiDYp9mE2YXYudin2YTYrNin2KrYjCDZhdinINmK2YXZhtitINij2K\/Yp9ih2Ysg2KPYs9ix2Lkg2YjZg9mB2KfYodipINij2LnZhNmJLicsCiAgICAgICAgJ3RpcC5zc2QnOiAn2YLYsdi1IE5WTWUg2K\/Yp9iu2YTZiiDZhdmGINmG2YjYuSBTU0Qg2KjYs9i52KkgMjU2IEdCINmI2KjYs9ix2LnYp9iqINmC2LHYp9ih2Kkg2KrYtdmEINil2YTZiSAzLjQgR0Ivcy4g2LPYsdmK2Lkg2KjZhdinINmK2YPZgdmKINmE2LnZhdmE2YrYp9iqINio2YbYp9ihIFhjb2RlINmI2K3Yp9mI2YrYp9iqIERvY2tlciDZiNin2YTZhdi02KfYsdmK2Lkg2KfZhNmD2KjZitix2KkuINiq2KrZiNmB2LEg2LPYudipINiq2K7YstmK2YYg2K7Yp9ix2KzZitipINil2LbYp9mB2YrYqSDZg9il2LbYp9mB2KkuJywKICAgICAgICAndGlwLm1hY29zJzogJ21hY09TIDI3ICjYp9mE2KXYtdiv2KfYsSAyNy4wINij2Ygg2KPYrdiv2Ksp2Iwg2KPYrdiv2Ksg2YbYuNin2YUg2KrYtNi62YrZhCDZhdmGIEFwcGxlLiDZitiq2LbZhdmGINij2K3Yr9irINil2LXYr9in2LHYp9iqIFhjb2RlINmIU3dpZnQg2YjYo9iv2YjYp9iqINin2YTYqti32YjZitixLiDZhdit2K\/ZjtmR2Ksg2K\/Yp9im2YXZi9inINio2KPYrdiv2Ksg2KfZhNiq2LXYrdmK2K3Yp9iqINin2YTYo9mF2YbZitipLicsCiAgICAgICAgJ3RpcC5hY2Nlc3MnOiAn2YjYtdmI2YQg2YXYqtmI2KfYtdmEINi52YTZiSDZhdiv2KfYsSDYp9mE2LPYp9i52Kkg2LfZiNin2YQg2KPZitin2YUg2KfZhNij2LPYqNmI2LnYjCDZiNmE2YrYsyDZgdmKINij2YrYp9mFINin2YTYudmF2YQg2KPZiCDYs9in2LnYp9iqINmF2K3Yr9iv2Kkg2YHZgti3LiDZitio2K\/YoyDZiNi12YjZhNmDINmB2YjYsSDYp9mE2K\/Zgdi5INmI2YrYqtis2K\/YryDYqtmE2YLYp9im2YrZi9inINmF2Kcg2YTZhSDYqtmP2YTYutmHINmF2YYg2KjZiNin2KjYqSDYp9mE2YXYs9iq2K7Yr9mFLicsCiAgICAgICAgJ3RpcC5yZW1vdGVEZXNrdG9wJzogJ9in2KrYtdmEINi52KjYsSDYqNix2YbYp9mF2Kwg2LPYt9itINin2YTZhdmD2KrYqCDYp9mE2KjYudmK2K8gRGVza0luLiDYqNi52K8g2KfZhNi02LHYp9ihINiz2KrYqtmE2YLZiSDYqNmK2KfZhtin2Kog2KfZhNiv2K7ZiNmEINi52KjYsSDYp9mE2KjYsdmK2K8g2KfZhNil2YTZg9iq2LHZiNmG2YouINmK2YLYr9mFIERlc2tJbiDYo9i52YTZiSDZhdi52K\/ZhCDYpdi32KfYsdin2Kog2YjYo9mC2YQg2LLZhdmGINin2LPYqtis2KfYqNipINio2YrZhiDYqNix2KfZhdisINiz2LfYrSDYp9mE2YXZg9iq2Kgg2KfZhNio2LnZitivLicsCiAgICAgICAgJ3RpcC5zc2gnOiAn2YjYtdmI2YQg2YPYp9mF2YQg2KXZhNmJINi32LHZgdmK2KkgU1NIINi52YTZiSDYrNmH2KfYsiBNYWMg2KfZhNiu2KfYtSDYqNmDINmE2YTYqti32YjZitixINi52YYg2KjZj9i52K8g2YjYqti02LrZitmEINi52YXZhNmK2KfYqiDYp9mE2KjZhtin2KEg2YjZhtmC2YQg2KfZhNmF2YTZgdin2KogKHNjcC9zZnRwKS4g2KfYqti12YQg2YXZhiDYo9mKINi32LHZgdmK2Kkg2KjYp9iz2KrYrtiv2KfZhSDYqNmK2KfZhtin2Kog2KfZhNiv2K7ZiNmEINin2YTZhdmC2K\/ZhdipINio2LnYryDYp9mE2LTYsdin2KEuJywKICAgICAgICAndGlwLmFkbWluJzogJ9i12YTYp9it2YrYp9iqINmF2LPYpNmI2YQg2YPYp9mF2YTYqSAo2YjYtdmI2YQgcm9vdCkg2K\/ZiNmGINij2Yog2YLZitmI2K8uINir2KjZkdiqINij2Yog2KjYsdmG2KfZhdis2Iwg2YjYp9i22KjYtyDYqNmK2KbYp9iqINin2YTYqti32YjZitix2Iwg2YjYqtit2YPZhSDZgdmKINin2YTZhti42KfZhSDYqNin2YTZg9in2YXZhC4nLAogICAgICAgICd0aXAuZGVkaWNhdGVkJzogJ9is2YfYp9iyIHttb2RlbH0g2YXYrti12LUg2YTZgyDYqNin2YTZg9in2YXZhDog2YTYpyDYo9is2YfYstipINin2YHYqtix2KfYttmK2Kkg2YjZhNinINio2YrYptipINmF2KrYudiv2K\/YqSDYp9mE2YXYs9iq2K7Yr9mF2YrZhi4g2KrYrdi12YQg2LnZhNmJINin2YTYrNmH2KfYsiDYp9mE2YHYudmE2Yog2YPYp9mF2YTZi9inINmE2KfYs9iq2K7Yr9in2YXZgyDZiNit2K\/Zgy4nLAogICAgICAgICd0aXAuaW1tZWRpYXRlJzogJ9in2YTYo9is2YfYstipINiq2LnZhdmEINio2KfZhNmB2LnZhC4g2LPYqtiq2YTZgtmJINio2YrYp9mG2KfYqiDYp9mE2K\/YrtmI2YQg2YHZiNixINin2YTYr9mB2Lkg2YjZitmF2YPZhtmDINin2YTYqNiv2KEg2YHZiiDYp9iz2KrYrtiv2KfZhSDYrNmH2KfYsiBNYWMg2LnZhNmJINin2YTZgdmI2LEg2K\/ZiNmGINij2Yog2KfZhtiq2LjYp9ixLicsCiAgICAgICAgJ3RpcC5uZXR3b3JrJzogJ9in2KrYtdin2YQg2LnYp9mE2Yog2KfZhNiz2LHYudipINmF2YYg2YXYsdmD2LIg2KjZitin2YbYp9iq2YbYpyDZgdmKINmC2KjYsdi1OiDYrdiq2YkgMSBHYnBzINmE2YTYqtmG2LLZitmEINmIfjIwMCBNYnBzINmE2YTYsdmB2LkuINmF2KvYp9mE2Yog2YTZhtmC2YQg2KfZhNmF2YTZgdin2Kog2KfZhNmD2KjZitix2Kkg2YjZhdiz2KfYsdin2KogQ0kvQ0QuJywKICAgICAgICAndGlwLnhjb2RlJzogJ9mK2KPYqtmKINmD2YQg2KzZh9in2LIgTWFjINmF2LkgWGNvZGUg2YXYq9io2KrZi9inINmI2KzYp9mH2LLZi9inINmE2YTYp9iz2KrYrtiv2KfZhS4g2KfYqNiv2KMg2YHZiiDYqNmG2KfYoSDYqti32KjZitmC2KfYqiBpT1Mg2YhtYWNPUyDZiNiq2LTYutmK2YTZh9inINmB2YjYsdmL2KfYjCDYr9mI2YYg2KrZhtiy2YrZhCDYo9mIINil2LnYr9in2K8g2LfZiNmK2YQuJywKICAgICAgICAndGlwLnNpcCc6ICfZhti42LHZi9inINmE2KPZhiBTSVAg2YrZhti32YjZiiDYudmE2Ykg2YXYrtin2LfYsSDYpdi22KfZgdmK2Kkg2LnZhNmJINin2YTYo9is2YfYstip2Iwg2YbZiNmB2LEg2KrYrti12YrYtdmHINmB2Yog2K7Yt9i3IDYg2KPYtNmH2LEg2YHZgti3LiDYqNi52K8g2KfZhNi02LHYp9ih2Iwg2KrZiNin2LXZhCDZhdi5INin2YTYr9i52YUg2YTYqtmB2LnZitmE2Ycg2YTYo9mG2Ycg2YrYqti32YTYqCDYqtiv2K7ZhNmL2Kcg2YrYr9mI2YrZi9inLicsCiAgICAgICAgJ3NwZWMuYWNjZXNzJzogJ9in2YTZiNi12YjZhCcsCiAgICAgICAgJ3NwZWMubWFjaGluZSc6ICfYp9mE2KzZh9in2LInLAogICAgICAgICdzcGVjLm5ldHdvcmsnOiAn2KfZhNi02KjZg9ipJywKICAgICAgICAnc3BlYy5wbGFuJzogJ9in2YTYrti32KknLAogICAgICAgICdzcGVjLmV4dHJhJzogJ9il2LbYp9mB2YonLAogICAgICAgICdzcGVjLnJlbW90ZURlc2t0b3AnOiAn2LPYt9itINmF2YPYqtioINio2LnZitivJywKICAgICAgICAnc3BlYy5kZWRpY2F0ZWQnOiAnTWFjIG1pbmkg2YXYrti12LUnLAogICAgICAgICdzcGVjLmluc3RhbnRTZXR1cCc6ICfYpdi52K\/Yp9ivINmB2YjYsdmKJywKICAgICAgICAnc3BlYy5uZXR3b3JrVmFsdWUnOiAn2KrZhtiy2YrZhCAxIEdicHMgwrcg2LHZgdi5IDIwMCBNYnBzJywKICAgICAgICAnc3BlYy5zaXAnOiAn2KrYrti12YrYtSBTSVAnCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdChrZXksIHBhcmFtcykgewogICAgICBjb25zdCB0ZXh0ID0gSTE4TltMQU5HXT8uW2tleV0gPz8gSTE4Ti5lbltrZXldID8\/IGtleTsKICAgICAgaWYgKCFwYXJhbXMpIHJldHVybiB0ZXh0OwogICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9ceyhcdyspXH0vZywgKG1hdGNoLCBuYW1lKSA9PiAobmFtZSBpbiBwYXJhbXMgPyBTdHJpbmcocGFyYW1zW25hbWVdKSA6IG1hdGNoKSk7CiAgICB9CgogICAgLy8gVGhlIHBhZ2UncyBvd24gdHJhbnNsYXRpb25zIHdpbiBvdmVyIFRyYW5zbGF0ZVByZXNzIGZvciB0aGUgc2FtZSBzdHJpbmdzOiBpdHMgb2xkZXIgbWFjaGluZSB0cmFuc2xhdGlvbnMKICAgIC8vIGhhZCAiMTYgR08gREUgUkFNIiBpbiBGcmVuY2gsIGEgcmVwZWF0ZWQgd29yZCBpbiBBcmFiaWMgYW5kICJyb290IiB0cmFuc2xhdGVkIGxpdGVyYWxseS4gU3RhdGljIHRleHQKICAgIC8vIHdpdGhvdXQgYSBrZXkgaGVyZSBpcyBzdGlsbCB0cmFuc2xhdGVkIGJ5IFRyYW5zbGF0ZVByZXNzLgogICAgZnVuY3Rpb24gdHJhbnNsYXRlU3RhdGljVGV4dCgpIHsKICAgICAgaWYgKExBTkcgPT09ICdlbicpIHJldHVybjsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlbnRhbWFjLXByaWNpbmcgW2RhdGEtaTE4bl0nKS5mb3JFYWNoKGVsID0+IHsKICAgICAgICBjb25zdCB0ZXh0ID0gSTE4TltMQU5HXT8uW2VsLmRhdGFzZXQuaTE4bl07CiAgICAgICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkgZWwudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICB9KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJJQ0lORyBDT05GSUdVUkFUSU9OIC0gRWRpdCB0aGVzZSB2YWx1ZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgY29uc3QgUFJJQ0lOR19DT05GSUcgPSB7CiAgICAgIGN5Y2xlczogewogICAgICAgIC8vIExhYmVscyBwZXIgY3ljbGUgYXJlIHRoZSBJMThOIGtleXMgY3ljbGUuKiwgYmlsbGVkLiosIGFjY2Vzcy4qIGFuZCByZW5ld3MuKi4KICAgICAgICBkYWlseTogewogICAgICAgICAgZGF5czogMSwKICAgICAgICAgIHN1cHBvcnQ6ICdTdGFuZGFyZCBzdXBwb3J0JywKICAgICAgICAgIGhhc1N0b3JhZ2U6IGZhbHNlLCAvLyBObyBzdG9yYWdlIGFkZC1vbnMgZm9yIGRhaWx5CiAgICAgICAgICBzYXZpbmdzUGVyY2VudDogbnVsbAogICAgICAgIH0sCiAgICAgICAgd2Vla2x5OiB7CiAgICAgICAgICBkYXlzOiA3LAogICAgICAgICAgc3VwcG9ydDogJ1ByaW9yaXR5IHN1cHBvcnQnLAogICAgICAgICAgaGFzU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgIHNhdmluZ3NQZXJjZW50OiBudWxsCiAgICAgICAgfSwKICAgICAgICBtb250aGx5OiB7CiAgICAgICAgICBkYXlzOiAzMCwKICAgICAgICAgIHN1cHBvcnQ6ICdQcmlvcml0eSBzdXBwb3J0JywKICAgICAgICAgIGhhc1N0b3JhZ2U6IHRydWUsCiAgICAgICAgICBzYXZpbmdzUGVyY2VudDogbnVsbCwKICAgICAgICAgIHBvcHVsYXI6IHRydWUKICAgICAgICB9LAogICAgICAgICczbW9udGgnOiB7CiAgICAgICAgICBkYXlzOiA5MCwKICAgICAgICAgIHN1cHBvcnQ6ICdQcmlvcml0eSBzdXBwb3J0JywKICAgICAgICAgIGhhc1N0b3JhZ2U6IHRydWUsCiAgICAgICAgICBzYXZpbmdzUGVyY2VudDogNQogICAgICAgIH0sCiAgICAgICAgJzZtb250aCc6IHsKICAgICAgICAgIGRheXM6IDE4MCwKICAgICAgICAgIHN1cHBvcnQ6ICdQcmVtaXVtIHN1cHBvcnQnLAogICAgICAgICAgaGFzU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgIHNhdmluZ3NQZXJjZW50OiAxMAogICAgICAgIH0KICAgICAgfSwKCiAgICAgIHN0b3JhZ2U6IHsKICAgICAgICBiYXNlOiB7CiAgICAgICAgICBzaXplOiAyNTYsCiAgICAgICAgICBwcmljZTogMCwKICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgYWRkb24yNTY6IHsKICAgICAgICAgIHNpemU6IDUxMiwgLy8gMjU2IGJhc2UgKyAyNTYgYWRkb24KICAgICAgICAgIG1vbnRobHlQcmljZTogOS45MCwgLy8gQmFzZSBtb250aGx5IHByaWNlCiAgICAgICAgICAvLyBNdWx0aXBsaWVycyBmb3IgbG9uZ2VyIHRlcm1zCiAgICAgICAgICAnM21vbnRoTXVsdGlwbGllcic6IDMsCiAgICAgICAgICAnNm1vbnRoTXVsdGlwbGllcic6IDYKICAgICAgICB9LAogICAgICAgIGFkZG9uNTEyOiB7CiAgICAgICAgICBzaXplOiA3NjgsIC8vIDI1NiBiYXNlICsgNTEyIGFkZG9uCiAgICAgICAgICBtb250aGx5UHJpY2U6IDE0LjkwLCAvLyBCYXNlIG1vbnRobHkgcHJpY2UKICAgICAgICAgICczbW9udGhNdWx0aXBsaWVyJzogMywKICAgICAgICAgICc2bW9udGhNdWx0aXBsaWVyJzogNgogICAgICAgIH0KICAgICAgfSwKCiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNT0RFTCBDT05GSUdVUkFUSU9OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gT25lIGVudHJ5IHBlciBNYWMgb24gc2FsZSwgd2l0aCBpdHMgcHJpY2UgcGVyIGJpbGxpbmcgY3ljbGUgKHN0b3JhZ2UgYWRkLW9ucyBjb3N0IHRoZSBzYW1lIG9uCiAgICAvLyBldmVyeSBtb2RlbCkuIGJhY2tlbmRLZXkgaXMgdGhlIERldmljZU1vZGVsIHZhbHVlIHNoYXJlZCB3aXRoIHRoZSBBUEk6IHN0YXR1cyByb3dzIGNhcnJ5IGl0IGFzCiAgICAvLyBgZGV2aWNlTW9kZWxgLCBhbmQgY2hlY2tvdXQgLyB3YWl0bGlzdCByZXF1ZXN0cyBzZW5kIGl0LiBSb3dzIHdpdGhvdXQgYGRldmljZU1vZGVsYCBhcmUgdGhlIE00LAogICAgLy8gd2hpY2ggaXMgYWxsIHRvZGF5J3MgQVBJIHJldHVybnMsIHNvIHRoZSBwYWdlIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkIHVudGlsIHRoZSBiYWNrZW5kIGFkZHMgTTYKICAgIC8vIHJvd3MuIEEgbW9kZWwgb3RoZXIgdGhhbiB0aGUgTTQgaXMgb25seSBzb2xkIHdoZXJlIHRoZSBzdGF0dXMgQVBJIGhhcyBhIHJvdyBmb3IgaXQuCiAgICBjb25zdCBNT0RFTFMgPSB7CiAgICAgIG00OiB7CiAgICAgICAgbmFtZTogJ01hYyBtaW5pIE00JywKICAgICAgICBiYWNrZW5kS2V5OiAwLAogICAgICAgIGxvY2F0aW9uczogWydjeXBydXMnLCAndXNhJywgJ2luZGlhJ10sCiAgICAgICAgcHJpY2VzOiB7IGRhaWx5OiAxOSwgd2Vla2x5OiA1OSwgbW9udGhseTogMTE5LCAnM21vbnRoJzogMzM5LCAnNm1vbnRoJzogNjM5IH0KICAgICAgfSwKICAgICAgbTY6IHsKICAgICAgICBuYW1lOiAnTWFjIG1pbmkgTTYnLAogICAgICAgIGJhY2tlbmRLZXk6IDEsCiAgICAgICAgbG9jYXRpb25zOiBbJ2N5cHJ1cycsICd1c2EnXSwKICAgICAgICBwcmljZXM6IHsgZGFpbHk6IDI0LCB3ZWVrbHk6IDY5LCBtb250aGx5OiAxMzksICczbW9udGgnOiAzOTUsICc2bW9udGgnOiA3NDkgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGN5Y2xlUHJpY2UoY3ljbGVLZXksIG1vZGVsS2V5ID0gc2VsZWN0ZWRNb2RlbCkgewogICAgICByZXR1cm4gTU9ERUxTW21vZGVsS2V5XS5wcmljZXNbY3ljbGVLZXldOwogICAgfQoKICAgIGZ1bmN0aW9uIGN5Y2xlUHJpY2VQZXJEYXkoY3ljbGVLZXksIG1vZGVsS2V5ID0gc2VsZWN0ZWRNb2RlbCkgewogICAgICByZXR1cm4gTWF0aC5yb3VuZChjeWNsZVByaWNlKGN5Y2xlS2V5LCBtb2RlbEtleSkgLyBQUklDSU5HX0NPTkZJRy5jeWNsZXNbY3ljbGVLZXldLmRheXMgKiAxMDApIC8gMTAwOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMT0NBVElPTiBDT05GSUdVUkFUSU9OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gS2V5IG9yZGVyIGlzIHRoZSBvcmRlciB0aGUgcGlja2VyIHRhYnMgcmVuZGVyIGluIOKAlCB3ZXN0IHRvIGVhc3QsIHNvIEFtZXJpY2Egc2l0cyBpbiB0aGUKICAgIC8vIG1pZGRsZS4gYmFja2VuZEtleSBpcyB0aGUgRGF0YWNlbnRlckxvY2F0aW9uIGVudW0ncyBpbnRlZ2VyIHZhbHVlICh3aGljaCBkb2VzIE5PVCBmb2xsb3cgdGhpcwogICAgLy8gb3JkZXIpLCB1c2VkIGJvdGggZm9yIHRoZSBwZXItREMgYXZhaWxhYmlsaXR5IGNvdW50cyB0aGUgQVBJIHJldHVybnMgYW5kIGZvciB0aGUgZGF0YWNlbnRlcgogICAgLy8gc2VudCB3aGVuIG1pbnRpbmcgYSBjaGVja291dC4KICAgIGNvbnN0IExPQ0FUSU9OUyA9IHsKICAgICAgY3lwcnVzOiB7CiAgICAgICAgZmxhZzogJzxzdmcgY2xhc3M9ImxvYy1mbGFnIiB2aWV3Qm94PSIwIDAgMTkgMTMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cmVjdCB3aWR0aD0iMTkiIGhlaWdodD0iMTMiIHJ4PSIyIiBmaWxsPSIjMDAzMzk5Ii8+PGcgZmlsbD0iI0ZGQ0MwMCI+PGNpcmNsZSBjeD0iOS41IiBjeT0iMi4zIiByPSIuNjUiLz48Y2lyY2xlIGN4PSIxMS42IiBjeT0iMi44NiIgcj0iLjY1Ii8+PGNpcmNsZSBjeD0iMTMuMTQiIGN5PSI0LjQiIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjEzLjciIGN5PSI2LjUiIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjEzLjE0IiBjeT0iOC42IiByPSIuNjUiLz48Y2lyY2xlIGN4PSIxMS42IiBjeT0iMTAuMTQiIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjkuNSIgY3k9IjEwLjciIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjcuNCIgY3k9IjEwLjE0IiByPSIuNjUiLz48Y2lyY2xlIGN4PSI1Ljg2IiBjeT0iOC42IiByPSIuNjUiLz48Y2lyY2xlIGN4PSI1LjMiIGN5PSI2LjUiIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjUuODYiIGN5PSI0LjQiIHI9Ii42NSIvPjxjaXJjbGUgY3g9IjcuNCIgY3k9IjIuODYiIHI9Ii42NSIvPjwvZz48L3N2Zz4nLAogICAgICAgIGF2YWlsYWJsZTogdHJ1ZSwKICAgICAgICBpc0RlZmF1bHQ6IHRydWUsCiAgICAgICAgYmFja2VuZEtleTogMAogICAgICB9LAogICAgICB1c2E6IHsKICAgICAgICBmbGFnOiAnPHN2ZyBjbGFzcz0ibG9jLWZsYWciIHZpZXdCb3g9IjAgMCAxOSAxMyIgYXJpYS1oaWRkZW49InRydWUiPjxkZWZzPjxjbGlwUGF0aCBpZD0ibGZ1cyI+PHJlY3Qgd2lkdGg9IjE5IiBoZWlnaHQ9IjEzIiByeD0iMiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNsZnVzKSI+PHJlY3Qgd2lkdGg9IjE5IiBoZWlnaHQ9IjEzIiBmaWxsPSIjQjIyMjM0Ii8+PGcgZmlsbD0iI2ZmZiI+PHJlY3QgeT0iMS45IiB3aWR0aD0iMTkiIGhlaWdodD0iMS45Ii8+PHJlY3QgeT0iNS43IiB3aWR0aD0iMTkiIGhlaWdodD0iMS45Ii8+PHJlY3QgeT0iOS41IiB3aWR0aD0iMTkiIGhlaWdodD0iMS45Ii8+PC9nPjxyZWN0IHdpZHRoPSI4LjUiIGhlaWdodD0iNyIgZmlsbD0iIzNDM0I2RSIvPjxnIGZpbGw9IiNmZmYiPjxjaXJjbGUgY3g9IjEuOCIgY3k9IjEuNiIgcj0iLjU1Ii8+PGNpcmNsZSBjeD0iNC4yIiBjeT0iMS42IiByPSIuNTUiLz48Y2lyY2xlIGN4PSI2LjYiIGN5PSIxLjYiIHI9Ii41NSIvPjxjaXJjbGUgY3g9IjMiIGN5PSIzLjUiIHI9Ii41NSIvPjxjaXJjbGUgY3g9IjUuNCIgY3k9IjMuNSIgcj0iLjU1Ii8+PGNpcmNsZSBjeD0iMS44IiBjeT0iNS40IiByPSIuNTUiLz48Y2lyY2xlIGN4PSI0LjIiIGN5PSI1LjQiIHI9Ii41NSIvPjxjaXJjbGUgY3g9IjYuNiIgY3k9IjUuNCIgcj0iLjU1Ii8+PC9nPjwvZz48L3N2Zz4nLAogICAgICAgIGF2YWlsYWJsZTogdHJ1ZSwKICAgICAgICBiYWNrZW5kS2V5OiAyCiAgICAgIH0sCiAgICAgIGluZGlhOiB7CiAgICAgICAgZmxhZzogJzxzdmcgY2xhc3M9ImxvYy1mbGFnIiB2aWV3Qm94PSIwIDAgMTkgMTMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGVmcz48Y2xpcFBhdGggaWQ9ImxmaW4iPjxyZWN0IHdpZHRoPSIxOSIgaGVpZ2h0PSIxMyIgcng9IjIiLz48L2NsaXBQYXRoPjwvZGVmcz48ZyBjbGlwLXBhdGg9InVybCgjbGZpbikiPjxyZWN0IHdpZHRoPSIxOSIgaGVpZ2h0PSI0LjMzIiBmaWxsPSIjRkY5OTMzIi8+PHJlY3QgeT0iNC4zMyIgd2lkdGg9IjE5IiBoZWlnaHQ9IjQuMzMiIGZpbGw9IiNmZmYiLz48cmVjdCB5PSI4LjY2IiB3aWR0aD0iMTkiIGhlaWdodD0iNC4zNCIgZmlsbD0iIzEzODgwOCIvPjxjaXJjbGUgY3g9IjkuNSIgY3k9IjYuNSIgcj0iMS41IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwODgiIHN0cm9rZS13aWR0aD0iLjUiLz48L2c+PC9zdmc+JywKICAgICAgICBhdmFpbGFibGU6IHRydWUsCiAgICAgICAgYmFja2VuZEtleTogMQogICAgICB9CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBBUEkgRU5EUE9JTlRTCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGNvbnN0IEVORFBPSU5UX1NUQVRVUyA9ICJodHRwczovL2FwaS5yZW50YW1hYy5pby9hcGkvd2Vic2l0ZS9hdmFpbGFiaWxpdHkvc3RhdHVzIgogICAgY29uc3QgRU5EUE9JTlRfU1VCU0NSSUJFID0gImh0dHBzOi8vYXBpLnJlbnRhbWFjLmlvL2FwaS93ZWJzaXRlL2F2YWlsYWJpbGl0eS9zdWJzY3JpYmUiCiAgICBjb25zdCBFTkRQT0lOVF9BRF9UUkFDS0lORyA9ICJodHRwczovL2FwaS5yZW50YW1hYy5pby9hcGkvd2Vic2l0ZS9hZHQiCiAgICBjb25zdCBFTkRQT0lOVF9DSEVDS09VVF9TRVNTSU9OID0gImh0dHBzOi8vYXBpLnJlbnRhbWFjLmlvL2FwaS9jaGVja291dHMvc2Vzc2lvbiIKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU1RBVEUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgbGV0IHNlbGVjdGVkQ3ljbGUgPSAnbW9udGhseSc7CiAgICBsZXQgc2VsZWN0ZWRTdG9yYWdlID0gJ2Jhc2UnOwogICAgbGV0IHNlbGVjdGVkTG9jYXRpb24gPSAnY3lwcnVzJzsKICAgIGxldCBzZWxlY3RlZE1vZGVsID0gJ200JzsKICAgIGxldCBkaWFsb2dNb2RlbCA9ICdtNCc7IC8vIHRoZSBNYWMgdGhlIG9wZW4gd2FpdGxpc3QgZGlhbG9nIGlzIGFib3V0CiAgICBsZXQgdXNlckludGVyYWN0ZWRXaXRoTG9jYXRpb24gPSBmYWxzZTsKICAgIC8vIERlZmF1bHQgYWxsIGF2YWlsYWJpbGl0eSBjb3VudHMgaGlnaCBzbyBldmVyeXRoaW5nIGFwcGVhcnMgYXZhaWxhYmxlIHdoaWxlIHRoZSBBUEkgbG9hZHMuCiAgICAvLyBUaGUgQVBJIHJlc3BvbnNlIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIG1hcmsgYW4gb3B0aW9uIGFzIHVuYXZhaWxhYmxlLgogICAgbGV0IGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID0gOTk5OwogICAgbGV0IGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA9IDk5OTsKICAgIGxldCBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPSA5OTk7CiAgICBsZXQgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gMzsgLy8gVGhyZXNob2xkIGZyb20gQVBJLCBkZWZhdWx0cyB0byAzCiAgICBsZXQgZm9ybVN1Ym1pdHRlZFN1Y2Nlc3NmdWxseSA9IGZhbHNlOwogICAgbGV0IGN1cnJlbnRQcmljaW5nT3B0aW9uID0gbnVsbDsgLy8gVHJhY2tzIHdoaWNoIGF2YWlsYWJpbGl0eSBuZXdzbGV0dGVyIHRvIHN1YnNjcmliZSB0byAoZW51bSB2YWx1ZSkKCiAgICAvLyBBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlIGVudW0gdmFsdWVzIChtdXN0IG1hdGNoIGJhY2tlbmQpCiAgICBjb25zdCBBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlID0gewogICAgICBEYWlseTogMCwgICAgICAgIC8vIERhaWx5IHBsYW4gLSB0cmlnZ2VycyB3aGVuIGF2YWlsYWJsZURldmljZXMgPiBkYWlseVBsYW5BdmFpbGFiaWxpdHlUaHJlc2hvbGQKICAgICAgQmFzZVN0b3JhZ2U6IDEsICAvLyBCYXNlIDI1NkdCIHN0b3JhZ2UgLSB0cmlnZ2VycyB3aGVuIGFueSBkZXZpY2UgYXZhaWxhYmxlCiAgICAgIEV4dGVybmFsMjU2R2I6IDIsIC8vIDI1NkdCIGV4dGVybmFsIGRyaXZlIC0gdHJpZ2dlcnMgd2hlbiAyNTZHQiBleHRlcm5hbCBhdmFpbGFibGUKICAgICAgRXh0ZXJuYWw1MTJHYjogMyAgLy8gNTEyR0IgZXh0ZXJuYWwgZHJpdmUgLSB0cmlnZ2VycyB3aGVuIDUxMkdCIGV4dGVybmFsIGF2YWlsYWJsZQogICAgfTsKCiAgICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIFN1YnNjcmlwdGlvblR5cGUgZW51bS4gVGhlIGF2YWlsYWJpbGl0eS1uZXdzbGV0dGVyIHN1cHBvcnQgbm90aWZpY2F0aW9uCiAgICAvLyByZWNvcmRzIHdoaWNoIGJpbGxpbmcgY3ljbGUgdGhlIHZpc2l0b3Igd2FzIGFmdGVyIChpbmZvcm1hdGlvbmFsIG9ubHkpLgogICAgY29uc3QgU3Vic2NyaXB0aW9uVHlwZSA9IHsKICAgICAgSG91cmx5OiAwLCBEYWlseTogMSwgV2Vla2x5OiAyLCBNb250aGx5OiAzLCBTaXhNb250aHM6IDQsIFllYXJseTogNSwgVGhyZWVNb250aHM6IDYKICAgIH07CgogICAgY29uc3QgQ1lDTEVfVE9fU1VCU0NSSVBUSU9OX1RZUEUgPSB7CiAgICAgIGRhaWx5OiBTdWJzY3JpcHRpb25UeXBlLkRhaWx5LAogICAgICB3ZWVrbHk6IFN1YnNjcmlwdGlvblR5cGUuV2Vla2x5LAogICAgICBtb250aGx5OiBTdWJzY3JpcHRpb25UeXBlLk1vbnRobHksCiAgICAgICczbW9udGgnOiBTdWJzY3JpcHRpb25UeXBlLlRocmVlTW9udGhzLAogICAgICAnNm1vbnRoJzogU3Vic2NyaXB0aW9uVHlwZS5TaXhNb250aHMKICAgIH07CgogICAgLy8gTWlycm9ycyB0aGUgYmFja2VuZCBFeHRlcm5hbERyaXZlT3B0aW9uIGVudW07IG51bGwgbWVhbnMgYSBwbGFpbiBwbGFuIHdpdGggbm8gYWRkLW9uLgogICAgY29uc3QgU1RPUkFHRV9UT19EUklWRV9PUFRJT04gPSB7CiAgICAgIGJhc2U6IG51bGwsCiAgICAgIGFkZG9uMjU2OiAwLAogICAgICBhZGRvbjUxMjogMQogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRE9NIEVMRU1FTlRTIChsYXp5LWxvYWRlZCkKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgbGV0IGF2YWlsYWJpbGl0eURpYWxvZywgYXZhaWxhYmlsaXR5T3ZlcmxheSwgYXZhaWxhYmlsaXR5RGlhbG9nQ2xvc2UsIAogICAgICAgIGF2YWlsYWJpbGl0eUZvcm0sIGF2YWlsYWJpbGl0eUZlZWRiYWNrLCBhdmFpbGFiaWxpdHlFbWFpbDsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVFJBQ0tJTkcgRlVOQ1RJT05TCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlR3VpZCgpIHsKICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykgewogICAgICAgIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwOwogICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpOwogICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QWR0UGF5bG9hZCgpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBwYXlsb2FkU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FkdFBheWxvYWQnKTsKICAgICAgICBpZiAocGF5bG9hZFN0cikgewogICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGF5bG9hZFN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBhZHRQYXlsb2FkJywgZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBlbnN1cmVBZHRQYXlsb2FkKCkgewogICAgICBsZXQgcGF5bG9hZCA9IGdldEFkdFBheWxvYWQoKTsKCiAgICAgIGlmICghcGF5bG9hZCkgewogICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgY29uc3QgZ2NsaWQgPSB1cmxQYXJhbXMuZ2V0KCdnY2xpZCcpIHx8IG51bGw7CiAgICAgICAgY29uc3QgbXNjbGtpZCA9IHVybFBhcmFtcy5nZXQoJ21zY2xraWQnKSB8fCBudWxsOwoKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgQ2xpZW50UmVmZXJlbmNlSWQ6IGdlbmVyYXRlR3VpZCgpLAogICAgICAgICAgR2NsaWQ6IGdjbGlkLAogICAgICAgICAgTXNDbGtpZDogbXNjbGtpZCwKICAgICAgICAgIExhbmRpbmdQYWdlVXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZgogICAgICAgIH07CgogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWR0UGF5bG9hZCcsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTsKICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIGFkdFBheWxvYWQgaW4gbG9jYWxTdG9yYWdlOicsIHBheWxvYWQpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIFN0b3JhZ2UgYmxvY2tlZCBieSBwcml2YWN5IHNldHRpbmdzOiB0cmFja2luZyBsb3NlcyBpdHMgaWQsIGJ1dCBjaGVja291dCBtdXN0IHN0aWxsIHJ1bi4KICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHN0b3JlIGFkdFBheWxvYWQnLCBlKTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICBmZXRjaChFTkRQT0lOVF9BRF9UUkFDS0lORywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgIC8vIFNlbmQgY3JlZGVudGlhbHMgc28gdGhlIHNlcnZlci1zZXQgZmlyc3QtcGFydHkgcmFtX3ZpZCBjb29raWUgKGtleWVkIHRvIHRoaXMgc2FtZQogICAgICAgICAgICAvLyBDbGllbnRSZWZlcmVuY2VJZCkgaXMgc3RvcmVkIOKAlCBpdCBsZXRzIHRoZSBwb3J0YWwgYnJpZGdlIHJlc29sdmUgdGhpcyByb3cgYWZ0ZXIgbG9naW4uCiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpCiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBRFQgQVBJIGNhbGwgZmFpbGVkOicsIGVycik7CiAgICAgICAgICB9KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2VuZCBBRFQgcmVxdWVzdDonLCBlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBwYXlsb2FkOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE1ldGFUcmFja2luZ1BhcmFtcygpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgbGV0IGZicCA9IG51bGw7CiAgICAgICAgbGV0IGZiYyA9IG51bGw7CgogICAgICAgIGZvciAobGV0IGNvb2tpZSBvZiBjb29raWVzKSB7CiAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gY29va2llLnRyaW0oKS5zcGxpdCgnPScpOwogICAgICAgICAgaWYgKG5hbWUgPT09ICdfZmJwJykgZmJwID0gdmFsdWU7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ19mYmMnKSBmYmMgPSB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7IGZicCwgZmJjIH07CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IE1ldGEgdHJhY2tpbmcgcGFyYW1zOicsIGUpOwogICAgICAgIHJldHVybiB7IGZicDogbnVsbCwgZmJjOiBudWxsIH07CiAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiB0cmFja0FkQ29udmVyc2lvbihjbGllbnRSZWZlcmVuY2VJZCwgcGxhblR5cGUpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBhZHRQYXlsb2FkID0gZ2V0QWR0UGF5bG9hZCgpOwogICAgICAgIGNvbnN0IG1ldGFQYXJhbXMgPSBnZXRNZXRhVHJhY2tpbmdQYXJhbXMoKTsKICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgIGNvbnN0IG1ldGFDbGlja0lkID0gdXJsUGFyYW1zLmdldCgnZmJjbGlkJykgfHwgbnVsbDsKCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgIGNsaWVudFJlZmVyZW5jZUlkOiBjbGllbnRSZWZlcmVuY2VJZCwKICAgICAgICAgIEdjbGlkOiBhZHRQYXlsb2FkPy5HY2xpZCB8fCBudWxsLAogICAgICAgICAgTXNDbGtpZDogYWR0UGF5bG9hZD8uTXNDbGtpZCB8fCBudWxsLAogICAgICAgICAgTGFuZGluZ1BhZ2VVcmw6IGFkdFBheWxvYWQ\/LkxhbmRpbmdQYWdlVXJsIHx8IG51bGwsCiAgICAgICAgICBPcmlnaW5hbENsaWVudFJlZmVyZW5jZUlkOiBhZHRQYXlsb2FkPy5DbGllbnRSZWZlcmVuY2VJZCB8fCBudWxsLAogICAgICAgICAgbWV0YUNsaWNrSWQ6IG1ldGFDbGlja0lkLAogICAgICAgICAgbWV0YUZicDogbWV0YVBhcmFtcy5mYnAsCiAgICAgICAgICBtZXRhRmJjOiBtZXRhUGFyYW1zLmZiYywKICAgICAgICAgIHBsYW5UeXBlOiBwbGFuVHlwZQogICAgICAgIH07CgogICAgICAgIGZldGNoKEVORFBPSU5UX0FEX1RSQUNLSU5HLCB7CiAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywKICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpCiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FkIHRyYWNraW5nIGZhaWxlZDonLCBlcnIpOwogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignQWQgdHJhY2tpbmcgZXJyb3I6JywgZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQVZBSUxBQklMSVRZIEZVTkNUSU9OUwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBNb3N0IHJlY2VudCBhdmFpbGFiaWxpdHkgcGF5bG9hZCBmcm9tIHRoZSBBUEksIGtlcHQgc28gd2UgY2FuIHJlLWRlcml2ZSB0aGUKICAgIC8vIHNlbGVjdGVkIGRhdGFjZW50ZXIncyBjb3VudHMgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBsb2NhdGlvbiB3aXRob3V0IHJlLWZldGNoaW5nLgogICAgbGV0IGxhc3RBdmFpbGFiaWxpdHlQYXlsb2FkID0gbnVsbDsKCiAgICAvLyBGbGlwcyB0cnVlIG9uY2UgdGhlIHN0YXR1cyBBUEkgaGFzIGFuc3dlcmVkIChlaXRoZXIgd2F5KSBvciB0aGUgc2FmZXR5IHRpbWVvdXQgZmlyZWQuIEdhdGVzIHRoZQogICAgLy8gc2tlbGV0b24gc3dhcDogYSBnZW8tZHJpdmVuIGxvY2F0aW9uIGNoYW5nZSBjYW4gbGFuZCBmaXJzdCwgYW5kIGl0cyBvcHRpbWlzdGljCiAgICAvLyBldmVyeXRoaW5nLWF2YWlsYWJsZSBkZWZhdWx0cyBtdXN0IG5vdCBwYWludCBjYXJkcyB0aGF0IHRoZW4gZmxpcCB0byBzb2xkIG91dC4KICAgIGxldCBhdmFpbGFiaWxpdHlTdGF0dXNTZXR0bGVkID0gZmFsc2U7CgogICAgLy8gU3RhdHVzIHJvdyBmb3Igb25lIGRhdGFjZW50ZXIgYW5kIG9uZSBtb2RlbC4gUm93cyB3aXRob3V0IGBkZXZpY2VNb2RlbGAgYXJlIHRoZSBNNC4KICAgIGZ1bmN0aW9uIGRhdGFjZW50ZXJSb3cobG9jYXRpb25LZXksIG1vZGVsS2V5ID0gc2VsZWN0ZWRNb2RlbCkgewogICAgICBpZiAoIU1PREVMU1ttb2RlbEtleV0\/LmxvY2F0aW9ucy5pbmNsdWRlcyhsb2NhdGlvbktleSkpIHJldHVybiBudWxsOwogICAgICBjb25zdCBiYWNrZW5kS2V5ID0gTE9DQVRJT05TW2xvY2F0aW9uS2V5XT8uYmFja2VuZEtleTsKICAgICAgY29uc3QgbW9kZWwgPSBNT0RFTFNbbW9kZWxLZXldPy5iYWNrZW5kS2V5ID8\/IDA7CiAgICAgIHJldHVybiBsYXN0QXZhaWxhYmlsaXR5UGF5bG9hZD8uZGF0YWNlbnRlcnM\/LmZpbmQoZCA9PiBkLmxvY2F0aW9uID09PSBiYWNrZW5kS2V5ICYmIChkLmRldmljZU1vZGVsID8\/IDApID09PSBtb2RlbCkgPz8gbnVsbDsKICAgIH0KCiAgICAvLyBUaGUgTTQgaXMgYWx3YXlzIG9uIHNhbGUuIEFueSBvdGhlciBtb2RlbCBpcyBvbiBzYWxlIG9uY2UgdGhlIHN0YXR1cyBBUEkgcmV0dXJucyByb3dzIGZvciBpdCwKICAgIC8vIHNvIGEgbmV3ZXIgTWFjIGNhbiBuZXZlciBiZSBjaGVja2VkIG91dCBhZ2FpbnN0IGEgYmFja2VuZCB0aGF0IHdvdWxkIGJpbGwgaXQgYXMgYW4gTTQuCiAgICBmdW5jdGlvbiBtb2RlbE9uU2FsZShtb2RlbEtleSkgewogICAgICBpZiAobW9kZWxLZXkgPT09ICdtNCcpIHJldHVybiB0cnVlOwogICAgICBjb25zdCBtb2RlbCA9IE1PREVMU1ttb2RlbEtleV0\/LmJhY2tlbmRLZXk7CiAgICAgIHJldHVybiAhIWxhc3RBdmFpbGFiaWxpdHlQYXlsb2FkPy5kYXRhY2VudGVycz8uc29tZShkID0+IGQuZGV2aWNlTW9kZWwgPT09IG1vZGVsKTsKICAgIH0KCiAgICAvLyBSZXF1ZXN0IGZpZWxkIGZvciB0aGUgTWFjIG1vZGVsLiBMZWZ0IG91dCBmb3IgdGhlIE00LCBzbyB0b2RheSdzIEFQSSBrZWVwcyByZWNlaXZpbmcgZXhhY3RseQogICAgLy8gdGhlIGJvZHkgaXQgYWxyZWFkeSBhY2NlcHRzLgogICAgZnVuY3Rpb24gbW9kZWxGaWVsZChtb2RlbEtleSkgewogICAgICBjb25zdCBtb2RlbCA9IE1PREVMU1ttb2RlbEtleV0\/LmJhY2tlbmRLZXkgPz8gMDsKICAgICAgcmV0dXJuIG1vZGVsID09PSAwID8ge30gOiB7IGRldmljZU1vZGVsOiBtb2RlbCB9OwogICAgfQoKICAgIC8vIFB1bGwgdGhlIGNvdW50cyBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRhY2VudGVyIG91dCBvZiB0aGUgcGF5bG9hZCBhbmQKICAgIC8vIHVwZGF0ZSB0aGUgZ2xvYmFsIGF2YWlsYWJpbGl0eSBzdGF0ZS4gRmFsbHMgYmFjayB0byAiZXZlcnl0aGluZyBhdmFpbGFibGUiIHdoZW4KICAgIC8vIHRoZSBwYXlsb2FkIGRvZXNuJ3QgaW5jbHVkZSB0aGUgc2VsZWN0ZWQgREMgKGUuZy4gYmVmb3JlIHRoZSBBUEkgY2FsbCBoYXMgY29tZSBiYWNrKS4KICAgIGZ1bmN0aW9uIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpIHsKICAgICAgLy8gQSBNYWMgcGlja2VkIGJlZm9yZSB0aGUgc3RhdHVzIEFQSSBhbnN3ZXJlZCB0aGF0IHR1cm5zIG91dCBub3QgdG8gYmUgb24gc2FsZSBmYWxscyBiYWNrIHRvIHRoZSBNNC4KICAgICAgY29uc3QgbW9kZWxGZWxsQmFjayA9IGF2YWlsYWJpbGl0eVN0YXR1c1NldHRsZWQgJiYgIW1vZGVsT25TYWxlKHNlbGVjdGVkTW9kZWwpOwogICAgICBpZiAobW9kZWxGZWxsQmFjaykgewogICAgICAgIHNlbGVjdGVkTW9kZWwgPSAnbTQnOwogICAgICAgIGlmIChsb2NhdGlvblJlc29sdmVkKSByZW5kZXJMb2NhdGlvblRhYnMoKTsKICAgICAgfQogICAgICBjb25zdCBkYyA9IGRhdGFjZW50ZXJSb3coc2VsZWN0ZWRMb2NhdGlvbik7CgogICAgICAvLyBFdmVyeSBjb3VudCAoYmFzZSBkZXZpY2VzIEFORCBkcml2ZS1lcXVpcHBlZCBkZXZpY2VzKSBpcyByZWFkIGZyb20gdGhlIFNFTEVDVEVEIGRhdGFjZW50ZXIuCiAgICAgIC8vIEFkZC1vbnMgYXJlIG5ldmVyIHNvdXJjZWQgZnJvbSBhbm90aGVyIERDOiB3aGF0IHRoZSB2aXNpdG9yIHNlZXMgdW5kZXIgYSBsb2NhdGlvbiB0YWIgaXMKICAgICAgLy8gZXhhY3RseSB3aGF0IHRoYXQgbG9jYXRpb24gY2FuIGZ1bGZpbCwgYW5kIGNoZWNrb3V0IGFsd2F5cyBnb2VzIHRvIHRoZSBzZWxlY3RlZCBEQy4KICAgICAgaWYgKGRjKSB7CiAgICAgICAgY3VycmVudEF2YWlsYWJsZURldmljZXMgPSBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlcyA\/PyAwKTsKICAgICAgICBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPSBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlc1dpdGgyNTZHYkRyaXZlID8\/IDApOwogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9IE51bWJlcihkYy5hdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPz8gMCk7CiAgICAgICAgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gTnVtYmVyKGRjLmRhaWx5UGxhbkF2YWlsYWJpbGl0eVRocmVzaG9sZCA\/PyAzKTsKICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE1vZGVsICE9PSAnbTQnKSB7CiAgICAgICAgLy8gTm8gcm93IGZvciB0aGlzIG1vZGVsIGhlcmU6IGl0IGlzIG5vdCBzb2xkIGluIHRoaXMgZGF0YWNlbnRlciwgb3Igbm90IHlldCBhdCBhbGwuCiAgICAgICAgY3VycmVudEF2YWlsYWJsZURldmljZXMgPSAwOwogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA9IDA7CiAgICAgICAgYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID0gMDsKICAgICAgICBkYWlseVBsYW5BdmFpbGFiaWxpdHlUaHJlc2hvbGQgPSAzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5vIGRhdGEgZm9yIHRoaXMgREMgeWV0OiBrZWVwIGRlZmF1bHRzIHNvIG5vdGhpbmcgYXBwZWFycyBhcnRpZmljaWFsbHkgb3V0IG9mIHN0b2NrLgogICAgICAgIGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID0gOTk5OwogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA9IDk5OTsKICAgICAgICBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPSA5OTk7CiAgICAgICAgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gMzsKICAgICAgfQoKCiAgICAgIGlmICghYXZhaWxhYmlsaXR5U3RhdHVzU2V0dGxlZCkgcmV0dXJuOwoKICAgICAgcmVuZGVyTW9kZWxUaWxlcygpOwogICAgICByZW5kZXJDeWNsZVRhYnMoKTsKICAgICAgcmVuZGVyU3RvcmFnZU9wdGlvbnMoKTsKICAgICAgdXBkYXRlUHJpY2VEaXNwbGF5KCk7CiAgICAgIHVwZGF0ZUN0YUJ1dHRvblN0YXRlKCk7CiAgICAgIHJlbmRlckF2YWlsYWJpbGl0eU5vdGljZXMoKTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaEF2YWlsYWJpbGl0eVN0YXR1cygpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKEVORFBPSU5UX1NUQVRVUywgeyBtZXRob2Q6ICJHRVQiIH0pOwogICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzIEFQSSByZXNwb25kZWQgd2l0aCAke3Jlc3BvbnNlLnN0YXR1c31gKTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBheWxvYWQ\/LmRhdGFjZW50ZXJzKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0dXMgQVBJIHJldHVybmVkIGFuIGludmFsaWQgcGF5bG9hZCIpOwogICAgICAgIH0KCiAgICAgICAgbGFzdEF2YWlsYWJpbGl0eVBheWxvYWQgPSBwYXlsb2FkOwogICAgICAgIGF2YWlsYWJpbGl0eVN0YXR1c1NldHRsZWQgPSB0cnVlOwogICAgICAgIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBhdmFpbGFiaWxpdHkgc3RhdHVzIiwgZXJyb3IpOwogICAgICAgIC8vIE9uIGVycm9yLCBrZWVwIGV2ZXJ5dGhpbmcgYXZhaWxhYmxlIC0gdGhlIEFQSSBuZXZlciBleHBsaWNpdGx5IHNhaWQgYW55dGhpbmcgd2FzIHVuYXZhaWxhYmxlLgogICAgICAgIGxhc3RBdmFpbGFiaWxpdHlQYXlsb2FkID0gbnVsbDsKICAgICAgICBhdmFpbGFiaWxpdHlTdGF0dXNTZXR0bGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUF2YWlsYWJpbGl0eUZvclNlbGVjdGVkTG9jYXRpb24oKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGVkU3RvcmFnZVNvbGRPdXQoKSB7CiAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdhZGRvbjI1NicpIHJldHVybiBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDA7CiAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdhZGRvbjUxMicpIHJldHVybiBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPT09IDA7CiAgICAgIHJldHVybiBjdXJyZW50QXZhaWxhYmxlRGV2aWNlcyA9PT0gMDsKICAgIH0KCiAgICAvLyBEYWlseSBuZWVkcyBtb3JlIGZyZWUgTWFjcyBpbiB0aGUgZGF0YWNlbnRlciB0aGFuIGl0cyB0aHJlc2hvbGQuCiAgICBmdW5jdGlvbiBzZWxlY3RlZERhaWx5U29sZE91dCgpIHsKICAgICAgcmV0dXJuIHNlbGVjdGVkQ3ljbGUgPT09ICdkYWlseScgJiYgZ2V0VG90YWxBdmFpbGFibGVEZXZpY2VzKCkgPD0gZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUN0YUJ1dHRvblN0YXRlKCkgewogICAgICBjb25zdCBjdGFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3RhQnV0dG9uJyk7CgogICAgICBpZiAoc2VsZWN0ZWRTdG9yYWdlU29sZE91dCgpIHx8IHNlbGVjdGVkRGFpbHlTb2xkT3V0KCkpIHsKICAgICAgICBjdGFCdXR0b24udGV4dENvbnRlbnQgPSB0KCdjdGEud2FpdGxpc3QnKTsKICAgICAgICBjdGFCdXR0b24uY2xhc3NMaXN0LmFkZCgnb3V0LW9mLXN0b2NrJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3RhQnV0dG9uLnRleHRDb250ZW50ID0gdCgnY3RhLmJ1eScpOwogICAgICAgIGN0YUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdvdXQtb2Ytc3RvY2snKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW5BdmFpbGFiaWxpdHlEaWFsb2cocHJpY2luZ09wdGlvbiwgbW9kZWxLZXkpIHsKICAgICAgY3VycmVudFByaWNpbmdPcHRpb24gPSBwcmljaW5nT3B0aW9uICE9PSB1bmRlZmluZWQgPyBwcmljaW5nT3B0aW9uIDogbnVsbDsKICAgICAgZGlhbG9nTW9kZWwgPSBNT0RFTFNbbW9kZWxLZXldID8gbW9kZWxLZXkgOiBzZWxlY3RlZE1vZGVsOwoKICAgICAgLy8gVXBkYXRlIGRpYWxvZyBjb250ZW50IGJhc2VkIG9uIHRoZSByZWFzb24uIENvcHkgbmFtZXMgdGhlIHNlbGVjdGVkIHJlZ2lvbiBvbmNlIHRoZQogICAgICAvLyBzdGF0dXMgcGF5bG9hZCBpcyBpbiwgYW5kIHRoZSAiUHJlZmVyIG5vdCB0byB3YWl0PyIgcm93IG9mZmVycyBhbnkgcmVnaW9uIHRoYXQgaGFzIGl0LgogICAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eURpYWxvZ1RpdGxlJyk7CiAgICAgIGNvbnN0IGRlc2NFbCA9IGF2YWlsYWJpbGl0eURpYWxvZy5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgIGNvbnN0IHJlYWR5ID0gbm90aWNlc1JlYWR5KCk7CiAgICAgIGNvbnN0IG1vZGVsID0gTU9ERUxTW2RpYWxvZ01vZGVsXS5uYW1lOwogICAgICBjb25zdCBpbkhlcmUgPSByZWdpb25JbihzZWxlY3RlZExvY2F0aW9uKTsKICAgICAgY29uc3QgaXNFeHRlcm5hbERyaXZlT3B0aW9uID0gcHJpY2luZ09wdGlvbiA9PT0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5FeHRlcm5hbDI1NkdiCiAgICAgICAgfHwgcHJpY2luZ09wdGlvbiA9PT0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5FeHRlcm5hbDUxMkdiOwogICAgICBjb25zdCByZWdpb25Tb2xkT3V0ID0gcmVhZHkgJiYgIWxvY2F0aW9uSGFzKHNlbGVjdGVkTG9jYXRpb24sICdhbnknKTsKCiAgICAgIGlmICghbW9kZWxPblNhbGUoZGlhbG9nTW9kZWwpKSB7CiAgICAgICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHQoJ2RpYWxvZy5zb29uVGl0bGUnLCB7IG1vZGVsIH0pOwogICAgICAgIGRlc2NFbC50ZXh0Q29udGVudCA9IHQoJ2RpYWxvZy5zb29uRGVzYycpOwogICAgICAgIHJlbmRlckRpYWxvZ0FsdGVybmF0aXZlKCdub25lJywgbnVsbCk7CiAgICAgIH0gZWxzZSBpZiAocHJpY2luZ09wdGlvbiA9PT0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5EYWlseSkgewogICAgICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0KCdkaWFsb2cuZGFpbHlUaXRsZScpOwogICAgICAgIGRlc2NFbC50ZXh0Q29udGVudCA9IChyZWFkeSA\/IHQoJ2RpYWxvZy5kYWlseURlc2NIZXJlJywgeyBpbkhlcmUgfSkgOiB0KCdkaWFsb2cuZGFpbHlEZXNjJykpCiAgICAgICAgICArIChyZWdpb25Tb2xkT3V0ID8gJycgOiB0KCdkaWFsb2cuZGFpbHlPdGhlcnMnKSkKICAgICAgICAgICsgdCgnZGlhbG9nLmRhaWx5Tm90aWZ5Jyk7CiAgICAgICAgcmVuZGVyRGlhbG9nQWx0ZXJuYXRpdmUoJ2RhaWx5JywgJ2RhaWx5Jyk7CiAgICAgIH0gZWxzZSBpZiAoaXNFeHRlcm5hbERyaXZlT3B0aW9uICYmIHJlYWR5ICYmICFyZWdpb25Tb2xkT3V0KSB7CiAgICAgICAgLy8gT25seSB0aGlzIGRyaXZlIGNvbmZpZ3VyYXRpb24gaXMgZ29uZTsgYmFzZSBNYWNzIGFyZSBzdGlsbCBvbiBvZmZlciBoZXJlLgogICAgICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0KCdkaWFsb2cuc3RvcmFnZVRpdGxlJyk7CiAgICAgICAgZGVzY0VsLnRleHRDb250ZW50ID0gdCgnZGlhbG9nLnN0b3JhZ2VEZXNjJywgeyBpbkhlcmUgfSk7CiAgICAgICAgcmVuZGVyRGlhbG9nQWx0ZXJuYXRpdmUocHJpY2luZ09wdGlvbiA9PT0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5FeHRlcm5hbDI1NkdiID8gJ2FkZG9uMjU2JyA6ICdhZGRvbjUxMicsIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHRpdGxlS2V5ID0gKGRpYWxvZ01vZGVsID09PSAnbTQnID8gJ2RpYWxvZy5hbGxUaXRsZScgOiAnZGlhbG9nLm1vZGVsVGl0bGUnKSArIChyZWFkeSA\/ICdIZXJlJyA6ICcnKTsKICAgICAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdCh0aXRsZUtleSwgeyBtb2RlbCwgaW5IZXJlIH0pOwogICAgICAgIGRlc2NFbC50ZXh0Q29udGVudCA9IHJlYWR5ID8gdCgnZGlhbG9nLmFsbERlc2NIZXJlJywgeyBpbkhlcmUgfSkgOiB0KCdkaWFsb2cuYWxsRGVzYycpOwogICAgICAgIHJlbmRlckRpYWxvZ0FsdGVybmF0aXZlKCdhbnknLCBudWxsKTsKICAgICAgfQoKICAgICAgYXZhaWxhYmlsaXR5RGlhbG9nLmNsYXNzTGlzdC5yZW1vdmUoImlzLWhpZGRlbiIpOwogICAgICBhdmFpbGFiaWxpdHlPdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoImlzLWhpZGRlbiIpOwogICAgICBhdmFpbGFiaWxpdHlPdmVybGF5LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCAiZmFsc2UiKTsKICAgICAgYXZhaWxhYmlsaXR5RW1haWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCkgewogICAgICBhdmFpbGFiaWxpdHlEaWFsb2cuY2xhc3NMaXN0LmFkZCgiaXMtaGlkZGVuIik7CiAgICAgIGF2YWlsYWJpbGl0eU92ZXJsYXkuY2xhc3NMaXN0LmFkZCgiaXMtaGlkZGVuIik7CiAgICAgIGF2YWlsYWJpbGl0eU92ZXJsYXkuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsICJ0cnVlIik7CgogICAgICBpZiAoZm9ybVN1Ym1pdHRlZFN1Y2Nlc3NmdWxseSkgewogICAgICAgIGZvcm1TdWJtaXR0ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsKICAgICAgICBjb25zdCBzdWJtaXRCdXR0b24gPSBhdmFpbGFiaWxpdHlGb3JtLnF1ZXJ5U2VsZWN0b3IoImJ1dHRvbiIpOwogICAgICAgIHN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9IHQoJ3dhaXRsaXN0Lm5vdGlmeScpOwogICAgICAgIHN1Ym1pdEJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gIiI7CiAgICAgICAgc3VibWl0QnV0dG9uLnN0eWxlLmNvbG9yID0gIiI7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSAiIjsKICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIGluZm8iOwogICAgICB9CiAgICAgIGN1cnJlbnRQcmljaW5nT3B0aW9uID0gbnVsbDsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXRBdmFpbGFiaWxpdHlGb3JtKGV2ZW50KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgICBpZiAoZm9ybVN1Ym1pdHRlZFN1Y2Nlc3NmdWxseSkgewogICAgICAgIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBlbWFpbCA9IGF2YWlsYWJpbGl0eUVtYWlsLnZhbHVlLnRyaW0oKTsKICAgICAgaWYgKCFlbWFpbCkgewogICAgICAgIGF2YWlsYWJpbGl0eUZlZWRiYWNrLnRleHRDb250ZW50ID0gdCgnd2FpdGxpc3QuaW52YWxpZEVtYWlsJyk7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2suY2xhc3NOYW1lID0gImF2YWlsYWJpbGl0eS1mZWVkYmFjayBlcnJvciI7CiAgICAgICAgYXZhaWxhYmlsaXR5RW1haWwuZm9jdXMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGF2YWlsYWJpbGl0eUZvcm0ucXVlcnlTZWxlY3RvcigiYnV0dG9uIik7CgogICAgICB0cnkgewogICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSB0KCd3YWl0bGlzdC5zYXZpbmcnKTsKICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIGluZm8iOwoKICAgICAgICAvLyBFdmVyeSB3YWl0bGlzdCBlbnRyeSAoYmFzZSBvciBleHRlcm5hbCBkcml2ZSkgaXMgYWJvdXQgdGhlIFNFTEVDVEVEIGRhdGFjZW50ZXIncyBzdG9jazsgYSBNYWMKICAgICAgICAvLyB0aGF0IGRhdGFjZW50ZXIgZG9lcyBub3Qgc2VsbCBpcyBmaWxlZCB1bmRlciB0aGUgZmlyc3QgZGF0YWNlbnRlciB0aGF0IGRvZXMuCiAgICAgICAgY29uc3Qgd2FpdGxpc3RMb2NhdGlvbiA9IE1PREVMU1tkaWFsb2dNb2RlbF0ubG9jYXRpb25zLmluY2x1ZGVzKHNlbGVjdGVkTG9jYXRpb24pCiAgICAgICAgICA\/IHNlbGVjdGVkTG9jYXRpb24KICAgICAgICAgIDogTU9ERUxTW2RpYWxvZ01vZGVsXS5sb2NhdGlvbnNbMF07CiAgICAgICAgY29uc3QgZGF0YWNlbnRlciA9IExPQ0FUSU9OU1t3YWl0bGlzdExvY2F0aW9uXT8uYmFja2VuZEtleTsKICAgICAgICAvLyBEYWlseSBvdXQtb2Ytc3RvY2sgZW50ZXJzIHZpYSB0aGUgY3ljbGUgdGFiIHdpdGhvdXQgY2hhbmdpbmcgc2VsZWN0ZWRDeWNsZSwgc28ga2V5IHRoZQogICAgICAgIC8vIERhaWx5IGNhc2Ugb2ZmIHRoZSBwcmljaW5nIG9wdGlvbjsgb3RoZXJ3aXNlIG1hcCB0aGUgc2VsZWN0ZWQgYmlsbGluZyBjeWNsZS4KICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25UeXBlID0gY3VycmVudFByaWNpbmdPcHRpb24gPT09IEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuRGFpbHkKICAgICAgICAgID8gU3Vic2NyaXB0aW9uVHlwZS5EYWlseQogICAgICAgICAgOiBDWUNMRV9UT19TVUJTQ1JJUFRJT05fVFlQRVtzZWxlY3RlZEN5Y2xlXTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKEVORFBPSU5UX1NVQlNDUklCRSwgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSwKICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW1haWwsIHByaWNpbmdPcHRpb246IGN1cnJlbnRQcmljaW5nT3B0aW9uLCBkYXRhY2VudGVyLCBzdWJzY3JpcHRpb25UeXBlLCAuLi5tb2RlbEZpZWxkKGRpYWxvZ01vZGVsKSB9KQogICAgICAgIH0pOwoKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoJ3dhaXRsaXN0LnRvb0Zhc3QnKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JCb2R5Py5lcnJvciA\/PyB0KCd3YWl0bGlzdC5mYWlsZWRMYXRlcicpKTsKICAgICAgICB9CgogICAgICAgIGF2YWlsYWJpbGl0eUVtYWlsLnZhbHVlID0gIiI7CiAgICAgICAgZm9ybVN1Ym1pdHRlZFN1Y2Nlc3NmdWxseSA9IHRydWU7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSB0KCd3YWl0bGlzdC5zdWNjZXNzJyk7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2suY2xhc3NOYW1lID0gImF2YWlsYWJpbGl0eS1mZWVkYmFjayBzdWNjZXNzIjsKCiAgICAgICAgc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gdCgnd2FpdGxpc3QuY2xvc2UnKTsKICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBzdWJtaXRCdXR0b24uc3R5bGUuYmFja2dyb3VuZCA9ICJyZ2JhKDI1NSwyNTUsMjU1LC4xKSI7CiAgICAgICAgc3VibWl0QnV0dG9uLnN0eWxlLmNvbG9yID0gInZhcigtLXRleHQpIjsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay50ZXh0Q29udGVudCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogdCgnd2FpdGxpc3QuZmFpbGVkJyk7CiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2suY2xhc3NOYW1lID0gImF2YWlsYWJpbGl0eS1mZWVkYmFjayBlcnJvciI7CiAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR09PR0xFIFJFVklFV1MgQ09ORklHVVJBVElPTgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBjb25zdCBSRVZJRVdTX0NPTkZJRyA9IHsKICAgICAgLy8gR29vZ2xlIE1hcHMgVVJMIGZvciAiUmVhZCBhbGwgcmV2aWV3cyIgbGluawogICAgICBnb29nbGVNYXBzVXJsOiAnaHR0cHM6Ly9tYXBzLmFwcC5nb28uZ2wvdjU1ZWRLRDdLMmdlUGhUaDknLAoKICAgICAgLy8gUmV2aWV3cyBkYXRhIC0gVXBkYXRlIHRoZXNlIG1hbnVhbGx5IHdoZW4gbmV3IHJldmlld3MgY29tZSBpbgogICAgICBmYWxsYmFja0RhdGE6IHsKICAgICAgICByYXRpbmc6IDUuMCwKICAgICAgICB0b3RhbFJldmlld3M6IDI4LAogICAgICAgIHJldmlld3M6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgYXV0aG9yX25hbWU6ICJBaG1lZCBNb25zZWYiLAogICAgICAgICAgICByYXRpbmc6IDUsCiAgICAgICAgICAgIHRleHQ6ICJFeGNlbGxlbnQgc2VydmljZSBpbiBldmVyeSBhc3BlY3QuIFJlc3BvbnNlIHRpbWUgaXMgb3V0c3RhbmRpbmcsIGFuZCB0aGUgdGVjaG5pY2FsIHN1cHBvcnQgdGVhbSBpcyB2ZXJ5IGNvb3BlcmF0aXZlIGFuZCBmb2xsb3dzIHVwIHVudGlsIHRoZSBpc3N1ZSBpcyBjb21wbGV0ZWx5IHJlc29sdmVkLiBBbnkgaW5xdWlyeSBvciBwcm9ibGVtIGlzIGhhbmRsZWQgd2l0aCBwcm9mZXNzaW9uYWxpc20gYW5kIGdyZWF0IGNhcmUuIEEgc21vb3RoIGV4cGVyaWVuY2UgYW5kIHRydWx5IGV4Y2VwdGlvbmFsIHNlcnZpY2Ug4oCUIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRob3V0IGhlc2l0YXRpb24uIiwKICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogIjYgZGF5cyBhZ28iLAogICAgICAgICAgICBwcm9maWxlX3Bob3RvX3VybDogbnVsbAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgYXV0aG9yX25hbWU6ICJFbGVuYSBTYWxhZGluaSIsCiAgICAgICAgICAgIHJhdGluZzogNSwKICAgICAgICAgICAgdGV4dDogIkdyZWF0IGFuZCB2ZXJ5IGhlbHBmdWwgc2VydmljZSEgVGhhbmsgeW91LiIsCiAgICAgICAgICAgIHJlbGF0aXZlX3RpbWVfZGVzY3JpcHRpb246ICJhIHdlZWsgYWdvIiwKICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiRW1hbWEgU2hha2VyeSIsCiAgICAgICAgICAgIHJhdGluZzogNSwKICAgICAgICAgICAgdGV4dDogIlN1cGVyIGVhc3kgdG8gcmVudCBhIE1hYyEgRmFzdCBkZWxpdmVyeSBhbmQgZ3JlYXQgY29uZGl0aW9uLiBIaWdobHkgcmVjb21tZW5kIiwKICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogIjIgd2Vla3MgYWdvIiwKICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiTWFsYWsgQWx3YXplZXIiLAogICAgICAgICAgICByYXRpbmc6IDUsCiAgICAgICAgICAgIHRleHQ6ICJHcmVhdCBwcmljaW5nLCBlYXN5IHNldHVwLCBhbmQgb3V0c3RhbmRpbmcgY3VzdG9tZXIgY29tbXVuaWNhdGlvbi4gU3VwcG9ydCB3YXMgZmFzdCBhbmQgdmVyeSBoZWxwZnVsLiBIaWdobHkgcmVjb21tZW5kZWQhIiwKICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogIjIgd2Vla3MgYWdvIiwKICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiU3VtYW4iLAogICAgICAgICAgICByYXRpbmc6IDUsCiAgICAgICAgICAgIHRleHQ6ICJUaGUgcGVyZm9ybWFuY2UgYXJlIGF3ZXNvbWUgb2YgdGhlIG1hYy4gQW5kIGkgbmV2ZXIgZmFjZSBhbnkgaXNzdWUgb24gb25saW5lIG1hYyBydW5uaW5nIG9uIGNsb3VkLiBUaGUgYmVzdCBwYXJ0IGlzIGl0J3MgYWZmb3JkYWJsZSBmb3IgbWUgdG8gY29kZSBvbiBtYWMgZnJvbSBteSBXaW5kb3dzIHBjLiIsCiAgICAgICAgICAgIHJlbGF0aXZlX3RpbWVfZGVzY3JpcHRpb246ICI0IHdlZWtzIGFnbyIsCiAgICAgICAgICAgIHByb2ZpbGVfcGhvdG9fdXJsOiBudWxsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBhdXRob3JfbmFtZTogIkhhc3NhbiBBTC1PcmFpYmkiLAogICAgICAgICAgICByYXRpbmc6IDUsCiAgICAgICAgICAgIHRleHQ6ICJHcmVhdCBzZXJ2aWNlIHdpdGggZXhjZWxsZW50IHN1cHBvcnQuIFRoZSBNYWMgTWluaSBNNCBydW5zIHNtb290aGx5IGFuZCB0aGUgc2V0dXAgd2FzIHF1aWNrLiBIaWdobHkgcmVjb21tZW5kZWQgZm9yIGRldmVsb3BlcnMhIiwKICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogImEgbW9udGggYWdvIiwKICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0KICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJFVklFV1MgQ0FST1VTRUwKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgbGV0IHJldmlld3NEYXRhID0gbnVsbDsKICAgIGxldCBjdXJyZW50UmV2aWV3U2xpZGUgPSAwOwoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlU3RhcnNIdG1sKHJhdGluZywgc2l6ZSA9IDE2KSB7CiAgICAgIGxldCBodG1sID0gJyc7CiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDU7IGkrKykgewogICAgICAgIGlmIChpIDw9IHJhdGluZykgewogICAgICAgICAgaHRtbCArPSBgPHN2ZyB3aWR0aD0iJHtzaXplfSIgaGVpZ2h0PSIke3NpemV9IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiNGQkJDMDQiPjxwYXRoIGQ9Ik0xMiAybDMuMDkgNi4yNkwyMiA5LjI3bC01IDQuODcgMS4xOCA2Ljg4TDEyIDE3Ljc3bC02LjE4IDMuMjVMNyAxNC4xNCAyIDkuMjdsNi45MS0xLjAxTDEyIDJ6Ii8+PC9zdmc+YDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaHRtbCArPSBgPHN2ZyB3aWR0aD0iJHtzaXplfSIgaGVpZ2h0PSIke3NpemV9IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC4yKSI+PHBhdGggZD0iTTEyIDJsMy4wOSA2LjI2TDIyIDkuMjdsLTUgNC44NyAxLjE4IDYuODhMMTIgMTcuNzdsLTYuMTggMy4yNUw3IDE0LjE0IDIgOS4yN2w2LjkxLTEuMDFMMTIgMnoiLz48L3N2Zz5gOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaHRtbDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRSZWxhdGl2ZVRpbWUodGltZXN0YW1wKSB7CiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwOwogICAgICBjb25zdCBkaWZmID0gbm93IC0gdGltZXN0YW1wOwoKICAgICAgaWYgKGRpZmYgPCA4NjQwMCkgcmV0dXJuICdUb2RheSc7CiAgICAgIGlmIChkaWZmIDwgODY0MDAgKiAyKSByZXR1cm4gJ1llc3RlcmRheSc7CiAgICAgIGlmIChkaWZmIDwgODY0MDAgKiA3KSByZXR1cm4gYCR7TWF0aC5mbG9vcihkaWZmIC8gODY0MDApfSBkYXlzIGFnb2A7CiAgICAgIGlmIChkaWZmIDwgODY0MDAgKiAzMCkgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZiAvICg4NjQwMCAqIDcpKX0gd2Vla3MgYWdvYDsKICAgICAgaWYgKGRpZmYgPCA4NjQwMCAqIDM2NSkgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZiAvICg4NjQwMCAqIDMwKSl9IG1vbnRocyBhZ29gOwogICAgICByZXR1cm4gYCR7TWF0aC5mbG9vcihkaWZmIC8gKDg2NDAwICogMzY1KSl9IHllYXJzIGFnb2A7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0SW5pdGlhbHMobmFtZSkgewogICAgICByZXR1cm4gbmFtZS5zcGxpdCgnICcpLm1hcChuID0+IG5bMF0pLmpvaW4oJycpLnRvVXBwZXJDYXNlKCkuc3Vic3RyaW5nKDAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlclJldmlld0NhcmQocmV2aWV3KSB7CiAgICAgIGNvbnN0IGluaXRpYWxzID0gZ2V0SW5pdGlhbHMocmV2aWV3LmF1dGhvcl9uYW1lKTsKICAgICAgY29uc3QgcmVsYXRpdmVUaW1lID0gcmV2aWV3LnJlbGF0aXZlX3RpbWVfZGVzY3JpcHRpb24gfHwgZ2V0UmVsYXRpdmVUaW1lKHJldmlldy50aW1lKTsKCiAgICAgIHJldHVybiBgCiAgICAgICAgPGRpdiBjbGFzcz0icmV2aWV3LWNhcmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0icmV2aWV3LWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJldmlld2VyLWF2YXRhciI+CiAgICAgICAgICAgICAgJHtyZXZpZXcucHJvZmlsZV9waG90b191cmwKICAgICAgICAgICAgICAgID8gYDxpbWcgc3JjPSIke3Jldmlldy5wcm9maWxlX3Bob3RvX3VybH0iIGFsdD0iJHtyZXZpZXcuYXV0aG9yX25hbWV9IiAvPmAKICAgICAgICAgICAgICAgIDogaW5pdGlhbHMKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXdlci1pbmZvIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXdlci1uYW1lIj4ke3Jldmlldy5hdXRob3JfbmFtZX08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJldmlldy1zdGFycyI+CiAgICAgICAgICAgICR7Z2VuZXJhdGVTdGFyc0h0bWwocmV2aWV3LnJhdGluZyl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJldmlldy10ZXh0Ij4ke3Jldmlldy50ZXh0fTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icmV2aWV3LWdvb2dsZS1pY29uIj4KICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGhlaWdodD0iMTgiPgogICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+CiAgICAgICAgICAgICAgPHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPgogICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+CiAgICAgICAgICAgICAgPHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJSZXZpZXdzKGRhdGEpIHsKICAgICAgcmV2aWV3c0RhdGEgPSBkYXRhOwoKICAgICAgLy8gVXBkYXRlIHN1bW1hcnkgKHNtYWxsZXIgc3RhcnMgZm9yIGhlYWRlcikKICAgICAgY29uc3QgYXZnUmF0aW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZnUmF0aW5nJyk7CiAgICAgIGNvbnN0IGF2Z1N0YXJzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZnU3RhcnMnKTsKICAgICAgY29uc3QgY2Fyb3VzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3c0Nhcm91c2VsJyk7CgogICAgICBpZiAoIWF2Z1JhdGluZ0VsIHx8ICFhdmdTdGFyc0VsIHx8ICFjYXJvdXNlbCkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbnRhTWFjIFByaWNpbmc6IFJldmlld3MgZWxlbWVudHMgbm90IGZvdW5kJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBhdmdSYXRpbmdFbC50ZXh0Q29udGVudCA9IGRhdGEucmF0aW5nLnRvRml4ZWQoMSk7CiAgICAgIGF2Z1N0YXJzRWwuaW5uZXJIVE1MID0gZ2VuZXJhdGVTdGFyc0h0bWwoTWF0aC5yb3VuZChkYXRhLnJhdGluZyksIDE4KTsKCiAgICAgIC8vIFJlbmRlciByZXZpZXcgY2FyZHMgKGR1cGxpY2F0ZSBmb3IgaW5maW5pdGUgc2Nyb2xsKQogICAgICBjb25zdCByZXZpZXdzSHRtbCA9IGRhdGEucmV2aWV3cy5tYXAocmVuZGVyUmV2aWV3Q2FyZCkuam9pbignJyk7CiAgICAgIC8vIER1cGxpY2F0ZSByZXZpZXdzIGZvciBzZWFtbGVzcyBpbmZpbml0ZSBzY3JvbGwKICAgICAgY2Fyb3VzZWwuaW5uZXJIVE1MID0gcmV2aWV3c0h0bWwgKyByZXZpZXdzSHRtbDsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2FkR29vZ2xlUmV2aWV3cygpIHsKICAgICAgLy8gTG9hZCByZXZpZXdzIGZyb20gY29uZmlnCiAgICAgIHJlbmRlclJldmlld3MoUkVWSUVXU19DT05GSUcuZmFsbGJhY2tEYXRhKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRU5URVJQUklTRSBQUklDSU5HIENBTENVTEFUT1IKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgbGV0IHF1YW50aXR5U2xpZGVyLCBkdXJhdGlvblNsaWRlciwgcXVhbnRpdHlWYWx1ZSwgZHVyYXRpb25WYWx1ZSwKICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UsIGR1cmF0aW9uRGlzY291bnRCYWRnZSwgZW50ZXJwcmlzZVByaWNlLAogICAgICAgIGRpc2NvdW50QmFkZ2VFbCwgcHJpY2VCcmVha2Rvd25FbnRlcnByaXNlLCBub25DdW11bGF0aXZlTm90aWNlOwoKICAgIGxldCBwcmV2aW91c1F1YW50aXR5RGlzY291bnQgPSAwOwogICAgbGV0IHByZXZpb3VzVGltZURpc2NvdW50ID0gMDsKCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVFbnRlcnByaXNlUHJpY2UoKSB7CiAgICAgIGlmICghcXVhbnRpdHlTbGlkZXIgfHwgIWR1cmF0aW9uU2xpZGVyKSByZXR1cm47CgogICAgICBjb25zdCBxdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5U2xpZGVyLnZhbHVlKTsKICAgICAgY29uc3QgZHVyYXRpb24gPSBwYXJzZUludChkdXJhdGlvblNsaWRlci52YWx1ZSk7CiAgICAgIGNvbnN0IEJBU0VfUFJJQ0VfUEVSX01PTlRIID0gY3ljbGVQcmljZSgnbW9udGhseScpOwoKICAgICAgY29uc3QgbW9kZWxOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VudGVycHJpc2VNb2RlbE5hbWUnKTsKICAgICAgaWYgKG1vZGVsTmFtZSkgbW9kZWxOYW1lLnRleHRDb250ZW50ID0gTU9ERUxTW3NlbGVjdGVkTW9kZWxdLm5hbWU7CgogICAgICAvLyBEZXRlcm1pbmUgcHJpY2UgcGVyIG1vbnRoIGJhc2VkIG9uIGR1cmF0aW9uCiAgICAgIGxldCBwcmljZVBlck1vbnRoID0gQkFTRV9QUklDRV9QRVJfTU9OVEg7CiAgICAgIGxldCB0aW1lRGlzY291bnQgPSAwOwoKICAgICAgaWYgKGR1cmF0aW9uID49IDMgJiYgZHVyYXRpb24gPCA2KSB7CiAgICAgICAgcHJpY2VQZXJNb250aCA9IGN5Y2xlUHJpY2UoJzNtb250aCcpIC8gMzsKICAgICAgICB0aW1lRGlzY291bnQgPSAwLjA1OwogICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID49IDYpIHsKICAgICAgICBwcmljZVBlck1vbnRoID0gY3ljbGVQcmljZSgnNm1vbnRoJykgLyA2OwogICAgICAgIHRpbWVEaXNjb3VudCA9IDAuMTA7CiAgICAgIH0KCiAgICAgIC8vIENhbGN1bGF0ZSBxdWFudGl0eS1iYXNlZCBkaXNjb3VudAogICAgICBsZXQgcXVhbnRpdHlEaXNjb3VudCA9IDA7CiAgICAgIGlmIChxdWFudGl0eSA+PSA1ICYmIHF1YW50aXR5IDw9IDE0KSB7CiAgICAgICAgcXVhbnRpdHlEaXNjb3VudCA9IDAuMDU7IC8vIDUlIGRpc2NvdW50CiAgICAgIH0gZWxzZSBpZiAocXVhbnRpdHkgPj0gMTUpIHsKICAgICAgICBxdWFudGl0eURpc2NvdW50ID0gMC4xMDsgLy8gMTAlIGRpc2NvdW50CiAgICAgIH0KCiAgICAgIC8vIEFwcGx5IHRoZSBoaWdoZXIgZGlzY291bnQKICAgICAgbGV0IGZpbmFsUHJpY2VQZXJNb250aCA9IHByaWNlUGVyTW9udGg7CiAgICAgIGxldCBhcHBsaWVkRGlzY291bnQgPSB0aW1lRGlzY291bnQ7CgogICAgICBpZiAocXVhbnRpdHlEaXNjb3VudCA+IHRpbWVEaXNjb3VudCkgewogICAgICAgIGZpbmFsUHJpY2VQZXJNb250aCA9IEJBU0VfUFJJQ0VfUEVSX01PTlRIICogKDEgLSBxdWFudGl0eURpc2NvdW50KTsKICAgICAgICBhcHBsaWVkRGlzY291bnQgPSBxdWFudGl0eURpc2NvdW50OwogICAgICB9CgogICAgICAvLyBVcGRhdGUgcXVhbnRpdHkgZGlzY291bnQgYmFkZ2UKICAgICAgaWYgKHF1YW50aXR5RGlzY291bnQgPiAwKSB7CiAgICAgICAgY29uc3QgcXVhbnRpdHlQZXJjZW50ID0gTWF0aC5yb3VuZChxdWFudGl0eURpc2NvdW50ICogMTAwKTsKICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UudGV4dENvbnRlbnQgPSB0KCdlbnRlcnByaXNlLm9mZicsIHsgcGN0OiBxdWFudGl0eVBlcmNlbnQgfSk7CiAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOwoKICAgICAgICBpZiAocXVhbnRpdHlEaXNjb3VudCAhPT0gcHJldmlvdXNRdWFudGl0eURpc2NvdW50KSB7CiAgICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7CiAgICAgICAgICB2b2lkIHF1YW50aXR5RGlzY291bnRCYWRnZS5vZmZzZXRXaWR0aDsKICAgICAgICAgIHF1YW50aXR5RGlzY291bnRCYWRnZS5jbGFzc0xpc3QuYWRkKCJib3VuY2UiKTsKICAgICAgICAgIHF1YW50aXR5VmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7CiAgICAgICAgICB2b2lkIHF1YW50aXR5VmFsdWUub2Zmc2V0V2lkdGg7CiAgICAgICAgICBxdWFudGl0eVZhbHVlLmNsYXNzTGlzdC5hZGQoImJvdW5jZSIpOwoKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7CiAgICAgICAgICAgIHF1YW50aXR5VmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7CiAgICAgICAgICB9LCA2MDApOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7CiAgICAgIH0KCiAgICAgIC8vIFVwZGF0ZSBkdXJhdGlvbiBkaXNjb3VudCBiYWRnZQogICAgICBpZiAodGltZURpc2NvdW50ID4gMCkgewogICAgICAgIGNvbnN0IHRpbWVQZXJjZW50ID0gTWF0aC5yb3VuZCh0aW1lRGlzY291bnQgKiAxMDApOwogICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS50ZXh0Q29udGVudCA9IHQoJ2VudGVycHJpc2Uub2ZmJywgeyBwY3Q6IHRpbWVQZXJjZW50IH0pOwogICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTsKCiAgICAgICAgaWYgKHRpbWVEaXNjb3VudCAhPT0gcHJldmlvdXNUaW1lRGlzY291bnQpIHsKICAgICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsKICAgICAgICAgIHZvaWQgZHVyYXRpb25EaXNjb3VudEJhZGdlLm9mZnNldFdpZHRoOwogICAgICAgICAgZHVyYXRpb25EaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5hZGQoImJvdW5jZSIpOwogICAgICAgICAgZHVyYXRpb25WYWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsKICAgICAgICAgIHZvaWQgZHVyYXRpb25WYWx1ZS5vZmZzZXRXaWR0aDsKICAgICAgICAgIGR1cmF0aW9uVmFsdWUuY2xhc3NMaXN0LmFkZCgiYm91bmNlIik7CgogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsKICAgICAgICAgICAgZHVyYXRpb25WYWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsKICAgICAgICAgIH0sIDYwMCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTsKICAgICAgfQoKICAgICAgLy8gU2hvdyBub24tY3VtdWxhdGl2ZSBub3RpY2Ugd2hlbiBib3RoIGhhdmUgZGlzY291bnRzCiAgICAgIGlmIChub25DdW11bGF0aXZlTm90aWNlKSB7CiAgICAgICAgbm9uQ3VtdWxhdGl2ZU5vdGljZS5zdHlsZS5kaXNwbGF5ID0gKHF1YW50aXR5RGlzY291bnQgPiAwICYmIHRpbWVEaXNjb3VudCA+IDApID8gImJsb2NrIiA6ICJub25lIjsKICAgICAgfQoKICAgICAgLy8gR2VuZXJhdGUgZGlzY291bnQgdGV4dAogICAgICBsZXQgZGlzY291bnRUZXh0ID0gdCgnZW50ZXJwcmlzZS5zdGFuZGFyZCcpOwogICAgICBpZiAoYXBwbGllZERpc2NvdW50ID4gMCkgewogICAgICAgIGRpc2NvdW50VGV4dCA9IHQoJ2VudGVycHJpc2UuYXBwbGllZCcsIHsgcGN0OiBNYXRoLnJvdW5kKGFwcGxpZWREaXNjb3VudCAqIDEwMCkgfSk7CiAgICAgIH0KCiAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBwcmljZQogICAgICBjb25zdCB0b3RhbFByaWNlID0gcXVhbnRpdHkgKiBkdXJhdGlvbiAqIGZpbmFsUHJpY2VQZXJNb250aDsKCiAgICAgIC8vIFVwZGF0ZSBVSQogICAgICBxdWFudGl0eVZhbHVlLnRleHRDb250ZW50ID0gcXVhbnRpdHkgPj0gMTUgPyAiMTUrIiA6IHF1YW50aXR5OwogICAgICBkdXJhdGlvblZhbHVlLnRleHRDb250ZW50ID0gZHVyYXRpb247CiAgICAgIGVudGVycHJpc2VQcmljZS50ZXh0Q29udGVudCA9ICIkIiArIHRvdGFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsKCiAgICAgIGlmIChhcHBsaWVkRGlzY291bnQgPiAwKSB7CiAgICAgICAgZGlzY291bnRCYWRnZUVsLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOwogICAgICB9IGVsc2UgewogICAgICAgIGRpc2NvdW50QmFkZ2VFbC5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTsKICAgICAgfQogICAgICBkaXNjb3VudEJhZGdlRWwudGV4dENvbnRlbnQgPSBkaXNjb3VudFRleHQ7CgogICAgICBwcmljZUJyZWFrZG93bkVudGVycHJpc2UudGV4dENvbnRlbnQgPSB0KCdlbnRlcnByaXNlLnBlckluc3RhbmNlJywgeyBwcmljZTogIiQiICsgZmluYWxQcmljZVBlck1vbnRoLnRvRml4ZWQoMikgfSk7CgogICAgICBwcmV2aW91c1F1YW50aXR5RGlzY291bnQgPSBxdWFudGl0eURpc2NvdW50OwogICAgICBwcmV2aW91c1RpbWVEaXNjb3VudCA9IHRpbWVEaXNjb3VudDsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTkFWSUdBVElPTiBIRUxQRVIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gbmF2aWdhdGVXaXRoTGFuZ3VhZ2UodGFyZ2V0UGF0aCkgewogICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgY29uc3QgbGFuZ0NvZGVzID0gWyd0cicsICdhcicsICdmcicsICdwdCcsICdlcycsICdlbiddOwogICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBjdXJyZW50UGF0aC5zcGxpdCgnLycpLmZpbHRlcihzZWdtZW50ID0+IHNlZ21lbnQubGVuZ3RoID4gMCk7CgogICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgbGFuZ0NvZGVzLmluY2x1ZGVzKHBhdGhTZWdtZW50c1swXS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgIGNvbnN0IGxhbmdDb2RlID0gcGF0aFNlZ21lbnRzWzBdOwogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYC8ke2xhbmdDb2RlfSR7dGFyZ2V0UGF0aH1gOwogICAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGFyZ2V0UGF0aDsKICAgICAgfQogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMT0NBVElPTiBGVU5DVElPTlMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gcmVuZGVyTG9jYXRpb25UYWJzKCkgewogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9jYXRpb25UYWJzJyk7CiAgICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignUmVudGFNYWMgUHJpY2luZzogI2xvY2F0aW9uVGFicyBlbGVtZW50IG5vdCBmb3VuZCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7CgogICAgICBPYmplY3QuZW50cmllcyhMT0NBVElPTlMpLmZvckVhY2goKFtrZXksIGxvY10pID0+IHsKICAgICAgICBjb25zdCB0YWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICB0YWIudHlwZSA9ICdidXR0b24nOwogICAgICAgIGNvbnN0IG9mZmVyZWQgPSBNT0RFTFNbc2VsZWN0ZWRNb2RlbF0ubG9jYXRpb25zLmluY2x1ZGVzKGtleSk7CiAgICAgICAgbGV0IGNsYXNzZXMgPSAnY3ljbGUtdGFiJzsKICAgICAgICBpZiAoa2V5ID09PSBzZWxlY3RlZExvY2F0aW9uICYmIGxvYy5hdmFpbGFibGUpIGNsYXNzZXMgKz0gJyBhY3RpdmUnOwogICAgICAgIGlmICghb2ZmZXJlZCkgY2xhc3NlcyArPSAnIHVuYXZhaWxhYmxlJzsKICAgICAgICB0YWIuY2xhc3NOYW1lID0gY2xhc3NlczsKICAgICAgICB0YWIuZGF0YXNldC5sb2NhdGlvbiA9IGtleTsKICAgICAgICBpZiAoIW9mZmVyZWQpIHRhYi5kYXRhc2V0LnRpcCA9IHQoJ3RpcC5tb2RlbE5vdEhlcmUnLCB7IG1vZGVsOiBNT0RFTFNbc2VsZWN0ZWRNb2RlbF0ubmFtZSB9KTsKCiAgICAgICAgdGFiLmlubmVySFRNTCA9IGAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJjeWNsZS1uYW1lIj4ke2xvYy5mbGFnfSAke3QoJ2NvbnRpbmVudC4nICsga2V5KX08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3ljbGUtcHJpY2UiPiR7dCgnY291bnRyeS4nICsga2V5KX08L3NwYW4+CiAgICAgICAgYDsKCiAgICAgICAgaWYgKGxvYy5hdmFpbGFibGUpIHsKICAgICAgICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgdXNlckludGVyYWN0ZWRXaXRoTG9jYXRpb24gPSB0cnVlOwogICAgICAgICAgICBpZiAoIU1PREVMU1tzZWxlY3RlZE1vZGVsXS5sb2NhdGlvbnMuaW5jbHVkZXMoa2V5KSkgewogICAgICAgICAgICAgIC8vIFRoaXMgZGF0YWNlbnRlciBvbmx5IGhhcyB0aGUgTTQ6IHN3aXRjaCBNYWMgcmF0aGVyIHRoYW4gbGVhdmUgYSBkZWFkIGVuZC4KICAgICAgICAgICAgICBzZWxlY3RlZE1vZGVsID0gJ200JzsKICAgICAgICAgICAgICBzaG93TW9kZWxOb3RlKHQoJ25vdGUubTRPbmx5JywgeyByZWdpb246IHJlZ2lvbk5hbWUoa2V5KSwgaW5SZWdpb246IHJlZ2lvbkluKGtleSkgfSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGhpZGVNb2RlbE5vdGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxlY3RMb2NhdGlvbihrZXkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFiKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0TG9jYXRpb24obG9jYXRpb25LZXkpIHsKICAgICAgY29uc3QgbG9jID0gTE9DQVRJT05TW2xvY2F0aW9uS2V5XTsKICAgICAgaWYgKCFsb2MgfHwgIWxvYy5hdmFpbGFibGUpIHJldHVybjsKICAgICAgaWYgKGxvY2F0aW9uS2V5ICE9PSBzZWxlY3RlZExvY2F0aW9uKSB7CiAgICAgICAgLy8gVGhlIERhaWx5IG5vdGljZSBhbnN3ZXJzIGEgdGFwIGluIE9ORSByZWdpb247IGEgbmV3IHJlZ2lvbiBzdGFydHMgY2xlYW4uCiAgICAgICAgZGFpbHlOb3RpY2VSZXF1ZXN0ZWQgPSBmYWxzZTsKICAgICAgICByZXF1ZXN0ZWRDb25maWcgPSBudWxsOwogICAgICB9CiAgICAgIHNlbGVjdGVkTG9jYXRpb24gPSBsb2NhdGlvbktleTsKICAgICAgcmVuZGVyTG9jYXRpb25UYWJzKCk7CiAgICAgIC8vIEF2YWlsYWJpbGl0eSBjb3VudHMgYXJlIHBlci1EQyDigJQgcmVjb21wdXRlIGZyb20gdGhlIGNhY2hlZCBwYXlsb2FkIHNvIHRoZQogICAgICAvLyBzdG9yYWdlIHRpbGVzLCBkYWlseS1wbGFuIGdhdGUsIGFuZCBDVEEgYnV0dG9uIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbi4KICAgICAgYXBwbHlBdmFpbGFiaWxpdHlGb3JTZWxlY3RlZExvY2F0aW9uKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1PREVMIFNFTEVDVElPTgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiByZW5kZXJNb2RlbFRpbGVzKCkgewogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9kZWwtdGlsZScpLmZvckVhY2godGlsZSA9PiB7CiAgICAgICAgY29uc3Qga2V5ID0gdGlsZS5kYXRhc2V0Lm1vZGVsOwogICAgICAgIGlmICghTU9ERUxTW2tleV0pIHJldHVybjsKICAgICAgICBjb25zdCBhY3RpdmUgPSBrZXkgPT09IHNlbGVjdGVkTW9kZWw7CiAgICAgICAgY29uc3QgY29taW5nU29vbiA9IGF2YWlsYWJpbGl0eVN0YXR1c1NldHRsZWQgJiYgIW1vZGVsT25TYWxlKGtleSk7CiAgICAgICAgdGlsZS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBhY3RpdmUpOwogICAgICAgIHRpbGUuY2xhc3NMaXN0LnRvZ2dsZSgnY29taW5nLXNvb24nLCBjb21pbmdTb29uKTsKICAgICAgICB0aWxlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgICAgY29uc3QgYmFkZ2UgPSB0aWxlLnF1ZXJ5U2VsZWN0b3IoJy5tb2RlbC1iYWRnZScpOwogICAgICAgIGlmIChiYWRnZSkgYmFkZ2UudGV4dENvbnRlbnQgPSB0KGNvbWluZ1Nvb24gPyAnYmFkZ2Uuc29vbicgOiAnYmFkZ2UubmV3Jyk7CiAgICAgIH0pOwogICAgICByZW5kZXJNb2RlbFRpbGVQcmljZXMoKTsKICAgICAgcmVuZGVyTW9kZWxTcGVjcygpOwogICAgICBjYWxjdWxhdGVFbnRlcnByaXNlUHJpY2UoKTsKICAgIH0KCiAgICAvLyBFYWNoIHRpbGUgc2hvd3MgaXRzIE1hYydzIHByaWNlIGZvciB0aGUgc2VsZWN0ZWQgYmlsbGluZyBjeWNsZSAoIiQ1OS93ZWVrIikKICAgIGZ1bmN0aW9uIHJlbmRlck1vZGVsVGlsZVByaWNlcygpIHsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1vZGVsLXRpbGUnKS5mb3JFYWNoKHRpbGUgPT4gewogICAgICAgIGNvbnN0IGtleSA9IHRpbGUuZGF0YXNldC5tb2RlbDsKICAgICAgICBpZiAoIU1PREVMU1trZXldKSByZXR1cm47CiAgICAgICAgY29uc3QgcHJpY2UgPSB0aWxlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGVsLXByaWNlXScpOwogICAgICAgIGlmIChwcmljZSkgcHJpY2UudGV4dENvbnRlbnQgPSBmb3JtYXRQcmljZShjeWNsZVByaWNlKHNlbGVjdGVkQ3ljbGUsIGtleSkpOwogICAgICAgIGNvbnN0IHBlciA9IHRpbGUucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kZWwtcGVyXScpOwogICAgICAgIGlmIChwZXIpIHBlci50ZXh0Q29udGVudCA9IHQoJ3RpbGUucGVyLicgKyBzZWxlY3RlZEN5Y2xlKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyTW9kZWxTcGVjcygpIHsKICAgICAgY29uc3QgbTYgPSBzZWxlY3RlZE1vZGVsID09PSAnbTYnOwogICAgICBjb25zdCBzZXRUZXh0ID0gKGlkLCB0ZXh0KSA9PiB7IGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gdGV4dDsgfTsKICAgICAgc2V0VGV4dCgnc3BlY0NoaXAnLCB0KG02ID8gJ3NwZWMuY2hpcE02JyA6ICdzcGVjLmNoaXBNNCcpKTsKICAgICAgc2V0VGV4dCgndGlwQ2hpcCcsIHQobTYgPyAndGlwLmNoaXBNNicgOiAndGlwLmNoaXBNNCcpKTsKICAgICAgc2V0VGV4dCgndGlwRGVkaWNhdGVkJywgdCgndGlwLmRlZGljYXRlZCcsIHsgbW9kZWw6IE1PREVMU1tzZWxlY3RlZE1vZGVsXS5uYW1lIH0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RNb2RlbChtb2RlbEtleSkgewogICAgICBpZiAoIU1PREVMU1ttb2RlbEtleV0pIHJldHVybjsKICAgICAgaWYgKGF2YWlsYWJpbGl0eVN0YXR1c1NldHRsZWQgJiYgIW1vZGVsT25TYWxlKG1vZGVsS2V5KSkgewogICAgICAgIC8vIE5vdCBvbiBzYWxlIHlldDogb2ZmZXIgdGhlIHdhaXRsaXN0IGZvciB0aGF0IE1hYyBpbnN0ZWFkIG9mIHNlbGVjdGluZyBpdC4KICAgICAgICBvcGVuQXZhaWxhYmlsaXR5RGlhbG9nKEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuQmFzZVN0b3JhZ2UsIG1vZGVsS2V5KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcHJldmlvdXMgPSBzZWxlY3RlZExvY2F0aW9uOwogICAgICBzZWxlY3RlZE1vZGVsID0gbW9kZWxLZXk7CiAgICAgIHJlcXVlc3RlZENvbmZpZyA9IG51bGw7CiAgICAgIGlmICghTU9ERUxTW21vZGVsS2V5XS5sb2NhdGlvbnMuaW5jbHVkZXMoc2VsZWN0ZWRMb2NhdGlvbikpIHsKICAgICAgICBzZWxlY3RlZExvY2F0aW9uID0gTU9ERUxTW21vZGVsS2V5XS5sb2NhdGlvbnNbMF07CiAgICAgICAgZGFpbHlOb3RpY2VSZXF1ZXN0ZWQgPSBmYWxzZTsKICAgICAgICBzaG93TW9kZWxOb3RlKHQoJ25vdGUubG9jYXRpb25Td2l0Y2hlZCcsIHsKICAgICAgICAgIG1vZGVsOiBNT0RFTFNbbW9kZWxLZXldLm5hbWUsCiAgICAgICAgICBpblByZXZpb3VzOiByZWdpb25JbihwcmV2aW91cyksCiAgICAgICAgICByZWdpb246IHJlZ2lvbk5hbWUoc2VsZWN0ZWRMb2NhdGlvbikKICAgICAgICB9KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGlkZU1vZGVsTm90ZSgpOwogICAgICB9CiAgICAgIHJlbmRlck1vZGVsVGlsZXMoKTsKICAgICAgaWYgKGxvY2F0aW9uUmVzb2x2ZWQpIHJlbmRlckxvY2F0aW9uVGFicygpOwogICAgICBhcHBseUF2YWlsYWJpbGl0eUZvclNlbGVjdGVkTG9jYXRpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93TW9kZWxOb3RlKHRleHQpIHsKICAgICAgY29uc3QgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhdGlvblRhYnMnKTsKICAgICAgaWYgKCF0YWJzKSByZXR1cm47CiAgICAgIGNvbnN0IG5vdGUgPSBlbnN1cmVOb3RpY2VFbGVtZW50KCdtb2RlbE5vdGUnLCB0YWJzLCAnYXZhaWxhYmlsaXR5LW5vdGUnKTsKICAgICAgbm90ZS5pbm5lckhUTUwgPSBgJHtOT1RJQ0VfSU5GT19JQ09OfTxzcGFuPjwvc3Bhbj5gOwogICAgICBub3RlLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgIG5vdGUuaGlkZGVuID0gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZU1vZGVsTm90ZSgpIHsKICAgICAgY29uc3Qgbm90ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlbE5vdGUnKTsKICAgICAgaWYgKG5vdGUpIG5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgIH0KCiAgICAvLyDimqDvuI8gS0VFUCBJTiBTWU5DIHdpdGggdGhlIHVzZXItYXBwIHByaWNpbmcgcGFnZToKICAgIC8vICAgIFJlbnRBbWFjL1JlbnRBbWFjLVVzZXIvYXBwL1tsb2NhbGVdL2Rhc2hib2FyZC9wcmljaW5nL3BhZ2UudHN4ICAoZ2VvVG9EYXRhY2VudGVyIC8gQ1lQUlVTX1BSRUZFUlJFRF9DT1VOVFJJRVMpCiAgICAvLyBCb3RoIHN1cmZhY2VzIG11c3Qgcm91dGUgdGhlIHNhbWUgd2F5LiBJZiB5b3UgY2hhbmdlIHRoZSBjb3VudHJ5IGxpc3Qgb3IgY29udGluZW50IG1hcHBpbmcKICAgIC8vIGhlcmUsIG1pcnJvciBpdCB0aGVyZSAoYW5kIHZpY2UtdmVyc2EpLgogICAgLy8KICAgIC8vIENvdW50cmllcyB0aGF0IHNpdCBpbiBjb250aW5lbnQgIkFzaWEiIGJ1dCBhcmUgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VzdCB0byBvdXIgQ3lwcnVzCiAgICAvLyAoTGltYXNzb2wpIGRhdGFjZW50ZXIgcmF0aGVyIHRoYW4gTXVtYmFpLiBXaXRob3V0IHRoaXMgb3ZlcnJpZGUsIGlwYXBpLmNvJ3MgY29udGluZW50CiAgICAvLyBjb2RlIHJvdXRlcyB0aGUgd2hvbGUgTmVhciBFYXN0IOKAlCBUdXJrZXksIHRoZSBMZXZhbnQsIG11Y2ggb2YgQXJhYmlhLCB0aGUgQ2F1Y2FzdXMgYW5kCiAgICAvLyBJcmFuIOKAlCB0byBJbmRpYSwgd2hpY2ggaXMgdGhlIHdyb25nIChmYXIpIGRhdGFjZW50ZXIgKGUuZy4gQW5rYXJh4oaSQ3lwcnVzIH41ODAga20gdnMKICAgIC8vIH40LDQwMCBrbSB0byBNdW1iYWkpLiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2Rlcy4KICAgIC8vIFRoZSB3aG9sZSBHdWxmIChpbmNsLiBVQUUvT21hbikgcm91dGVzIHRvIEN5cHJ1cyBieSBidXNpbmVzcyBkZWNpc2lvbiwgZXZlbiB0aG91Z2gKICAgIC8vIE11bWJhaSBpcyBtYXJnaW5hbGx5IGNsb3NlciB0byB0aGUgZWFzdGVybm1vc3Qgc3RhdGVzLgogICAgY29uc3QgQ1lQUlVTX1BSRUZFUlJFRF9DT1VOVFJJRVMgPSBuZXcgU2V0KFsKICAgICAgJ0NZJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeXBydXMKICAgICAgJ1RSJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJrZXkKICAgICAgJ1NZJywgJ0xCJywgJ0lMJywgJ1BTJywgJ0pPJywgICAgICAgICAgICAgICAvLyBMZXZhbnQKICAgICAgJ0lRJywgJ0lSJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcmFxLCBJcmFuCiAgICAgICdTQScsICdLVycsICdCSCcsICdRQScsICdBRScsICdPTScsICdZRScsICAgLy8gQXJhYmlhbiBwZW5pbnN1bGEgLyBHdWxmCiAgICAgICdBTScsICdHRScsICdBWicsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2F1Y2FzdXMKICAgIF0pOwoKICAgIC8vIE1hcHMgdGhlIHZpc2l0b3IncyBnZW8gKGNvdW50cnkgZmlyc3QsIHRoZW4gY29udGluZW50KSB0byB0aGUgY2xvc2VzdCBhdmFpbGFibGUgcmVnaW9uLgogICAgLy8gT25seSByZXR1cm4gYSB2YWx1ZSB3aGVuIHdlIGFjdHVhbGx5IHdhbnQgdG8gYXV0by1zd2l0Y2ggZnJvbSB0aGUgQ3lwcnVzIGRlZmF1bHQuCiAgICBmdW5jdGlvbiBnZW9Ub0xvY2F0aW9uKGNvdW50cnlDb2RlLCBjb250aW5lbnRDb2RlKSB7CiAgICAgIC8vIE5lYXItRWFzdCAvIENhdWNhc3VzIGNvdW50cmllcyBhcmUgaW4gY29udGluZW50ICJBc2lhIiBidXQgYXJlIG5lYXJlc3QgdG8gQ3lwcnVzLgogICAgICBpZiAoY291bnRyeUNvZGUgJiYgQ1lQUlVTX1BSRUZFUlJFRF9DT1VOVFJJRVMuaGFzKGNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7IC8vIGtlZXAgdGhlIEN5cHJ1cyBkZWZhdWx0CiAgICAgIH0KICAgICAgc3dpdGNoIChjb250aW5lbnRDb2RlKSB7CiAgICAgICAgY2FzZSAnQVMnOiAvLyBBc2lhCiAgICAgICAgICByZXR1cm4gJ2luZGlhJzsKICAgICAgICBjYXNlICdOQSc6IC8vIE5vcnRoIEFtZXJpY2EKICAgICAgICBjYXNlICdTQSc6IC8vIFNvdXRoIEFtZXJpY2EKICAgICAgICBjYXNlICdPQyc6IC8vIE9jZWFuaWEg4oCUIFRleGFzIGJ5IGJ1c2luZXNzIGRlY2lzaW9uLCBub3QgZGlzdGFuY2UgKE11bWJhaSBpcyBuZWFyZXIpCiAgICAgICAgICByZXR1cm4gJ3VzYSc7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8vIEVVLCBBRiwgQU4gLT4ga2VlcCBDeXBydXMgZGVmYXVsdAogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR0VPIFBSRS1TRUxFQ1RJT04gKHBpY2tlciB2aXNpYmxlLCBnZW8gb25seSBwaWNrcyB0aGUgaW5pdGlhbCB0YWIpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRnVsbHkgY2xpZW50LXNpZGU6IHdlIGxvb2sgdXAgdGhlIHZpc2l0b3IncyBJUCB2aWEgaXBhcGkuY28gYW5kIHByZS1zZWxlY3QgdGhlIG5lYXJlc3QKICAgIC8vIGRhdGFjZW50ZXIgaW4gdGhlIHBpY2tlci4gTm8gYmFja2VuZC9jb29raWUgaW52b2x2ZW1lbnQuIFN0b2NrIG5ldmVyIG1vdmVzIHRoZSBzZWxlY3Rpb24g4oCUCiAgICAvLyBhIHNvbGQtb3V0IHJlZ2lvbiBzdGF5cyBzZWxlY3RlZCBhbmQgc2hvd3MgaXRzIG93biB3YWl0bGlzdCwgYmVjYXVzZSBzaWxlbnRseSBjaGVja2luZyBhCiAgICAvLyBjdXN0b21lciBvdXQgb2YgYSBkaWZmZXJlbnQgY29udGluZW50IGlzIHdvcnNlIHRoYW4gdGVsbGluZyB0aGVtIHRvIHdhaXQgZm9yIHRoaXMgb25lLgoKICAgIC8vIEdlby1zdWdnZXN0ZWQgbG9jYXRpb24gKExPQ0FUSU9OUyBrZXkpLCBudWxsIHVudGlsIHRoZSBsb29rdXAgcmVzb2x2ZXMuCiAgICBsZXQgZ2VvUHJlZmVycmVkTG9jYXRpb24gPSBudWxsOwoKICAgIC8vIEZsaXBzIHRydWUgdGhlIGZpcnN0IHRpbWUgdGhlIHJlYWwgcGlja2VyIHJlcGxhY2VzIGl0cyBza2VsZXRvbi4KICAgIGxldCBsb2NhdGlvblJlc29sdmVkID0gZmFsc2U7CgogICAgLy8gaXBhcGkuY28gaXMgYSB0aGlyZCBwYXJ0eSB0aGF0IGNhbiBiZSBzbG93LCByYXRlLWxpbWl0ZWQgKDQyOSkgb3IgYmxvY2tlZCBieSBhbiBleHRlbnNpb24sIHNvIHRoZQogICAgLy8gcGlja2VyIHBhaW50cyBvbiB0aGlzIGRlYWRsaW5lIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGl0IOKAlCBvdGhlcndpc2UgdGhlIHNrZWxldG9uIHNoaW1tZXJzIG9uIGxvbmcKICAgIC8vIGFmdGVyIHRoZSBhdmFpbGFiaWxpdHkgZGF0YSBsYW5kZWQuIEEgcmVzdWx0IGFycml2aW5nIGxhdGVyIHN0aWxsIHByZS1zZWxlY3RzIChhcHBseUdlb0RhdGFjZW50ZXIpLgogICAgY29uc3QgR0VPX1BJQ0tFUl9ERUFETElORV9NUyA9IDE1MDA7CiAgICBjb25zdCBHRU9fTE9PS1VQX1RJTUVPVVRfTVMgPSA3MDAwOwogICAgY29uc3QgR0VPX1NFU1NJT05fS0VZID0gJ3JhbV9nZW9fbG9jYXRpb24nOwoKICAgIC8vIFN3YXAgdGhlIHBpY2tlciBza2VsZXRvbiBmb3IgdGhlIHJlYWwgdGFicywgb25jZSwgd2hhdGV2ZXIgdGhlIGdlbyBsb29rdXAgZGlkIOKAlCBpbmNsdWRpbmcgdGhlCiAgICAvLyBwYXRocyB0aGF0IGJhaWwgZWFybHkgKG5vbi1PSyByZXNwb25zZSwgZXJyb3IgcGF5bG9hZCwgQ3lwcnVzIGRlZmF1bHQpIGFuZCB0aGUgZmFpbHVyZSBwYXRoLgogICAgZnVuY3Rpb24gc2V0dGxlTG9jYXRpb25QaWNrZXIoKSB7CiAgICAgIGlmIChsb2NhdGlvblJlc29sdmVkKSByZXR1cm47CiAgICAgIGxvY2F0aW9uUmVzb2x2ZWQgPSB0cnVlOwogICAgICByZW5kZXJMb2NhdGlvblRhYnMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkQ2FjaGVkR2VvTG9jYXRpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgY2FjaGVkID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oR0VPX1NFU1NJT05fS0VZKTsKICAgICAgICByZXR1cm4gTE9DQVRJT05TW2NhY2hlZF0gPyBjYWNoZWQgOiBudWxsOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjYWNoZUdlb0xvY2F0aW9uKGxvY2F0aW9uS2V5KSB7CiAgICAgIHRyeSB7CiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oR0VPX1NFU1NJT05fS0VZLCBsb2NhdGlvbktleSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAvLyBQcml2YXRlIG1vZGU6IHRoZSBsb29rdXAganVzdCBydW5zIGFnYWluIG9uIHRoZSBuZXh0IHBhZ2Ugdmlldy4KICAgICAgfQogICAgfQoKICAgIC8vIFJlc29sdmUgdGhlIG5lYXJlc3QgZGF0YWNlbnRlciBmcm9tIHRoZSB2aXNpdG9yJ3MgSVAgKGNvbnRpbmVudCksIHRoZW4gYXBwbHkgaXQuCiAgICBhc3luYyBmdW5jdGlvbiByZXNvbHZlR2VvUHJlZmVycmVkTG9jYXRpb24oKSB7CiAgICAgIC8vIENhY2hlZCBoaXQgcGFpbnRzIHRoZSByaWdodCB0YWIgc3luY2hyb25vdXNseSwgYmVmb3JlIHRoZSBza2VsZXRvbiBpcyBldmVyIGFuaW1hdGVkLgogICAgICBjb25zdCBjYWNoZWQgPSByZWFkQ2FjaGVkR2VvTG9jYXRpb24oKTsKICAgICAgaWYgKGNhY2hlZCkgewogICAgICAgIGdlb1ByZWZlcnJlZExvY2F0aW9uID0gY2FjaGVkOwogICAgICAgIGFwcGx5R2VvRGF0YWNlbnRlcigpOwogICAgICAgIHNldHRsZUxvY2F0aW9uUGlja2VyKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0cnkgewogICAgICAgIC8vIGlwYXBpLmNvIHN1cHBvcnRzIENPUlMgb24gdGhlIGZyZWUgdGllciBhbmQgcmV0dXJucyBgY291bnRyeV9jb2RlYCArIGBjb250aW5lbnRfY29kZWAuCiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9pcGFwaS5jby9qc29uLycsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KEdFT19MT09LVVBfVElNRU9VVF9NUykgfSk7CiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuOwoKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICAgIGlmICghZGF0YSB8fCBkYXRhLmVycm9yKSByZXR1cm47CgogICAgICAgIGNvbnN0IGRldGVjdGVkID0gZ2VvVG9Mb2NhdGlvbihkYXRhLmNvdW50cnlfY29kZSwgZGF0YS5jb250aW5lbnRfY29kZSk7CiAgICAgICAgaWYgKCFkZXRlY3RlZCkgewogICAgICAgICAgY2FjaGVHZW9Mb2NhdGlvbignY3lwcnVzJyk7IC8vIEVVL0FGICsgTmVhci1FYXN0L0NhdWNhc3VzIGtlZXAgdGhlIEN5cHJ1cyBkZWZhdWx0CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBnZW9QcmVmZXJyZWRMb2NhdGlvbiA9IGRldGVjdGVkOwogICAgICAgIGNhY2hlR2VvTG9jYXRpb24oZGV0ZWN0ZWQpOwogICAgICAgIGFwcGx5R2VvRGF0YWNlbnRlcigpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgLy8gU2lsZW50IGZhaWwgLSB0aGUgcGFnZSBhbHJlYWR5IHNob3dzIHRoZSBDeXBydXMgZGVmYXVsdCwgd2hpY2ggaXMgZmluZS4KICAgICAgICBjb25zb2xlLndhcm4oJ0xvY2F0aW9uIGF1dG8tZGV0ZWN0IGZhaWxlZDsga2VlcGluZyBkZWZhdWx0LicsIGUpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHNldHRsZUxvY2F0aW9uUGlja2VyKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUb3RhbCBkZXZpY2VzIGF2YWlsYWJsZSBpbiBhIGRhdGFjZW50ZXIgYWNyb3NzIGFsbCBzdG9yYWdlIHRpZXJzIChudWxsIHdoZW4gdW5rbm93bikuCiAgICBmdW5jdGlvbiB0b3RhbEF2YWlsYWJsZUZvckxvY2F0aW9uKGxvY2F0aW9uS2V5LCBtb2RlbEtleSA9IHNlbGVjdGVkTW9kZWwpIHsKICAgICAgY29uc3QgZGMgPSBkYXRhY2VudGVyUm93KGxvY2F0aW9uS2V5LCBtb2RlbEtleSk7CiAgICAgIGlmICghZGMpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gTnVtYmVyKGRjLmF2YWlsYWJsZURldmljZXMgPz8gMCkKICAgICAgICArIE51bWJlcihkYy5hdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPz8gMCkKICAgICAgICArIE51bWJlcihkYy5hdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPz8gMCk7CiAgICB9CgogICAgLy8gUHJlLXNlbGVjdCB0aGUgZ2VvLXN1Z2dlc3RlZCBkYXRhY2VudGVyLiBSdW5zIG9uY2UgdGhlIElQIGxvb2t1cCByZXNvbHZlcyBhbmQgbmV2ZXIgYWdhaW4KICAgIC8vIGFmdGVyIHRoZSB2aXNpdG9yIHRvdWNoZXMgYSB0YWIuIFBhaW50aW5nIHRoZSBwaWNrZXIgaXMgbm9ybWFsbHkgc2V0dGxlTG9jYXRpb25QaWNrZXIncyBqb2IsIHNvCiAgICAvLyB0aGUgc2tlbGV0b24gaXMgcmVwbGFjZWQgZXhhY3RseSBvbmNlLCBhbHJlYWR5IHNob3dpbmcgdGhlIHJpZ2h0IHRhYiDigJQgdW5sZXNzIHRoZSBsb29rdXAgY2FtZQogICAgLy8gYmFjayBhZnRlciBHRU9fUElDS0VSX0RFQURMSU5FX01TLCBpbiB3aGljaCBjYXNlIHRoZSBwaWNrZWQgdGFiIGhhcyB0byBiZSByZXBhaW50ZWQuCiAgICBmdW5jdGlvbiBhcHBseUdlb0RhdGFjZW50ZXIoKSB7CiAgICAgIGlmICh1c2VySW50ZXJhY3RlZFdpdGhMb2NhdGlvbikgcmV0dXJuIHRydWU7IC8vIHRoZSB2aXNpdG9yJ3MgcGljayB3aW5zCgogICAgICBjb25zdCBwcmVmZXJyZWQgPSBnZW9QcmVmZXJyZWRMb2NhdGlvbjsKICAgICAgaWYgKCFwcmVmZXJyZWQpIHJldHVybiBmYWxzZTsKCiAgICAgIGNvbnN0IHRhcmdldCA9IExPQ0FUSU9OU1twcmVmZXJyZWRdPy5hdmFpbGFibGUgPyBwcmVmZXJyZWQgOiAnY3lwcnVzJzsKICAgICAgLy8gQSBnZW8gcGljayBuZXZlciBsYW5kcyBvbiBhIGRhdGFjZW50ZXIgdGhhdCBkb2VzIG5vdCBzZWxsIHRoZSBNYWMgYWxyZWFkeSBjaG9zZW4uCiAgICAgIGlmICghTU9ERUxTW3NlbGVjdGVkTW9kZWxdLmxvY2F0aW9ucy5pbmNsdWRlcyh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHRhcmdldCAhPT0gc2VsZWN0ZWRMb2NhdGlvbikgewogICAgICAgIHNlbGVjdGVkTG9jYXRpb24gPSB0YXJnZXQ7CiAgICAgICAgYXBwbHlBdmFpbGFiaWxpdHlGb3JTZWxlY3RlZExvY2F0aW9uKCk7CiAgICAgICAgaWYgKGxvY2F0aW9uUmVzb2x2ZWQpIHJlbmRlckxvY2F0aW9uVGFicygpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUklDSU5HIEZVTkNUSU9OUwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBnZXRTdG9yYWdlUHJpY2Uoc3RvcmFnZUtleSwgY3ljbGVLZXkpIHsKICAgICAgY29uc3Qgc3RvcmFnZSA9IFBSSUNJTkdfQ09ORklHLnN0b3JhZ2Vbc3RvcmFnZUtleV07CiAgICAgIGlmICghc3RvcmFnZSB8fCBzdG9yYWdlLnByaWNlID09PSAwKSByZXR1cm4gMDsKCiAgICAgIC8vIEZvciB3ZWVrbHkgYW5kIG1vbnRobHksIHVzZSB0aGUgbW9udGhseSBwcmljZQogICAgICBpZiAoY3ljbGVLZXkgPT09ICd3ZWVrbHknIHx8IGN5Y2xlS2V5ID09PSAnbW9udGhseScpIHsKICAgICAgICByZXR1cm4gc3RvcmFnZS5tb250aGx5UHJpY2U7CiAgICAgIH0KCiAgICAgIC8vIEZvciAzIG1vbnRocwogICAgICBpZiAoY3ljbGVLZXkgPT09ICczbW9udGgnKSB7CiAgICAgICAgcmV0dXJuIHN0b3JhZ2UubW9udGhseVByaWNlICogKHN0b3JhZ2VbJzNtb250aE11bHRpcGxpZXInXSB8fCAzKTsKICAgICAgfQoKICAgICAgLy8gRm9yIDYgbW9udGhzCiAgICAgIGlmIChjeWNsZUtleSA9PT0gJzZtb250aCcpIHsKICAgICAgICByZXR1cm4gc3RvcmFnZS5tb250aGx5UHJpY2UgKiAoc3RvcmFnZVsnNm1vbnRoTXVsdGlwbGllciddIHx8IDYpOwogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbCgpIHsKICAgICAgY29uc3QgYmFzZVByaWNlID0gY3ljbGVQcmljZShzZWxlY3RlZEN5Y2xlKTsKICAgICAgY29uc3Qgc3RvcmFnZVByaWNlID0gZ2V0U3RvcmFnZVByaWNlKHNlbGVjdGVkU3RvcmFnZSwgc2VsZWN0ZWRDeWNsZSk7CiAgICAgIHJldHVybiBiYXNlUHJpY2UgKyBzdG9yYWdlUHJpY2U7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0UHJpY2UocHJpY2UpIHsKICAgICAgaWYgKHByaWNlICUgMSA9PT0gMCkgewogICAgICAgIHJldHVybiBgJCR7cHJpY2V9YDsKICAgICAgfQogICAgICByZXR1cm4gYCQke3ByaWNlLnRvRml4ZWQoMil9YDsKICAgIH0KCiAgICAvLyBUb3RhbCBwaHlzaWNhbCBkZXZpY2VzIGluIHRoZSAqc2VsZWN0ZWQqIGRhdGFjZW50ZXIgKGJhc2UgKyBpdHMgb3duIGRyaXZlLWVxdWlwcGVkIHVuaXRzKSwKICAgIC8vIHVzZWQgZm9yIHRoZSBkYWlseS1wbGFuIGdhdGUuIFJlYWRzIHRoZSBzZWxlY3RlZCBEQydzIG93biBjb3VudHMgc3RyYWlnaHQgZnJvbSB0aGUgcGF5bG9hZCwKICAgIC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZ2xvYmFscyAod2hpY2ggYXJlIGFsc28gc2VsZWN0ZWQtREMgc291cmNlZCkgYmVmb3JlIHRoZSBwYXlsb2FkIGxhbmRzLgogICAgZnVuY3Rpb24gZ2V0VG90YWxBdmFpbGFibGVEZXZpY2VzKCkgewogICAgICBjb25zdCB0b3RhbCA9IHRvdGFsQXZhaWxhYmxlRm9yTG9jYXRpb24oc2VsZWN0ZWRMb2NhdGlvbik7CiAgICAgIHJldHVybiB0b3RhbCA\/PyAoY3VycmVudEF2YWlsYWJsZURldmljZXMgKyBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgKyBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDUk9TUy1MT0NBVElPTiBBVkFJTEFCSUxJVFkgTk9USUNFUwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFdoZW4gd2hhdCB0aGUgdmlzaXRvciB3YW50cyBpcyBzb2xkIG91dCBpbiB0aGUgc2VsZWN0ZWQgZGF0YWNlbnRlciBidXQgYW5vdGhlciBvbmUgaGFzIGl0LAogICAgLy8gc2F5IHNvIGFuZCBvZmZlciBhIG9uZS1jbGljayBzd2l0Y2guIFN0b2NrIG5ldmVyIG1vdmVzIHRoZSBzZWxlY3Rpb24gb24gaXRzIG93biAoc2VlIHRoZSBnZW8KICAgIC8vIHNlY3Rpb24pOiBldmVyeSBqdW1wIHRvIGFub3RoZXIgcmVnaW9uIGlzIGFuIGV4cGxpY2l0IHRhcCBvbiBvbmUgb2YgdGhlc2UgbGlua3MuCiAgICAvLyBFdmVyeXRoaW5nIGhlcmUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjYWNoZWQgc3RhdHVzIHBheWxvYWQsIHNvIG5vdGhpbmcgcmVuZGVycyB1bnRpbCBpdCBsYW5kcy4KCiAgICAvLyBUcnVlIGZyb20gdGhlIG1vbWVudCB0aGUgdmlzaXRvciB0YXBzIHRoZSBzb2xkLW91dCBEYWlseSB0YWIgdW50aWwgdGhlIGxvY2F0aW9uIGNoYW5nZXMuCiAgICAvLyBUaGUgRGFpbHkgbm90aWNlIGlzIGRlbGliZXJhdGVseSBOT1Qgc2hvd24gdXAgZnJvbnQ6IGl0IG9ubHkgYW5zd2VycyB0aGUgdGFwLgogICAgbGV0IGRhaWx5Tm90aWNlUmVxdWVzdGVkID0gZmFsc2U7CgogICAgLy8geyBjeWNsZSwgc3RvcmFnZSB9IG9mIHRoZSBzb2xkLW91dCBvcHRpb24gdGhlIHZpc2l0b3IgbGFzdCB0YXBwZWQ7IGNsZWFyZWQgYnkgYW55IG90aGVyIHBpY2suCiAgICBsZXQgcmVxdWVzdGVkQ29uZmlnID0gbnVsbDsKCiAgICBmdW5jdGlvbiBkYXRhY2VudGVyRm9yKGxvY2F0aW9uS2V5LCBtb2RlbEtleSA9IHNlbGVjdGVkTW9kZWwpIHsKICAgICAgcmV0dXJuIGRhdGFjZW50ZXJSb3cobG9jYXRpb25LZXksIG1vZGVsS2V5KTsKICAgIH0KCiAgICAvLyBEb2VzIHRoaXMgZGF0YWNlbnRlciBoYXZlIGB3aGF0YCBpbiBzdG9jayByaWdodCBub3cgKGZvciB0aGF0IE1hYyk\/CiAgICAvLyAgICdhbnknICAgICAgLT4gYXQgbGVhc3Qgb25lIHBoeXNpY2FsIE1hYyAoYmFzZSBvciBkcml2ZS1lcXVpcHBlZCkKICAgIC8vICAgJ2RhaWx5JyAgICAtPiBlbm91Z2ggTWFjcyB0byBwYXNzIHRoYXQgREMncyBvd24gZGFpbHktcGxhbiB0aHJlc2hvbGQKICAgIC8vICAgJ2Jhc2UnIHwgJ2FkZG9uMjU2JyB8ICdhZGRvbjUxMicgLT4gdGhhdCBzcGVjaWZpYyBjb25maWd1cmF0aW9uCiAgICBmdW5jdGlvbiBsb2NhdGlvbkhhcyhsb2NhdGlvbktleSwgd2hhdCwgbW9kZWxLZXkgPSBzZWxlY3RlZE1vZGVsKSB7CiAgICAgIGNvbnN0IGRjID0gZGF0YWNlbnRlckZvcihsb2NhdGlvbktleSwgbW9kZWxLZXkpOwogICAgICBpZiAoIWRjKSByZXR1cm4gZmFsc2U7CiAgICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgIGNhc2UgJ2RhaWx5JzoKICAgICAgICAgIHJldHVybiAodG90YWxBdmFpbGFibGVGb3JMb2NhdGlvbihsb2NhdGlvbktleSwgbW9kZWxLZXkpID8\/IDApID4gTnVtYmVyKGRjLmRhaWx5UGxhbkF2YWlsYWJpbGl0eVRocmVzaG9sZCA\/PyAzKTsKICAgICAgICBjYXNlICdiYXNlJzoKICAgICAgICAgIHJldHVybiBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlcyA\/PyAwKSA+IDA7CiAgICAgICAgY2FzZSAnYWRkb24yNTYnOgogICAgICAgICAgcmV0dXJuIE51bWJlcihkYy5hdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPz8gMCkgPiAwOwogICAgICAgIGNhc2UgJ2FkZG9uNTEyJzoKICAgICAgICAgIHJldHVybiBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID8\/IDApID4gMDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICh0b3RhbEF2YWlsYWJsZUZvckxvY2F0aW9uKGxvY2F0aW9uS2V5LCBtb2RlbEtleSkgPz8gMCkgPiAwOwogICAgICB9CiAgICB9CgogICAgLy8gRXZlcnkgbG9jYXRpb24gZXhjZXB0IHRoZSBzZWxlY3RlZCBvbmUsIEN5cHJ1cyBmaXJzdCAobWFpbiBEQyksIHRoZW4gcGlja2VyIG9yZGVyLgogICAgZnVuY3Rpb24gb3RoZXJMb2NhdGlvbnNXaGVyZSh0ZXN0KSB7CiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhMT0NBVElPTlMpCiAgICAgICAgLmZpbHRlcihrZXkgPT4ga2V5ICE9PSBzZWxlY3RlZExvY2F0aW9uICYmIExPQ0FUSU9OU1trZXldLmF2YWlsYWJsZSAmJiB0ZXN0KGtleSkpCiAgICAgICAgLnNvcnQoKGEsIGIpID0+IChhID09PSAnY3lwcnVzJyA\/IC0xIDogYiA9PT0gJ2N5cHJ1cycgPyAxIDogMCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG90aGVyTG9jYXRpb25zV2l0aCh3aGF0KSB7CiAgICAgIHJldHVybiBvdGhlckxvY2F0aW9uc1doZXJlKGtleSA9PiBsb2NhdGlvbkhhcyhrZXksIHdoYXQpKTsKICAgIH0KCiAgICAvLyBTYW1lIGdhdGVzIGFzIHRoZSBzZWxlY3RlZCBkYXRhY2VudGVyIGFwcGxpZXM6IHRoZSBzdG9yYWdlIHRpZXIgaW4gc3RvY2ssIGFuZCBEYWlseSBvdmVyIGl0cyB0aHJlc2hvbGQuCiAgICBmdW5jdGlvbiBjb25maWdBdmFpbGFibGVJbihsb2NhdGlvbktleSwgbW9kZWxLZXksIGNvbmZpZykgewogICAgICBpZiAoIUxPQ0FUSU9OU1tsb2NhdGlvbktleV0\/LmF2YWlsYWJsZSB8fCAhbW9kZWxPblNhbGUobW9kZWxLZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICghbG9jYXRpb25IYXMobG9jYXRpb25LZXksIGNvbmZpZy5zdG9yYWdlLCBtb2RlbEtleSkpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIGNvbmZpZy5jeWNsZSAhPT0gJ2RhaWx5JyB8fCBsb2NhdGlvbkhhcyhsb2NhdGlvbktleSwgJ2RhaWx5JywgbW9kZWxLZXkpOwogICAgfQoKICAgIC8vIFdoYXQgdGhlIHZpc2l0b3Igd2FudHMgYnV0IGNhbid0IGJ1eSBoZXJlOiB0aGUgc29sZC1vdXQgb3B0aW9uIHRoZXkgdGFwcGVkLCBlbHNlIHRoZSBzZWxlY3Rpb24uCiAgICBmdW5jdGlvbiB3YW50ZWRDb25maWcoKSB7CiAgICAgIGlmICghYXZhaWxhYmlsaXR5U3RhdHVzU2V0dGxlZCB8fCAhbGFzdEF2YWlsYWJpbGl0eVBheWxvYWQpIHJldHVybiBudWxsOwogICAgICBpZiAocmVxdWVzdGVkQ29uZmlnKSB7CiAgICAgICAgcmV0dXJuIGNvbmZpZ0F2YWlsYWJsZUluKHNlbGVjdGVkTG9jYXRpb24sIHNlbGVjdGVkTW9kZWwsIHJlcXVlc3RlZENvbmZpZykgPyBudWxsIDogcmVxdWVzdGVkQ29uZmlnOwogICAgICB9CiAgICAgIGlmICghc2VsZWN0ZWRTdG9yYWdlU29sZE91dCgpICYmICFzZWxlY3RlZERhaWx5U29sZE91dCgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIHsgY3ljbGU6IHNlbGVjdGVkQ3ljbGUsIHN0b3JhZ2U6IHNlbGVjdGVkU3RvcmFnZSB9OwogICAgfQoKICAgIC8vIFdoZXJlIGBjb25maWdgIGNhbiBiZSBib3VnaHQgbm93LCBiZXN0IGZpcnN0OiB0aGlzIE1hYyBlbHNld2hlcmUsIHRoZW4gYW5vdGhlciBNYWMgaGVyZSwKICAgIC8vIGFuZCBvbmx5IHdoZW4gbmVpdGhlciBleGlzdHMsIGFub3RoZXIgTWFjIGVsc2V3aGVyZS4KICAgIGZ1bmN0aW9uIGNvbmZpZ0FsdGVybmF0aXZlcyhjb25maWcpIHsKICAgICAgY29uc3Qgb3RoZXJNb2RlbHMgPSBPYmplY3Qua2V5cyhNT0RFTFMpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSBzZWxlY3RlZE1vZGVsICYmIG1vZGVsT25TYWxlKGtleSkpOwogICAgICBjb25zdCBvcHRpb25zID0gb3RoZXJMb2NhdGlvbnNXaGVyZShrZXkgPT4gY29uZmlnQXZhaWxhYmxlSW4oa2V5LCBzZWxlY3RlZE1vZGVsLCBjb25maWcpKQogICAgICAgIC5tYXAobG9jYXRpb24gPT4gKHsgbG9jYXRpb24sIG1vZGVsOiBzZWxlY3RlZE1vZGVsIH0pKTsKICAgICAgb3RoZXJNb2RlbHMKICAgICAgICAuZmlsdGVyKG1vZGVsID0+IGNvbmZpZ0F2YWlsYWJsZUluKHNlbGVjdGVkTG9jYXRpb24sIG1vZGVsLCBjb25maWcpKQogICAgICAgIC5mb3JFYWNoKG1vZGVsID0+IG9wdGlvbnMucHVzaCh7IGxvY2F0aW9uOiBzZWxlY3RlZExvY2F0aW9uLCBtb2RlbCB9KSk7CiAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkgcmV0dXJuIG9wdGlvbnM7CiAgICAgIHJldHVybiBvdGhlck1vZGVscy5mbGF0TWFwKG1vZGVsID0+IG90aGVyTG9jYXRpb25zV2hlcmUoa2V5ID0+IGNvbmZpZ0F2YWlsYWJsZUluKGtleSwgbW9kZWwsIGNvbmZpZykpCiAgICAgICAgLm1hcChsb2NhdGlvbiA9PiAoeyBsb2NhdGlvbiwgbW9kZWwgfSkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub3RpY2VzUmVhZHkoKSB7CiAgICAgIHJldHVybiBhdmFpbGFiaWxpdHlTdGF0dXNTZXR0bGVkICYmICEhbGFzdEF2YWlsYWJpbGl0eVBheWxvYWQgJiYgISFkYXRhY2VudGVyRm9yKHNlbGVjdGVkTG9jYXRpb24pOwogICAgfQoKICAgIC8vIFJlZ2lvbiBuYW1lIGZvciBub3RpY2UgY29weSwgd2l0aCBub24tYnJlYWtpbmcgc3BhY2VzIHNvICJVU0EgwrcgVGV4YXMiIG5ldmVyIHdyYXBzIG1pZC1uYW1lLgogICAgZnVuY3Rpb24gcmVnaW9uTmFtZShsb2NhdGlvbktleSkgewogICAgICByZXR1cm4gKExPQ0FUSU9OU1tsb2NhdGlvbktleV0gPyB0KCdjb3VudHJ5LicgKyBsb2NhdGlvbktleSkgOiB0KCd0aGlzUmVnaW9uJykpLnJlcGxhY2UoLyAvZywgJ1x1MDBhMCcpOwogICAgfQoKICAgIC8vICJpbiBDeXBydXMiOiB0aGUgcHJlcG9zaXRpb24gKG9yIFR1cmtpc2ggc3VmZml4KSBkZXBlbmRzIG9uIHRoZSByZWdpb24uCiAgICBmdW5jdGlvbiByZWdpb25Jbihsb2NhdGlvbktleSkgewogICAgICByZXR1cm4gdChMT0NBVElPTlNbbG9jYXRpb25LZXldID8gJ2luLicgKyBsb2NhdGlvbktleSA6ICdpbi5jeXBydXMnLCB7IG5hbWU6IHJlZ2lvbk5hbWUobG9jYXRpb25LZXkpIH0pOwogICAgfQoKICAgIC8vIEJ1dHRvbnMgc2F5ICJFdXJvcGUiIGZvciBDeXBydXM7IHRoZSBzdXJyb3VuZGluZyBjb3B5IHN0aWxsIG5hbWVzIHRoZSBjb3VudHJ5LgogICAgZnVuY3Rpb24gc3dpdGNoTmFtZShsb2NhdGlvbktleSkgewogICAgICByZXR1cm4gbG9jYXRpb25LZXkgPT09ICdjeXBydXMnID8gdCgnY29udGluZW50LmN5cHJ1cycpIDogcmVnaW9uTmFtZShsb2NhdGlvbktleSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0ZWRMb2NhdGlvbk5hbWUoKSB7CiAgICAgIHJldHVybiByZWdpb25OYW1lKHNlbGVjdGVkTG9jYXRpb24pOwogICAgfQoKICAgIGZ1bmN0aW9uIGpvaW5MaXN0KGl0ZW1zKSB7CiAgICAgIGlmIChpdGVtcy5sZW5ndGggPD0gMSkgcmV0dXJuIGl0ZW1zLmpvaW4oJycpOwogICAgICByZXR1cm4gaXRlbXMuc2xpY2UoMCwgLTEpLmpvaW4odCgnbGlzdFNlcCcpKSArIHQoJ2xpc3RBbmQnKSArIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdOwogICAgfQoKICAgIC8vICJDeXBydXMiIC8gIkN5cHJ1cyBhbmQgSW5kaWEiIC8gIkN5cHJ1cywgSW5kaWEgYW5kIFVTQSDCtyBUZXhhcyIsIGVhY2ggbmFtZSBhIHN3aXRjaCBsaW5rLgogICAgZnVuY3Rpb24gbG9jYXRpb25MaW5rcyhrZXlzLCBjeWNsZUtleSkgewogICAgICByZXR1cm4gam9pbkxpc3Qoa2V5cy5tYXAoa2V5ID0+IHsKICAgICAgICBjb25zdCBjeWNsZUF0dHIgPSBjeWNsZUtleSA\/IGAgZGF0YS1hbHQtY3ljbGU9IiR7Y3ljbGVLZXl9ImAgOiAnJzsKICAgICAgICByZXR1cm4gYDxhIGhyZWY9IiMiIGRhdGEtYWx0LWxvY2F0aW9uPSIke2tleX0iJHtjeWNsZUF0dHJ9PiR7cmVnaW9uTmFtZShrZXkpfTwvYT5gOwogICAgICB9KSk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9jYXRpb25OYW1lcyhrZXlzKSB7CiAgICAgIHJldHVybiBqb2luTGlzdChrZXlzLm1hcChrZXkgPT4gcmVnaW9uTmFtZShrZXkpKSk7CiAgICB9CgogICAgY29uc3QgTk9USUNFX0lORk9fSUNPTiA9ICc8c3ZnIGNsYXNzPSJhdmFpbGFiaWxpdHktbm90ZV9faWNvbiIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48Y2lyY2xlIGN4PSI4IiBjeT0iOCIgcj0iNi41Ii8+PHBhdGggZD0iTTggNy4ydjQiLz48Y2lyY2xlIGN4PSI4IiBjeT0iNSIgcj0iLjYiIGZpbGw9ImN1cnJlbnRDb2xvciIgc3Ryb2tlPSJub25lIi8+PC9zdmc+JzsKICAgIGNvbnN0IEFMVF9ST1dfQ0hFVlJPTiA9ICc8c3ZnIGNsYXNzPSJhbHQtcm93X19jaGV2IiB2aWV3Qm94PSIwIDAgMTYgMTYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHBhdGggZD0iTTYgMy41IDEwLjUgOCA2IDEyLjUiLz48L3N2Zz4nOwogICAgY29uc3QgTk9USUNFX1dBUk5fSUNPTiA9ICc8c3ZnIGNsYXNzPSJhdmFpbGFiaWxpdHktbm90ZV9faWNvbiIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNOCAyLjIgMTQuMyAxM0gxLjd6Ii8+PHBhdGggZD0iTTggNi41djMuMiIvPjxjaXJjbGUgY3g9IjgiIGN5PSIxMS42IiByPSIuNiIgZmlsbD0iY3VycmVudENvbG9yIiBzdHJva2U9Im5vbmUiLz48L3N2Zz4nOwoKICAgIC8vIENyZWF0ZS1vci1yZXVzZSBhIG5vdGljZSBlbGVtZW50IHJpZ2h0IGFmdGVyIGBhbmNob3JgOyBoaWRkZW4gYnkgZGVmYXVsdC4KICAgIGZ1bmN0aW9uIGVuc3VyZU5vdGljZUVsZW1lbnQoaWQsIGFuY2hvciwgY2xhc3NOYW1lKSB7CiAgICAgIGxldCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgaWYgKCFlbCkgewogICAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgZWwuaWQgPSBpZDsKICAgICAgICBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgICAgZWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU5vdGljZUNsaWNrKTsKICAgICAgICBhbmNob3IuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGVsKTsKICAgICAgfQogICAgICByZXR1cm4gZWw7CiAgICB9CgogICAgZnVuY3Rpb24gaGFuZGxlTm90aWNlQ2xpY2soZXZlbnQpIHsKICAgICAgY29uc3QgbGluayA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdhW2RhdGEtYWx0LWxvY2F0aW9uXSwgYnV0dG9uW2RhdGEtYWx0LWxvY2F0aW9uXSwgYVtkYXRhLW9wZW4td2FpdGxpc3RdJyk7CiAgICAgIGlmICghbGluaykgcmV0dXJuOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAobGluay5kYXRhc2V0LmFsdExvY2F0aW9uKSB7CiAgICAgICAgY29uc3QgeyBhbHRMb2NhdGlvbiwgYWx0Q3ljbGUsIGFsdE1vZGVsLCBhbHRTdG9yYWdlIH0gPSBsaW5rLmRhdGFzZXQ7CiAgICAgICAgY29uc3QgaGFkRm9jdXMgPSBsaW5rLnRhZ05hbWUgPT09ICdCVVRUT04nICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxpbms7CiAgICAgICAgc3dpdGNoVG9Mb2NhdGlvbihhbHRMb2NhdGlvbiwgYWx0Q3ljbGUgfHwgbnVsbCwgYWx0TW9kZWwgfHwgbnVsbCwgYWx0U3RvcmFnZSB8fCBudWxsKTsKICAgICAgICAvLyBUaGUgYnV0dG9uIGlzIGdvbmUgb25jZSB0aGUgc3dpdGNoIGxhbmRzOyBrZWVwIGtleWJvYXJkIGZvY3VzIG9uIHRoZSBwaWNrZXIuCiAgICAgICAgaWYgKGhhZEZvY3VzKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbG9jYXRpb25UYWJzIC5jeWNsZS10YWIuYWN0aXZlJyk\/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsKICAgICAgfSBlbHNlIGlmIChsaW5rLmRhdGFzZXQub3BlbldhaXRsaXN0ID09PSAnZGFpbHknKSB7CiAgICAgICAgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5KTsKICAgICAgfQogICAgfQoKICAgIC8vIEV4cGxpY2l0LCB2aXNpdG9yLWluaXRpYXRlZCBqdW1wIHRvIGFub3RoZXIgcmVnaW9uIGFuZC9vciBNYWMsIG9wdGlvbmFsbHkgbGFuZGluZyBvbiBhIGdpdmVuCiAgICAvLyBjeWNsZSBhbmQgc3RvcmFnZS4KICAgIGZ1bmN0aW9uIHN3aXRjaFRvTG9jYXRpb24obG9jYXRpb25LZXksIGN5Y2xlS2V5LCBtb2RlbEtleSwgc3RvcmFnZUtleSkgewogICAgICBpZiAoIUxPQ0FUSU9OU1tsb2NhdGlvbktleV0pIHJldHVybjsKICAgICAgdXNlckludGVyYWN0ZWRXaXRoTG9jYXRpb24gPSB0cnVlOwogICAgICBkYWlseU5vdGljZVJlcXVlc3RlZCA9IGZhbHNlOwogICAgICByZXF1ZXN0ZWRDb25maWcgPSBudWxsOwogICAgICAvLyBUaGUgdmlzaXRvciBwaWNrZWQgdGhpcyByZWdpb24gYW5kIE1hYyB0aGVtc2VsdmVzLCBzbyBhbiBlYXJsaWVyICJ3ZSBzd2l0Y2hlZCB5b3UiIG5vdGUgaXMgc3RhbGUuCiAgICAgIGhpZGVNb2RlbE5vdGUoKTsKICAgICAgaWYgKE1PREVMU1ttb2RlbEtleV0gJiYgbW9kZWxLZXkgIT09IHNlbGVjdGVkTW9kZWwpIHsKICAgICAgICBzZWxlY3RlZE1vZGVsID0gbW9kZWxLZXk7CiAgICAgIH0KICAgICAgc2VsZWN0TG9jYXRpb24obG9jYXRpb25LZXkpOwogICAgICBpZiAoY3ljbGVLZXkgJiYgUFJJQ0lOR19DT05GSUcuY3ljbGVzW2N5Y2xlS2V5XSkgewogICAgICAgIHNlbGVjdEN5Y2xlKGN5Y2xlS2V5KTsKICAgICAgfQogICAgICBpZiAoc3RvcmFnZUtleSAmJiBQUklDSU5HX0NPTkZJRy5zdG9yYWdlW3N0b3JhZ2VLZXldKSB7CiAgICAgICAgc2VsZWN0U3RvcmFnZShzdG9yYWdlS2V5KTsKICAgICAgfQogICAgICAvLyBUaGUgbGlua3MgbGl2ZSBiZWxvdyB0aGUgcGlja2VyOyBicmluZyBpdCBiYWNrIGludG8gdmlldyBvbmx5IGlmIGl0IHNjcm9sbGVkIGF3YXkuCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhdGlvblRhYnMnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWx0ZXJuYXRpdmVBdHRycyhvcHRpb24sIGNvbmZpZykgewogICAgICByZXR1cm4gYGRhdGEtYWx0LWxvY2F0aW9uPSIke29wdGlvbi5sb2NhdGlvbn0iIGRhdGEtYWx0LW1vZGVsPSIke29wdGlvbi5tb2RlbH0iIGRhdGEtYWx0LWN5Y2xlPSIke2NvbmZpZy5jeWNsZX0iIGRhdGEtYWx0LXN0b3JhZ2U9IiR7Y29uZmlnLnN0b3JhZ2V9ImA7CiAgICB9CgogICAgZnVuY3Rpb24gd2FudGVkTGVhZChjb25maWcpIHsKICAgICAgY29uc3QgcGFyYW1zID0geyBtb2RlbDogTU9ERUxTW3NlbGVjdGVkTW9kZWxdLm5hbWUsIGluSGVyZTogcmVnaW9uSW4oc2VsZWN0ZWRMb2NhdGlvbikgfTsKICAgICAgaWYgKCFsb2NhdGlvbkhhcyhzZWxlY3RlZExvY2F0aW9uLCAnYW55JykpIHJldHVybiB0KCd4YWx0LmxlYWRSZWdpb24nLCBwYXJhbXMpOwogICAgICBpZiAoY29uZmlnLmN5Y2xlID09PSAnZGFpbHknKSByZXR1cm4gdCgneGFsdC5sZWFkRGFpbHknLCBwYXJhbXMpOwogICAgICBpZiAoY29uZmlnLnN0b3JhZ2UgPT09ICdiYXNlJykgcmV0dXJuIHQoJ3hhbHQubGVhZEJhc2UnLCBwYXJhbXMpOwogICAgICAvLyBOYW1lZCBsaWtlIHRoZSB0aWxlJ3MgdGl0bGUgKCI3NjggR0IiKSwgdGhlIHNhbWUgYXMgaW4gdGhlIHJvd3MgYmVsb3cuCiAgICAgIHJldHVybiB0KCd4YWx0LmxlYWRTdG9yYWdlJywgeyAuLi5wYXJhbXMsIHN0b3JhZ2U6IHQoJ3N0b3JhZ2Uuc2l6ZScsIHsgc2l6ZTogUFJJQ0lOR19DT05GSUcuc3RvcmFnZVtjb25maWcuc3RvcmFnZV0uc2l6ZSB9KSB9KTsKICAgIH0KCiAgICAvLyBPbmUgcm93IHBlciB3YXkgdG8gZ2V0IGl0OiB3aGljaCBNYWMsIHdoZXJlLCBhbmQgd2hhdCBpdCBjb3N0cyBmb3IgdGhlIHdhbnRlZCBwbGFuLiBUaGUgcmVnaW9uCiAgICAvLyB1c2VzIHRoZSBwbGFpbiBuYW1lIChub3QgcmVnaW9uTmFtZSdzIG5vbi1icmVha2luZyBvbmUpIHNvIGl0IGNhbiB3cmFwIGluIGEgbmFycm93IHJvdy4KICAgIGZ1bmN0aW9uIGFsdGVybmF0aXZlUm93KG9wdGlvbiwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHByaWNlID0gZm9ybWF0UHJpY2UoY3ljbGVQcmljZShjb25maWcuY3ljbGUsIG9wdGlvbi5tb2RlbCkgKyBnZXRTdG9yYWdlUHJpY2UoY29uZmlnLnN0b3JhZ2UsIGNvbmZpZy5jeWNsZSkpICsgdCgndGlsZS5wZXIuJyArIGNvbmZpZy5jeWNsZSk7CiAgICAgIC8vIFdpdGggYW4gZXh0ZXJuYWwgZHJpdmUgdGhlIHJvdyBzYXlzIHNvICgiTWFjIG1pbmkgTTQgwrcgNTEyIEdCIiksIHNpbmNlIHRoZSBwcmljZSBpbmNsdWRlcyBpdC4KICAgICAgY29uc3QgZHJpdmUgPSBjb25maWcuc3RvcmFnZSAhPT0gJ2Jhc2UnID8gYCDCtyAke3QoJ3N0b3JhZ2Uuc2l6ZScsIHsgc2l6ZTogUFJJQ0lOR19DT05GSUcuc3RvcmFnZVtjb25maWcuc3RvcmFnZV0uc2l6ZSB9KX1gIDogJyc7CiAgICAgIHJldHVybiBgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJhbHQtcm93IiAke2FsdGVybmF0aXZlQXR0cnMob3B0aW9uLCBjb25maWcpfT5gCiAgICAgICAgKyBgPHNwYW4gY2xhc3M9ImFsdC1yb3dfX3doYXQiPjxiPiR7TU9ERUxTW29wdGlvbi5tb2RlbF0ubmFtZX0ke2RyaXZlfTwvYj48c3Bhbj4ke3QoJ2NvdW50cnkuJyArIG9wdGlvbi5sb2NhdGlvbil9PC9zcGFuPjwvc3Bhbj5gCiAgICAgICAgKyBgPHNwYW4gY2xhc3M9ImFsdC1yb3dfX3ByaWNlIj4ke3ByaWNlfTwvc3Bhbj4ke0FMVF9ST1dfQ0hFVlJPTn08L2J1dHRvbj5gOwogICAgfQoKICAgIC8vIFRoZSBzZWxlY3Rpb24gKG9yIHRoZSBzb2xkLW91dCBvcHRpb24ganVzdCB0YXBwZWQpIGNhbid0IGJlIGJvdWdodCBoZXJlIGJ1dCBjYW4gZWxzZXdoZXJlOgogICAgLy8gb25lIGJhbm5lciB1bmRlciB0aGUgcGlja2VyIHdpdGggYSByb3cgcGVyIHdheSB0byBnZXQgaXQuIFJldHVybnMgd2hldGhlciBpdCBpcyBzaG93bi4KICAgIGZ1bmN0aW9uIHJlbmRlckFsdGVybmF0aXZlc05vdGUoYW5jaG9yLCBjdGFBbHQpIHsKICAgICAgY29uc3Qgbm90ZSA9IGVuc3VyZU5vdGljZUVsZW1lbnQoJ2NvbmZpZ0FsdE5vdGUnLCBhbmNob3IsICdhdmFpbGFiaWxpdHktbm90ZSBpcy13YXJuaW5nJyk7CiAgICAgIGNvbnN0IGNvbmZpZyA9IHdhbnRlZENvbmZpZygpOwogICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnID8gY29uZmlnQWx0ZXJuYXRpdmVzKGNvbmZpZykgOiBbXTsKICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCkgewogICAgICAgIG5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGhlIGljb24gc2l0cyB3aXRoIHRoZSBzZW50ZW5jZSBvbmx5LCBzbyB0aGUgcm93cyBnZXQgdGhlIGJhbm5lcidzIGZ1bGwgd2lkdGggb24gcGhvbmVzLgogICAgICBub3RlLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJhdmFpbGFiaWxpdHktbm90ZV9fYm9keSI+PHNwYW4gY2xhc3M9ImFsdC1sZWFkIj4ke05PVElDRV9XQVJOX0lDT059PHNwYW4+JHt3YW50ZWRMZWFkKGNvbmZpZyl9ICR7dCgneGFsdC5hdmFpbGFibGVOb3cnKX08L3NwYW4+PC9zcGFuPmAKICAgICAgICArIGA8ZGl2IGNsYXNzPSJhbHQtcm93cyI+JHtvcHRpb25zLm1hcChvcHRpb24gPT4gYWx0ZXJuYXRpdmVSb3cob3B0aW9uLCBjb25maWcpKS5qb2luKCcnKX08L2Rpdj48L2Rpdj5gOwogICAgICBub3RlLmhpZGRlbiA9IGZhbHNlOwogICAgICAvLyBVbmRlciB0aGUgQ1RBIG9ubHkgd2hlbiB0aGUgd2hvbGUgcmVnaW9uIGlzIG91dCBhbmQgdGhlIHNhbWUgTWFjIGlzIHdhaXRpbmcgZWxzZXdoZXJlLgogICAgICBjb25zdCBmaXJzdCA9IG9wdGlvbnNbMF07CiAgICAgIGlmICghbG9jYXRpb25IYXMoc2VsZWN0ZWRMb2NhdGlvbiwgJ2FueScpICYmIGZpcnN0Lm1vZGVsID09PSBzZWxlY3RlZE1vZGVsKSB7CiAgICAgICAgY29uc3QgYWx0TGluayA9IGA8YSBocmVmPSIjIiAke2FsdGVybmF0aXZlQXR0cnMoZmlyc3QsIGNvbmZpZyl9PiR7dCgnbm90aWNlLmN0YUFsdExpbmsnLCB7IGluUmVnaW9uOiByZWdpb25JbihmaXJzdC5sb2NhdGlvbikgfSl9PC9hPmA7CiAgICAgICAgY3RhQWx0LmlubmVySFRNTCA9IHQoJ25vdGljZS5jdGFBbHQnLCB7IGxpbms6IGFsdExpbmsgfSk7CiAgICAgICAgY3RhQWx0LmhpZGRlbiA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIGN0YUFsdC5oaWRkZW4gPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckF2YWlsYWJpbGl0eU5vdGljZXMoKSB7CiAgICAgIGNvbnN0IGxvY2F0aW9uVGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhdGlvblRhYnMnKTsKICAgICAgY29uc3QgY3ljbGVUYWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N5Y2xlVGFicycpOwogICAgICBjb25zdCBjdGFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3RhQnV0dG9uJyk7CiAgICAgIGlmICghbG9jYXRpb25UYWJzIHx8ICFjeWNsZVRhYnMgfHwgIWN0YUJ1dHRvbikgcmV0dXJuOwoKICAgICAgY29uc3QgbG9jYXRpb25Ob3RlID0gZW5zdXJlTm90aWNlRWxlbWVudCgnbG9jYXRpb25BdmFpbGFiaWxpdHlOb3RlJywgbG9jYXRpb25UYWJzLCAnYXZhaWxhYmlsaXR5LW5vdGUgaXMtd2FybmluZycpOwogICAgICBjb25zdCBkYWlseU5vdGUgPSBlbnN1cmVOb3RpY2VFbGVtZW50KCdkYWlseUF2YWlsYWJpbGl0eU5vdGUnLCBjeWNsZVRhYnMsICdhdmFpbGFiaWxpdHktbm90ZScpOwogICAgICBjb25zdCBjdGFBbHQgPSBlbnN1cmVOb3RpY2VFbGVtZW50KCdjdGFBbHRMb2NhdGlvbicsIGN0YUJ1dHRvbiwgJ2N0YS1hbHQtbG9jYXRpb24nKTsKCiAgICAgIC8vIFRoZSBhbHRlcm5hdGl2ZXMgYmFubmVyIHN1cGVyc2VkZXMgdGhlIGdlbmVyaWMgc29sZC1vdXQgYW5kIERhaWx5IG5vdGVzLgogICAgICBpZiAocmVuZGVyQWx0ZXJuYXRpdmVzTm90ZShsb2NhdGlvbk5vdGUsIGN0YUFsdCkpIHsKICAgICAgICBsb2NhdGlvbk5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgICAgICBkYWlseU5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IHJlYWR5ID0gbm90aWNlc1JlYWR5KCk7CiAgICAgIGNvbnN0IGhlcmUgPSBzZWxlY3RlZExvY2F0aW9uTmFtZSgpOwogICAgICBjb25zdCBzb2xkT3V0SGVyZSA9IHJlYWR5ICYmICFsb2NhdGlvbkhhcyhzZWxlY3RlZExvY2F0aW9uLCAnYW55Jyk7CiAgICAgIGNvbnN0IHN0b2NrRWxzZXdoZXJlID0gcmVhZHkgPyBvdGhlckxvY2F0aW9uc1dpdGgoJ2FueScpIDogW107CgogICAgICAvLyAxKSBUaGUgd2hvbGUgcmVnaW9uIGlzIGFsbG9jYXRlZCAtPiB3YXJuaW5nIHVuZGVyIHRoZSBwaWNrZXIgKyBzZWNvbmRhcnkgbGluayB1bmRlciB0aGUgQ1RBLgogICAgICBpZiAoc29sZE91dEhlcmUgJiYgc3RvY2tFbHNld2hlcmUubGVuZ3RoKSB7CiAgICAgICAgY29uc3Qgc29sZE91dFRleHQgPSB0KHNlbGVjdGVkTW9kZWwgPT09ICdtNCcgPyAnbm90aWNlLnNvbGRPdXQnIDogJ25vdGljZS5tb2RlbFNvbGRPdXQnLCB7CiAgICAgICAgICBtb2RlbDogTU9ERUxTW3NlbGVjdGVkTW9kZWxdLm5hbWUsCiAgICAgICAgICBpbkhlcmU6IHJlZ2lvbkluKHNlbGVjdGVkTG9jYXRpb24pLAogICAgICAgICAgaGVyZSwKICAgICAgICAgIGxpbmtzOiBsb2NhdGlvbkxpbmtzKHN0b2NrRWxzZXdoZXJlKQogICAgICAgIH0pOwogICAgICAgIGxvY2F0aW9uTm90ZS5pbm5lckhUTUwgPSBgJHtOT1RJQ0VfV0FSTl9JQ09OfTxzcGFuPiR7c29sZE91dFRleHR9PC9zcGFuPmA7CiAgICAgICAgbG9jYXRpb25Ob3RlLmhpZGRlbiA9IGZhbHNlOwogICAgICAgIGNvbnN0IGFsdExpbmsgPSBgPGEgaHJlZj0iIyIgZGF0YS1hbHQtbG9jYXRpb249IiR7c3RvY2tFbHNld2hlcmVbMF19Ij4ke3QoJ25vdGljZS5jdGFBbHRMaW5rJywgeyBpblJlZ2lvbjogcmVnaW9uSW4oc3RvY2tFbHNld2hlcmVbMF0pIH0pfTwvYT5gOwogICAgICAgIGN0YUFsdC5pbm5lckhUTUwgPSB0KCdub3RpY2UuY3RhQWx0JywgeyBsaW5rOiBhbHRMaW5rIH0pOwogICAgICAgIGN0YUFsdC5oaWRkZW4gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhdGlvbk5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgICAgICBjdGFBbHQuaGlkZGVuID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLy8gMikgRGFpbHkgc29sZCBvdXQgaGVyZSBidXQgb3BlbiBlbHNld2hlcmUgLT4gaW5mbyB1bmRlciB0aGUgY3ljbGUgdGFicywgb25seSBvbmNlIHRhcHBlZC4KICAgICAgY29uc3QgZGFpbHlPdXRIZXJlID0gcmVhZHkgJiYgIWxvY2F0aW9uSGFzKHNlbGVjdGVkTG9jYXRpb24sICdkYWlseScpOwogICAgICBjb25zdCBkYWlseUVsc2V3aGVyZSA9IHJlYWR5ID8gb3RoZXJMb2NhdGlvbnNXaXRoKCdkYWlseScpIDogW107CiAgICAgIGlmIChkYWlseU5vdGljZVJlcXVlc3RlZCAmJiBkYWlseU91dEhlcmUgJiYgIXNvbGRPdXRIZXJlICYmIGRhaWx5RWxzZXdoZXJlLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGRhaWx5VGV4dCA9IHQoJ25vdGljZS5kYWlseVNvbGRPdXQnLCB7CiAgICAgICAgICBpbkhlcmU6IHJlZ2lvbkluKHNlbGVjdGVkTG9jYXRpb24pLAogICAgICAgICAgbGlua3M6IGxvY2F0aW9uTGlua3MoZGFpbHlFbHNld2hlcmUsICdkYWlseScpLAogICAgICAgICAgd2FpdGxpc3Q6IGA8YSBocmVmPSIjIiBkYXRhLW9wZW4td2FpdGxpc3Q9ImRhaWx5Ij4ke3QoJ25vdGljZS5qb2luV2FpdGxpc3QnKX08L2E+YAogICAgICAgIH0pOwogICAgICAgIGRhaWx5Tm90ZS5pbm5lckhUTUwgPSBgJHtOT1RJQ0VfSU5GT19JQ09OfTxzcGFuPiR7ZGFpbHlUZXh0fTwvc3Bhbj5gOwogICAgICAgIGRhaWx5Tm90ZS5oaWRkZW4gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkYWlseU5vdGUuaGlkZGVuID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8vIEluc2lkZSB0aGUgd2FpdGxpc3QgZGlhbG9nOiAiUHJlZmVyIG5vdCB0byB3YWl0PyIgcm93IHdpdGggb25lIHN3aXRjaCBidXR0b24gcGVyIHJlZ2lvbgogICAgLy8gdGhhdCBoYXMgd2hhdCB0aGUgdmlzaXRvciBhc2tlZCBmb3IuIGB3aGF0YCBtaXJyb3JzIGxvY2F0aW9uSGFzKCkuCiAgICBmdW5jdGlvbiByZW5kZXJEaWFsb2dBbHRlcm5hdGl2ZSh3aGF0LCBjeWNsZUtleSkgewogICAgICBpZiAoIWF2YWlsYWJpbGl0eURpYWxvZyB8fCAhYXZhaWxhYmlsaXR5Rm9ybSkgcmV0dXJuOwogICAgICBsZXQgcm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eUFsdExvY2F0aW9uJyk7CiAgICAgIGlmICghcm93KSB7CiAgICAgICAgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcm93LmlkID0gJ2F2YWlsYWJpbGl0eUFsdExvY2F0aW9uJzsKICAgICAgICByb3cuY2xhc3NOYW1lID0gJ2F2YWlsYWJpbGl0eS1hbHQnOwogICAgICAgIHJvdy5oaWRkZW4gPSB0cnVlOwogICAgICAgIGF2YWlsYWJpbGl0eUZvcm0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHJvdyk7CiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7CiAgICAgICAgICBjb25zdCBidXR0b24gPSBldmVudC50YXJnZXQuY2xvc2VzdCgnYnV0dG9uW2RhdGEtYWx0LWxvY2F0aW9uXScpOwogICAgICAgICAgaWYgKCFidXR0b24pIHJldHVybjsKICAgICAgICAgIGNvbnN0IHsgYWx0TG9jYXRpb24sIGFsdEN5Y2xlLCBhbHRTdG9yYWdlIH0gPSBidXR0b24uZGF0YXNldDsKICAgICAgICAgIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCk7CiAgICAgICAgICBzd2l0Y2hUb0xvY2F0aW9uKGFsdExvY2F0aW9uLCBhbHRDeWNsZSB8fCBudWxsLCBudWxsLCBhbHRTdG9yYWdlIHx8IG51bGwpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBjb25zdCBhbHRlcm5hdGl2ZXMgPSBub3RpY2VzUmVhZHkoKSAmJiB3aGF0ICE9PSAnbm9uZScgPyBvdGhlckxvY2F0aW9uc1dpdGgod2hhdCkgOiBbXTsKICAgICAgaWYgKCFhbHRlcm5hdGl2ZXMubGVuZ3RoKSB7CiAgICAgICAgcm93LmhpZGRlbiA9IHRydWU7CiAgICAgICAgcm93LmlubmVySFRNTCA9ICcnOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcHJvbXB0S2V5ID0gd2hhdCA9PT0gJ2RhaWx5JyA\/ICdhbHQuZGFpbHknCiAgICAgICAgOiAod2hhdCA9PT0gJ2FkZG9uMjU2JyB8fCB3aGF0ID09PSAnYWRkb241MTInKSA\/ICdhbHQuY29uZmlnJwogICAgICAgIDogJ2FsdC5hbnknOwogICAgICBjb25zdCBzdG9yYWdlQXR0ciA9IHdoYXQgPT09ICdhZGRvbjI1NicgfHwgd2hhdCA9PT0gJ2FkZG9uNTEyJyA\/IGAgZGF0YS1hbHQtc3RvcmFnZT0iJHt3aGF0fSJgIDogJyc7CiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBhbHRlcm5hdGl2ZXMubWFwKGtleSA9PiB7CiAgICAgICAgY29uc3QgY3ljbGVBdHRyID0gY3ljbGVLZXkgPyBgIGRhdGEtYWx0LWN5Y2xlPSIke2N5Y2xlS2V5fSJgIDogJyc7CiAgICAgICAgcmV0dXJuIGA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1hbHQtbG9jYXRpb249IiR7a2V5fSIke2N5Y2xlQXR0cn0ke3N0b3JhZ2VBdHRyfT4ke3QoJ2FsdC5zd2l0Y2gnLCB7IHJlZ2lvbjogc3dpdGNoTmFtZShrZXkpIH0pfTwvYnV0dG9uPmA7CiAgICAgIH0pLmpvaW4oJycpOwogICAgICByb3cuaW5uZXJIVE1MID0gYDxzcGFuPiR7dChwcm9tcHRLZXksIHsgbmFtZXM6IGxvY2F0aW9uTmFtZXMoYWx0ZXJuYXRpdmVzKSB9KX08L3NwYW4+PGRpdiBjbGFzcz0iYXZhaWxhYmlsaXR5LWFsdF9fYWN0aW9ucyI+JHtidXR0b25zfTwvZGl2PmA7CiAgICAgIHJvdy5oaWRkZW4gPSBmYWxzZTsKICAgIH0KCiAgICAvLyBTa2VsZXRvbiBwbGFjZWhvbGRlcnMgc2hvd24gdW50aWwgYXZhaWxhYmlsaXR5IGRhdGEgYXJyaXZlcyBhbmQgdGhlIHJlYWwKICAgIC8vIGN5Y2xlIHRhYnMgLyBzdG9yYWdlIG9wdGlvbnMgYXJlIHJlbmRlcmVkLgogICAgLy8KICAgIC8vIFRoZSBsb2NhdGlvbiBwaWNrZXIgaGFzIGl0cyBvd24gc2tlbGV0b24gb24gYSBkaWZmZXJlbnQgc2lnbmFsOiBpdCB3YWl0cyBvbiB0aGUgZ2VvIGxvb2t1cCwKICAgIC8vIG5vdCBvbiBhdmFpbGFiaWxpdHksIHNvIHRoZSB2aXNpdG9yIG5ldmVyIHNlZXMgQ3lwcnVzIGhpZ2hsaWdodGVkIGZvciBhIG1vbWVudCBhbmQgdGhlbgogICAgLy8gd2F0Y2hlcyBpdCBqdW1wIHRvIHRoZWlyIG93biByZWdpb24uCiAgICBmdW5jdGlvbiByZW5kZXJMb2NhdGlvblRhYnNTa2VsZXRvbigpIHsKICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2F0aW9uVGFicycpOwogICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOwogICAgICBsZXQgaHRtbCA9ICcnOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE9iamVjdC5rZXlzKExPQ0FUSU9OUykubGVuZ3RoOyBpKyspIHsKICAgICAgICBodG1sICs9IGAKICAgICAgICAgIDxkaXYgY2xhc3M9ImN5Y2xlLXRhYiBpcy1za2VsZXRvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNrZWxldG9uLWJhciIgc3R5bGU9ImhlaWdodDoxNHB4O3dpZHRoOjU1JTttYXJnaW46NnB4IGF1dG8gOHB4OyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNrZWxldG9uLWJhciIgc3R5bGU9ImhlaWdodDoxMHB4O3dpZHRoOjQwJTttYXJnaW46MCBhdXRvOyI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICB9CiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckN5Y2xlVGFic1NrZWxldG9uKCkgewogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3ljbGVUYWJzJyk7CiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47CiAgICAgIGxldCBodG1sID0gJyc7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgaHRtbCArPSBgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJjeWNsZS10YWIgaXMtc2tlbGV0b24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2VsZXRvbi1iYXIiIHN0eWxlPSJoZWlnaHQ6MTRweDt3aWR0aDo1NSU7bWFyZ2luOjZweCBhdXRvIDhweDsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2VsZXRvbi1iYXIiIHN0eWxlPSJoZWlnaHQ6MTBweDt3aWR0aDo0MCU7bWFyZ2luOjAgYXV0bzsiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTdG9yYWdlT3B0aW9uc1NrZWxldG9uKCkgewogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvcmFnZUNvbnRhaW5lcicpOwogICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOwogICAgICBsZXQgb3B0aW9uc0h0bWwgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICBvcHRpb25zSHRtbCArPSBgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdG9yYWdlLW9wdGlvbiBpcy1za2VsZXRvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNrZWxldG9uLWJhciIgc3R5bGU9ImhlaWdodDoxOHB4O3dpZHRoOjQ1JTttYXJnaW46MCBhdXRvIDhweDsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2VsZXRvbi1iYXIiIHN0eWxlPSJoZWlnaHQ6MTJweDt3aWR0aDo3MCU7bWFyZ2luOjAgYXV0byA4cHg7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2tlbGV0b24tYmFyIiBzdHlsZT0iaGVpZ2h0OjEzcHg7d2lkdGg6MzUlO21hcmdpbjowIGF1dG87Ij48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgIH0KICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJzdG9yYWdlLW9wdGlvbnMiPiR7b3B0aW9uc0h0bWx9PC9kaXY+YDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJDeWNsZVRhYnMoKSB7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjeWNsZVRhYnMnKTsKICAgICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdSZW50YU1hYyBQcmljaW5nOiAjY3ljbGVUYWJzIGVsZW1lbnQgbm90IGZvdW5kJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsKCiAgICAgIE9iamVjdC5lbnRyaWVzKFBSSUNJTkdfQ09ORklHLmN5Y2xlcykuZm9yRWFjaCgoW2tleSwgY3ljbGVdKSA9PiB7CiAgICAgICAgY29uc3QgdGFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgdGFiLnR5cGUgPSAnYnV0dG9uJzsKICAgICAgICBjb25zdCBpc0RhaWx5VW5hdmFpbGFibGUgPSBrZXkgPT09ICdkYWlseScgJiYgZ2V0VG90YWxBdmFpbGFibGVEZXZpY2VzKCkgPD0gZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkOwogICAgICAgIHRhYi5jbGFzc05hbWUgPSBgY3ljbGUtdGFiICR7a2V5ID09PSBzZWxlY3RlZEN5Y2xlID8gJ2FjdGl2ZScgOiAnJ30gJHtpc0RhaWx5VW5hdmFpbGFibGUgPyAndW5hdmFpbGFibGUnIDogJyd9YDsKICAgICAgICB0YWIuZGF0YXNldC5jeWNsZSA9IGtleTsKCiAgICAgICAgbGV0IGh0bWwgPSBgCiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3ljbGUtbmFtZSI+JHt0KCdjeWNsZS4nICsga2V5KX08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3ljbGUtcHJpY2UiPiR7dCgncGVyRGF5JywgeyBwcmljZTogZm9ybWF0UHJpY2UoY3ljbGVQcmljZVBlckRheShrZXkpKSB9KX08L3NwYW4+CiAgICAgICAgYDsKCiAgICAgICAgY29uc3QgcGlsbHMgPSAoY3ljbGUucG9wdWxhciA\/IGA8c3BhbiBjbGFzcz0icG9wdWxhci1iYWRnZSI+JHt0KCdwb3B1bGFyJyl9PC9zcGFuPmAgOiAnJykKICAgICAgICAgICsgKGN5Y2xlLnNhdmluZ3NQZXJjZW50ID8gYDxzcGFuIGNsYXNzPSJzYXZpbmdzLWJhZGdlIj4ke3QoJ3NhdmUnLCB7IHBjdDogY3ljbGUuc2F2aW5nc1BlcmNlbnQgfSl9PC9zcGFuPmAgOiAnJyk7CiAgICAgICAgaWYgKHBpbGxzKSBodG1sICs9IGA8c3BhbiBjbGFzcz0idGFiLXBpbGxzIj4ke3BpbGxzfTwvc3Bhbj5gOwoKICAgICAgICB0YWIuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBpZiAoaXNEYWlseVVuYXZhaWxhYmxlKSB7CiAgICAgICAgICAvLyBIb3ZlciB0b29sdGlwIChDU1MgcmVhZHMgZGF0YS10aXApOiBuYW1lIHRoZSByZWdpb24sIGFuZCB3aGVyZSBEYWlseSBpcyBvcGVuIGluc3RlYWQuCiAgICAgICAgICBjb25zdCBkYWlseUVsc2V3aGVyZSA9IG5vdGljZXNSZWFkeSgpID8gb3RoZXJMb2NhdGlvbnNXaXRoKCdkYWlseScpIDogW107CiAgICAgICAgICB0YWIuZGF0YXNldC50aXAgPSBkYWlseUVsc2V3aGVyZS5sZW5ndGgKICAgICAgICAgICAgPyB0KCd0aXAuZGFpbHlFbHNld2hlcmUnLCB7IGluSGVyZTogcmVnaW9uSW4oc2VsZWN0ZWRMb2NhdGlvbiksIG5hbWVzOiBsb2NhdGlvbk5hbWVzKGRhaWx5RWxzZXdoZXJlKSB9KQogICAgICAgICAgICA6IHQoJ3RpcC5kYWlseU5vbmUnKTsKICAgICAgICB9CiAgICAgICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgaWYgKGlzRGFpbHlVbmF2YWlsYWJsZSkgewogICAgICAgICAgICAvLyBUaGUgdGFwIGlzIHdoYXQgZWFybnMgdGhlIGlubGluZSBub3RpY2UgKGl0IGlzIG5ldmVyIHNob3duIHVwIGZyb250KS4KICAgICAgICAgICAgZGFpbHlOb3RpY2VSZXF1ZXN0ZWQgPSB0cnVlOwogICAgICAgICAgICByZXF1ZXN0ZWRDb25maWcgPSB7IGN5Y2xlOiAnZGFpbHknLCBzdG9yYWdlOiAnYmFzZScgfTsKICAgICAgICAgICAgcmVuZGVyQXZhaWxhYmlsaXR5Tm90aWNlcygpOwogICAgICAgICAgICBvcGVuQXZhaWxhYmlsaXR5RGlhbG9nKEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuRGFpbHkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzZWxlY3RDeWNsZShrZXkpOwogICAgICAgIH0pOwogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTdG9yYWdlT3B0aW9ucygpIHsKICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b3JhZ2VDb250YWluZXInKTsKICAgICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdSZW50YU1hYyBQcmljaW5nOiAjc3RvcmFnZUNvbnRhaW5lciBlbGVtZW50IG5vdCBmb3VuZCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjeWNsZSA9IFBSSUNJTkdfQ09ORklHLmN5Y2xlc1tzZWxlY3RlZEN5Y2xlXTsKICAgICAgY29uc3QgaGFzU3RvcmFnZSA9IGN5Y2xlLmhhc1N0b3JhZ2U7CgogICAgICAvLyBSZXNldCB0byBiYXNlIHN0b3JhZ2UgaWYgY3VycmVudCBjeWNsZSBkb2Vzbid0IHN1cHBvcnQgYWRkb25zCiAgICAgIGlmICghaGFzU3RvcmFnZSAmJiBzZWxlY3RlZFN0b3JhZ2UgIT09ICdiYXNlJykgewogICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdiYXNlJzsKICAgICAgfQoKICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBzdG9yYWdlIGlzIHVuYXZhaWxhYmxlCiAgICAgIGNvbnN0IGlzQ3VycmVudFNlbGVjdGlvblVuYXZhaWxhYmxlID0KICAgICAgICAoc2VsZWN0ZWRTdG9yYWdlID09PSAnYmFzZScgJiYgY3VycmVudEF2YWlsYWJsZURldmljZXMgPT09IDApIHx8CiAgICAgICAgKHNlbGVjdGVkU3RvcmFnZSA9PT0gJ2FkZG9uMjU2JyAmJiBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDApIHx8CiAgICAgICAgKHNlbGVjdGVkU3RvcmFnZSA9PT0gJ2FkZG9uNTEyJyAmJiBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPT09IDApOwoKICAgICAgLy8gQXV0by1zZWxlY3QgZmlyc3QgYXZhaWxhYmxlIHN0b3JhZ2Ugb3B0aW9uIGlmIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHVuYXZhaWxhYmxlCiAgICAgIGlmIChpc0N1cnJlbnRTZWxlY3Rpb25VbmF2YWlsYWJsZSAmJiBoYXNTdG9yYWdlKSB7CiAgICAgICAgaWYgKGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID4gMCkgewogICAgICAgICAgc2VsZWN0ZWRTdG9yYWdlID0gJ2Jhc2UnOwogICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlc1dpdGgyNTZHYkRyaXZlID4gMCkgewogICAgICAgICAgc2VsZWN0ZWRTdG9yYWdlID0gJ2FkZG9uMjU2JzsKICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA+IDApIHsKICAgICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdhZGRvbjUxMic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vdGhpbmcgaW4gc3RvY2s6IGJhY2sgdG8gdGhlIGJhc2UgTWFjLCBzbyBKb2luIFdhaXRsaXN0IGlzIHRoZSBNYWMgd2FpdGxpc3QgKG5vbmUgZm9yIGRyaXZlcykKICAgICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdiYXNlJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50U2VsZWN0aW9uVW5hdmFpbGFibGUgJiYgIWhhc1N0b3JhZ2UpIHsKICAgICAgICAvLyBGb3IgZGFpbHkgcGxhbiwganVzdCBrZWVwIGJhc2UgZXZlbiBpZiB1bmF2YWlsYWJsZQogICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdiYXNlJzsKICAgICAgfQoKICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBvcHRpb25zQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzdG9yYWdlLW9wdGlvbnMnOwogICAgICBvcHRpb25zQ29udGFpbmVyLmlkID0gJ3N0b3JhZ2VPcHRpb25zJzsKCiAgICAgIE9iamVjdC5lbnRyaWVzKFBSSUNJTkdfQ09ORklHLnN0b3JhZ2UpLmZvckVhY2goKFtrZXksIHN0b3JhZ2VdKSA9PiB7CiAgICAgICAgY29uc3QgaXNBZGRvbiA9IGtleSAhPT0gJ2Jhc2UnOwogICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpc0FkZG9uICYmICFoYXNTdG9yYWdlOwoKICAgICAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgZHluYW1pY2FsbHkgYmFzZWQgb24gQVBJIHJlc3BvbnNlIChkZXZpY2VzIHdpdGggZHJpdmVzIGF0dGFjaGVkKQogICAgICAgIGxldCBpc1VuYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgaWYgKGtleSA9PT0gJ2Jhc2UnKSB7CiAgICAgICAgICBpc1VuYXZhaWxhYmxlID0gY3VycmVudEF2YWlsYWJsZURldmljZXMgPT09IDA7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhZGRvbjI1NicpIHsKICAgICAgICAgIGlzVW5hdmFpbGFibGUgPSBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDA7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhZGRvbjUxMicpIHsKICAgICAgICAgIGlzVW5hdmFpbGFibGUgPSBhdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPT09IDA7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICBvcHRpb24udHlwZSA9ICdidXR0b24nOwogICAgICAgIGxldCBjbGFzc2VzID0gJ3N0b3JhZ2Utb3B0aW9uJzsKICAgICAgICBpZiAoa2V5ID09PSBzZWxlY3RlZFN0b3JhZ2UgJiYgIWlzVW5hdmFpbGFibGUpIGNsYXNzZXMgKz0gJyBhY3RpdmUnOwogICAgICAgIGlmIChpc0Rpc2FibGVkKSBjbGFzc2VzICs9ICcgZGlzYWJsZWQnOwogICAgICAgIGVsc2UgaWYgKGlzVW5hdmFpbGFibGUpIGNsYXNzZXMgKz0gJyB1bmF2YWlsYWJsZSc7CiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9IGNsYXNzZXM7CiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc3RvcmFnZSA9IGtleTsKICAgICAgICBpZiAoaXNEaXNhYmxlZCkgb3B0aW9uLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7CgogICAgICAgIC8vIEZvciBkaXNhYmxlZC91bmF2YWlsYWJsZSBhZGRvbnMsIHNob3cgbW9udGhseSBwcmljZSBhcyByZWZlcmVuY2UKICAgICAgICBsZXQgcHJpY2UsIHByaWNlTGFiZWw7CiAgICAgICAgaWYgKGlzVW5hdmFpbGFibGUgJiYgIWlzRGlzYWJsZWQpIHsKICAgICAgICAgIHByaWNlTGFiZWwgPSB0KCdzdG9yYWdlLnNvbGRPdXQnKTsKICAgICAgICB9IGVsc2UgaWYgKGlzRGlzYWJsZWQgJiYgc3RvcmFnZS5tb250aGx5UHJpY2UpIHsKICAgICAgICAgIHByaWNlID0gc3RvcmFnZS5tb250aGx5UHJpY2U7CiAgICAgICAgICBwcmljZUxhYmVsID0gdCgnc3RvcmFnZS5wZXJNb250aCcsIHsgcHJpY2U6IGZvcm1hdFByaWNlKHByaWNlKSB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJpY2UgPSBnZXRTdG9yYWdlUHJpY2Uoa2V5LCBzZWxlY3RlZEN5Y2xlKTsKICAgICAgICAgIHByaWNlTGFiZWwgPSBwcmljZSA9PT0gMCA\/IHQoJ3N0b3JhZ2UuaW5jbHVkZWQnKSA6IGArJHtmb3JtYXRQcmljZShwcmljZSl9YDsKICAgICAgICB9CgogICAgICAgIGxldCBjb250ZW50SHRtbCA9IGAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdG9yYWdlLXNpemUiPiR7dCgnc3RvcmFnZS5zaXplJywgeyBzaXplOiBzdG9yYWdlLnNpemUgfSl9PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9InN0b3JhZ2UtbGFiZWwiPiR7dCgnc3RvcmFnZS4nICsga2V5KX08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RvcmFnZS1wcmljZSI+JHtwcmljZUxhYmVsfTwvc3Bhbj4KICAgICAgICBgOwoKICAgICAgICBpZiAoc3RvcmFnZS5pc0RlZmF1bHQpIHsKICAgICAgICAgIGNvbnRlbnRIdG1sICs9IGA8c3BhbiBjbGFzcz0iZGVmYXVsdC1iYWRnZSI+JHt0KCdzdG9yYWdlLmRlZmF1bHQnKX08L3NwYW4+YDsKICAgICAgICB9CgogICAgICAgIC8vIFdyYXAgY29udGVudCBmb3IgdW5hdmFpbGFibGUvZGlzYWJsZWQgb3B0aW9ucyBzbyB0aGUgZGltbWluZyBkb2Vzbid0IGFmZmVjdCB0aGUgdG9vbHRpcAogICAgICAgIGlmIChpc1VuYXZhaWxhYmxlIHx8IGlzRGlzYWJsZWQpIHsKICAgICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9InN0b3JhZ2UtY29udGVudCI+JHtjb250ZW50SHRtbH08L3NwYW4+YDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3B0aW9uLmlubmVySFRNTCA9IGNvbnRlbnRIdG1sOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzVW5hdmFpbGFibGUgJiYgIWlzRGlzYWJsZWQpIHsKICAgICAgICAgIC8vIEhvdmVyIHRvb2x0aXAgKENTUyByZWFkcyBkYXRhLXRpcCk6IG5hbWUgdGhlIHJlZ2lvbiwgYW5kIHdoZXJlIHRoaXMgZHJpdmUgaXMgb3BlbiBpbnN0ZWFkLgogICAgICAgICAgY29uc3QgZWxzZXdoZXJlID0gbm90aWNlc1JlYWR5KCkgPyBvdGhlckxvY2F0aW9uc1dpdGgoa2V5KSA6IFtdOwogICAgICAgICAgb3B0aW9uLmRhdGFzZXQudGlwID0gZWxzZXdoZXJlLmxlbmd0aAogICAgICAgICAgICA\/IHQoJ3RpcC5zdG9yYWdlRWxzZXdoZXJlJywgeyBpbkhlcmU6IHJlZ2lvbkluKHNlbGVjdGVkTG9jYXRpb24pLCBuYW1lczogbG9jYXRpb25OYW1lcyhlbHNld2hlcmUpIH0pCiAgICAgICAgICAgIDogdCgndGlwLnN0b3JhZ2VOb25lJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBEaXNhYmxlZCB0aWxlcyBhcmUgdGhlIHdyb25nIGJpbGxpbmcgY3ljbGUsIG5vdCBhIHN0b2NrIHByb2JsZW0sIHNvIHRoZXkgc3RheSBpbmVydC4KICAgICAgICBpZiAoIWlzRGlzYWJsZWQpIHsKICAgICAgICAgIG9wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgaWYgKGlzVW5hdmFpbGFibGUpIHsKICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWcgPSB7IGN5Y2xlOiBzZWxlY3RlZEN5Y2xlLCBzdG9yYWdlOiBrZXkgfTsKICAgICAgICAgICAgICByZW5kZXJBdmFpbGFiaWxpdHlOb3RpY2VzKCk7CiAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSB3YWl0bGlzdCBmb3IgdGhlIE1hYywgbm90IGZvciBhbiBleHRlcm5hbCBkcml2ZTogYSBzb2xkLW91dCBkcml2ZSBvbmx5IGJyaW5ncyB1cAogICAgICAgICAgICAgIC8vIHdoZXJlIHRoYXQgc2V0dXAgaXMgaW4gc3RvY2ssIHVubGVzcyBubyBNYWMgYXQgYWxsIGlzIGxlZnQgaGVyZSwgdGhlbiBpdCBpcyB0aGUgTWFjIHdhaXRsaXN0LgogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdiYXNlJyB8fCAhbG9jYXRpb25IYXMoc2VsZWN0ZWRMb2NhdGlvbiwgJ2FueScpKSB7CiAgICAgICAgICAgICAgICBvcGVuQXZhaWxhYmlsaXR5RGlhbG9nKEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuQmFzZVN0b3JhZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0U3RvcmFnZShrZXkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBvcHRpb25zQ29udGFpbmVyLmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICAgIH0pOwoKICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOwogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQob3B0aW9uc0NvbnRhaW5lcik7CgogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVByaWNlRGlzcGxheSgpIHsKICAgICAgY29uc3QgdG90YWwgPSBjYWxjdWxhdGVUb3RhbCgpOwoKICAgICAgY29uc3QgdG90YWxQcmljZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdGFsUHJpY2UnKTsKICAgICAgY29uc3QgcHJpY2VCcmVha2Rvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljZUJyZWFrZG93bicpOwogICAgICBjb25zdCBhY2Nlc3NEdXJhdGlvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjY2Vzc0R1cmF0aW9uJyk7CiAgICAgIGNvbnN0IHN0b3JhZ2VOb3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b3JhZ2VOb3RlJyk7CgogICAgICBpZiAoIXRvdGFsUHJpY2VFbCB8fCAhcHJpY2VCcmVha2Rvd25FbCkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbnRhTWFjIFByaWNpbmc6IFByaWNlIGRpc3BsYXkgZWxlbWVudHMgbm90IGZvdW5kJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0b3RhbFByaWNlRWwudGV4dENvbnRlbnQgPSBmb3JtYXRQcmljZSh0b3RhbCk7CiAgICAgIHByaWNlQnJlYWtkb3duRWwudGV4dENvbnRlbnQgPSB0KCdiaWxsZWQuJyArIHNlbGVjdGVkQ3ljbGUpOwogICAgICBpZiAoYWNjZXNzRHVyYXRpb25FbCkgYWNjZXNzRHVyYXRpb25FbC50ZXh0Q29udGVudCA9IHQoJ2FjY2Vzcy4nICsgc2VsZWN0ZWRDeWNsZSk7CgogICAgICAvLyBSZW5ld2FsIHRlcm1zIG5leHQgdG8gdGhlIENUQTogZXZlcnkgcGxhbiBhdXRvLXJlbmV3cyB1bnRpbCBjYW5jZWxsZWQgaW4gdGhlIFVzZXIgUG9ydGFsLgogICAgICBjb25zdCByZW5ld0xpbmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5ld0xpbmUnKTsKICAgICAgaWYgKHJlbmV3TGluZUVsKSB7CiAgICAgICAgcmVuZXdMaW5lRWwudGV4dENvbnRlbnQgPSB0KCdyZW5ld0xpbmUnLCB7IHJlbmV3czogdCgncmVuZXdzLicgKyBzZWxlY3RlZEN5Y2xlKSB9KTsKICAgICAgfQoKICAgICAgLy8gU3RvcmFnZSBub3RlCiAgICAgIGlmIChzdG9yYWdlTm90ZSkgewogICAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2UgIT09ICdiYXNlJykgewogICAgICAgICAgY29uc3Qgc3RvcmFnZVByaWNlID0gZ2V0U3RvcmFnZVByaWNlKHNlbGVjdGVkU3RvcmFnZSwgc2VsZWN0ZWRDeWNsZSk7CiAgICAgICAgICBzdG9yYWdlTm90ZS50ZXh0Q29udGVudCA9IHQoJ3N0b3JhZ2Uubm90ZScsIHsgbGFiZWw6IHQoJ3N0b3JhZ2UuJyArIHNlbGVjdGVkU3RvcmFnZSksIHByaWNlOiBmb3JtYXRQcmljZShzdG9yYWdlUHJpY2UpIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdG9yYWdlTm90ZS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdEN5Y2xlKGN5Y2xlS2V5KSB7CiAgICAgIHNlbGVjdGVkQ3ljbGUgPSBjeWNsZUtleTsKICAgICAgcmVxdWVzdGVkQ29uZmlnID0gbnVsbDsKCiAgICAgIC8vIFJlc2V0IHN0b3JhZ2UgdG8gYmFzZSBpZiBuZXcgY3ljbGUgZG9lc24ndCBzdXBwb3J0IHN0b3JhZ2UKICAgICAgaWYgKCFQUklDSU5HX0NPTkZJRy5jeWNsZXNbY3ljbGVLZXldLmhhc1N0b3JhZ2UpIHsKICAgICAgICBzZWxlY3RlZFN0b3JhZ2UgPSAnYmFzZSc7CiAgICAgIH0KCiAgICAgIC8vIFNob3cgU0lQIGN1c3RvbWl6YXRpb24gZmVhdHVyZSBvbmx5IGZvciA2LW1vbnRoIHBsYW5zCiAgICAgIGNvbnN0IHNpcEZlYXR1cmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lwRmVhdHVyZScpOwogICAgICBpZiAoc2lwRmVhdHVyZSkgewogICAgICAgIHNpcEZlYXR1cmUuc3R5bGUuZGlzcGxheSA9IGN5Y2xlS2V5ID09PSAnNm1vbnRoJyA\/ICcnIDogJ25vbmUnOwogICAgICB9CgogICAgICByZW5kZXJDeWNsZVRhYnMoKTsKICAgICAgcmVuZGVyTW9kZWxUaWxlUHJpY2VzKCk7CiAgICAgIHJlbmRlclN0b3JhZ2VPcHRpb25zKCk7CiAgICAgIHVwZGF0ZVByaWNlRGlzcGxheSgpOwogICAgICB1cGRhdGVDdGFCdXR0b25TdGF0ZSgpOwogICAgICByZW5kZXJBdmFpbGFiaWxpdHlOb3RpY2VzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0U3RvcmFnZShzdG9yYWdlS2V5KSB7CiAgICAgIGlmICghUFJJQ0lOR19DT05GSUcuY3ljbGVzW3NlbGVjdGVkQ3ljbGVdLmhhc1N0b3JhZ2UpIHJldHVybjsKCiAgICAgIC8vIFByZXZlbnQgc2VsZWN0aW5nIHVuYXZhaWxhYmxlIHN0b3JhZ2Ugb3B0aW9ucyAobm8gZGV2aWNlcyB3aXRoIHRoYXQgZHJpdmUgYXZhaWxhYmxlKQogICAgICBpZiAoc3RvcmFnZUtleSA9PT0gJ2FkZG9uMjU2JyAmJiBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDApIHJldHVybjsKICAgICAgaWYgKHN0b3JhZ2VLZXkgPT09ICdhZGRvbjUxMicgJiYgYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID09PSAwKSByZXR1cm47CgogICAgICBzZWxlY3RlZFN0b3JhZ2UgPSBzdG9yYWdlS2V5OwogICAgICByZXF1ZXN0ZWRDb25maWcgPSBudWxsOwogICAgICByZW5kZXJTdG9yYWdlT3B0aW9ucygpOwogICAgICB1cGRhdGVQcmljZURpc3BsYXkoKTsKICAgICAgdXBkYXRlQ3RhQnV0dG9uU3RhdGUoKTsKICAgICAgcmVuZGVyQXZhaWxhYmlsaXR5Tm90aWNlcygpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNoZWNrb3V0KCkgewogICAgICAvLyBBIE1hYyB0aGUgYmFja2VuZCBkb2VzIG5vdCBzZWxsIHlldCBuZXZlciByZWFjaGVzIGNoZWNrb3V0LgogICAgICBpZiAoIW1vZGVsT25TYWxlKHNlbGVjdGVkTW9kZWwpKSB7CiAgICAgICAgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkJhc2VTdG9yYWdlLCBzZWxlY3RlZE1vZGVsKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2VTb2xkT3V0KCkpIHsKICAgICAgICAvLyBPbmx5IHRoZSBNYWMgaGFzIGEgd2FpdGxpc3Q7IGEgc29sZC1vdXQgZHJpdmUgY2FuJ3Qgc3RheSBzZWxlY3RlZCAocmVuZGVyU3RvcmFnZU9wdGlvbnMpLgogICAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdiYXNlJykgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkJhc2VTdG9yYWdlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChzZWxlY3RlZERhaWx5U29sZE91dCgpKSB7CiAgICAgICAgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IGN5Y2xlID0gc2VsZWN0ZWRDeWNsZTsKICAgICAgY29uc3Qgc3RvcmFnZSA9IHNlbGVjdGVkU3RvcmFnZTsKCiAgICAgIC8vIEVuc3VyZSBBRFQgcGF5bG9hZCBleGlzdHMKICAgICAgY29uc3QgYWR0UGF5bG9hZCA9IGF3YWl0IGVuc3VyZUFkdFBheWxvYWQoKTsKICAgICAgY29uc3QgY2xpZW50UmVmZXJlbmNlSWQgPSBhZHRQYXlsb2FkPy5DbGllbnRSZWZlcmVuY2VJZCA\/PyBnZW5lcmF0ZUd1aWQoKTsKCiAgICAgIC8vIENoZWNrb3V0IGFsd2F5cyBnb2VzIHRvIHRoZSBTRUxFQ1RFRCBkYXRhY2VudGVyLCB3aGF0ZXZlciB0aGUgc3RvcmFnZSBvcHRpb246IHRoZSB2aXNpdG9yCiAgICAgIC8vIGlzIG5ldmVyIHNpbGVudGx5IHByb3Zpc2lvbmVkIGluIGEgZGlmZmVyZW50IHJlZ2lvbiBmcm9tIHRoZSB0YWIgdGhleSBwaWNrZWQuCiAgICAgIGNvbnN0IGJhY2tlbmRLZXkgPSBMT0NBVElPTlNbc2VsZWN0ZWRMb2NhdGlvbl0\/LmJhY2tlbmRLZXk7CiAgICAgIGlmIChiYWNrZW5kS2V5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzZXRDaGVja291dEVycm9yKHQoJ2NoZWNrb3V0Lm5vTG9jYXRpb24nKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBzZXRDaGVja291dEVycm9yKG51bGwpOwogICAgICBzZXRDaGVja291dEJ1c3kodHJ1ZSk7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlQ2hlY2tvdXRTZXNzaW9uKGN5Y2xlLCBiYWNrZW5kS2V5LCBzdG9yYWdlLCBjbGllbnRSZWZlcmVuY2VJZCk7CgogICAgICAgIGlmIChyZXN1bHQudXJsKSB7CiAgICAgICAgICB0cmFja0FkQ29udmVyc2lvbihjbGllbnRSZWZlcmVuY2VJZCwgY3ljbGUpOwogICAgICAgICAgLy8gUG9wdXAgYmxvY2tlcnMgcmVqZWN0IHdpbmRvdy5vcGVuIGFmdGVyIGFuIGF3YWl0LCBzbyBmYWxsIGJhY2sgdG8gdGhpcyB0YWIuCiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3BlbihyZXN1bHQudXJsLCAnX2JsYW5rJyk7CiAgICAgICAgICBpZiAoIW5ld1dpbmRvdykgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3VsdC51cmw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgYmFja2VuZCBub3cgb3ducyB0aGUgYXV0aG9yaXRhdGl2ZSBzdG9jayBjaGVjaywgc28gaXQgY2FuIHJlZnVzZSBhZnRlciB0aGUgY2FjaGVkCiAgICAgICAgLy8gYXZhaWxhYmlsaXR5IHNhaWQgeWVzLiBGb3IgdGhlIE1hYywgb2ZmZXIgdGhlIHdhaXRsaXN0IHJhdGhlciB0aGFuIGFuIGVycm9yOyBmb3IgYW4gZXh0ZXJuYWwKICAgICAgICAvLyBkcml2ZSAobm8gd2FpdGxpc3QpIHNheSBzbyBhbmQgcmVmcmVzaCB0aGUgc3RvY2ssIHNvIHRoZSB0aWxlcyBhbmQgYWx0ZXJuYXRpdmVzIGNhdGNoIHVwLgogICAgICAgIGlmIChyZXN1bHQub3V0T2ZTdG9jaykgewogICAgICAgICAgaWYgKHN0b3JhZ2UgPT09ICdiYXNlJykgewogICAgICAgICAgICBvcGVuQXZhaWxhYmlsaXR5RGlhbG9nKEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuQmFzZVN0b3JhZ2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0Q2hlY2tvdXRFcnJvcihyZXN1bHQuZXJyb3IpOwogICAgICAgICAgICBmZXRjaEF2YWlsYWJpbGl0eVN0YXR1cygpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc2V0Q2hlY2tvdXRFcnJvcihyZXN1bHQuZXJyb3IpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHNldENoZWNrb3V0QnVzeShmYWxzZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJQU5BIHpvbmU7IHdpdGggdGhlIElQIGNvdW50cnkgaXQgZGVjaWRlcyB3aGljaCBTdHJpcGUgZW50aXR5IGludm9pY2VzIHRoZSBidXllciAoVVMgZW50aXR5IG9ubHkgd2hlbiBib3RoIHNheSBVUykuCiAgICBmdW5jdGlvbiBicm93c2VyVGltZVpvbmUoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCBudWxsOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVDaGVja291dFNlc3Npb24oY3ljbGUsIGRhdGFjZW50ZXIsIHN0b3JhZ2UsIGNsaWVudFJlZmVyZW5jZUlkKSB7CiAgICAgIGNvbnN0IGdlbmVyaWNFcnJvciA9IHQoJ2NoZWNrb3V0LmZhaWxlZCcpOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goRU5EUE9JTlRfQ0hFQ0tPVVRfU0VTU0lPTiwgewogICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uVHlwZTogQ1lDTEVfVE9fU1VCU0NSSVBUSU9OX1RZUEVbY3ljbGVdLAogICAgICAgICAgICBkYXRhY2VudGVyOiBkYXRhY2VudGVyLAogICAgICAgICAgICBleHRlcm5hbERyaXZlOiBTVE9SQUdFX1RPX0RSSVZFX09QVElPTltzdG9yYWdlXSwKICAgICAgICAgICAgY2xpZW50UmVmZXJlbmNlSWQ6IGNsaWVudFJlZmVyZW5jZUlkLAogICAgICAgICAgICB0aW1lWm9uZTogYnJvd3NlclRpbWVab25lKCksCiAgICAgICAgICAgIC4uLm1vZGVsRmllbGQoc2VsZWN0ZWRNb2RlbCkKICAgICAgICAgIH0pCiAgICAgICAgfSk7CgogICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQyOSkgewogICAgICAgICAgcmV0dXJuIHsgdXJsOiBudWxsLCBlcnJvcjogdCgnY2hlY2tvdXQudG9vTWFueScpLCBvdXRPZlN0b2NrOiBmYWxzZSB9OwogICAgICAgIH0KCiAgICAgICAgLy8gQXJkYWxpcyByZXR1cm5zIGEgbm9uLTJ4eCBzdGF0dXMgYnV0IHN0aWxsIHNlbmRzIHRoZSBSZXN1bHQgYm9keTsgNTAzIG1lYW5zIHNvbGQgb3V0LgogICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbCk7CiAgICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHBheWxvYWQ\/LmlzU3VjY2VzcyAmJiBwYXlsb2FkPy52YWx1ZT8udXJsKSB7CiAgICAgICAgICByZXR1cm4geyB1cmw6IHBheWxvYWQudmFsdWUudXJsLCBlcnJvcjogbnVsbCwgb3V0T2ZTdG9jazogZmFsc2UgfTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgICBlcnJvcjogcGF5bG9hZD8uZXJyb3JzPy5bMF0gPz8gZ2VuZXJpY0Vycm9yLAogICAgICAgICAgb3V0T2ZTdG9jazogcmVzcG9uc2Uuc3RhdHVzID09PSA1MDMKICAgICAgICB9OwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGNoZWNrb3V0IHNlc3Npb246JywgZXJyb3IpOwogICAgICAgIHJldHVybiB7IHVybDogbnVsbCwgZXJyb3I6IGdlbmVyaWNFcnJvciwgb3V0T2ZTdG9jazogZmFsc2UgfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldENoZWNrb3V0RXJyb3IobWVzc2FnZSkgewogICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVja291dEVycm9yJyk7CiAgICAgIGlmICghZWwpIHJldHVybjsKICAgICAgZWwudGV4dENvbnRlbnQgPSBtZXNzYWdlIHx8ICcnOwogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gbWVzc2FnZSA\/ICdibG9jaycgOiAnbm9uZSc7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q2hlY2tvdXRCdXN5KGlzQnVzeSkgewogICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3RhQnV0dG9uJyk7CiAgICAgIGlmICghYnV0dG9uKSByZXR1cm47CiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGlzQnVzeTsKICAgICAgaWYgKGlzQnVzeSkgewogICAgICAgIGJ1dHRvbi5kYXRhc2V0LnByZXZpb3VzTGFiZWwgPSBidXR0b24udGV4dENvbnRlbnQ7CiAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gdCgnY3RhLnN0YXJ0aW5nJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChidXR0b24uZGF0YXNldC5wcmV2aW91c0xhYmVsKSB7CiAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gYnV0dG9uLmRhdGFzZXQucHJldmlvdXNMYWJlbDsKICAgICAgICBkZWxldGUgYnV0dG9uLmRhdGFzZXQucHJldmlvdXNMYWJlbDsKICAgICAgfQogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBUT09MVElQUyAoc3BlYyBiYWRnZXMgYW5kIEluY2x1ZGVkIGxpc3QpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIEtlZXBzIGFuIG9wZW4gdG9vbHRpcCBpbnNpZGUgdGhlIHZpZXdwb3J0OiBzaGlmdHMgaXQgc2lkZXdheXMsIGZsaXBzIGl0IGJlbG93IG5lYXIgdGhlIHRvcC4KICAgIGZ1bmN0aW9uIHBsYWNlVGlwKG93bmVyKSB7CiAgICAgIGNvbnN0IHRpcCA9IG93bmVyLnF1ZXJ5U2VsZWN0b3IoJy50b29sdGlwJyk7CiAgICAgIGlmICghdGlwKSByZXR1cm47CiAgICAgIHRpcC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXAtc2hpZnQnLCAnMHB4Jyk7CiAgICAgIG93bmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3RpcC1iZWxvdycpOwogICAgICBjb25zdCByID0gdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBpZiAoIXIud2lkdGgpIHJldHVybjsKICAgICAgY29uc3QgdncgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgIGNvbnN0IHNoaWZ0ID0gci5sZWZ0IDwgOCA\/IDggLSByLmxlZnQgOiByLnJpZ2h0ID4gdncgLSA4ID8gdncgLSA4IC0gci5yaWdodCA6IDA7CiAgICAgIHRpcC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXAtc2hpZnQnLCBNYXRoLnJvdW5kKHNoaWZ0KSArICdweCcpOwogICAgICBpZiAoci50b3AgPCA4KSBvd25lci5jbGFzc0xpc3QuYWRkKCd0aXAtYmVsb3cnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVRpcHMoZXhjZXB0KSB7CiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZW50YW1hYy1wcmljaW5nIC50aXAtb3duZXIudGlwLW9wZW4nKS5mb3JFYWNoKG8gPT4gewogICAgICAgIGlmIChvICE9PSBleGNlcHQpIG8uY2xhc3NMaXN0LnJlbW92ZSgndGlwLW9wZW4nKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdFRvb2x0aXBzKCkgewogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVudGFtYWMtcHJpY2luZyAudGlwLW93bmVyJykuZm9yRWFjaChvd25lciA9PiB7CiAgICAgICAgY29uc3QgcGxhY2UgPSAoKSA9PiB7IHBsYWNlVGlwKG93bmVyKTsgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHBsYWNlVGlwKG93bmVyKSk7IH07CiAgICAgICAgb3duZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBsYWNlKTsKICAgICAgICBvd25lci5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgcGxhY2UpOwogICAgICAgIC8vIFRvdWNoIGhhcyBubyBob3ZlcjogYSB0YXAgdG9nZ2xlcyB0aGUgdG9vbHRpcAogICAgICAgIG93bmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgY2xvc2VUaXBzKG93bmVyKTsKICAgICAgICAgIG93bmVyLmNsYXNzTGlzdC50b2dnbGUoJ3RpcC1vcGVuJyk7CiAgICAgICAgICBwbGFjZVRpcChvd25lcik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHsKICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5jbG9zZXN0IHx8ICFldmVudC50YXJnZXQuY2xvc2VzdCgnLnJlbnRhbWFjLXByaWNpbmcgLnRpcC1vd25lcicpKSBjbG9zZVRpcHMobnVsbCk7CiAgICAgIH0pOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQgPT4gewogICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZVRpcHMobnVsbCk7CiAgICAgIH0pOwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlbnRhbWFjLXByaWNpbmcgLnRpcC1vd25lci50aXAtb3BlbicpLmZvckVhY2gocGxhY2VUaXApKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJJQ0UgQ0hBTkdFIE5PVElDRQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1PQklMRSBDVEEgQkFSCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIEluIHRoZSBvbmUtY29sdW1uIGxheW91dCB0aGUgcmVhbCBCdXkgUGxhbiBzaXRzIGJlbG93IGV2ZXJ5IGNob2ljZSwgc28gYSBiYXIgd2l0aCB0aGUgY2hvaWNlcywKICAgIC8vIHRoZSB0b3RhbCBhbmQgdGhlIGJ1dHRvbiBzdGF5cyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gd2hpbGUgdGhlIHJlYWwgb25lIGlzIG9mZiBzY3JlZW4uCiAgICAvLyBJdCBvbmx5IG1pcnJvcnMgd2hhdCB0aGUgY2FyZCBzaG93cyAoc2VsZWN0ZWQgdGlsZXMsICN0b3RhbFByaWNlLCAjY3RhQnV0dG9uKSBhbmQgYSB0YXAgY2xpY2tzCiAgICAvLyAjY3RhQnV0dG9uLCBzbyBjaGVja291dCBhbmQgd2FpdGxpc3Qga2VlcCB0aGVpciBzaW5nbGUgY29kZSBwYXRoLgogICAgZnVuY3Rpb24gaW5pdE1vYmlsZUN0YUJhcigpIHsKICAgICAgY29uc3QgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vYmlsZUN0YUJhcicpOwogICAgICBjb25zdCBtYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N0YUJ1dHRvbicpOwogICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJlbnRhbWFjLXByaWNpbmcgLnByaWNpbmctY2FyZCcpOwogICAgICBpZiAoIWJhciB8fCAhbWFpbiB8fCAhY2FyZCkgcmV0dXJuOwoKICAgICAgY29uc3QgYnV0dG9uID0gYmFyLnF1ZXJ5U2VsZWN0b3IoJy5tY2ItYnRuJyk7CiAgICAgIGNvbnN0IHRpbGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJlbnRhbWFjLXByaWNpbmcgLm1vZGVsLXRpbGVzJyk7CiAgICAgIGNvbnN0IG9uZUNvbHVtbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiAxMDYwcHgpJyk7CiAgICAgIGNvbnN0IGluVmlldyA9IHsgY3RhOiBmYWxzZSwgZW50ZXJwcmlzZTogZmFsc2UsIGZvb3RlcjogZmFsc2UgfTsKICAgICAgY29uc3QgdGV4dCA9IHNlbCA9PiB7CiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCk7CiAgICAgICAgcmV0dXJuIGVsID8gZWwudGV4dENvbnRlbnQucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpIDogJyc7CiAgICAgIH07CgogICAgICBmdW5jdGlvbiBzeW5jKCkgewogICAgICAgIGJhci5xdWVyeVNlbGVjdG9yKCcubWNiLXN1bW1hcnknKS50ZXh0Q29udGVudCA9IFsKICAgICAgICAgIHRleHQoJy5yZW50YW1hYy1wcmljaW5nIC5tb2RlbC10aWxlLmFjdGl2ZSAubXQtbmFtZScpLAogICAgICAgICAgdGV4dCgnI2xvY2F0aW9uVGFicyAuY3ljbGUtdGFiLmFjdGl2ZSAuY3ljbGUtbmFtZScpLAogICAgICAgICAgdGV4dCgnI2N5Y2xlVGFicyAuY3ljbGUtdGFiLmFjdGl2ZSAuY3ljbGUtbmFtZScpLAogICAgICAgICAgdGV4dCgnI3N0b3JhZ2VPcHRpb25zIC5zdG9yYWdlLW9wdGlvbi5hY3RpdmUgLnN0b3JhZ2Utc2l6ZScpCiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpOwogICAgICAgIGJhci5xdWVyeVNlbGVjdG9yKCcubWNiLWxhYmVsJykudGV4dENvbnRlbnQgPSBtYWluLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICBiYXIucXVlcnlTZWxlY3RvcignLm1jYi1idG4tcHJpY2UnKS50ZXh0Q29udGVudCA9IHRleHQoJyN0b3RhbFByaWNlJyk7CiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gbWFpbi5kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLy8gU2hvd24gd2hpbGUgbmVpdGhlciB0aGUgcmVhbCBidXR0b24sIHRoZSBFbnRlcnByaXNlIGJsb2NrIG5vciB0aGUgZm9vdGVyIGlzIG9uIHNjcmVlbgogICAgICBmdW5jdGlvbiBwbGFjZSgpIHsKICAgICAgICBjb25zdCBvbiA9IG9uZUNvbHVtbi5tYXRjaGVzICYmICFpblZpZXcuY3RhICYmICFpblZpZXcuZW50ZXJwcmlzZSAmJiAhaW5WaWV3LmZvb3RlcjsKICAgICAgICBiYXIuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtb24nLCBvbik7CiAgICAgICAgYmFyLmluZXJ0ID0gIW9uOwogICAgICAgIGlmIChvbikgewogICAgICAgICAgaWYgKHRpbGVzICYmIHRpbGVzLm9mZnNldFdpZHRoKSBiYXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tcnAtbWNiLXcnLCB0aWxlcy5vZmZzZXRXaWR0aCArICdweCcpOwogICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLXJwLW1jYi1oJywgYmFyLm9mZnNldEhlaWdodCArICdweCcpOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgncnAtbWNiLWxpZnQnLCBvbik7CiAgICAgIH0KCiAgICAgIGNvbnN0IHdhdGNoID0gKGVsLCBrZXkpID0+IHsKICAgICAgICBpZiAoIWVsIHx8ICEoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpKSByZXR1cm47CiAgICAgICAgbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gewogICAgICAgICAgaW5WaWV3W2tleV0gPSBlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaXNJbnRlcnNlY3Rpbmc7CiAgICAgICAgICBwbGFjZSgpOwogICAgICAgIH0pLm9ic2VydmUoZWwpOwogICAgICB9OwogICAgICB3YXRjaChtYWluLCAnY3RhJyk7CiAgICAgIHdhdGNoKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZW50YW1hYy1wcmljaW5nIC5lbnRlcnByaXNlLXNlY3Rpb24nKSwgJ2VudGVycHJpc2UnKTsKICAgICAgd2F0Y2goZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhbS1mb290ZXInKSwgJ2Zvb3RlcicpOwoKICAgICAgLy8gVGlsZXMsIHByaWNlcyBhbmQgdGhlIGJ1dHRvbiBsYWJlbCBhcmUgcmUtcmVuZGVyZWQgYnkgdGhlIGNvZGUgYWJvdmU7IGZvbGxvdyB0aGVtLgogICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihzeW5jKS5vYnNlcnZlKGNhcmQsIHsgc3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnLCAnZGlzYWJsZWQnXSB9KTsKCiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1haW4uY2xpY2soKSk7CgogICAgICAvLyBBIGNoZWNrb3V0IGVycm9yIGlzIHdyaXR0ZW4gdW5kZXIgdGhlIHJlYWwgYnV0dG9uOyBicmluZyBpdCBpbnRvIHZpZXcuCiAgICAgIGNvbnN0IGVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrb3V0RXJyb3InKTsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgaWYgKGVycm9yLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBlcnJvci50ZXh0Q29udGVudC50cmltKCkpIGVycm9yLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7CiAgICAgICAgfSkub2JzZXJ2ZShlcnJvciwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICAgIH0KCiAgICAgIGlmIChvbmVDb2x1bW4uYWRkRXZlbnRMaXN0ZW5lcikgb25lQ29sdW1uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHBsYWNlKTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHBsYWNlKTsKICAgICAgc3luYygpOwogICAgICBwbGFjZSgpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJTklUSUFMSVpBVElPTgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBpbml0UmVudGFtYWNQcmljaW5nKCkgewogICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkIHRvIHByZXZlbnQgZG91YmxlIGluaXQKICAgICAgaWYgKHdpbmRvdy5yZW50YW1hY1ByaWNpbmdJbml0aWFsaXplZCkgcmV0dXJuOwogICAgICB3aW5kb3cucmVudGFtYWNQcmljaW5nSW5pdGlhbGl6ZWQgPSB0cnVlOwoKICAgICAgLy8gSW5pdGlhbGl6ZSBET00gZWxlbWVudCByZWZlcmVuY2VzCiAgICAgIGF2YWlsYWJpbGl0eURpYWxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlEaWFsb2ciKTsKICAgICAgYXZhaWxhYmlsaXR5T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlPdmVybGF5Iik7CiAgICAgIGF2YWlsYWJpbGl0eURpYWxvZ0Nsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF2YWlsYWJpbGl0eURpYWxvZ0Nsb3NlIik7CiAgICAgIGF2YWlsYWJpbGl0eUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXZhaWxhYmlsaXR5Rm9ybSIpOwogICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlGZWVkYmFjayIpOwogICAgICBhdmFpbGFiaWxpdHlFbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlFbWFpbCIpOwoKICAgICAgcXVhbnRpdHlTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVhbnRpdHlTbGlkZXIiKTsKICAgICAgZHVyYXRpb25TbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZHVyYXRpb25TbGlkZXIiKTsKICAgICAgcXVhbnRpdHlWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWFudGl0eVZhbHVlIik7CiAgICAgIGR1cmF0aW9uVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZHVyYXRpb25WYWx1ZSIpOwogICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVhbnRpdHlEaXNjb3VudEJhZGdlIik7CiAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkdXJhdGlvbkRpc2NvdW50QmFkZ2UiKTsKICAgICAgZW50ZXJwcmlzZVByaWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVudGVycHJpc2VQcmljZSIpOwogICAgICBkaXNjb3VudEJhZGdlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGlzY291bnRCYWRnZSIpOwogICAgICBwcmljZUJyZWFrZG93bkVudGVycHJpc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpY2VCcmVha2Rvd25FbnRlcnByaXNlIik7CiAgICAgIG5vbkN1bXVsYXRpdmVOb3RpY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9uQ3VtdWxhdGl2ZU5vdGljZSIpOwoKICAgICAgdHJhbnNsYXRlU3RhdGljVGV4dCgpOwoKCiAgICAgIC8vIFJlbmRlciBVSQogICAgICAvLyBBbGwgdGhyZWUgc2tlbGV0b25zIGFyZSBiYWtlZCBpbnRvIHRoZSBtYXJrdXAgYWxyZWFkeTsgcmUtcmVuZGVyIHRoZW0gdG9nZXRoZXIgc28gdGhlaXIKICAgICAgLy8gc2hpbW1lciBzdGF5cyBpbiBwaGFzZSAoYW5kIHRvIGNvdmVyIGEgcmUtaW5pdCBvbiBhIHBhZ2UgdGhhdCBhbHJlYWR5IHBhaW50ZWQgcmVhbCBjYXJkcykuCiAgICAgIC8vIFRoZSBwaWNrZXIgd2FpdHMgb24gdGhlIGdlbyBsb29rdXAgKHNldHRsZUxvY2F0aW9uUGlja2VyKSwgbm90IG9uIGF2YWlsYWJpbGl0eTsgdGhlIHJlYWwKICAgICAgLy8gY3ljbGUgdGFicyBhbmQgc3RvcmFnZSBvcHRpb25zIGFyZSByZW5kZXJlZCBieSBhcHBseUF2YWlsYWJpbGl0eUZvclNlbGVjdGVkTG9jYXRpb24oKSwKICAgICAgLy8gY2FsbGVkIHdoZW4gZmV0Y2hBdmFpbGFiaWxpdHlTdGF0dXMoKSByZXNvbHZlcyAob3IgdGhlIHNhZmV0eSB0aW1lb3V0IGJlbG93IGZpcmVzKS4KICAgICAgcmVuZGVyTG9jYXRpb25UYWJzU2tlbGV0b24oKTsKICAgICAgcmVuZGVyQ3ljbGVUYWJzU2tlbGV0b24oKTsKICAgICAgcmVuZGVyU3RvcmFnZU9wdGlvbnNTa2VsZXRvbigpOwogICAgICB1cGRhdGVQcmljZURpc3BsYXkoKTsKCiAgICAgIC8vIEdlbyBwcmUtc2VsZWN0aW9uIChjbGllbnQtc2lkZSk6IGRldGVjdCB0aGUgdmlzaXRvcidzIG5lYXJlc3QgZGF0YWNlbnRlciBmcm9tIHRoZWlyIElQIGFuZAogICAgICAvLyBwcmUtc2VsZWN0IGl0IGluIHRoZSBwaWNrZXIuIFJlc29sdmVzIG9uY2UgYXN5bmNocm9ub3VzbHk7IHRoZSB2aXNpdG9yIGNhbiBvdmVycmlkZSBpdC4KICAgICAgcmVzb2x2ZUdlb1ByZWZlcnJlZExvY2F0aW9uKCk7CgogICAgICAvLyBQYWludCB0aGUgcGlja2VyIGV2ZW4gaWYgaXBhcGkuY28gaXMgc3RpbGwgaW4gZmxpZ2h0IOKAlCBhIHRoaXJkIHBhcnR5IG11c3Qgbm90IGhvbGQgdGhlCiAgICAgIC8vIHNrZWxldG9uIHVwIG9uY2Ugb3VyIG93biBhdmFpbGFiaWxpdHkgZGF0YSBoYXMgYXJyaXZlZC4KICAgICAgc2V0VGltZW91dChzZXR0bGVMb2NhdGlvblBpY2tlciwgR0VPX1BJQ0tFUl9ERUFETElORV9NUyk7CgogICAgICAvLyBDVEEgYnV0dG9uCiAgICAgIGNvbnN0IGN0YUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdGFCdXR0b24nKTsKICAgICAgaWYgKGN0YUJ1dHRvbikgY3RhQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2hlY2tvdXQpOwoKICAgICAgLy8gQXZhaWxhYmlsaXR5IGRpYWxvZyBldmVudHMKICAgICAgYXZhaWxhYmlsaXR5Rm9ybT8uYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0Iiwgc3VibWl0QXZhaWxhYmlsaXR5Rm9ybSk7CiAgICAgIGF2YWlsYWJpbGl0eUVtYWlsPy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsKICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay50ZXh0Q29udGVudCA9IHQoJ3dhaXRsaXN0LmhpbnQnKTsKICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIGluZm8iOwogICAgICB9KTsKICAgICAgYXZhaWxhYmlsaXR5RGlhbG9nQ2xvc2U\/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY2xvc2VBdmFpbGFiaWxpdHlEaWFsb2cpOwogICAgICBhdmFpbGFiaWxpdHlPdmVybGF5Py5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChldmVudCkgPT4gewogICAgICAgIGlmIChldmVudC5rZXkgPT09ICJFc2NhcGUiICYmIGF2YWlsYWJpbGl0eURpYWxvZyAmJiAhYXZhaWxhYmlsaXR5RGlhbG9nLmNsYXNzTGlzdC5jb250YWlucygiaXMtaGlkZGVuIikpIHsKICAgICAgICAgIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIEZldGNoIGF2YWlsYWJpbGl0eSBzdGF0dXMKICAgICAgZmV0Y2hBdmFpbGFiaWxpdHlTdGF0dXMoKTsKCiAgICAgIC8vIFNhZmV0eSBuZXQ6IGlmIHRoZSBzdGF0dXMgcmVxdWVzdCBoYW5ncyBhbmQgbmV2ZXIgcmVzb2x2ZXMvcmVqZWN0cywgc3dhcCB0aGUgc2tlbGV0b25zIGZvcgogICAgICAvLyByZWFsIGNhcmRzICh3aXRoIG9wdGltaXN0aWMgZGVmYXVsdHMpIHNvIHRoZSBwYWdlIG5ldmVyIHN0YXlzIGxvYWRpbmcuIE5vLW9wIG9uY2UgdGhlCiAgICAgIC8vIHN0YXR1cyBwYXRoIGhhcyBhbHJlYWR5IHNldHRsZWQuCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGlmIChhdmFpbGFiaWxpdHlTdGF0dXNTZXR0bGVkKSByZXR1cm47CiAgICAgICAgYXZhaWxhYmlsaXR5U3RhdHVzU2V0dGxlZCA9IHRydWU7CiAgICAgICAgYXBwbHlBdmFpbGFiaWxpdHlGb3JTZWxlY3RlZExvY2F0aW9uKCk7CiAgICAgIH0sIDcwMDApOwoKICAgICAgLy8gRW5zdXJlIEFEVCBwYXlsb2FkIGV4aXN0cyBvbiBwYWdlIGxvYWQKICAgICAgZW5zdXJlQWR0UGF5bG9hZCgpOwoKICAgICAgLy8gUHVyY2hhc2UgZHJvcGRvd24gdG9nZ2xlCiAgICAgIGNvbnN0IHB1cmNoYXNlRHJvcGRvd25UcmlnZ2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1cmNoYXNlRHJvcGRvd25UcmlnZ2VyJyk7CiAgICAgIGNvbnN0IHB1cmNoYXNlRHJvcGRvd25Db250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1cmNoYXNlRHJvcGRvd25Db250ZW50Jyk7CgogICAgICBwdXJjaGFzZURyb3Bkb3duVHJpZ2dlcj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHB1cmNoYXNlRHJvcGRvd25UcmlnZ2VyLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7CiAgICAgICAgcHVyY2hhc2VEcm9wZG93blRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgIWlzRXhwYW5kZWQpOwogICAgICAgIHB1cmNoYXNlRHJvcGRvd25Db250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBpc0V4cGFuZGVkKTsKICAgICAgICBwdXJjaGFzZURyb3Bkb3duQ29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdleHBhbmRlZCcpOwogICAgICB9KTsKCiAgICAgIC8vIEVudGVycHJpc2Ugc2xpZGVyIGV2ZW50cwogICAgICBxdWFudGl0eVNsaWRlcj8uYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBjYWxjdWxhdGVFbnRlcnByaXNlUHJpY2UpOwogICAgICBkdXJhdGlvblNsaWRlcj8uYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBjYWxjdWxhdGVFbnRlcnByaXNlUHJpY2UpOwoKICAgICAgLy8gSW5pdGlhbCBlbnRlcnByaXNlIGNhbGN1bGF0aW9uCiAgICAgIGlmIChxdWFudGl0eVNsaWRlciAmJiBkdXJhdGlvblNsaWRlcikgewogICAgICAgIGNhbGN1bGF0ZUVudGVycHJpc2VQcmljZSgpOwogICAgICB9CgogICAgICAvLyBNYWMgbW9kZWwgdGlsZXMKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1vZGVsLXRpbGUnKS5mb3JFYWNoKHRpbGUgPT4gewogICAgICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZWxlY3RNb2RlbCh0aWxlLmRhdGFzZXQubW9kZWwpKTsKICAgICAgfSk7CiAgICAgIHJlbmRlck1vZGVsVGlsZXMoKTsKICAgICAgaW5pdFRvb2x0aXBzKCk7CiAgICAgIGluaXRNb2JpbGVDdGFCYXIoKTsKCiAgICAgIC8vIExvYWQgR29vZ2xlIFJldmlld3MKICAgICAgbG9hZEdvb2dsZVJldmlld3MoKTsKICAgIH0KCiAgICAvLyBSdW4gaW5pdDogaWYgRE9NIGFscmVhZHkgbG9hZGVkLCBydW4gaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3YWl0CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0UmVudGFtYWNQcmljaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIERPTSBhbHJlYWR5IGxvYWRlZCAoY29tbW9uIGluIFdvcmRQcmVzcyBlbWJlZHMpCiAgICAgIGluaXRSZW50YW1hY1ByaWNpbmcoKTsKICAgIH0KCiAgICAvLyBFeHBvc2UgbmF2aWdhdGVXaXRoTGFuZ3VhZ2UgdG8gZ2xvYmFsIHNjb3BlIGZvciBvbmNsaWNrIGhhbmRsZXJzCiAgICB3aW5kb3cubmF2aWdhdGVXaXRoTGFuZ3VhZ2UgPSBuYXZpZ2F0ZVdpdGhMYW5ndWFnZTsKICAgIH0pKCk7CiAg\");var a=new Uint8Array(b.length);for(var i=0;i<b.length;i++){a[i]=b.charCodeAt(i);}var u=URL.createObjectURL(new Blob([a],{type:\"text\/javascript;charset=utf-8\"}));var s=document.createElement(\"script\");s.src=u;s.onload=function(){URL.revokeObjectURL(u);};document.head.appendChild(s);}catch(e){console.error(\"rentamac pricing bootstrap failed\",e);}})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Choose Your Plan Mac Mac mini M4 $119\/mo New Mac mini M6 $139\/mo M4 10-core Apple M4 chip with 10-core CPU (4 performance cores + 6 efficiency cores) and 10-core GPU. Delivers exceptional single-threaded and multi-threaded performance for development, builds, and creative workloads. 16 GB RAM 16 GB of unified memory shared between CPU and [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-26","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/pages\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":664,"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/pages\/26\/revisions"}],"predecessor-version":[{"id":5593,"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/pages\/26\/revisions\/5593"}],"wp:attachment":[{"href":"https:\/\/rentamac.io\/pt\/wp-json\/wp\/v2\/media?parent=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}