{"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-07-16T11:54:23","modified_gmt":"2026-07-16T11:54:23","slug":"%d8%a7%d9%84%d8%aa%d8%b3%d8%b9%d9%8a%d8%b1","status":"publish","type":"page","link":"https:\/\/rentamac.io\/ar\/pricing\/","title":{"rendered":"\u0627\u0644\u062a\u0633\u0639\u064a\u0631"},"content":{"rendered":"\r\n<!-- RentaMac Pricing Component for WordPress -->\r\n<!-- Add this to your theme's functions.php or use a plugin to load Inter font:\r\n     wp_enqueue_style('google-fonts-inter', 'https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&display=swap');\r\n-->\r\n<style>\r\n    \/* ============================================\r\n       CONFIGURATION - Easy to modify pricing\r\n       ============================================ *\/\r\n\r\n    .rentamac-pricing {\r\n      \/* Colors *\/\r\n      --bg: #0a0a0f;\r\n      --bg-card: rgba(255, 255, 255, 0.03);\r\n      --bg-card-hover: rgba(255, 255, 255, 0.05);\r\n      --stroke: rgba(255, 255, 255, 0.08);\r\n      --stroke-hover: rgba(255, 255, 255, 0.15);\r\n      --text: #f0f2f5;\r\n      --text-secondary: #8b919e;\r\n      --text-muted: #5c6370;\r\n\r\n      \/* Accent colors *\/\r\n      --accent-blue: #3b82f6;\r\n      --accent-blue-glow: rgba(59, 130, 246, 0.2);\r\n      --accent-purple: #a855f7;\r\n      --accent-green: #22c55e;\r\n      --accent-green-glow: rgba(34, 197, 94, 0.15);\r\n      --accent-orange: #f97316;\r\n\r\n      \/* Gradients *\/\r\n      --gradient-primary: linear-gradient(135deg, #3b82f6, #8b5cf6);\r\n      --gradient-success: linear-gradient(135deg, #22c55e, #10b981);\r\n\r\n      \/* Shadows *\/\r\n      --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);\r\n      --shadow-md: 0 8px 32px rgba(0, 0, 0, 0.4);\r\n      --shadow-lg: 0 16px 64px rgba(0, 0, 0, 0.5);\r\n      --shadow-glow: 0 0 40px var(--accent-blue-glow);\r\n\r\n      \/* Base styles for the component *\/\r\n      font-family: 'Inter', system-ui, -apple-system, sans-serif;\r\n      color: var(--text);\r\n      -webkit-font-smoothing: antialiased;\r\n      line-height: 1.5;\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    .rentamac-pricing *,\r\n    .rentamac-pricing *::before,\r\n    .rentamac-pricing *::after {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    \/* Container *\/\r\n    .rentamac-pricing .container {\r\n      max-width: 720px;\r\n      margin: 0 auto;\r\n      padding: 4px 24px 24px;\r\n    }\r\n\r\n    \/* Header *\/\r\n    .rentamac-pricing .header {\r\n      text-align: center;\r\n      margin-top: 0;\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .header h1 {\r\n      font-size: clamp(32px, 5vw, 48px);\r\n      font-weight: 800;\r\n      letter-spacing: -0.5px;\r\n      margin-top: 0;\r\n      margin-bottom: 10px;\r\n      color: #ffffff; \/* White fallback color for browsers that don't support gradient text *\/\r\n    }\r\n\r\n    @supports (-webkit-background-clip: text) or (background-clip: text) {\r\n      .rentamac-pricing .header h1 {\r\n        background: linear-gradient(135deg, #ffffff 0%, rgba(255, 255, 255, 0.8) 100%);\r\n        -webkit-background-clip: text;\r\n        -webkit-text-fill-color: transparent;\r\n        background-clip: text;\r\n      }\r\n    }\r\n\r\n    \/* Main Card *\/\r\n    .rentamac-pricing .pricing-card {\r\n      background: var(--bg);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 24px;\r\n      padding: 24px 32px 32px;\r\n      box-shadow: var(--shadow-lg);\r\n    }\r\n\r\n    \/* Device Info *\/\r\n    .rentamac-pricing .device-info {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 6px;\r\n      padding-bottom: 10px;\r\n      border-bottom: 1px solid var(--stroke);\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .device-image {\r\n      width: 100px;\r\n      height: 56px;\r\n      object-fit: contain;\r\n      filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.4));\r\n    }\r\n\r\n    .rentamac-pricing .device-details h2 {\r\n      font-size: 22px;\r\n      font-weight: 700;\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .device-specs {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge {\r\n      background: rgba(255, 255, 255, 0.06);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 6px;\r\n      padding: 4px 10px;\r\n      font-size: 12px;\r\n      font-weight: 500;\r\n      color: var(--text-secondary);\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 4px;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge .feature-info {\r\n      width: 14px;\r\n      height: 14px;\r\n      margin-left: 2px;\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge .feature-info svg {\r\n      width: 12px;\r\n      height: 12px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge .feature-info:hover svg {\r\n      color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge .feature-info .tooltip {\r\n      width: 240px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge {\r\n      cursor: help;\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge:hover .feature-info svg {\r\n      color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .spec-badge:hover .feature-info .tooltip {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    \/* Section Titles *\/\r\n    .rentamac-pricing .section-title {\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      color: var(--text-muted);\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.5px;\r\n      margin-bottom: 3px;\r\n    }\r\n\r\n    \/* Cycle Selector *\/\r\n    .rentamac-pricing .cycle-section {\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tabs {\r\n      display: flex;\r\n      gap: 4px;\r\n      flex-wrap: wrap;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab {\r\n      flex: 1;\r\n      min-width: 80px;\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 12px;\r\n      padding: 14px 12px;\r\n      cursor: pointer;\r\n      transition: all 0.2s ease;\r\n      text-align: center;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab:hover {\r\n      background: rgba(255, 255, 255, 0.06);\r\n      border-color: var(--stroke-hover);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.active {\r\n      background: rgba(59, 130, 246, 0.1);\r\n      border-color: var(--accent-blue);\r\n      box-shadow: 0 0 20px var(--accent-blue-glow);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab .cycle-name {\r\n      font-size: 14px;\r\n      font-weight: 600;\r\n      color: var(--text);\r\n      display: block;\r\n      margin-top: 6px;\r\n      margin-bottom: 2px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab .cycle-price {\r\n      font-size: 12px;\r\n      color: var(--text-secondary);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.active .cycle-name {\r\n      color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab .savings-badge {\r\n      display: inline-block;\r\n      background: var(--gradient-success);\r\n      color: #000;\r\n      font-size: 10px;\r\n      font-weight: 700;\r\n      padding: 2px 6px;\r\n      border-radius: 4px;\r\n      margin-top: 6px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab .popular-badge {\r\n      position: absolute;\r\n      top: -8px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: var(--accent-blue);\r\n      color: #fff;\r\n      font-size: 9px;\r\n      font-weight: 700;\r\n      padding: 3px 8px;\r\n      border-radius: 4px;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.5px;\r\n    }\r\n\r\n    \/* Unavailable cycle tab (e.g. daily plan low stock) *\/\r\n    .rentamac-pricing .cycle-tab.unavailable {\r\n      cursor: not-allowed;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.unavailable .cycle-name,\r\n    .rentamac-pricing .cycle-tab.unavailable .cycle-price {\r\n      opacity: 0.4;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.unavailable:hover {\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border-color: var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.unavailable::after {\r\n      content: 'Disabled when availability is low. Join the waitlist to be notified.';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: var(--accent-orange);\r\n      color: #fff;\r\n      padding: 8px 14px;\r\n      border-radius: 8px;\r\n      font-size: 12px;\r\n      font-weight: 600;\r\n      white-space: nowrap;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.unavailable::before {\r\n      content: '';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      border: 6px solid transparent;\r\n      border-top-color: var(--accent-orange);\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      margin-bottom: -2px;\r\n      z-index: 10;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.unavailable:hover::after,\r\n    .rentamac-pricing .cycle-tab.unavailable:hover::before {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    \/* Location Section *\/\r\n    .rentamac-pricing .location-section {\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon {\r\n      cursor: not-allowed;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon .cycle-name,\r\n    .rentamac-pricing .cycle-tab.coming-soon .cycle-price {\r\n      opacity: 0.45;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon:hover {\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border-color: var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon::after {\r\n      content: 'Launching soon in Texas';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: var(--accent-orange);\r\n      color: #fff;\r\n      padding: 8px 14px;\r\n      border-radius: 8px;\r\n      font-size: 12px;\r\n      font-weight: 600;\r\n      white-space: nowrap;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon::before {\r\n      content: '';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      border: 6px solid transparent;\r\n      border-top-color: var(--accent-orange);\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      margin-bottom: -2px;\r\n      z-index: 10;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.coming-soon:hover::after,\r\n    .rentamac-pricing .cycle-tab.coming-soon:hover::before {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    \/* Storage Section *\/\r\n    .rentamac-pricing .storage-section {\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .storage-options {\r\n      display: flex;\r\n      gap: 5px;\r\n      flex-wrap: wrap;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option {\r\n      flex: 1;\r\n      min-width: 140px;\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 12px;\r\n      padding: 16px;\r\n      cursor: pointer;\r\n      transition: all 0.2s ease;\r\n      text-align: center;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option:hover:not(.disabled) {\r\n      background: rgba(255, 255, 255, 0.06);\r\n      border-color: var(--stroke-hover);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.active {\r\n      background: rgba(34, 197, 94, 0.08);\r\n      border-color: var(--accent-green);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.disabled {\r\n      cursor: not-allowed;\r\n    }\r\n    .rentamac-pricing .storage-option.disabled .storage-content {\r\n      opacity: 0.6;\r\n      filter: blur(1.5px);\r\n    }\r\n    .rentamac-pricing .storage-option.disabled:hover .storage-content {\r\n      filter: blur(1px);\r\n    }\r\n    .rentamac-pricing .storage-option.disabled::after {\r\n      content: 'Storage add-ons are only available on weekly or higher plans';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: rgba(0, 0, 0, 0.9);\r\n      color: var(--text);\r\n      padding: 8px 12px;\r\n      border-radius: 8px;\r\n      font-size: 12px;\r\n      font-weight: 500;\r\n      white-space: nowrap;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n      margin-bottom: 8px;\r\n      border: 1px solid var(--stroke);\r\n    }\r\n    .rentamac-pricing .storage-option.disabled::before {\r\n      content: '';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      border: 6px solid transparent;\r\n      border-top-color: rgba(0, 0, 0, 0.9);\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      margin-bottom: 2px;\r\n    }\r\n    .rentamac-pricing .storage-option.disabled:hover::after,\r\n    .rentamac-pricing .storage-option.disabled:hover::before {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable {\r\n      cursor: not-allowed;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable .storage-content {\r\n      opacity: 0.6;\r\n      filter: blur(1.5px);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable:hover .storage-content {\r\n      filter: blur(1px);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable::after {\r\n      content: 'Unavailable due to high demand';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: rgba(0, 0, 0, 0.9);\r\n      color: var(--text);\r\n      padding: 8px 12px;\r\n      border-radius: 8px;\r\n      font-size: 12px;\r\n      font-weight: 500;\r\n      white-space: nowrap;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n      margin-bottom: 8px;\r\n      border: 1px solid var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable::before {\r\n      content: '';\r\n      position: absolute;\r\n      bottom: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      border: 6px solid transparent;\r\n      border-top-color: rgba(0, 0, 0, 0.9);\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      margin-bottom: 2px;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.unavailable:hover::after,\r\n    .rentamac-pricing .storage-option.unavailable:hover::before {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n\r\n    .rentamac-pricing .storage-option .storage-size {\r\n      font-size: 18px;\r\n      font-weight: 700;\r\n      color: var(--text);\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.active .storage-size {\r\n      color: var(--accent-green);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option .storage-label {\r\n      font-size: 12px;\r\n      color: var(--text-secondary);\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option .storage-sublabel {\r\n      font-size: 10px;\r\n      color: var(--text-muted);\r\n      margin-bottom: 6px;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.3px;\r\n    }\r\n\r\n    .rentamac-pricing .storage-option .storage-price {\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option.active .storage-price {\r\n      color: var(--accent-green);\r\n    }\r\n\r\n    .rentamac-pricing .storage-option .default-badge {\r\n      position: absolute;\r\n      top: -8px;\r\n      right: 12px;\r\n      background: var(--accent-blue);\r\n      color: #fff;\r\n      font-size: 9px;\r\n      font-weight: 700;\r\n      padding: 3px 8px;\r\n      border-radius: 4px;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.5px;\r\n    }\r\n\r\n    \/* Features List *\/\r\n    .rentamac-pricing .features-section {\r\n      margin-bottom: 4px;\r\n      padding-top: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .features-grid {\r\n      display: grid;\r\n      grid-template-columns: repeat(2, 1fr);\r\n      gap: 6px;\r\n    }\r\n\r\n    @media (max-width: 500px) {\r\n      .rentamac-pricing .features-grid {\r\n        grid-template-columns: 1fr;\r\n      }\r\n    }\r\n\r\n    .rentamac-pricing .feature-item {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 10px;\r\n      font-size: 14px;\r\n      color: var(--text-secondary);\r\n      cursor: help;\r\n    }\r\n\r\n    .rentamac-pricing .feature-item:hover .feature-info svg {\r\n      color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .feature-item:hover .feature-info .tooltip {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    .rentamac-pricing .feature-icon {\r\n      width: 20px;\r\n      height: 20px;\r\n      border-radius: 6px;\r\n      background: rgba(34, 197, 94, 0.15);\r\n      border: 1px solid rgba(34, 197, 94, 0.3);\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      color: var(--accent-green);\r\n      font-size: 11px;\r\n      flex-shrink: 0;\r\n    }\r\n\r\n    \/* Info icon tooltip styles *\/\r\n    .rentamac-pricing .feature-info {\r\n      position: relative;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      width: 16px;\r\n      height: 16px;\r\n      margin-left: 6px;\r\n      cursor: help;\r\n      flex-shrink: 0;\r\n    }\r\n\r\n    .rentamac-pricing .feature-info svg {\r\n      width: 14px;\r\n      height: 14px;\r\n      color: var(--text-muted);\r\n      transition: color 0.2s ease;\r\n    }\r\n\r\n    .rentamac-pricing .feature-info:hover svg {\r\n      color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .feature-info .tooltip {\r\n      position: absolute;\r\n      bottom: calc(100% + 8px);\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: rgba(15, 15, 20, 0.98);\r\n      border: 1px solid var(--stroke-hover);\r\n      border-radius: 10px;\r\n      padding: 12px 14px;\r\n      width: 260px;\r\n      font-size: 13px;\r\n      line-height: 1.5;\r\n      color: var(--text-secondary);\r\n      text-align: left;\r\n      opacity: 0;\r\n      visibility: hidden;\r\n      transition: all 0.2s ease;\r\n      pointer-events: none;\r\n      z-index: 100;\r\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\r\n    }\r\n\r\n    .rentamac-pricing .feature-info .tooltip::after {\r\n      content: '';\r\n      position: absolute;\r\n      top: 100%;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      border: 6px solid transparent;\r\n      border-top-color: rgba(15, 15, 20, 0.98);\r\n    }\r\n\r\n    .rentamac-pricing .feature-info:hover .tooltip {\r\n      opacity: 1;\r\n      visibility: visible;\r\n    }\r\n\r\n    @media (max-width: 600px) {\r\n      .rentamac-pricing .feature-info .tooltip {\r\n        width: 220px;\r\n        left: auto;\r\n        right: -10px;\r\n        transform: none;\r\n      }\r\n\r\n      .rentamac-pricing .feature-info .tooltip::after {\r\n        left: auto;\r\n        right: 16px;\r\n        transform: none;\r\n      }\r\n    }\r\n\r\n    \/* Price Display *\/\r\n    .rentamac-pricing .price-section {\r\n      text-align: center;\r\n      padding: 10px 0;\r\n      border-bottom: 1px solid var(--stroke);\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .total-label {\r\n      font-size: 13px;\r\n      color: var(--text-muted);\r\n      margin-bottom: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .total-price {\r\n      font-size: 52px;\r\n      font-weight: 800;\r\n      letter-spacing: -2px;\r\n      margin-bottom: 8px;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .price-breakdown {\r\n      font-size: 15px;\r\n      color: var(--text-secondary);\r\n    }\r\n\r\n    .rentamac-pricing .storage-addon-note {\r\n      font-size: 13px;\r\n      color: var(--text-muted);\r\n      margin-top: 8px;\r\n    }\r\n\r\n    \/* CTA Button *\/\r\n    .rentamac-pricing .cta-button {\r\n      width: 100%;\r\n      padding: 18px 24px;\r\n      font-size: 17px;\r\n      font-weight: 700;\r\n      border: none;\r\n      border-radius: 14px;\r\n      cursor: pointer;\r\n      background: var(--accent-blue);\r\n      color: white;\r\n      transition: all 0.2s ease;\r\n      box-shadow: var(--shadow-md), 0 0 30px var(--accent-blue-glow);\r\n    }\r\n\r\n    .rentamac-pricing .cta-button:hover {\r\n      transform: translateY(-2px);\r\n      box-shadow: var(--shadow-lg), 0 0 50px var(--accent-blue-glow);\r\n    }\r\n\r\n    .rentamac-pricing .cta-button:active {\r\n      transform: translateY(0);\r\n    }\r\n\r\n    \/* Help Text *\/\r\n    .rentamac-pricing .help-text {\r\n      text-align: center;\r\n      margin-top: 20px;\r\n      font-size: 14px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .help-text a {\r\n      color: var(--accent-blue);\r\n      text-decoration: none;\r\n    }\r\n\r\n    .rentamac-pricing .help-text a:hover {\r\n      text-decoration: underline;\r\n    }\r\n\r\n    \/* Animations *\/\r\n    @keyframes rentamacFadeIn {\r\n      from { opacity: 0; transform: translateY(10px); }\r\n      to { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    .rentamac-pricing .pricing-card {\r\n      animation: rentamacFadeIn 0.4s ease-out;\r\n    }\r\n\r\n    \/* Responsive *\/\r\n    @media (max-width: 600px) {\r\n      .rentamac-pricing .container {\r\n        padding: 32px 16px;\r\n      }\r\n\r\n      .rentamac-pricing .pricing-card {\r\n        padding: 24px 20px;\r\n      }\r\n\r\n      .rentamac-pricing .device-info {\r\n        flex-direction: column;\r\n        text-align: center;\r\n      }\r\n\r\n      .rentamac-pricing .device-specs {\r\n        justify-content: center;\r\n      }\r\n\r\n      .rentamac-pricing .cycle-tabs {\r\n        flex-wrap: wrap;\r\n      }\r\n\r\n      .rentamac-pricing .cycle-tab {\r\n        min-width: calc(33.333% - 6px);\r\n        padding: 12px 8px;\r\n      }\r\n\r\n      .rentamac-pricing .cycle-tab.unavailable::after {\r\n        white-space: normal;\r\n        width: 220px;\r\n        text-align: center;\r\n      }\r\n\r\n      .rentamac-pricing .total-price {\r\n        font-size: 42px;\r\n      }\r\n    }\r\n\r\n    \/* Compact layout for short viewports (e.g. 1080x720) *\/\r\n    @media (max-height: 820px) {\r\n      .rentamac-pricing .container {\r\n        padding-top: 0;\r\n      }\r\n\r\n      .rentamac-pricing .header {\r\n        margin-bottom: 2px;\r\n      }\r\n\r\n      .rentamac-pricing .header h1 {\r\n        font-size: clamp(24px, 4vw, 36px);\r\n        margin-bottom: 2px;\r\n      }\r\n\r\n      .rentamac-pricing .pricing-card {\r\n        padding: 20px 28px;\r\n      }\r\n\r\n      .rentamac-pricing .device-info {\r\n        padding-bottom: 6px;\r\n        margin-bottom: 6px;\r\n      }\r\n\r\n      .rentamac-pricing .cycle-section {\r\n        margin-bottom: 2px;\r\n      }\r\n\r\n      .rentamac-pricing .cycle-tab {\r\n        padding: 10px 10px;\r\n      }\r\n\r\n      .rentamac-pricing .storage-section {\r\n        margin-bottom: 2px;\r\n      }\r\n\r\n      .rentamac-pricing .storage-option {\r\n        padding: 10px;\r\n      }\r\n\r\n      .rentamac-pricing .features-section {\r\n        margin-bottom: 2px;\r\n        padding-top: 6px;\r\n      }\r\n\r\n      .rentamac-pricing .features-grid {\r\n        gap: 2px;\r\n      }\r\n\r\n      .rentamac-pricing .price-section {\r\n        padding: 6px 0;\r\n        margin-bottom: 6px;\r\n      }\r\n\r\n      .rentamac-pricing .total-price {\r\n        font-size: 40px;\r\n        margin-bottom: 4px;\r\n      }\r\n\r\n      .rentamac-pricing .total-label {\r\n        margin-bottom: 4px;\r\n      }\r\n\r\n      .rentamac-pricing .cta-button {\r\n        padding: 14px 24px;\r\n      }\r\n    }\r\n\r\n    \/* No storage available message *\/\r\n    .rentamac-pricing .no-storage-message {\r\n      background: rgba(249, 115, 22, 0.1);\r\n      border: 1px solid rgba(249, 115, 22, 0.2);\r\n      border-radius: 10px;\r\n      padding: 12px 16px;\r\n      text-align: center;\r\n      color: var(--accent-orange);\r\n      font-size: 13px;\r\n      font-weight: 500;\r\n    }\r\n\r\n    .rentamac-pricing .storage-addon-disabled-note {\r\n      display: none !important;\r\n    }\r\n\r\n    \/* Availability Dialog *\/\r\n    .rentamac-pricing .availability-overlay {\r\n      position: fixed;\r\n      inset: 0;\r\n      background: rgba(0, 0, 0, 0.7);\r\n      backdrop-filter: blur(8px);\r\n      z-index: 1000;\r\n      animation: rentamacFadeIn 0.25s ease-out forwards;\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog {\r\n      position: fixed;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      background: var(--bg);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 20px;\r\n      padding: 32px;\r\n      max-width: 480px;\r\n      width: calc(100% - 48px);\r\n      z-index: 1010;\r\n      animation: rentamacDialogSlide 0.3s ease-out forwards;\r\n    }\r\n\r\n    @keyframes rentamacDialogSlide {\r\n      from { opacity: 0; transform: translate(-50%, calc(-50% - 20px)); }\r\n      to { opacity: 1; transform: translate(-50%, -50%); }\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog__header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      margin-bottom: 16px;\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog__title {\r\n      font-size: 22px;\r\n      font-weight: 700;\r\n      color: var(--text);\r\n      margin: 0;\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog__close {\r\n      background: transparent;\r\n      border: none;\r\n      color: var(--text-secondary);\r\n      font-size: 24px;\r\n      cursor: pointer;\r\n      transition: color 0.2s ease;\r\n      line-height: 1;\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog__close:hover {\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .availability-dialog p {\r\n      color: var(--text-secondary);\r\n      line-height: 1.6;\r\n      margin: 0 0 20px;\r\n    }\r\n\r\n    .rentamac-pricing .availability-form {\r\n      display: flex;\r\n      gap: 12px;\r\n      flex-wrap: wrap;\r\n    }\r\n\r\n    .rentamac-pricing .availability-form input[type=\"email\"] {\r\n      flex: 1;\r\n      min-width: 200px;\r\n      padding: 14px 16px;\r\n      border-radius: 12px;\r\n      border: 1px solid var(--stroke);\r\n      background: rgba(0, 0, 0, 0.3);\r\n      color: var(--text);\r\n      font-size: 15px;\r\n      outline: none;\r\n      transition: border-color 0.2s ease;\r\n    }\r\n\r\n    .rentamac-pricing .availability-form input[type=\"email\"]:focus {\r\n      border-color: var(--accent-blue);\r\n    }\r\n\r\n    .rentamac-pricing .availability-form button {\r\n      padding: 14px 24px;\r\n      border-radius: 12px;\r\n      border: none;\r\n      background: var(--gradient-primary);\r\n      color: white;\r\n      font-weight: 600;\r\n      font-size: 15px;\r\n      cursor: pointer;\r\n      transition: transform 0.2s ease, opacity 0.2s ease;\r\n    }\r\n\r\n    .rentamac-pricing .availability-form button:hover {\r\n      transform: translateY(-1px);\r\n    }\r\n\r\n    .rentamac-pricing .availability-form button:disabled {\r\n      opacity: 0.6;\r\n      cursor: not-allowed;\r\n      transform: none;\r\n    }\r\n\r\n    .rentamac-pricing .availability-feedback {\r\n      width: 100%;\r\n      margin-top: 12px;\r\n      font-size: 14px;\r\n      min-height: 20px;\r\n    }\r\n\r\n    .rentamac-pricing .availability-feedback.success { color: var(--accent-green); }\r\n    .rentamac-pricing .availability-feedback.error { color: #ef4444; }\r\n    .rentamac-pricing .availability-feedback.info { color: var(--text-muted); }\r\n\r\n    .rentamac-pricing .availability-disclaimer {\r\n      font-size: 12px;\r\n      color: var(--text-muted);\r\n      margin-top: 16px;\r\n    }\r\n\r\n    .rentamac-pricing .is-hidden { display: none !important; }\r\n\r\n    .rentamac-pricing .sr-only {\r\n      position: absolute;\r\n      width: 1px;\r\n      height: 1px;\r\n      padding: 0;\r\n      margin: -1px;\r\n      overflow: hidden;\r\n      clip: rect(0, 0, 0, 0);\r\n      border: 0;\r\n    }\r\n\r\n    \/* Out of stock button state *\/\r\n    .rentamac-pricing .cta-button.out-of-stock {\r\n      background: rgba(255, 255, 255, 0.1);\r\n      box-shadow: none;\r\n    }\r\n\r\n    .rentamac-pricing .cta-button.out-of-stock:hover {\r\n      transform: none;\r\n      box-shadow: none;\r\n    }\r\n\r\n    \/* Purchase Info Dropdown *\/\r\n    .rentamac-pricing .purchase-info {\r\n      margin-top: 32px;\r\n      text-align: center;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown {\r\n      max-width: 480px;\r\n      margin: 0 auto;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-trigger {\r\n      width: 100%;\r\n      background: rgba(255, 255, 255, 0.06);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 12px;\r\n      padding: 16px 20px;\r\n      color: var(--text);\r\n      font-size: 15px;\r\n      font-weight: 600;\r\n      cursor: pointer;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      transition: all 0.2s ease;\r\n      position: relative;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-trigger:hover {\r\n      background: rgba(255, 255, 255, 0.08);\r\n      border-color: var(--stroke-hover);\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-icon {\r\n      position: absolute;\r\n      right: 20px;\r\n      opacity: 0.6;\r\n      transition: transform 0.2s ease;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-trigger[aria-expanded=\"true\"] .purchase-dropdown-icon {\r\n      transform: rotate(180deg);\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-content {\r\n      overflow: hidden;\r\n      max-height: 0;\r\n      opacity: 0;\r\n      transition: all 0.3s ease;\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border: 1px solid var(--stroke);\r\n      border-top: none;\r\n      border-radius: 0 0 12px 12px;\r\n      margin-top: -1px;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-content.expanded {\r\n      max-height: 200px;\r\n      opacity: 1;\r\n      padding: 16px 20px;\r\n    }\r\n\r\n    .rentamac-pricing .purchase-dropdown-content p {\r\n      font-size: 14px;\r\n      color: var(--text-secondary);\r\n      margin: 0;\r\n      line-height: 1.6;\r\n      text-align: center;\r\n    }\r\n\r\n    \/* Help Section *\/\r\n    .rentamac-pricing .help-section {\r\n      margin-top: 64px;\r\n      text-align: center;\r\n    }\r\n\r\n    .rentamac-pricing .help-header {\r\n      margin-bottom: 40px;\r\n    }\r\n\r\n    .rentamac-pricing .help-header h3 {\r\n      font-size: 28px;\r\n      font-weight: 700;\r\n      margin: 0 0 8px;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .help-subtitle {\r\n      font-size: 16px;\r\n      color: var(--text-secondary);\r\n      margin: 0;\r\n    }\r\n\r\n    .rentamac-pricing .help-cards {\r\n      display: grid;\r\n      grid-template-columns: repeat(2, 1fr);\r\n      gap: 24px;\r\n      max-width: 720px;\r\n      margin: 0 auto 48px;\r\n    }\r\n\r\n    @media (max-width: 600px) {\r\n      .rentamac-pricing .help-cards {\r\n        grid-template-columns: 1fr;\r\n        gap: 20px;\r\n      }\r\n    }\r\n\r\n    .rentamac-pricing .help-card {\r\n      background: var(--bg);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 20px;\r\n      padding: 32px 24px;\r\n      text-align: center;\r\n      transition: all 0.3s ease;\r\n      position: relative;\r\n      overflow: hidden;\r\n    }\r\n\r\n    .rentamac-pricing .help-card::before {\r\n      content: '';\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      height: 3px;\r\n      background: var(--gradient-primary);\r\n      opacity: 0;\r\n      transition: opacity 0.3s ease;\r\n    }\r\n\r\n    .rentamac-pricing .help-card:hover {\r\n      transform: translateY(-4px);\r\n      border-color: var(--stroke-hover);\r\n      box-shadow: var(--shadow-lg);\r\n    }\r\n\r\n    .rentamac-pricing .help-card:hover::before {\r\n      opacity: 1;\r\n    }\r\n\r\n    .rentamac-pricing .help-icon {\r\n      width: 56px;\r\n      height: 56px;\r\n      margin: 0 auto 20px;\r\n      background: rgba(255, 255, 255, 0.06);\r\n      border-radius: 16px;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      color: var(--text);\r\n      transition: all 0.3s ease;\r\n    }\r\n\r\n    .rentamac-pricing .help-card:hover .help-icon {\r\n      background: rgba(255, 255, 255, 0.1);\r\n      transform: scale(1.05);\r\n    }\r\n\r\n    .rentamac-pricing .help-card h4 {\r\n      font-size: 20px;\r\n      font-weight: 700;\r\n      margin: 0 0 12px;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .help-card p {\r\n      color: var(--text-secondary);\r\n      margin: 0 0 24px;\r\n      font-size: 14px;\r\n      line-height: 1.5;\r\n    }\r\n\r\n    .rentamac-pricing .help-btn {\r\n      border: none;\r\n      border-radius: 12px;\r\n      padding: 12px 24px;\r\n      font-weight: 600;\r\n      cursor: pointer;\r\n      font-size: 14px;\r\n      transition: all 0.2s ease;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .help-btn.secondary {\r\n      background: rgba(255, 255, 255, 0.08);\r\n      color: var(--text);\r\n      border: 1px solid var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .help-btn.secondary:hover {\r\n      background: rgba(255, 255, 255, 0.12);\r\n      transform: translateY(-2px);\r\n    }\r\n\r\n    .rentamac-pricing .help-footer {\r\n      margin-top: 48px;\r\n      padding-top: 40px;\r\n      border-top: 1px solid var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .help-footer-text {\r\n      font-size: 16px;\r\n      color: var(--text-secondary);\r\n      margin: 0 0 20px;\r\n    }\r\n\r\n    .rentamac-pricing .help-portal-btn {\r\n      background: rgba(255, 255, 255, 0.06);\r\n      color: var(--text);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 14px;\r\n      padding: 14px 24px;\r\n      font-weight: 600;\r\n      font-size: 15px;\r\n      cursor: pointer;\r\n      transition: all 0.2s ease;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .help-portal-btn:hover {\r\n      background: rgba(255, 255, 255, 0.1);\r\n      border-color: var(--stroke-hover);\r\n      transform: translateY(-2px);\r\n    }\r\n\r\n    \/* Enterprise Section *\/\r\n    .rentamac-pricing .enterprise-section {\r\n      margin-top: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-card {\r\n      background: var(--bg);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 24px;\r\n      padding: 28px;\r\n      max-width: 520px;\r\n      margin: 0 auto;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-card .card-header {\r\n      text-align: center;\r\n      margin-bottom: 4px;\r\n      padding-bottom: 3px;\r\n      border-bottom: 1px solid var(--stroke);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-card .card-title {\r\n      font-size: 24px;\r\n      font-weight: 700;\r\n      margin: 0 0 8px;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-card .card-subtitle {\r\n      font-size: 14px;\r\n      color: var(--text-secondary);\r\n      margin: 0;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-benefits {\r\n      display: flex;\r\n      gap: 4px;\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .benefit-item {\r\n      flex: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 10px;\r\n      padding: 12px;\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 10px;\r\n    }\r\n\r\n    .rentamac-pricing .benefit-icon {\r\n      width: 32px;\r\n      height: 32px;\r\n      background: rgba(249, 115, 22, 0.15);\r\n      border-radius: 8px;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      color: var(--accent-orange);\r\n      flex-shrink: 0;\r\n    }\r\n\r\n    .rentamac-pricing .benefit-item h4 {\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      color: var(--text);\r\n      margin: 0;\r\n    }\r\n\r\n    \/* Sliders *\/\r\n    .rentamac-pricing .slider-group {\r\n      margin-bottom: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .slider-label-row {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      margin-bottom: 3px;\r\n    }\r\n\r\n    .rentamac-pricing .slider-label {\r\n      font-size: 14px;\r\n      font-weight: 600;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .slider-value {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .slider-value-number {\r\n      background: rgba(249, 115, 22, 0.12);\r\n      border: 1px solid rgba(249, 115, 22, 0.25);\r\n      border-radius: 8px;\r\n      padding: 4px 12px;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      color: var(--accent-orange);\r\n      min-width: 40px;\r\n      text-align: center;\r\n    }\r\n\r\n    .rentamac-pricing .slider-discount-badge {\r\n      background: rgba(249, 115, 22, 0.15);\r\n      border: 1px solid rgba(249, 115, 22, 0.3);\r\n      border-radius: 12px;\r\n      padding: 4px 10px;\r\n      font-size: 11px;\r\n      font-weight: 700;\r\n      color: var(--accent-orange);\r\n      opacity: 0;\r\n      transform: scale(0.9);\r\n      transition: all 0.3s ease;\r\n    }\r\n\r\n    .rentamac-pricing .slider-discount-badge.active {\r\n      opacity: 1;\r\n      transform: scale(1);\r\n    }\r\n\r\n    .rentamac-pricing .slider-discount-badge.bounce {\r\n      animation: rentamacDiscountBounce 0.6s ease;\r\n    }\r\n\r\n    .rentamac-pricing .slider-value-number.bounce {\r\n      animation: rentamacNumberBounce 0.5s ease;\r\n    }\r\n\r\n    @keyframes rentamacDiscountBounce {\r\n      0%, 100% { transform: scale(1); }\r\n      25% { transform: scale(1.2); }\r\n      50% { transform: scale(0.95); }\r\n      75% { transform: scale(1.1); }\r\n    }\r\n\r\n    @keyframes rentamacNumberBounce {\r\n      0%, 100% { transform: scale(1); }\r\n      30% { transform: scale(1.15); }\r\n      60% { transform: scale(0.98); }\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-slider {\r\n      -webkit-appearance: none;\r\n      appearance: none;\r\n      width: 100%;\r\n      height: 6px;\r\n      border-radius: 10px;\r\n      background: rgba(255, 255, 255, 0.08);\r\n      outline: none;\r\n      cursor: pointer;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-slider::-webkit-slider-thumb {\r\n      -webkit-appearance: none;\r\n      appearance: none;\r\n      width: 20px;\r\n      height: 20px;\r\n      border-radius: 50%;\r\n      background: var(--accent-orange);\r\n      cursor: grab;\r\n      box-shadow: 0 2px 12px rgba(249, 115, 22, 0.4);\r\n      transition: all 0.2s ease;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-slider::-webkit-slider-thumb:hover {\r\n      transform: scale(1.2);\r\n      box-shadow: 0 4px 16px rgba(249, 115, 22, 0.6);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-slider::-moz-range-thumb {\r\n      width: 20px;\r\n      height: 20px;\r\n      border-radius: 50%;\r\n      background: var(--accent-orange);\r\n      cursor: grab;\r\n      border: none;\r\n      box-shadow: 0 2px 12px rgba(249, 115, 22, 0.4);\r\n    }\r\n\r\n    .rentamac-pricing .slider-range-labels {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      margin-top: 8px;\r\n      font-size: 12px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    \/* Enterprise pricing display *\/\r\n    .rentamac-pricing .enterprise-pricing {\r\n      text-align: center;\r\n      padding: 20px 0;\r\n      border-top: 1px solid var(--stroke);\r\n      margin-top: 8px;\r\n    }\r\n\r\n    .rentamac-pricing .non-cumulative-notice {\r\n      background: rgba(34, 197, 94, 0.08);\r\n      border: 1px solid rgba(34, 197, 94, 0.2);\r\n      border-radius: 10px;\r\n      padding: 10px 16px;\r\n      margin-bottom: 16px;\r\n      font-size: 13px;\r\n      color: var(--accent-green);\r\n      font-weight: 600;\r\n      display: none;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-pricing .price-amount {\r\n      font-size: 42px;\r\n      font-weight: 800;\r\n      color: var(--text);\r\n      letter-spacing: -1px;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-pricing .price-label {\r\n      font-size: 16px;\r\n      color: var(--text-secondary);\r\n      margin-left: 4px;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-pricing .discount-text {\r\n      font-size: 14px;\r\n      color: var(--text-muted);\r\n      margin: 8px 0 4px;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-pricing .discount-text.active {\r\n      color: var(--accent-orange);\r\n      font-weight: 700;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-pricing .price-breakdown {\r\n      font-size: 13px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-cta {\r\n      margin-top: 20px;\r\n      text-align: center;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-btn {\r\n      width: 100%;\r\n      padding: 16px 24px;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      border: none;\r\n      border-radius: 12px;\r\n      cursor: pointer;\r\n      background: linear-gradient(135deg, var(--accent-orange), #ea580c);\r\n      color: white;\r\n      transition: all 0.2s ease;\r\n      box-shadow: 0 8px 24px rgba(249, 115, 22, 0.3);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-btn:hover {\r\n      transform: translateY(-2px);\r\n      box-shadow: 0 12px 32px rgba(249, 115, 22, 0.4);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-contact {\r\n      margin-top: 12px;\r\n      font-size: 14px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-contact a {\r\n      color: var(--accent-orange);\r\n      text-decoration: none;\r\n    }\r\n\r\n    .rentamac-pricing .enterprise-contact a:hover {\r\n      text-decoration: underline;\r\n    }\r\n\r\n    @media (max-width: 500px) {\r\n      .rentamac-pricing .enterprise-benefits {\r\n        flex-direction: column;\r\n      }\r\n    }\r\n\r\n    \/* Google Reviews Section *\/\r\n    .rentamac-pricing .reviews-section {\r\n      margin-top: 48px;\r\n      padding: 20px 0;\r\n      \/* Break out of container to wider width *\/\r\n      width: 90vw;\r\n      max-width: 1000px;\r\n      position: relative;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n    }\r\n\r\n    .rentamac-pricing .reviews-header {\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 12px;\r\n      margin-bottom: 20px;\r\n    }\r\n\r\n    .rentamac-pricing .google-icon-small {\r\n      width: 24px;\r\n      height: 24px;\r\n      flex-shrink: 0;\r\n    }\r\n\r\n    .rentamac-pricing .reviews-header .rating-stars {\r\n      display: flex;\r\n      gap: 2px;\r\n    }\r\n\r\n    .rentamac-pricing .reviews-header .rating-stars svg {\r\n      width: 18px;\r\n      height: 18px;\r\n    }\r\n\r\n    .rentamac-pricing .reviews-meta {\r\n      font-size: 15px;\r\n      color: var(--text-secondary);\r\n    }\r\n\r\n    .rentamac-pricing .reviews-meta .rating-number {\r\n      font-weight: 700;\r\n      color: var(--text);\r\n    }\r\n\r\n    .rentamac-pricing .reviews-meta a {\r\n      color: var(--text-secondary);\r\n      text-decoration: none;\r\n    }\r\n\r\n    .rentamac-pricing .reviews-meta a:hover {\r\n      color: var(--text);\r\n    }\r\n\r\n    \/* Reviews Carousel *\/\r\n    .rentamac-pricing .reviews-carousel-container {\r\n      position: relative;\r\n      overflow: hidden;\r\n      -webkit-mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);\r\n      mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);\r\n    }\r\n\r\n    .rentamac-pricing .reviews-carousel {\r\n      display: flex;\r\n      gap: 20px;\r\n      animation: rentamacScrollReviews 60s linear infinite;\r\n      width: max-content;\r\n    }\r\n\r\n    .rentamac-pricing .reviews-carousel:hover {\r\n      animation-play-state: paused;\r\n    }\r\n\r\n    @keyframes rentamacScrollReviews {\r\n      0% {\r\n        transform: translateX(0);\r\n      }\r\n      100% {\r\n        transform: translateX(-50%);\r\n      }\r\n    }\r\n\r\n    .rentamac-pricing .review-card {\r\n      flex: 0 0 300px;\r\n      background: var(--bg);\r\n      border: 1px solid var(--stroke);\r\n      border-radius: 16px;\r\n      padding: 24px;\r\n      min-height: 180px;\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n\r\n    .rentamac-pricing .review-header {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 12px;\r\n      margin-bottom: 12px;\r\n    }\r\n\r\n    .rentamac-pricing .reviewer-avatar {\r\n      width: 40px;\r\n      height: 40px;\r\n      border-radius: 50%;\r\n      background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple));\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      font-size: 16px;\r\n      font-weight: 700;\r\n      color: white;\r\n      flex-shrink: 0;\r\n    }\r\n\r\n    .rentamac-pricing .reviewer-avatar img {\r\n      width: 100%;\r\n      height: 100%;\r\n      border-radius: 50%;\r\n      object-fit: cover;\r\n    }\r\n\r\n    .rentamac-pricing .reviewer-info {\r\n      flex: 1;\r\n      min-width: 0;\r\n    }\r\n\r\n    .rentamac-pricing .reviewer-name {\r\n      font-size: 14px;\r\n      font-weight: 600;\r\n      color: var(--text);\r\n      white-space: nowrap;\r\n      overflow: hidden;\r\n      text-overflow: ellipsis;\r\n    }\r\n\r\n    .rentamac-pricing .review-date {\r\n      font-size: 12px;\r\n      color: var(--text-muted);\r\n    }\r\n\r\n    .rentamac-pricing .review-stars {\r\n      display: flex;\r\n      gap: 2px;\r\n      margin-bottom: 12px;\r\n    }\r\n\r\n    .rentamac-pricing .review-stars svg {\r\n      width: 16px;\r\n      height: 16px;\r\n      color: #FBBC04;\r\n    }\r\n\r\n    .rentamac-pricing .review-text {\r\n      font-size: 14px;\r\n      line-height: 1.6;\r\n      color: var(--text-secondary);\r\n      flex: 1;\r\n      overflow: hidden;\r\n      display: -webkit-box;\r\n      -webkit-line-clamp: 5;\r\n      -webkit-box-orient: vertical;\r\n    }\r\n\r\n    .rentamac-pricing .review-google-icon {\r\n      margin-top: 12px;\r\n      opacity: 0.5;\r\n    }\r\n\r\n    .rentamac-pricing .review-google-icon svg {\r\n      height: 16px;\r\n      width: auto;\r\n    }\r\n\r\n    @media (max-width: 600px) {\r\n      .rentamac-pricing .review-card {\r\n        flex: 0 0 260px;\r\n      }\r\n    }\r\n\r\n    \/* ============================================\r\n       Skeleton Loaders\r\n       Shown while availability + reviews load, then\r\n       swapped for real cards by the render functions.\r\n       ============================================ *\/\r\n    @keyframes rentamacSkeletonShimmer {\r\n      0%   { background-position: 200% 0; }\r\n      100% { background-position: -200% 0; }\r\n    }\r\n\r\n    .rentamac-pricing .skeleton-bar {\r\n      background: linear-gradient(\r\n        90deg,\r\n        rgba(255, 255, 255, 0.04) 25%,\r\n        rgba(255, 255, 255, 0.10) 37%,\r\n        rgba(255, 255, 255, 0.04) 63%\r\n      );\r\n      background-size: 200% 100%;\r\n      animation: rentamacSkeletonShimmer 1.4s ease-in-out infinite;\r\n      border-radius: 6px;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.is-skeleton,\r\n    .rentamac-pricing .storage-option.is-skeleton,\r\n    .rentamac-pricing .review-card.is-skeleton {\r\n      cursor: default;\r\n      pointer-events: none;\r\n    }\r\n\r\n    .rentamac-pricing .cycle-tab.is-skeleton:hover,\r\n    .rentamac-pricing .storage-option.is-skeleton:hover {\r\n      background: rgba(255, 255, 255, 0.04);\r\n      border-color: var(--stroke);\r\n    }\r\n\r\n    \/* Don't auto-scroll the carousel while it's still showing skeletons *\/\r\n    .rentamac-pricing .reviews-carousel:has(.review-card.is-skeleton) {\r\n      animation: none;\r\n    }\r\n\r\n    @media (prefers-reduced-motion: reduce) {\r\n      .rentamac-pricing .skeleton-bar {\r\n        animation: none;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n<div class=\"rentamac-pricing\">\r\n<!-- Availability Dialog -->\r\n  <div id=\"availabilityOverlay\" class=\"availability-overlay is-hidden\" aria-hidden=\"true\"><\/div>\r\n  <div id=\"availabilityDialog\" class=\"availability-dialog is-hidden\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"availabilityDialogTitle\">\r\n    <div class=\"availability-dialog__header\">\r\n      <h2 id=\"availabilityDialogTitle\" class=\"availability-dialog__title\">All instances are currently allocated<\/h2>\r\n      <button type=\"button\" id=\"availabilityDialogClose\" class=\"availability-dialog__close\" aria-label=\"Close dialog\">&times;<\/button>\r\n    <\/div>\r\n    <p>\r\n      We&#8217;re at full capacity right now, but we can let you know the moment a Mac becomes available again.\r\n      Leave your email below and you&#8217;ll be first in line when we spin up new instances.\r\n    <\/p>\r\n    <form id=\"availabilityForm\" class=\"availability-form\" novalidate>\r\n      <label for=\"availabilityEmail\" class=\"sr-only\">Email address<\/label>\r\n      <input\r\n        id=\"availabilityEmail\"\r\n        name=\"email\"\r\n        type=\"email\"\r\n        inputmode=\"email\"\r\n        autocomplete=\"email\"\r\n        placeholder=\"your@email.com\"\r\n        aria-label=\"Email address\"\r\n        required\r\n      \/>\r\n      <button type=\"submit\">Notify me<\/button>\r\n    <\/form>\r\n    <div id=\"availabilityFeedback\" class=\"availability-feedback info\" role=\"status\"><\/div>\r\n    <p class=\"availability-disclaimer\">We only use this email to update you about availability. No spam.<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"container\">\r\n    <header class=\"header\">\r\n      <h1>Choose Your Plan<\/h1>\r\n    <\/header>\r\n\r\n    <div class=\"pricing-card\">\r\n      <!-- Device Info -->\r\n      <div class=\"device-info\">\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/rentamac.io\/wp-content\/uploads\/2025\/09\/mm24-front-cut-1.png\"\r\n          alt=\"Mac Mini M4\"\r\n          class=\"device-image\"\r\n        \/>\r\n        <div class=\"device-details\">\r\n          <h2>Dedicated Mac Mini M4<\/h2>\r\n          <div class=\"device-specs\">\r\n            <span class=\"spec-badge\">\r\n              M4 10-core\r\n              <span class=\"feature-info\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                  <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                  <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n                <\/svg>\r\n                <span class=\"tooltip\">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>\r\n              <\/span>\r\n            <\/span>\r\n            <span class=\"spec-badge\">\r\n              16 GB RAM\r\n              <span class=\"feature-info\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                  <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                  <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n                <\/svg>\r\n                <span class=\"tooltip\">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>\r\n              <\/span>\r\n            <\/span>\r\n            <span class=\"spec-badge\">\r\n              256 GB SSD\r\n              <span class=\"feature-info\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                  <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                  <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n                <\/svg>\r\n                <span class=\"tooltip\">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>\r\n              <\/span>\r\n            <\/span>\r\n            <span class=\"spec-badge\">\r\n              Tahoe 26.4+\r\n              <span class=\"feature-info\">\r\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                  <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                  <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n                <\/svg>\r\n                <span class=\"tooltip\">macOS Tahoe (version 26.4 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>\r\n              <\/span>\r\n            <\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Location picker temporarily disabled \u2014 datacenter is auto-routed from the visitor's IP\r\n           (see resolveGeoPreferredLocation \/ applyGeoDatacenter). To re-enable manual picking,\r\n           restore this block and the renderLocationTabs() call in initRentamacPricing().\r\n      <div class=\"location-section\">\r\n        <div class=\"section-title\">Location<\/div>\r\n        <div class=\"cycle-tabs\" id=\"locationTabs\"><\/div>\r\n      <\/div>\r\n      -->\r\n\r\n      <!-- Billing Cycle -->\r\n      <div class=\"cycle-section\">\r\n        <div class=\"section-title\">Billing Cycle<\/div>\r\n        <!-- Skeleton tabs are baked into the static markup so they show on first paint\r\n             (no empty flash before JS runs). Replaced by renderCycleTabs() once availability\r\n             data arrives; renderCycleTabsSkeleton() in init re-renders identical markup. -->\r\n        <div class=\"cycle-tabs\" id=\"cycleTabs\">\r\n          <div class=\"cycle-tab is-skeleton\">\r\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\r\n          <\/div>\r\n          <div class=\"cycle-tab is-skeleton\">\r\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\r\n          <\/div>\r\n          <div class=\"cycle-tab is-skeleton\">\r\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\r\n          <\/div>\r\n          <div class=\"cycle-tab is-skeleton\">\r\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\r\n          <\/div>\r\n          <div class=\"cycle-tab is-skeleton\">\r\n            <div class=\"skeleton-bar\" style=\"height:14px;width:55%;margin:6px auto 8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:10px;width:40%;margin:0 auto;\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Storage -->\r\n      <div class=\"storage-section\">\r\n        <div class=\"section-title\">Storage<\/div>\r\n        <!-- Skeleton options baked in for first paint (see cycle-tabs note above). -->\r\n        <div id=\"storageContainer\">\r\n          <div class=\"storage-options\" id=\"storageOptions\">\r\n            <div class=\"storage-option is-skeleton\">\r\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\r\n            <\/div>\r\n            <div class=\"storage-option is-skeleton\">\r\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\r\n            <\/div>\r\n            <div class=\"storage-option is-skeleton\">\r\n              <div class=\"skeleton-bar\" style=\"height:18px;width:45%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:12px;width:70%;margin:0 auto 8px;\"><\/div>\r\n              <div class=\"skeleton-bar\" style=\"height:13px;width:35%;margin:0 auto;\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Features -->\r\n      <div class=\"features-section\">\r\n        <div class=\"section-title\">Included<\/div>\r\n        <div class=\"features-grid\">\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span id=\"accessDuration\">1 month access<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>Remote desktop connection<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>SSH access<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>Admin user access<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">Full administrator privileges (Root access) with no restrictions. Install any software, configure development environments, and have complete control over the system.<\/span>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>Dedicated Mac<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>Immediate access<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>1 Gbps internet<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>Xcode pre-installed<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n          <div class=\"feature-item\" id=\"sipFeature\" style=\"display: none;\">\r\n            <span class=\"feature-icon\">&#10003;<\/span>\r\n            <span>SIP customization<\/span>\r\n            <span class=\"feature-info\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n                <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"><\/line>\r\n                <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"><\/line>\r\n              <\/svg>\r\n              <span class=\"tooltip\">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>\r\n            <\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Price Display -->\r\n      <div class=\"price-section\">\r\n        <div class=\"total-label\">Total<\/div>\r\n        <div class=\"total-price\" id=\"totalPrice\">$99<\/div>\r\n        <div class=\"price-breakdown\" id=\"priceBreakdown\">$99 billed monthly<\/div>\r\n        <div class=\"storage-addon-note\" id=\"storageNote\"><\/div>\r\n      <\/div>\r\n\r\n      <!-- CTA -->\r\n      <button class=\"cta-button\" id=\"ctaButton\">\r\n        Buy Plan\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Purchase Information -->\r\n    <section class=\"purchase-info\">\r\n      <div class=\"purchase-dropdown\">\r\n        <button class=\"purchase-dropdown-trigger\" id=\"purchaseDropdownTrigger\" type=\"button\" aria-expanded=\"false\" aria-controls=\"purchaseDropdownContent\">\r\n          <span>What happens after purchase?<\/span>\r\n          <svg class=\"purchase-dropdown-icon\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"\/>\r\n          <\/svg>\r\n        <\/button>\r\n        <div class=\"purchase-dropdown-content\" id=\"purchaseDropdownContent\" aria-hidden=\"true\">\r\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>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Google Reviews Section -->\r\n    <section class=\"reviews-section\">\r\n      <div class=\"reviews-header\">\r\n        <!-- Google \"G\" Icon -->\r\n        <svg class=\"google-icon-small\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\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\"\/>\r\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\"\/>\r\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\"\/>\r\n        <\/svg>\r\n        <div class=\"rating-stars\" id=\"avgStars\"><\/div>\r\n        <span class=\"reviews-meta\">\r\n          <span class=\"rating-number\" id=\"avgRating\">5.0<\/span>\r\n          <a href=\"https:\/\/maps.app.goo.gl\/v55edKD7K2gePhTh9\" target=\"_blank\" rel=\"noopener nofollow\">on Google<\/a>\r\n        <\/span>\r\n      <\/div>\r\n\r\n      <div class=\"reviews-carousel-container\">\r\n        <div class=\"reviews-carousel\" id=\"reviewsCarousel\">\r\n          <!-- Skeleton placeholders shown until reviews are rendered by JS -->\r\n          <div class=\"review-card is-skeleton\">\r\n            <div class=\"review-header\">\r\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\r\n              <div class=\"reviewer-info\">\r\n                <div class=\"skeleton-bar\" style=\"height:14px;width:60%;\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:92%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:74%;\"><\/div>\r\n          <\/div>\r\n          <div class=\"review-card is-skeleton\">\r\n            <div class=\"review-header\">\r\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\r\n              <div class=\"reviewer-info\">\r\n                <div class=\"skeleton-bar\" style=\"height:14px;width:55%;\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:88%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:64%;\"><\/div>\r\n          <\/div>\r\n          <div class=\"review-card is-skeleton\">\r\n            <div class=\"review-header\">\r\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\r\n              <div class=\"reviewer-info\">\r\n                <div class=\"skeleton-bar\" style=\"height:14px;width:65%;\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:90%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:70%;\"><\/div>\r\n          <\/div>\r\n          <div class=\"review-card is-skeleton\">\r\n            <div class=\"review-header\">\r\n              <div class=\"skeleton-bar\" style=\"width:40px;height:40px;border-radius:50%;flex-shrink:0;\"><\/div>\r\n              <div class=\"reviewer-info\">\r\n                <div class=\"skeleton-bar\" style=\"height:14px;width:58%;\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:16px;width:96px;margin-bottom:14px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:100%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:85%;margin-bottom:8px;\"><\/div>\r\n            <div class=\"skeleton-bar\" style=\"height:12px;width:60%;\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Enterprise Section -->\r\n    <section class=\"enterprise-section\">\r\n      <div class=\"enterprise-card\">\r\n        <div class=\"card-header\">\r\n          <h2 class=\"card-title\">Enterprise<\/h2>\r\n          <p class=\"card-subtitle\">Mac Mini M4 &#8211; Volume pricing<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"enterprise-benefits\">\r\n          <div class=\"benefit-item\">\r\n            <div class=\"benefit-icon\">\r\n              <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\n              <\/svg>\r\n            <\/div>\r\n            <h4>Volume discounts<\/h4>\r\n          <\/div>\r\n          <div class=\"benefit-item\">\r\n            <div class=\"benefit-icon\">\r\n              <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\n              <\/svg>\r\n            <\/div>\r\n            <h4>SLA guarantees<\/h4>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Quantity Slider -->\r\n        <div class=\"slider-group\">\r\n          <div class=\"slider-label-row\">\r\n            <span class=\"slider-label\">Number of Instances<\/span>\r\n            <div class=\"slider-value\">\r\n              <span class=\"slider-value-number\" id=\"quantityValue\">1<\/span>\r\n              <span class=\"slider-discount-badge\" id=\"quantityDiscountBadge\">10% OFF<\/span>\r\n            <\/div>\r\n          <\/div>\r\n          <input type=\"range\" id=\"quantitySlider\" min=\"1\" max=\"15\" value=\"1\" class=\"enterprise-slider\" \/>\r\n          <div class=\"slider-range-labels\">\r\n            <span>1<\/span>\r\n            <span>15+<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Duration Slider -->\r\n        <div class=\"slider-group\">\r\n          <div class=\"slider-label-row\">\r\n            <span class=\"slider-label\">Duration (Months)<\/span>\r\n            <div class=\"slider-value\">\r\n              <span class=\"slider-value-number\" id=\"durationValue\">1<\/span>\r\n              <span class=\"slider-discount-badge\" id=\"durationDiscountBadge\">10% OFF<\/span>\r\n            <\/div>\r\n          <\/div>\r\n          <input type=\"range\" id=\"durationSlider\" min=\"1\" max=\"12\" value=\"1\" class=\"enterprise-slider\" \/>\r\n          <div class=\"slider-range-labels\">\r\n            <span>1 month<\/span>\r\n            <span>12 months<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Pricing Display -->\r\n        <div class=\"enterprise-pricing\">\r\n          <div class=\"non-cumulative-notice\" id=\"nonCumulativeNotice\">\r\n            Discounts are not cumulative\r\n          <\/div>\r\n          <div>\r\n            <span class=\"price-amount\" id=\"enterprisePrice\">$99<\/span>\r\n            <span class=\"price-label\">total<\/span>\r\n          <\/div>\r\n          <p class=\"discount-text\" id=\"discountBadge\">Standard pricing<\/p>\r\n          <p class=\"price-breakdown\" id=\"priceBreakdownEnterprise\">$99.00\/month per instance<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"enterprise-cta\">\r\n          <button class=\"enterprise-btn\" onclick=\"if(typeof $crisp !== 'undefined') $crisp.push(['do', 'chat:open']); else window.location.href='mailto:support@rentamac.io';\">\r\n            Get custom quote\r\n          <\/button>\r\n          <p class=\"enterprise-contact\">or email <a href=\"mailto:support@rentamac.io\">support@rentamac.io<\/a><\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Help Section -->\r\n    <section class=\"help-section\">\r\n      <div class=\"help-header\">\r\n        <h3>Need help deciding?<\/h3>\r\n        <p class=\"help-subtitle\">See it in action or get your questions answered<\/p>\r\n      <\/div>\r\n\r\n      <div class=\"help-cards\">\r\n        <div class=\"help-card\">\r\n          <div class=\"help-icon\">\r\n            <svg width=\"28\" height=\"28\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h4>Watch live demo<\/h4>\r\n          <p>See our Mac Mini cloud service in action with a live demonstration. No signup required!<\/p>\r\n          <button class=\"help-btn secondary\" onclick=\"navigateWithLanguage('\/demo\/');\">\r\n            <span>View Demo<\/span>\r\n            <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\/>\r\n            <\/svg>\r\n          <\/button>\r\n        <\/div>\r\n\r\n        <div class=\"help-card\">\r\n          <div class=\"help-icon\">\r\n            <svg width=\"28\" height=\"28\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h4>Get answers<\/h4>\r\n          <p>Find detailed answers to common questions about setup, pricing, and features.<\/p>\r\n          <button class=\"help-btn secondary\" onclick=\"navigateWithLanguage('\/faq\/');\">\r\n            <span>Browse FAQ<\/span>\r\n            <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\/>\r\n            <\/svg>\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"help-footer\">\r\n        <p class=\"help-footer-text\">Prefer to create your account first?<\/p>\r\n        <button class=\"help-portal-btn\" onclick=\"window.open('https:\/\/portal.rentamac.io\/register', '_blank');\">\r\n          <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\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\"\/>\r\n          <\/svg>\r\n          <span>Create Account<\/span>\r\n        <\/button>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>(function(){try{var b=atob(\"DQogICAgKGZ1bmN0aW9uKCkgew0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgLy8gUFJJQ0lORyBDT05GSUdVUkFUSU9OIC0gRWRpdCB0aGVzZSB2YWx1ZXMNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogICAgY29uc3QgUFJJQ0lOR19DT05GSUcgPSB7DQogICAgICBjeWNsZXM6IHsNCiAgICAgICAgZGFpbHk6IHsNCiAgICAgICAgICBuYW1lOiAnRGFpbHknLA0KICAgICAgICAgIGJhc2VQcmljZTogMTUsDQogICAgICAgICAgYmlsbGluZ0xhYmVsOiAnYmlsbGVkIGRhaWx5JywNCiAgICAgICAgICBwcmljZVBlckRheTogMTUsDQogICAgICAgICAgc3VwcG9ydDogJ1N0YW5kYXJkIHN1cHBvcnQnLA0KICAgICAgICAgIGFjY2Vzc0R1cmF0aW9uOiAnMjQgaG91cnMgYWNjZXNzJywNCiAgICAgICAgICBoYXNTdG9yYWdlOiBmYWxzZSwgLy8gTm8gc3RvcmFnZSBhZGQtb25zIGZvciBkYWlseQ0KICAgICAgICAgIHNhdmluZ3M6IG51bGwNCiAgICAgICAgfSwNCiAgICAgICAgd2Vla2x5OiB7DQogICAgICAgICAgbmFtZTogJ1dlZWtseScsDQogICAgICAgICAgYmFzZVByaWNlOiA0OSwNCiAgICAgICAgICBiaWxsaW5nTGFiZWw6ICdiaWxsZWQgd2Vla2x5JywNCiAgICAgICAgICBwcmljZVBlckRheTogNywNCiAgICAgICAgICBzdXBwb3J0OiAnUHJpb3JpdHkgc3VwcG9ydCcsDQogICAgICAgICAgYWNjZXNzRHVyYXRpb246ICc3IGRheXMgYWNjZXNzJywNCiAgICAgICAgICBoYXNTdG9yYWdlOiB0cnVlLA0KICAgICAgICAgIHNhdmluZ3M6IG51bGwNCiAgICAgICAgfSwNCiAgICAgICAgbW9udGhseTogew0KICAgICAgICAgIG5hbWU6ICdNb250aGx5JywNCiAgICAgICAgICBiYXNlUHJpY2U6IDk5LA0KICAgICAgICAgIGJpbGxpbmdMYWJlbDogJ2JpbGxlZCBtb250aGx5JywNCiAgICAgICAgICBwcmljZVBlckRheTogMy4zLA0KICAgICAgICAgIHN1cHBvcnQ6ICdQcmlvcml0eSBzdXBwb3J0JywNCiAgICAgICAgICBhY2Nlc3NEdXJhdGlvbjogJzEgbW9udGggYWNjZXNzJywNCiAgICAgICAgICBoYXNTdG9yYWdlOiB0cnVlLA0KICAgICAgICAgIHNhdmluZ3M6IG51bGwsDQogICAgICAgICAgcG9wdWxhcjogdHJ1ZQ0KICAgICAgICB9LA0KICAgICAgICAnM21vbnRoJzogew0KICAgICAgICAgIG5hbWU6ICczIE1vbnRocycsDQogICAgICAgICAgYmFzZVByaWNlOiAyODIsDQogICAgICAgICAgYmlsbGluZ0xhYmVsOiAnYmlsbGVkIGV2ZXJ5IDMgbW9udGhzJywNCiAgICAgICAgICBwcmljZVBlckRheTogMy4xMywNCiAgICAgICAgICBzdXBwb3J0OiAnUHJpb3JpdHkgc3VwcG9ydCcsDQogICAgICAgICAgYWNjZXNzRHVyYXRpb246ICczIG1vbnRocyBhY2Nlc3MnLA0KICAgICAgICAgIGhhc1N0b3JhZ2U6IHRydWUsDQogICAgICAgICAgc2F2aW5nczogJ1NhdmUgNSUnDQogICAgICAgIH0sDQogICAgICAgICc2bW9udGgnOiB7DQogICAgICAgICAgbmFtZTogJzYgTW9udGhzJywNCiAgICAgICAgICBiYXNlUHJpY2U6IDUzNSwNCiAgICAgICAgICBiaWxsaW5nTGFiZWw6ICdiaWxsZWQgZXZlcnkgNiBtb250aHMnLA0KICAgICAgICAgIHByaWNlUGVyRGF5OiAyLjk3LA0KICAgICAgICAgIHN1cHBvcnQ6ICdQcmVtaXVtIHN1cHBvcnQnLA0KICAgICAgICAgIGFjY2Vzc0R1cmF0aW9uOiAnNiBtb250aHMgYWNjZXNzJywNCiAgICAgICAgICBoYXNTdG9yYWdlOiB0cnVlLA0KICAgICAgICAgIHNhdmluZ3M6ICdTYXZlIDEwJScNCiAgICAgICAgfQ0KICAgICAgfSwNCg0KICAgICAgc3RvcmFnZTogew0KICAgICAgICBiYXNlOiB7DQogICAgICAgICAgc2l6ZTogMjU2LA0KICAgICAgICAgIGxhYmVsOiAnSW50ZXJuYWwgU1NEJywNCiAgICAgICAgICBwcmljZTogMCwNCiAgICAgICAgICBpc0RlZmF1bHQ6IHRydWUNCiAgICAgICAgfSwNCiAgICAgICAgYWRkb24yNTY6IHsNCiAgICAgICAgICBzaXplOiA1MTIsIC8vIDI1NiBiYXNlICsgMjU2IGFkZG9uDQogICAgICAgICAgbGFiZWw6ICcyNTYgR0IgKyAyNTYgR0IgZXh0ZXJuYWwnLA0KICAgICAgICAgIG1vbnRobHlQcmljZTogOS45MCwgLy8gQmFzZSBtb250aGx5IHByaWNlDQogICAgICAgICAgLy8gTXVsdGlwbGllcnMgZm9yIGxvbmdlciB0ZXJtcw0KICAgICAgICAgICczbW9udGhNdWx0aXBsaWVyJzogMywNCiAgICAgICAgICAnNm1vbnRoTXVsdGlwbGllcic6IDYNCiAgICAgICAgfSwNCiAgICAgICAgYWRkb241MTI6IHsNCiAgICAgICAgICBzaXplOiA3NjgsIC8vIDI1NiBiYXNlICsgNTEyIGFkZG9uDQogICAgICAgICAgbGFiZWw6ICcyNTYgR0IgKyA1MTIgR0IgZXh0ZXJuYWwnLA0KICAgICAgICAgIG1vbnRobHlQcmljZTogMTQuOTAsIC8vIEJhc2UgbW9udGhseSBwcmljZQ0KICAgICAgICAgICczbW9udGhNdWx0aXBsaWVyJzogMywNCiAgICAgICAgICAnNm1vbnRoTXVsdGlwbGllcic6IDYNCiAgICAgICAgfQ0KICAgICAgfSwNCg0KICAgIH07DQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIExPQ0FUSU9OIENPTkZJR1VSQVRJT04NCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIEVhY2ggZGF0YWNlbnRlciBoYXMgaXRzIG93biBzZXQgb2YgU3RyaXBlIFBheW1lbnQgTGlua3Mg4oCUIHNhbWUgUHJpY2VzLCBidXQgZWFjaCBsaW5rDQogICAgLy8gaGFzIG1ldGFkYXRhLmRhdGFjZW50ZXIgc2V0IGluIFN0cmlwZSBzbyB0aGUgYmFja2VuZCByb3V0ZXMgdGhlIHJlbnRlZCBkZXZpY2UgdG8gdGhlDQogICAgLy8gY29ycmVjdCBEQy4gVGhlIGJhY2tlbmQncyBhdmFpbGFiaWxpdHkgZW5kcG9pbnQgYWxzbyByZXR1cm5zIHBlci1EQyBjb3VudHMsIGtleWVkIGJ5DQogICAgLy8gdGhlIEMjIERhdGFjZW50ZXJMb2NhdGlvbiBlbnVtIHNlcmlhbGl6ZWQgYXMgaXRzIGludGVnZXIgdmFsdWUgKG5vIFN0cmluZ0VudW1Db252ZXJ0ZXINCiAgICAvLyBpcyB3aXJlZCB1cCBvbiB0aGUgQVBJLCBzbyBgbG9jYXRpb25gIGNvbWVzIHRocm91Z2ggYXMgMC8xLCBub3QgIkN5cHJ1cyIvIkluZGlhIikuDQogICAgY29uc3QgTE9DQVRJT05TID0gew0KICAgICAgY3lwcnVzOiB7DQogICAgICAgIGZsYWc6ICfwn4eq8J+HuicsDQogICAgICAgIGNvbnRpbmVudDogJ0V1cm9wZScsDQogICAgICAgIGNvdW50cnk6ICdDeXBydXMnLA0KICAgICAgICBhdmFpbGFibGU6IHRydWUsDQogICAgICAgIGlzRGVmYXVsdDogdHJ1ZSwNCiAgICAgICAgLy8gSW50ZWdlciB2YWx1ZSBvZiB0aGUgRGF0YWNlbnRlckxvY2F0aW9uIGVudW0gb24gdGhlIGJhY2tlbmQgKEN5cHJ1cyA9IDApDQogICAgICAgIGJhY2tlbmRLZXk6IDAsDQogICAgICAgIGNoZWNrb3V0VXJsczogew0KICAgICAgICAgIGRhaWx5OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS82b1UzY3dkb3I3V002Qlg4QnpndzAwYicsDQogICAgICAgICAgd2Vla2x5OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS82b1VmWmkySk41T0U4SzU3eHZndzAwYycsDQogICAgICAgICAgbW9udGhseTogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vZFJtNWtFM05SOTBRMWhENGxqZ3cwMGQnLA0KICAgICAgICAgICczbW9udGgnOiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS8zY0kzY3c5OGJiOFk1eFRhSkhndzAwdicsDQogICAgICAgICAgJzZtb250aCc6ICdodHRwczovL2J1eS5zdHJpcGUuY29tL2NOaTAwa2JnajJDczZCWGNSUGd3MDBlJw0KICAgICAgICB9LA0KICAgICAgICBzdG9yYWdlQ2hlY2tvdXRVcmxzOiB7DQogICAgICAgICAgd2Vla2x5OiB7DQogICAgICAgICAgICBhZGRvbjI1NjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vMDB3N3NNYWNmY2QyZTRwZzQxZ3cwMGonLA0KICAgICAgICAgICAgYWRkb241MTI6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzRnTTlBVTg0N2I4WWFTZGc0MWd3MDBuJw0KICAgICAgICAgIH0sDQogICAgICAgICAgbW9udGhseTogew0KICAgICAgICAgICAgYWRkb24yNTY6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzZvVTNjd2dBRGE0VTZCWGRWVGd3MDBrJywNCiAgICAgICAgICAgIGFkZG9uNTEyOiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS9kUm00Z0EySk40S0E0dFAyZGJndzAwbycNCiAgICAgICAgICB9LA0KICAgICAgICAgICczbW9udGgnOiB7DQogICAgICAgICAgICBhZGRvbjI1NjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vYUZhNGdBYmdqOTBRZTRwN3h2Z3cwMHcnLA0KICAgICAgICAgICAgYWRkb241MTI6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzdzWTI4czVWWmNkMmdjeDd4dmd3MDB4Jw0KICAgICAgICAgIH0sDQogICAgICAgICAgJzZtb250aCc6IHsNCiAgICAgICAgICAgIGFkZG9uMjU2OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS82b1UwMGtiZ2o0S0E3RzEwNTNndzAwbCcsDQogICAgICAgICAgICBhZGRvbjUxMjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vM2NJY042Znd6OTBRYldoY1JQZ3cwMHAnDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9LA0KICAgICAgaW5kaWE6IHsNCiAgICAgICAgZmxhZzogJ\/Cfh67wn4ezJywNCiAgICAgICAgY29udGluZW50OiAnQXNpYScsDQogICAgICAgIGNvdW50cnk6ICdJbmRpYScsDQogICAgICAgIGF2YWlsYWJsZTogdHJ1ZSwNCiAgICAgICAgLy8gSW50ZWdlciB2YWx1ZSBvZiB0aGUgRGF0YWNlbnRlckxvY2F0aW9uIGVudW0gb24gdGhlIGJhY2tlbmQgKEluZGlhID0gMSkNCiAgICAgICAgYmFja2VuZEtleTogMSwNCiAgICAgICAgY2hlY2tvdXRVcmxzOiB7DQogICAgICAgICAgZGFpbHk6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzVrUWVWZWZ3emNkMjdHMTd4dmd3MDBEJywNCiAgICAgICAgICB3ZWVrbHk6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzVrUWNONjg0N2E0VTZCWDJkYmd3MDBFJywNCiAgICAgICAgICBtb250aGx5OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS9jTmlmWmkwQkZndGk3RzE1cG5ndzAwRicsDQogICAgICAgICAgJzNtb250aCc6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzlCNmZaaTJKTmZwZWFTZGJOTGd3MDBHJywNCiAgICAgICAgICAnNm1vbnRoJzogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vY05pN3NNMkpOYjhZNXhUNGxqZ3cwMEgnDQogICAgICAgIH0sDQogICAgICAgIHN0b3JhZ2VDaGVja291dFVybHM6IHsNCiAgICAgICAgICB3ZWVrbHk6IHsNCiAgICAgICAgICAgIGFkZG9uMjU2OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS9hRmEzY3cySk5kaDYwZHphSkhndzAwSScsDQogICAgICAgICAgICBhZGRvbjUxMjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vMTRBYUVZOThiMHVrNkJYMTk3Z3cwMEonDQogICAgICAgICAgfSwNCiAgICAgICAgICBtb250aGx5OiB7DQogICAgICAgICAgICBhZGRvbjI1NjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vNWtRZlppODQ3MkNzZ2N4NGxqZ3cwMEsnLA0KICAgICAgICAgICAgYWRkb241MTI6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzVrUTI4c2Nrbmd0aWJXaDNoZmd3MDBMJw0KICAgICAgICAgIH0sDQogICAgICAgICAgJzNtb250aCc6IHsNCiAgICAgICAgICAgIGFkZG9uMjU2OiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS80Z01lVmU3MDM1T0VnY3hkVlRndzAwTScsDQogICAgICAgICAgICBhZGRvbjUxMjogJ2h0dHBzOi8vYnV5LnN0cmlwZS5jb20vY05pMTRvNFJWZGg2YldoZzQxZ3cwME4nDQogICAgICAgICAgfSwNCiAgICAgICAgICAnNm1vbnRoJzogew0KICAgICAgICAgICAgYWRkb24yNTY6ICdodHRwczovL2J1eS5zdHJpcGUuY29tLzh4MmRSYWZ3ejdXTWJXaDlGRGd3MDBPJywNCiAgICAgICAgICAgIGFkZG9uNTEyOiAnaHR0cHM6Ly9idXkuc3RyaXBlLmNvbS83c1kzY3c1VlpmcGU3RzE3eHZndzAwUCcNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICB1c2E6IHsNCiAgICAgICAgZmxhZzogJ\/Cfh7rwn4e4JywNCiAgICAgICAgY29udGluZW50OiAnQW1lcmljYScsDQogICAgICAgIGNvdW50cnk6ICdVU0EgwrcgVGV4YXMnLA0KICAgICAgICBhdmFpbGFibGU6IGZhbHNlLA0KICAgICAgICBjb21pbmdTb29uOiB0cnVlDQogICAgICB9DQogICAgfTsNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgLy8gQVBJIEVORFBPSU5UUw0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiAgICBjb25zdCBFTkRQT0lOVF9TVEFUVVMgPSAiaHR0cHM6Ly9hcGkucmVudGFtYWMuaW8vYXBpL3dlYnNpdGUvYXZhaWxhYmlsaXR5L3N0YXR1cyINCiAgICBjb25zdCBFTkRQT0lOVF9TVUJTQ1JJQkUgPSAiaHR0cHM6Ly9hcGkucmVudGFtYWMuaW8vYXBpL3dlYnNpdGUvYXZhaWxhYmlsaXR5L3N1YnNjcmliZSINCiAgICBjb25zdCBFTkRQT0lOVF9BRF9UUkFDS0lORyA9ICJodHRwczovL2FwaS5yZW50YW1hYy5pby9hcGkvd2Vic2l0ZS9hZHQiDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIFNUQVRFDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGxldCBzZWxlY3RlZEN5Y2xlID0gJ21vbnRobHknOw0KICAgIGxldCBzZWxlY3RlZFN0b3JhZ2UgPSAnYmFzZSc7DQogICAgbGV0IHNlbGVjdGVkTG9jYXRpb24gPSAnY3lwcnVzJzsNCiAgICBsZXQgdXNlckludGVyYWN0ZWRXaXRoTG9jYXRpb24gPSBmYWxzZTsNCiAgICAvLyBEZWZhdWx0IGFsbCBhdmFpbGFiaWxpdHkgY291bnRzIGhpZ2ggc28gZXZlcnl0aGluZyBhcHBlYXJzIGF2YWlsYWJsZSB3aGlsZSB0aGUgQVBJIGxvYWRzLg0KICAgIC8vIFRoZSBBUEkgcmVzcG9uc2UgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4gbWFyayBhbiBvcHRpb24gYXMgdW5hdmFpbGFibGUuDQogICAgbGV0IGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID0gOTk5Ow0KICAgIGxldCBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPSA5OTk7DQogICAgbGV0IGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9IDk5OTsNCiAgICBsZXQgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gMzsgLy8gVGhyZXNob2xkIGZyb20gQVBJLCBkZWZhdWx0cyB0byAzDQogICAgbGV0IGZvcm1TdWJtaXR0ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsNCiAgICBsZXQgY3VycmVudFByaWNpbmdPcHRpb24gPSBudWxsOyAvLyBUcmFja3Mgd2hpY2ggYXZhaWxhYmlsaXR5IG5ld3NsZXR0ZXIgdG8gc3Vic2NyaWJlIHRvIChlbnVtIHZhbHVlKQ0KDQogICAgLy8gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZSBlbnVtIHZhbHVlcyAobXVzdCBtYXRjaCBiYWNrZW5kKQ0KICAgIGNvbnN0IEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUgPSB7DQogICAgICBEYWlseTogMCwgICAgICAgIC8vIERhaWx5IHBsYW4gLSB0cmlnZ2VycyB3aGVuIGF2YWlsYWJsZURldmljZXMgPiBkYWlseVBsYW5BdmFpbGFiaWxpdHlUaHJlc2hvbGQNCiAgICAgIEJhc2VTdG9yYWdlOiAxLCAgLy8gQmFzZSAyNTZHQiBzdG9yYWdlIC0gdHJpZ2dlcnMgd2hlbiBhbnkgZGV2aWNlIGF2YWlsYWJsZQ0KICAgICAgRXh0ZXJuYWwyNTZHYjogMiwgLy8gMjU2R0IgZXh0ZXJuYWwgZHJpdmUgLSB0cmlnZ2VycyB3aGVuIDI1NkdCIGV4dGVybmFsIGF2YWlsYWJsZQ0KICAgICAgRXh0ZXJuYWw1MTJHYjogMyAgLy8gNTEyR0IgZXh0ZXJuYWwgZHJpdmUgLSB0cmlnZ2VycyB3aGVuIDUxMkdCIGV4dGVybmFsIGF2YWlsYWJsZQ0KICAgIH07DQoNCiAgICAvLyBNaXJyb3JzIHRoZSBiYWNrZW5kIFN1YnNjcmlwdGlvblR5cGUgZW51bS4gVGhlIGF2YWlsYWJpbGl0eS1uZXdzbGV0dGVyIHN1cHBvcnQgbm90aWZpY2F0aW9uDQogICAgLy8gcmVjb3JkcyB3aGljaCBiaWxsaW5nIGN5Y2xlIHRoZSB2aXNpdG9yIHdhcyBhZnRlciAoaW5mb3JtYXRpb25hbCBvbmx5KS4NCiAgICBjb25zdCBTdWJzY3JpcHRpb25UeXBlID0gew0KICAgICAgSG91cmx5OiAwLCBEYWlseTogMSwgV2Vla2x5OiAyLCBNb250aGx5OiAzLCBTaXhNb250aHM6IDQsIFllYXJseTogNSwgVGhyZWVNb250aHM6IDYNCiAgICB9Ow0KDQogICAgY29uc3QgQ1lDTEVfVE9fU1VCU0NSSVBUSU9OX1RZUEUgPSB7DQogICAgICBkYWlseTogU3Vic2NyaXB0aW9uVHlwZS5EYWlseSwNCiAgICAgIHdlZWtseTogU3Vic2NyaXB0aW9uVHlwZS5XZWVrbHksDQogICAgICBtb250aGx5OiBTdWJzY3JpcHRpb25UeXBlLk1vbnRobHksDQogICAgICAnM21vbnRoJzogU3Vic2NyaXB0aW9uVHlwZS5UaHJlZU1vbnRocywNCiAgICAgICc2bW9udGgnOiBTdWJzY3JpcHRpb25UeXBlLlNpeE1vbnRocw0KICAgIH07DQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIERPTSBFTEVNRU5UUyAobGF6eS1sb2FkZWQpDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGxldCBhdmFpbGFiaWxpdHlEaWFsb2csIGF2YWlsYWJpbGl0eU92ZXJsYXksIGF2YWlsYWJpbGl0eURpYWxvZ0Nsb3NlLCANCiAgICAgICAgYXZhaWxhYmlsaXR5Rm9ybSwgYXZhaWxhYmlsaXR5RmVlZGJhY2ssIGF2YWlsYWJpbGl0eUVtYWlsOw0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBUUkFDS0lORyBGVU5DVElPTlMNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogICAgZnVuY3Rpb24gZ2VuZXJhdGVHdWlkKCkgew0KICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykgew0KICAgICAgICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDsNCiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA\/IHIgOiAociAmIDB4MyB8IDB4OCk7DQogICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEFkdFBheWxvYWQoKSB7DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBwYXlsb2FkU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FkdFBheWxvYWQnKTsNCiAgICAgICAgaWYgKHBheWxvYWRTdHIpIHsNCiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwYXlsb2FkU3RyKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBhZHRQYXlsb2FkJywgZSk7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFkdFBheWxvYWQoKSB7DQogICAgICBsZXQgcGF5bG9hZCA9IGdldEFkdFBheWxvYWQoKTsNCg0KICAgICAgaWYgKCFwYXlsb2FkKSB7DQogICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7DQogICAgICAgIGNvbnN0IGdjbGlkID0gdXJsUGFyYW1zLmdldCgnZ2NsaWQnKSB8fCBudWxsOw0KICAgICAgICBjb25zdCBtc2Nsa2lkID0gdXJsUGFyYW1zLmdldCgnbXNjbGtpZCcpIHx8IG51bGw7DQoNCiAgICAgICAgcGF5bG9hZCA9IHsNCiAgICAgICAgICBDbGllbnRSZWZlcmVuY2VJZDogZ2VuZXJhdGVHdWlkKCksDQogICAgICAgICAgR2NsaWQ6IGdjbGlkLA0KICAgICAgICAgIE1zQ2xraWQ6IG1zY2xraWQsDQogICAgICAgICAgTGFuZGluZ1BhZ2VVcmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmDQogICAgICAgIH07DQoNCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FkdFBheWxvYWQnLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7DQogICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIGFkdFBheWxvYWQgaW4gbG9jYWxTdG9yYWdlOicsIHBheWxvYWQpOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgZmV0Y2goRU5EUE9JTlRfQURfVFJBQ0tJTkcsIHsNCiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLA0KICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sDQogICAgICAgICAgICAvLyBTZW5kIGNyZWRlbnRpYWxzIHNvIHRoZSBzZXJ2ZXItc2V0IGZpcnN0LXBhcnR5IHJhbV92aWQgY29va2llIChrZXllZCB0byB0aGlzIHNhbWUNCiAgICAgICAgICAgIC8vIENsaWVudFJlZmVyZW5jZUlkKSBpcyBzdG9yZWQg4oCUIGl0IGxldHMgdGhlIHBvcnRhbCBicmlkZ2UgcmVzb2x2ZSB0aGlzIHJvdyBhZnRlciBsb2dpbi4NCiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsDQogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKQ0KICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7DQogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBRFQgQVBJIGNhbGwgZmFpbGVkOicsIGVycik7DQogICAgICAgICAgfSk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2VuZCBBRFQgcmVxdWVzdDonLCBlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICByZXR1cm4gcGF5bG9hZDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRNZXRhVHJhY2tpbmdQYXJhbXMoKSB7DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7DQogICAgICAgIGxldCBmYnAgPSBudWxsOw0KICAgICAgICBsZXQgZmJjID0gbnVsbDsNCg0KICAgICAgICBmb3IgKGxldCBjb29raWUgb2YgY29va2llcykgew0KICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBjb29raWUudHJpbSgpLnNwbGl0KCc9Jyk7DQogICAgICAgICAgaWYgKG5hbWUgPT09ICdfZmJwJykgZmJwID0gdmFsdWU7DQogICAgICAgICAgaWYgKG5hbWUgPT09ICdfZmJjJykgZmJjID0gdmFsdWU7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4geyBmYnAsIGZiYyB9Ow0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IE1ldGEgdHJhY2tpbmcgcGFyYW1zOicsIGUpOw0KICAgICAgICByZXR1cm4geyBmYnA6IG51bGwsIGZiYzogbnVsbCB9Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFzeW5jIGZ1bmN0aW9uIHRyYWNrQWRDb252ZXJzaW9uKGNsaWVudFJlZmVyZW5jZUlkLCBwbGFuVHlwZSkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgY29uc3QgYWR0UGF5bG9hZCA9IGdldEFkdFBheWxvYWQoKTsNCiAgICAgICAgY29uc3QgbWV0YVBhcmFtcyA9IGdldE1ldGFUcmFja2luZ1BhcmFtcygpOw0KICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOw0KICAgICAgICBjb25zdCBtZXRhQ2xpY2tJZCA9IHVybFBhcmFtcy5nZXQoJ2ZiY2xpZCcpIHx8IG51bGw7DQoNCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsNCiAgICAgICAgICBjbGllbnRSZWZlcmVuY2VJZDogY2xpZW50UmVmZXJlbmNlSWQsDQogICAgICAgICAgR2NsaWQ6IGFkdFBheWxvYWQ\/LkdjbGlkIHx8IG51bGwsDQogICAgICAgICAgTXNDbGtpZDogYWR0UGF5bG9hZD8uTXNDbGtpZCB8fCBudWxsLA0KICAgICAgICAgIExhbmRpbmdQYWdlVXJsOiBhZHRQYXlsb2FkPy5MYW5kaW5nUGFnZVVybCB8fCBudWxsLA0KICAgICAgICAgIE9yaWdpbmFsQ2xpZW50UmVmZXJlbmNlSWQ6IGFkdFBheWxvYWQ\/LkNsaWVudFJlZmVyZW5jZUlkIHx8IG51bGwsDQogICAgICAgICAgbWV0YUNsaWNrSWQ6IG1ldGFDbGlja0lkLA0KICAgICAgICAgIG1ldGFGYnA6IG1ldGFQYXJhbXMuZmJwLA0KICAgICAgICAgIG1ldGFGYmM6IG1ldGFQYXJhbXMuZmJjLA0KICAgICAgICAgIHBsYW5UeXBlOiBwbGFuVHlwZQ0KICAgICAgICB9Ow0KDQogICAgICAgIGZldGNoKEVORFBPSU5UX0FEX1RSQUNLSU5HLCB7DQogICAgICAgICAgbWV0aG9kOiAnUE9TVCcsDQogICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sDQogICAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywNCiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKQ0KICAgICAgICB9KS5jYXRjaChlcnIgPT4gew0KICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FkIHRyYWNraW5nIGZhaWxlZDonLCBlcnIpOw0KICAgICAgICB9KTsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignQWQgdHJhY2tpbmcgZXJyb3I6JywgZSk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBBVkFJTEFCSUxJVFkgRlVOQ1RJT05TDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIC8vIE1vc3QgcmVjZW50IGF2YWlsYWJpbGl0eSBwYXlsb2FkIGZyb20gdGhlIEFQSSwga2VwdCBzbyB3ZSBjYW4gcmUtZGVyaXZlIHRoZQ0KICAgIC8vIHNlbGVjdGVkIGRhdGFjZW50ZXIncyBjb3VudHMgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBsb2NhdGlvbiB3aXRob3V0IHJlLWZldGNoaW5nLg0KICAgIGxldCBsYXN0QXZhaWxhYmlsaXR5UGF5bG9hZCA9IG51bGw7DQoNCiAgICAvLyBGbGlwcyB0cnVlIG9uY2UgdGhlIHJlYWwgY2FyZHMgaGF2ZSBiZWVuIHJlbmRlcmVkIGF0IGxlYXN0IG9uY2UgKGF2YWlsYWJpbGl0eQ0KICAgIC8vIHJlc29sdmVkIG9yIHRoZSBzYWZldHkgdGltZW91dCBmaXJlZCkuIFVzZWQgdG8gc3dhcCBvdXQgdGhlIHNrZWxldG9uIGxvYWRlcnMuDQogICAgbGV0IGF2YWlsYWJpbGl0eUFwcGxpZWQgPSBmYWxzZTsNCg0KICAgIC8vIFB1bGwgdGhlIGNvdW50cyBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRhY2VudGVyIG91dCBvZiB0aGUgcGF5bG9hZCBhbmQNCiAgICAvLyB1cGRhdGUgdGhlIGdsb2JhbCBhdmFpbGFiaWxpdHkgc3RhdGUuIEZhbGxzIGJhY2sgdG8gImV2ZXJ5dGhpbmcgYXZhaWxhYmxlIiB3aGVuDQogICAgLy8gdGhlIHBheWxvYWQgZG9lc24ndCBpbmNsdWRlIHRoZSBzZWxlY3RlZCBEQyAoZS5nLiBiZWZvcmUgdGhlIEFQSSBjYWxsIGhhcyBjb21lIGJhY2spLg0KICAgIGZ1bmN0aW9uIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpIHsNCiAgICAgIGNvbnN0IGJhY2tlbmRLZXkgPSBMT0NBVElPTlNbc2VsZWN0ZWRMb2NhdGlvbl0\/LmJhY2tlbmRLZXk7DQogICAgICBjb25zdCBkYyA9IGxhc3RBdmFpbGFiaWxpdHlQYXlsb2FkPy5kYXRhY2VudGVycz8uZmluZChkID0+IGQubG9jYXRpb24gPT09IGJhY2tlbmRLZXkpOw0KDQogICAgICAvLyBFeHRlcm5hbC1kcml2ZSBhZGQtb25zICg1MTIgR0IgLyA3NjggR0IgdG90YWwpIGFyZSBvbmx5IHN0b2NrZWQgaW4gQ3lwcnVzLCBzbyB0aGVpcg0KICAgICAgLy8gYXZhaWxhYmlsaXR5IGlzIGFsd2F5cyByZWFkIGZyb20gQ3lwcnVzIHJlZ2FyZGxlc3Mgb2YgdGhlIGdlby1yb3V0ZWQgZGF0YWNlbnRlci4gVGhpcyBsZXRzDQogICAgICAvLyB2aXNpdG9ycyByb3V0ZWQgdG8gSW5kaWEgc3RpbGwgcGljayBhIGRyaXZlIGFkZC1vbiAoZnVsZmlsbGVkIGZyb20gQ3lwcnVzLCBzZWUgaGFuZGxlQ2hlY2tvdXQpLg0KICAgICAgY29uc3QgY3lwcnVzRGMgPSBsYXN0QXZhaWxhYmlsaXR5UGF5bG9hZD8uZGF0YWNlbnRlcnM\/LmZpbmQoZCA9PiBkLmxvY2F0aW9uID09PSBMT0NBVElPTlMuY3lwcnVzLmJhY2tlbmRLZXkpOw0KDQogICAgICBpZiAoZGMpIHsNCiAgICAgICAgY3VycmVudEF2YWlsYWJsZURldmljZXMgPSBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlcyA\/PyAwKTsNCiAgICAgICAgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gTnVtYmVyKGRjLmRhaWx5UGxhbkF2YWlsYWJpbGl0eVRocmVzaG9sZCA\/PyAzKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vIE5vIGRhdGEgZm9yIHRoaXMgREMgeWV0IOKAlCBrZWVwIGRlZmF1bHRzIHNvIG5vdGhpbmcgYXBwZWFycyBhcnRpZmljaWFsbHkgb3V0IG9mIHN0b2NrLg0KICAgICAgICBjdXJyZW50QXZhaWxhYmxlRGV2aWNlcyA9IDk5OTsNCiAgICAgICAgZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkID0gMzsNCiAgICAgIH0NCg0KICAgICAgaWYgKGN5cHJ1c0RjKSB7DQogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA9IE51bWJlcihjeXBydXNEYy5hdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPz8gMCk7DQogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9IE51bWJlcihjeXBydXNEYy5hdmFpbGFibGVEZXZpY2VzV2l0aDUxMkdiRHJpdmUgPz8gMCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPSA5OTk7DQogICAgICAgIGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9IDk5OTsNCiAgICAgIH0NCg0KDQogICAgICByZW5kZXJDeWNsZVRhYnMoKTsNCiAgICAgIHJlbmRlclN0b3JhZ2VPcHRpb25zKCk7DQogICAgICB1cGRhdGVQcmljZURpc3BsYXkoKTsNCiAgICAgIHVwZGF0ZUN0YUJ1dHRvblN0YXRlKCk7DQogICAgICBhdmFpbGFiaWxpdHlBcHBsaWVkID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaEF2YWlsYWJpbGl0eVN0YXR1cygpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goRU5EUE9JTlRfU1RBVFVTLCB7IG1ldGhvZDogIkdFVCIgfSk7DQogICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsNCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyBBUEkgcmVzcG9uZGVkIHdpdGggJHtyZXNwb25zZS5zdGF0dXN9YCk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZD8uZGF0YWNlbnRlcnMpKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0dXMgQVBJIHJldHVybmVkIGFuIGludmFsaWQgcGF5bG9hZCIpOw0KICAgICAgICB9DQoNCiAgICAgICAgbGFzdEF2YWlsYWJpbGl0eVBheWxvYWQgPSBwYXlsb2FkOw0KICAgICAgICBhcHBseUdlb0RhdGFjZW50ZXIoKTsgLy8gY2FwYWNpdHkgZmFsbGJhY2sgbm93IHRoYXQgcGVyLURDIHN0b2NrIGlzIGtub3duDQogICAgICAgIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpOw0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGF2YWlsYWJpbGl0eSBzdGF0dXMiLCBlcnJvcik7DQogICAgICAgIC8vIE9uIGVycm9yLCBrZWVwIGV2ZXJ5dGhpbmcgYXZhaWxhYmxlIC0gdGhlIEFQSSBuZXZlciBleHBsaWNpdGx5IHNhaWQgYW55dGhpbmcgd2FzIHVuYXZhaWxhYmxlLg0KICAgICAgICBsYXN0QXZhaWxhYmlsaXR5UGF5bG9hZCA9IG51bGw7DQogICAgICAgIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUN0YUJ1dHRvblN0YXRlKCkgew0KICAgICAgY29uc3QgY3RhQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N0YUJ1dHRvbicpOw0KDQogICAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgYmFzZWQgb24gc2VsZWN0ZWQgc3RvcmFnZSBvcHRpb24NCiAgICAgIGxldCBpc1NlbGVjdGVkU3RvcmFnZU91dE9mU3RvY2sgPSBmYWxzZTsNCiAgICAgIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdiYXNlJykgew0KICAgICAgICBpc1NlbGVjdGVkU3RvcmFnZU91dE9mU3RvY2sgPSBjdXJyZW50QXZhaWxhYmxlRGV2aWNlcyA9PT0gMDsNCiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRTdG9yYWdlID09PSAnYWRkb24yNTYnKSB7DQogICAgICAgIGlzU2VsZWN0ZWRTdG9yYWdlT3V0T2ZTdG9jayA9IGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA9PT0gMDsNCiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRTdG9yYWdlID09PSAnYWRkb241MTInKSB7DQogICAgICAgIGlzU2VsZWN0ZWRTdG9yYWdlT3V0T2ZTdG9jayA9IGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9PT0gMDsNCiAgICAgIH0NCg0KICAgICAgLy8gQ2hlY2sgaWYgZGFpbHkgcGxhbiBpcyBzZWxlY3RlZCBidXQgbm90IGVub3VnaCBkZXZpY2VzIGF2YWlsYWJsZQ0KICAgICAgY29uc3QgaXNEYWlseVBsYW5VbmF2YWlsYWJsZSA9IHNlbGVjdGVkQ3ljbGUgPT09ICdkYWlseScgJiYgZ2V0VG90YWxBdmFpbGFibGVEZXZpY2VzKCkgPD0gZGFpbHlQbGFuQXZhaWxhYmlsaXR5VGhyZXNob2xkOw0KDQogICAgICBpZiAoaXNTZWxlY3RlZFN0b3JhZ2VPdXRPZlN0b2NrIHx8IGlzRGFpbHlQbGFuVW5hdmFpbGFibGUpIHsNCiAgICAgICAgY3RhQnV0dG9uLnRleHRDb250ZW50ID0gJ0pvaW4gV2FpdGxpc3QnOw0KICAgICAgICBjdGFCdXR0b24uY2xhc3NMaXN0LmFkZCgnb3V0LW9mLXN0b2NrJyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdGFCdXR0b24udGV4dENvbnRlbnQgPSAnQnV5IFBsYW4nOw0KICAgICAgICBjdGFCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnb3V0LW9mLXN0b2NrJyk7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhwcmljaW5nT3B0aW9uKSB7DQogICAgICBjdXJyZW50UHJpY2luZ09wdGlvbiA9IHByaWNpbmdPcHRpb24gIT09IHVuZGVmaW5lZCA\/IHByaWNpbmdPcHRpb24gOiBudWxsOw0KDQogICAgICAvLyBVcGRhdGUgZGlhbG9nIGNvbnRlbnQgYmFzZWQgb24gdGhlIHJlYXNvbg0KICAgICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdmFpbGFiaWxpdHlEaWFsb2dUaXRsZScpOw0KICAgICAgY29uc3QgZGVzY0VsID0gYXZhaWxhYmlsaXR5RGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ3AnKTsNCiAgICAgIGlmIChwcmljaW5nT3B0aW9uID09PSBBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5KSB7DQogICAgICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSAnRGFpbHkgcGxhbiB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSc7DQogICAgICAgIGRlc2NFbC50ZXh0Q29udGVudCA9ICdUaGUgZGFpbHkgcGxhbiBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUgZHVlIHRvIGhpZ2ggZGVtYW5kLiBXZWVrbHksIG1vbnRobHksIGFuZCBsb25nZXIgcGxhbnMgYXJlIHN0aWxsIGF2YWlsYWJsZS4gTGVhdmUgeW91ciBlbWFpbCBiZWxvdyBhbmQgd2VcdTIwMTlsbCBub3RpZnkgeW91IGFzIHNvb24gYXMgdGhlIGRhaWx5IHBsYW4gaXMgYmFjay4nOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGl0bGVFbC50ZXh0Q29udGVudCA9ICdBbGwgaW5zdGFuY2VzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkJzsNCiAgICAgICAgZGVzY0VsLnRleHRDb250ZW50ID0gJ1dlXHUyMDE5cmUgYXQgZnVsbCBjYXBhY2l0eSByaWdodCBub3csIGJ1dCB3ZSBjYW4gbGV0IHlvdSBrbm93IHRoZSBtb21lbnQgYSBNYWMgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4uIExlYXZlIHlvdXIgZW1haWwgYmVsb3cgYW5kIHlvdVx1MjAxOWxsIGJlIGZpcnN0IGluIGxpbmUgd2hlbiB3ZSBzcGluIHVwIG5ldyBpbnN0YW5jZXMuJzsNCiAgICAgIH0NCg0KICAgICAgYXZhaWxhYmlsaXR5RGlhbG9nLmNsYXNzTGlzdC5yZW1vdmUoImlzLWhpZGRlbiIpOw0KICAgICAgYXZhaWxhYmlsaXR5T3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1oaWRkZW4iKTsNCiAgICAgIGF2YWlsYWJpbGl0eU92ZXJsYXkuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsICJmYWxzZSIpOw0KICAgICAgYXZhaWxhYmlsaXR5RW1haWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCkgew0KICAgICAgYXZhaWxhYmlsaXR5RGlhbG9nLmNsYXNzTGlzdC5hZGQoImlzLWhpZGRlbiIpOw0KICAgICAgYXZhaWxhYmlsaXR5T3ZlcmxheS5jbGFzc0xpc3QuYWRkKCJpcy1oaWRkZW4iKTsNCiAgICAgIGF2YWlsYWJpbGl0eU92ZXJsYXkuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsICJ0cnVlIik7DQoNCiAgICAgIGlmIChmb3JtU3VibWl0dGVkU3VjY2Vzc2Z1bGx5KSB7DQogICAgICAgIGZvcm1TdWJtaXR0ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsNCiAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gYXZhaWxhYmlsaXR5Rm9ybS5xdWVyeVNlbGVjdG9yKCJidXR0b24iKTsNCiAgICAgICAgc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gIk5vdGlmeSBtZSI7DQogICAgICAgIHN1Ym1pdEJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gIiI7DQogICAgICAgIHN1Ym1pdEJ1dHRvbi5zdHlsZS5jb2xvciA9ICIiOw0KICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay50ZXh0Q29udGVudCA9ICIiOw0KICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIGluZm8iOw0KICAgICAgfQ0KICAgICAgY3VycmVudFByaWNpbmdPcHRpb24gPSBudWxsOw0KICAgIH0NCg0KICAgIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEF2YWlsYWJpbGl0eUZvcm0oZXZlbnQpIHsNCiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoNCiAgICAgIGlmIChmb3JtU3VibWl0dGVkU3VjY2Vzc2Z1bGx5KSB7DQogICAgICAgIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKCk7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgY29uc3QgZW1haWwgPSBhdmFpbGFiaWxpdHlFbWFpbC52YWx1ZS50cmltKCk7DQogICAgICBpZiAoIWVtYWlsKSB7DQogICAgICAgIGF2YWlsYWJpbGl0eUZlZWRiYWNrLnRleHRDb250ZW50ID0gIlBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuIjsNCiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2suY2xhc3NOYW1lID0gImF2YWlsYWJpbGl0eS1mZWVkYmFjayBlcnJvciI7DQogICAgICAgIGF2YWlsYWJpbGl0eUVtYWlsLmZvY3VzKCk7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gYXZhaWxhYmlsaXR5Rm9ybS5xdWVyeVNlbGVjdG9yKCJidXR0b24iKTsNCg0KICAgICAgdHJ5IHsNCiAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSAiU2F2aW5nIHlvdXIgcmVxdWVzdC4uLiI7DQogICAgICAgIGF2YWlsYWJpbGl0eUZlZWRiYWNrLmNsYXNzTmFtZSA9ICJhdmFpbGFiaWxpdHktZmVlZGJhY2sgaW5mbyI7DQoNCiAgICAgICAgLy8gRXh0ZXJuYWwtZHJpdmUgbm90aWZpY2F0aW9ucyBhcmUgYWx3YXlzIGFib3V0IEN5cHJ1cyBzdG9jayAoZHJpdmVzIGFyZSBvbmx5IHN0b2NrZWQgdGhlcmUpLg0KICAgICAgICBjb25zdCBpc0V4dGVybmFsRHJpdmVPcHRpb24gPSBjdXJyZW50UHJpY2luZ09wdGlvbiA9PT0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5FeHRlcm5hbDI1NkdiDQogICAgICAgICAgfHwgY3VycmVudFByaWNpbmdPcHRpb24gPT09IEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuRXh0ZXJuYWw1MTJHYjsNCiAgICAgICAgY29uc3QgZGF0YWNlbnRlciA9IGlzRXh0ZXJuYWxEcml2ZU9wdGlvbg0KICAgICAgICAgID8gTE9DQVRJT05TLmN5cHJ1cy5iYWNrZW5kS2V5DQogICAgICAgICAgOiBMT0NBVElPTlNbc2VsZWN0ZWRMb2NhdGlvbl0\/LmJhY2tlbmRLZXk7DQogICAgICAgIC8vIERhaWx5IG91dC1vZi1zdG9jayBlbnRlcnMgdmlhIHRoZSBjeWNsZSB0YWIgd2l0aG91dCBjaGFuZ2luZyBzZWxlY3RlZEN5Y2xlLCBzbyBrZXkgdGhlDQogICAgICAgIC8vIERhaWx5IGNhc2Ugb2ZmIHRoZSBwcmljaW5nIG9wdGlvbjsgb3RoZXJ3aXNlIG1hcCB0aGUgc2VsZWN0ZWQgYmlsbGluZyBjeWNsZS4NCiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uVHlwZSA9IGN1cnJlbnRQcmljaW5nT3B0aW9uID09PSBBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5DQogICAgICAgICAgPyBTdWJzY3JpcHRpb25UeXBlLkRhaWx5DQogICAgICAgICAgOiBDWUNMRV9UT19TVUJTQ1JJUFRJT05fVFlQRVtzZWxlY3RlZEN5Y2xlXTsNCiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChFTkRQT0lOVF9TVUJTQ1JJQkUsIHsNCiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSwNCiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsLCBwcmljaW5nT3B0aW9uOiBjdXJyZW50UHJpY2luZ09wdGlvbiwgZGF0YWNlbnRlciwgc3Vic2NyaXB0aW9uVHlwZSB9KQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7DQogICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSdyZSBnb2luZyB0b28gZmFzdC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iKTsNCiAgICAgICAgICB9DQogICAgICAgICAgY29uc3QgZXJyb3JCb2R5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOw0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvckJvZHk\/LmVycm9yID8\/ICJTb3JyeSwgc29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIik7DQogICAgICAgIH0NCg0KICAgICAgICBhdmFpbGFiaWxpdHlFbWFpbC52YWx1ZSA9ICIiOw0KICAgICAgICBmb3JtU3VibWl0dGVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsNCiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSAiWW91J3JlIG9uIHRoZSBsaXN0ISBXZSdsbCBlbWFpbCB5b3UgdGhlIG1vbWVudCBhIE1hYyBzcGlucyB1cC4iOw0KICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIHN1Y2Nlc3MiOw0KDQogICAgICAgIHN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9ICJDbG9zZSI7DQogICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICBzdWJtaXRCdXR0b24uc3R5bGUuYmFja2dyb3VuZCA9ICJyZ2JhKDI1NSwyNTUsMjU1LC4xKSI7DQogICAgICAgIHN1Ym1pdEJ1dHRvbi5zdHlsZS5jb2xvciA9ICJ2YXIoLS10ZXh0KSI7DQogICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay50ZXh0Q29udGVudCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogIlNvcnJ5LCBzb21ldGhpbmcgd2VudCB3cm9uZy4iOw0KICAgICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjay5jbGFzc05hbWUgPSAiYXZhaWxhYmlsaXR5LWZlZWRiYWNrIGVycm9yIjsNCiAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBHT09HTEUgUkVWSUVXUyBDT05GSUdVUkFUSU9ODQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGNvbnN0IFJFVklFV1NfQ09ORklHID0gew0KICAgICAgLy8gR29vZ2xlIE1hcHMgVVJMIGZvciAiUmVhZCBhbGwgcmV2aWV3cyIgbGluaw0KICAgICAgZ29vZ2xlTWFwc1VybDogJ2h0dHBzOi8vbWFwcy5hcHAuZ29vLmdsL3Y1NWVkS0Q3SzJnZVBoVGg5JywNCg0KICAgICAgLy8gUmV2aWV3cyBkYXRhIC0gVXBkYXRlIHRoZXNlIG1hbnVhbGx5IHdoZW4gbmV3IHJldmlld3MgY29tZSBpbg0KICAgICAgZmFsbGJhY2tEYXRhOiB7DQogICAgICAgIHJhdGluZzogNS4wLA0KICAgICAgICB0b3RhbFJldmlld3M6IDI4LA0KICAgICAgICByZXZpZXdzOiBbDQogICAgICAgICAgew0KICAgICAgICAgICAgYXV0aG9yX25hbWU6ICJBaG1lZCBNb25zZWYiLA0KICAgICAgICAgICAgcmF0aW5nOiA1LA0KICAgICAgICAgICAgdGV4dDogIkV4Y2VsbGVudCBzZXJ2aWNlIGluIGV2ZXJ5IGFzcGVjdC4gUmVzcG9uc2UgdGltZSBpcyBvdXRzdGFuZGluZywgYW5kIHRoZSB0ZWNobmljYWwgc3VwcG9ydCB0ZWFtIGlzIHZlcnkgY29vcGVyYXRpdmUgYW5kIGZvbGxvd3MgdXAgdW50aWwgdGhlIGlzc3VlIGlzIGNvbXBsZXRlbHkgcmVzb2x2ZWQuIEFueSBpbnF1aXJ5IG9yIHByb2JsZW0gaXMgaGFuZGxlZCB3aXRoIHByb2Zlc3Npb25hbGlzbSBhbmQgZ3JlYXQgY2FyZS4gQSBzbW9vdGggZXhwZXJpZW5jZSBhbmQgdHJ1bHkgZXhjZXB0aW9uYWwgc2VydmljZSDigJQgaGlnaGx5IHJlY29tbWVuZGVkIHdpdGhvdXQgaGVzaXRhdGlvbi4iLA0KICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogIjYgZGF5cyBhZ28iLA0KICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiRWxlbmEgU2FsYWRpbmkiLA0KICAgICAgICAgICAgcmF0aW5nOiA1LA0KICAgICAgICAgICAgdGV4dDogIkdyZWF0IGFuZCB2ZXJ5IGhlbHBmdWwgc2VydmljZSEgVGhhbmsgeW91LiIsDQogICAgICAgICAgICByZWxhdGl2ZV90aW1lX2Rlc2NyaXB0aW9uOiAiYSB3ZWVrIGFnbyIsDQogICAgICAgICAgICBwcm9maWxlX3Bob3RvX3VybDogbnVsbA0KICAgICAgICAgIH0sDQogICAgICAgICAgew0KICAgICAgICAgICAgYXV0aG9yX25hbWU6ICJFbWFtYSBTaGFrZXJ5IiwNCiAgICAgICAgICAgIHJhdGluZzogNSwNCiAgICAgICAgICAgIHRleHQ6ICJTdXBlciBlYXN5IHRvIHJlbnQgYSBNYWMhIEZhc3QgZGVsaXZlcnkgYW5kIGdyZWF0IGNvbmRpdGlvbi4gSGlnaGx5IHJlY29tbWVuZCIsDQogICAgICAgICAgICByZWxhdGl2ZV90aW1lX2Rlc2NyaXB0aW9uOiAiMiB3ZWVrcyBhZ28iLA0KICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiTWFsYWsgQWx3YXplZXIiLA0KICAgICAgICAgICAgcmF0aW5nOiA1LA0KICAgICAgICAgICAgdGV4dDogIkdyZWF0IHByaWNpbmcsIGVhc3kgc2V0dXAsIGFuZCBvdXRzdGFuZGluZyBjdXN0b21lciBjb21tdW5pY2F0aW9uLiBTdXBwb3J0IHdhcyBmYXN0IGFuZCB2ZXJ5IGhlbHBmdWwuIEhpZ2hseSByZWNvbW1lbmRlZCEiLA0KICAgICAgICAgICAgcmVsYXRpdmVfdGltZV9kZXNjcmlwdGlvbjogIjIgd2Vla3MgYWdvIiwNCiAgICAgICAgICAgIHByb2ZpbGVfcGhvdG9fdXJsOiBudWxsDQogICAgICAgICAgfSwNCiAgICAgICAgICB7DQogICAgICAgICAgICBhdXRob3JfbmFtZTogIlN1bWFuIiwNCiAgICAgICAgICAgIHJhdGluZzogNSwNCiAgICAgICAgICAgIHRleHQ6ICJUaGUgcGVyZm9ybWFuY2UgYXJlIGF3ZXNvbWUgb2YgdGhlIG1hYy4gQW5kIGkgbmV2ZXIgZmFjZSBhbnkgaXNzdWUgb24gb25saW5lIG1hYyBydW5uaW5nIG9uIGNsb3VkLiBUaGUgYmVzdCBwYXJ0IGlzIGl0J3MgYWZmb3JkYWJsZSBmb3IgbWUgdG8gY29kZSBvbiBtYWMgZnJvbSBteSBXaW5kb3dzIHBjLiIsDQogICAgICAgICAgICByZWxhdGl2ZV90aW1lX2Rlc2NyaXB0aW9uOiAiNCB3ZWVrcyBhZ28iLA0KICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGF1dGhvcl9uYW1lOiAiSGFzc2FuIEFMLU9yYWliaSIsDQogICAgICAgICAgICByYXRpbmc6IDUsDQogICAgICAgICAgICB0ZXh0OiAiR3JlYXQgc2VydmljZSB3aXRoIGV4Y2VsbGVudCBzdXBwb3J0LiBUaGUgTWFjIE1pbmkgTTQgcnVucyBzbW9vdGhseSBhbmQgdGhlIHNldHVwIHdhcyBxdWljay4gSGlnaGx5IHJlY29tbWVuZGVkIGZvciBkZXZlbG9wZXJzISIsDQogICAgICAgICAgICByZWxhdGl2ZV90aW1lX2Rlc2NyaXB0aW9uOiAiYSBtb250aCBhZ28iLA0KICAgICAgICAgICAgcHJvZmlsZV9waG90b191cmw6IG51bGwNCiAgICAgICAgICB9DQogICAgICAgIF0NCiAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBSRVZJRVdTIENBUk9VU0VMDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGxldCByZXZpZXdzRGF0YSA9IG51bGw7DQogICAgbGV0IGN1cnJlbnRSZXZpZXdTbGlkZSA9IDA7DQoNCiAgICBmdW5jdGlvbiBnZW5lcmF0ZVN0YXJzSHRtbChyYXRpbmcsIHNpemUgPSAxNikgew0KICAgICAgbGV0IGh0bWwgPSAnJzsNCiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDU7IGkrKykgew0KICAgICAgICBpZiAoaSA8PSByYXRpbmcpIHsNCiAgICAgICAgICBodG1sICs9IGA8c3ZnIHdpZHRoPSIke3NpemV9IiBoZWlnaHQ9IiR7c2l6ZX0iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZCQkMwNCI+PHBhdGggZD0iTTEyIDJsMy4wOSA2LjI2TDIyIDkuMjdsLTUgNC44NyAxLjE4IDYuODhMMTIgMTcuNzdsLTYuMTggMy4yNUw3IDE0LjE0IDIgOS4yN2w2LjkxLTEuMDFMMTIgMnoiLz48L3N2Zz5gOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGh0bWwgKz0gYDxzdmcgd2lkdGg9IiR7c2l6ZX0iIGhlaWdodD0iJHtzaXplfSIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMikiPjxwYXRoIGQ9Ik0xMiAybDMuMDkgNi4yNkwyMiA5LjI3bC01IDQuODcgMS4xOCA2Ljg4TDEyIDE3Ljc3bC02LjE4IDMuMjVMNyAxNC4xNCAyIDkuMjdsNi45MS0xLjAxTDEyIDJ6Ii8+PC9zdmc+YDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGh0bWw7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UmVsYXRpdmVUaW1lKHRpbWVzdGFtcCkgew0KICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7DQogICAgICBjb25zdCBkaWZmID0gbm93IC0gdGltZXN0YW1wOw0KDQogICAgICBpZiAoZGlmZiA8IDg2NDAwKSByZXR1cm4gJ1RvZGF5JzsNCiAgICAgIGlmIChkaWZmIDwgODY0MDAgKiAyKSByZXR1cm4gJ1llc3RlcmRheSc7DQogICAgICBpZiAoZGlmZiA8IDg2NDAwICogNykgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZiAvIDg2NDAwKX0gZGF5cyBhZ29gOw0KICAgICAgaWYgKGRpZmYgPCA4NjQwMCAqIDMwKSByZXR1cm4gYCR7TWF0aC5mbG9vcihkaWZmIC8gKDg2NDAwICogNykpfSB3ZWVrcyBhZ29gOw0KICAgICAgaWYgKGRpZmYgPCA4NjQwMCAqIDM2NSkgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZiAvICg4NjQwMCAqIDMwKSl9IG1vbnRocyBhZ29gOw0KICAgICAgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZiAvICg4NjQwMCAqIDM2NSkpfSB5ZWFycyBhZ29gOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEluaXRpYWxzKG5hbWUpIHsNCiAgICAgIHJldHVybiBuYW1lLnNwbGl0KCcgJykubWFwKG4gPT4gblswXSkuam9pbignJykudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMCwgMik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyUmV2aWV3Q2FyZChyZXZpZXcpIHsNCiAgICAgIGNvbnN0IGluaXRpYWxzID0gZ2V0SW5pdGlhbHMocmV2aWV3LmF1dGhvcl9uYW1lKTsNCiAgICAgIGNvbnN0IHJlbGF0aXZlVGltZSA9IHJldmlldy5yZWxhdGl2ZV90aW1lX2Rlc2NyaXB0aW9uIHx8IGdldFJlbGF0aXZlVGltZShyZXZpZXcudGltZSk7DQoNCiAgICAgIHJldHVybiBgDQogICAgICAgIDxkaXYgY2xhc3M9InJldmlldy1jYXJkIj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXctaGVhZGVyIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJldmlld2VyLWF2YXRhciI+DQogICAgICAgICAgICAgICR7cmV2aWV3LnByb2ZpbGVfcGhvdG9fdXJsDQogICAgICAgICAgICAgICAgPyBgPGltZyBzcmM9IiR7cmV2aWV3LnByb2ZpbGVfcGhvdG9fdXJsfSIgYWx0PSIke3Jldmlldy5hdXRob3JfbmFtZX0iIC8+YA0KICAgICAgICAgICAgICAgIDogaW5pdGlhbHMNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXdlci1pbmZvIj4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmV2aWV3ZXItbmFtZSI+JHtyZXZpZXcuYXV0aG9yX25hbWV9PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXctc3RhcnMiPg0KICAgICAgICAgICAgJHtnZW5lcmF0ZVN0YXJzSHRtbChyZXZpZXcucmF0aW5nKX0NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXctdGV4dCI+JHtyZXZpZXcudGV4dH08L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXZpZXctZ29vZ2xlLWljb24iPg0KICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGhlaWdodD0iMTgiPg0KICAgICAgICAgICAgICA8cGF0aCBmaWxsPSIjNDI4NUY0IiBkPSJNMjIuNTYgMTIuMjVjMC0uNzgtLjA3LTEuNTMtLjItMi4yNUgxMnY0LjI2aDUuOTJjLS4yNiAxLjM3LTEuMDQgMi41My0yLjIxIDMuMzF2Mi43N2gzLjU3YzIuMDgtMS45MiAzLjI4LTQuNzQgMy4yOC04LjA5eiIvPg0KICAgICAgICAgICAgICA8cGF0aCBmaWxsPSIjMzRBODUzIiBkPSJNMTIgMjNjMi45NyAwIDUuNDYtLjk4IDcuMjgtMi42NmwtMy41Ny0yLjc3Yy0uOTguNjYtMi4yMyAxLjA2LTMuNzEgMS4wNi0yLjg2IDAtNS4yOS0xLjkzLTYuMTYtNC41M0gyLjE4djIuODRDMy45OSAyMC41MyA3LjcgMjMgMTIgMjN6Ii8+DQogICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+DQogICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Ik0xMiA1LjM4YzEuNjIgMCAzLjA2LjU2IDQuMjEgMS42NGwzLjE1LTMuMTVDMTcuNDUgMi4wOSAxNC45NyAxIDEyIDEgNy43IDEgMy45OSAzLjQ3IDIuMTggNy4wN2wzLjY2IDIuODRjLjg3LTIuNiAzLjMtNC41MyA2LjE2LTQuNTN6Ii8+DQogICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbmRlclJldmlld3MoZGF0YSkgew0KICAgICAgcmV2aWV3c0RhdGEgPSBkYXRhOw0KDQogICAgICAvLyBVcGRhdGUgc3VtbWFyeSAoc21hbGxlciBzdGFycyBmb3IgaGVhZGVyKQ0KICAgICAgY29uc3QgYXZnUmF0aW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZnUmF0aW5nJyk7DQogICAgICBjb25zdCBhdmdTdGFyc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2Z1N0YXJzJyk7DQogICAgICBjb25zdCBjYXJvdXNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdzQ2Fyb3VzZWwnKTsNCg0KICAgICAgaWYgKCFhdmdSYXRpbmdFbCB8fCAhYXZnU3RhcnNFbCB8fCAhY2Fyb3VzZWwpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignUmVudGFNYWMgUHJpY2luZzogUmV2aWV3cyBlbGVtZW50cyBub3QgZm91bmQnKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KDQogICAgICBhdmdSYXRpbmdFbC50ZXh0Q29udGVudCA9IGRhdGEucmF0aW5nLnRvRml4ZWQoMSk7DQogICAgICBhdmdTdGFyc0VsLmlubmVySFRNTCA9IGdlbmVyYXRlU3RhcnNIdG1sKE1hdGgucm91bmQoZGF0YS5yYXRpbmcpLCAxOCk7DQoNCiAgICAgIC8vIFJlbmRlciByZXZpZXcgY2FyZHMgKGR1cGxpY2F0ZSBmb3IgaW5maW5pdGUgc2Nyb2xsKQ0KICAgICAgY29uc3QgcmV2aWV3c0h0bWwgPSBkYXRhLnJldmlld3MubWFwKHJlbmRlclJldmlld0NhcmQpLmpvaW4oJycpOw0KICAgICAgLy8gRHVwbGljYXRlIHJldmlld3MgZm9yIHNlYW1sZXNzIGluZmluaXRlIHNjcm9sbA0KICAgICAgY2Fyb3VzZWwuaW5uZXJIVE1MID0gcmV2aWV3c0h0bWwgKyByZXZpZXdzSHRtbDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBsb2FkR29vZ2xlUmV2aWV3cygpIHsNCiAgICAgIC8vIExvYWQgcmV2aWV3cyBmcm9tIGNvbmZpZw0KICAgICAgcmVuZGVyUmV2aWV3cyhSRVZJRVdTX0NPTkZJRy5mYWxsYmFja0RhdGEpOw0KICAgIH0NCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgLy8gRU5URVJQUklTRSBQUklDSU5HIENBTENVTEFUT1INCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogICAgbGV0IHF1YW50aXR5U2xpZGVyLCBkdXJhdGlvblNsaWRlciwgcXVhbnRpdHlWYWx1ZSwgZHVyYXRpb25WYWx1ZSwNCiAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLCBkdXJhdGlvbkRpc2NvdW50QmFkZ2UsIGVudGVycHJpc2VQcmljZSwNCiAgICAgICAgZGlzY291bnRCYWRnZUVsLCBwcmljZUJyZWFrZG93bkVudGVycHJpc2UsIG5vbkN1bXVsYXRpdmVOb3RpY2U7DQoNCiAgICBjb25zdCBCQVNFX1BSSUNFX1BFUl9NT05USCA9IDk5Ow0KICAgIGxldCBwcmV2aW91c1F1YW50aXR5RGlzY291bnQgPSAwOw0KICAgIGxldCBwcmV2aW91c1RpbWVEaXNjb3VudCA9IDA7DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVFbnRlcnByaXNlUHJpY2UoKSB7DQogICAgICBpZiAoIXF1YW50aXR5U2xpZGVyIHx8ICFkdXJhdGlvblNsaWRlcikgcmV0dXJuOw0KDQogICAgICBjb25zdCBxdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5U2xpZGVyLnZhbHVlKTsNCiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGFyc2VJbnQoZHVyYXRpb25TbGlkZXIudmFsdWUpOw0KDQogICAgICAvLyBEZXRlcm1pbmUgcHJpY2UgcGVyIG1vbnRoIGJhc2VkIG9uIGR1cmF0aW9uDQogICAgICBsZXQgcHJpY2VQZXJNb250aCA9IEJBU0VfUFJJQ0VfUEVSX01PTlRIOw0KICAgICAgbGV0IHRpbWVEaXNjb3VudCA9IDA7DQoNCiAgICAgIGlmIChkdXJhdGlvbiA+PSAzICYmIGR1cmF0aW9uIDwgNikgew0KICAgICAgICAvLyAzLTUgbW9udGhzOiBNYXRjaCAzLW1vbnRoIHBsYW4gcHJpY2luZyAoJDI4MiAvIDMgPSAkOTQuMDAvbW9udGgpDQogICAgICAgIHByaWNlUGVyTW9udGggPSAyODIgLyAzOw0KICAgICAgICB0aW1lRGlzY291bnQgPSAwLjA1Ow0KICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA+PSA2KSB7DQogICAgICAgIC8vIDYrIG1vbnRoczogTWF0Y2ggNi1tb250aCBwbGFuIHByaWNpbmcgKCQ1MzUgLyA2ID0gJDg5LjE3L21vbnRoKQ0KICAgICAgICBwcmljZVBlck1vbnRoID0gNTM1IC8gNjsNCiAgICAgICAgdGltZURpc2NvdW50ID0gMC4xMDsNCiAgICAgIH0NCg0KICAgICAgLy8gQ2FsY3VsYXRlIHF1YW50aXR5LWJhc2VkIGRpc2NvdW50DQogICAgICBsZXQgcXVhbnRpdHlEaXNjb3VudCA9IDA7DQogICAgICBpZiAocXVhbnRpdHkgPj0gNSAmJiBxdWFudGl0eSA8PSAxNCkgew0KICAgICAgICBxdWFudGl0eURpc2NvdW50ID0gMC4wNTsgLy8gNSUgZGlzY291bnQNCiAgICAgIH0gZWxzZSBpZiAocXVhbnRpdHkgPj0gMTUpIHsNCiAgICAgICAgcXVhbnRpdHlEaXNjb3VudCA9IDAuMTA7IC8vIDEwJSBkaXNjb3VudA0KICAgICAgfQ0KDQogICAgICAvLyBBcHBseSB0aGUgaGlnaGVyIGRpc2NvdW50DQogICAgICBsZXQgZmluYWxQcmljZVBlck1vbnRoID0gcHJpY2VQZXJNb250aDsNCiAgICAgIGxldCBhcHBsaWVkRGlzY291bnQgPSB0aW1lRGlzY291bnQ7DQoNCiAgICAgIGlmIChxdWFudGl0eURpc2NvdW50ID4gdGltZURpc2NvdW50KSB7DQogICAgICAgIGZpbmFsUHJpY2VQZXJNb250aCA9IEJBU0VfUFJJQ0VfUEVSX01PTlRIICogKDEgLSBxdWFudGl0eURpc2NvdW50KTsNCiAgICAgICAgYXBwbGllZERpc2NvdW50ID0gcXVhbnRpdHlEaXNjb3VudDsNCiAgICAgIH0NCg0KICAgICAgLy8gVXBkYXRlIHF1YW50aXR5IGRpc2NvdW50IGJhZGdlDQogICAgICBpZiAocXVhbnRpdHlEaXNjb3VudCA+IDApIHsNCiAgICAgICAgY29uc3QgcXVhbnRpdHlQZXJjZW50ID0gTWF0aC5yb3VuZChxdWFudGl0eURpc2NvdW50ICogMTAwKTsNCiAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLnRleHRDb250ZW50ID0gcXVhbnRpdHlQZXJjZW50ICsgIiUgT0ZGIjsNCiAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOw0KDQogICAgICAgIGlmIChxdWFudGl0eURpc2NvdW50ICE9PSBwcmV2aW91c1F1YW50aXR5RGlzY291bnQpIHsNCiAgICAgICAgICBxdWFudGl0eURpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7DQogICAgICAgICAgdm9pZCBxdWFudGl0eURpc2NvdW50QmFkZ2Uub2Zmc2V0V2lkdGg7DQogICAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5hZGQoImJvdW5jZSIpOw0KICAgICAgICAgIHF1YW50aXR5VmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7DQogICAgICAgICAgdm9pZCBxdWFudGl0eVZhbHVlLm9mZnNldFdpZHRoOw0KICAgICAgICAgIHF1YW50aXR5VmFsdWUuY2xhc3NMaXN0LmFkZCgiYm91bmNlIik7DQoNCiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgIHF1YW50aXR5RGlzY291bnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsNCiAgICAgICAgICAgIHF1YW50aXR5VmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgiYm91bmNlIik7DQogICAgICAgICAgfSwgNjAwKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpOw0KICAgICAgfQ0KDQogICAgICAvLyBVcGRhdGUgZHVyYXRpb24gZGlzY291bnQgYmFkZ2UNCiAgICAgIGlmICh0aW1lRGlzY291bnQgPiAwKSB7DQogICAgICAgIGNvbnN0IHRpbWVQZXJjZW50ID0gTWF0aC5yb3VuZCh0aW1lRGlzY291bnQgKiAxMDApOw0KICAgICAgICBkdXJhdGlvbkRpc2NvdW50QmFkZ2UudGV4dENvbnRlbnQgPSB0aW1lUGVyY2VudCArICIlIE9GRiI7DQogICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTsNCg0KICAgICAgICBpZiAodGltZURpc2NvdW50ICE9PSBwcmV2aW91c1RpbWVEaXNjb3VudCkgew0KICAgICAgICAgIGR1cmF0aW9uRGlzY291bnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsNCiAgICAgICAgICB2b2lkIGR1cmF0aW9uRGlzY291bnRCYWRnZS5vZmZzZXRXaWR0aDsNCiAgICAgICAgICBkdXJhdGlvbkRpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LmFkZCgiYm91bmNlIik7DQogICAgICAgICAgZHVyYXRpb25WYWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsNCiAgICAgICAgICB2b2lkIGR1cmF0aW9uVmFsdWUub2Zmc2V0V2lkdGg7DQogICAgICAgICAgZHVyYXRpb25WYWx1ZS5jbGFzc0xpc3QuYWRkKCJib3VuY2UiKTsNCg0KICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgZHVyYXRpb25EaXNjb3VudEJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoImJvdW5jZSIpOw0KICAgICAgICAgICAgZHVyYXRpb25WYWx1ZS5jbGFzc0xpc3QucmVtb3ZlKCJib3VuY2UiKTsNCiAgICAgICAgICB9LCA2MDApOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBkdXJhdGlvbkRpc2NvdW50QmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7DQogICAgICB9DQoNCiAgICAgIC8vIFNob3cgbm9uLWN1bXVsYXRpdmUgbm90aWNlIHdoZW4gYm90aCBoYXZlIGRpc2NvdW50cw0KICAgICAgaWYgKG5vbkN1bXVsYXRpdmVOb3RpY2UpIHsNCiAgICAgICAgbm9uQ3VtdWxhdGl2ZU5vdGljZS5zdHlsZS5kaXNwbGF5ID0gKHF1YW50aXR5RGlzY291bnQgPiAwICYmIHRpbWVEaXNjb3VudCA+IDApID8gImJsb2NrIiA6ICJub25lIjsNCiAgICAgIH0NCg0KICAgICAgLy8gR2VuZXJhdGUgZGlzY291bnQgdGV4dA0KICAgICAgbGV0IGRpc2NvdW50VGV4dCA9ICJTdGFuZGFyZCBwcmljaW5nIjsNCiAgICAgIGlmIChhcHBsaWVkRGlzY291bnQgPiAwKSB7DQogICAgICAgIGRpc2NvdW50VGV4dCA9IE1hdGgucm91bmQoYXBwbGllZERpc2NvdW50ICogMTAwKSArICIlIGRpc2NvdW50IGFwcGxpZWQiOw0KICAgICAgfQ0KDQogICAgICAvLyBDYWxjdWxhdGUgdG90YWwgcHJpY2UNCiAgICAgIGNvbnN0IHRvdGFsUHJpY2UgPSBxdWFudGl0eSAqIGR1cmF0aW9uICogZmluYWxQcmljZVBlck1vbnRoOw0KDQogICAgICAvLyBVcGRhdGUgVUkNCiAgICAgIHF1YW50aXR5VmFsdWUudGV4dENvbnRlbnQgPSBxdWFudGl0eSA+PSAxNSA\/ICIxNSsiIDogcXVhbnRpdHk7DQogICAgICBkdXJhdGlvblZhbHVlLnRleHRDb250ZW50ID0gZHVyYXRpb247DQogICAgICBlbnRlcnByaXNlUHJpY2UudGV4dENvbnRlbnQgPSAiJCIgKyB0b3RhbFByaWNlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAgfSk7DQoNCiAgICAgIGlmIChhcHBsaWVkRGlzY291bnQgPiAwKSB7DQogICAgICAgIGRpc2NvdW50QmFkZ2VFbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGRpc2NvdW50QmFkZ2VFbC5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTsNCiAgICAgIH0NCiAgICAgIGRpc2NvdW50QmFkZ2VFbC50ZXh0Q29udGVudCA9IGRpc2NvdW50VGV4dDsNCg0KICAgICAgcHJpY2VCcmVha2Rvd25FbnRlcnByaXNlLnRleHRDb250ZW50ID0gIiQiICsgZmluYWxQcmljZVBlck1vbnRoLnRvRml4ZWQoMikgKyAiL21vbnRoIHBlciBpbnN0YW5jZSI7DQoNCiAgICAgIHByZXZpb3VzUXVhbnRpdHlEaXNjb3VudCA9IHF1YW50aXR5RGlzY291bnQ7DQogICAgICBwcmV2aW91c1RpbWVEaXNjb3VudCA9IHRpbWVEaXNjb3VudDsNCiAgICB9DQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIE5BVklHQVRJT04gSEVMUEVSDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGZ1bmN0aW9uIG5hdmlnYXRlV2l0aExhbmd1YWdlKHRhcmdldFBhdGgpIHsNCiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOw0KICAgICAgY29uc3QgbGFuZ0NvZGVzID0gWyd0cicsICdhcicsICdmcicsICdwdCcsICdlcycsICdlbiddOw0KICAgICAgY29uc3QgcGF0aFNlZ21lbnRzID0gY3VycmVudFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoc2VnbWVudCA9PiBzZWdtZW50Lmxlbmd0aCA+IDApOw0KDQogICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgbGFuZ0NvZGVzLmluY2x1ZGVzKHBhdGhTZWdtZW50c1swXS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICBjb25zdCBsYW5nQ29kZSA9IHBhdGhTZWdtZW50c1swXTsNCiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgLyR7bGFuZ0NvZGV9JHt0YXJnZXRQYXRofWA7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRhcmdldFBhdGg7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBMT0NBVElPTiBGVU5DVElPTlMNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyTG9jYXRpb25UYWJzKCkgew0KICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2F0aW9uVGFicycpOw0KICAgICAgaWYgKCFjb250YWluZXIpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignUmVudGFNYWMgUHJpY2luZzogI2xvY2F0aW9uVGFicyBlbGVtZW50IG5vdCBmb3VuZCcpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7DQoNCiAgICAgIE9iamVjdC5lbnRyaWVzKExPQ0FUSU9OUykuZm9yRWFjaCgoW2tleSwgbG9jXSkgPT4gew0KICAgICAgICBjb25zdCB0YWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgbGV0IGNsYXNzZXMgPSAnY3ljbGUtdGFiJzsNCiAgICAgICAgaWYgKGtleSA9PT0gc2VsZWN0ZWRMb2NhdGlvbiAmJiBsb2MuYXZhaWxhYmxlKSBjbGFzc2VzICs9ICcgYWN0aXZlJzsNCiAgICAgICAgaWYgKGxvYy5jb21pbmdTb29uKSBjbGFzc2VzICs9ICcgY29taW5nLXNvb24nOw0KICAgICAgICB0YWIuY2xhc3NOYW1lID0gY2xhc3NlczsNCiAgICAgICAgdGFiLmRhdGFzZXQubG9jYXRpb24gPSBrZXk7DQoNCiAgICAgICAgdGFiLmlubmVySFRNTCA9IGANCiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3ljbGUtbmFtZSI+JHtsb2MuZmxhZ30gJHtsb2MuY29udGluZW50fTwvc3Bhbj4NCiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3ljbGUtcHJpY2UiPiR7bG9jLmNvdW50cnl9PC9zcGFuPg0KICAgICAgICBgOw0KDQogICAgICAgIGlmIChsb2MuYXZhaWxhYmxlKSB7DQogICAgICAgICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICAgICAgdXNlckludGVyYWN0ZWRXaXRoTG9jYXRpb24gPSB0cnVlOw0KICAgICAgICAgICAgc2VsZWN0TG9jYXRpb24oa2V5KTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2VsZWN0TG9jYXRpb24obG9jYXRpb25LZXkpIHsNCiAgICAgIGNvbnN0IGxvYyA9IExPQ0FUSU9OU1tsb2NhdGlvbktleV07DQogICAgICBpZiAoIWxvYyB8fCAhbG9jLmF2YWlsYWJsZSkgcmV0dXJuOw0KICAgICAgc2VsZWN0ZWRMb2NhdGlvbiA9IGxvY2F0aW9uS2V5Ow0KICAgICAgcmVuZGVyTG9jYXRpb25UYWJzKCk7DQogICAgICAvLyBBdmFpbGFiaWxpdHkgY291bnRzIGFyZSBwZXItREMg4oCUIHJlY29tcHV0ZSBmcm9tIHRoZSBjYWNoZWQgcGF5bG9hZCBzbyB0aGUNCiAgICAgIC8vIHN0b3JhZ2UgdGlsZXMsIGRhaWx5LXBsYW4gZ2F0ZSwgYW5kIENUQSBidXR0b24gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uLg0KICAgICAgYXBwbHlBdmFpbGFiaWxpdHlGb3JTZWxlY3RlZExvY2F0aW9uKCk7DQogICAgfQ0KDQogICAgLy8g4pqg77iPIEtFRVAgSU4gU1lOQyB3aXRoIHRoZSB1c2VyLWFwcCBwcmljaW5nIHBhZ2U6DQogICAgLy8gICAgUmVudEFtYWMvUmVudEFtYWMtVXNlci9saWIvYXBpLnRzICAoZ2VvVG9EYXRhY2VudGVyIC8gQ1lQUlVTX1BSRUZFUlJFRF9DT1VOVFJJRVMpDQogICAgLy8gQm90aCBzdXJmYWNlcyBtdXN0IHJvdXRlIHRoZSBzYW1lIHdheS4gSWYgeW91IGNoYW5nZSB0aGUgY291bnRyeSBsaXN0IG9yIGNvbnRpbmVudCBtYXBwaW5nDQogICAgLy8gaGVyZSwgbWlycm9yIGl0IHRoZXJlIChhbmQgdmljZS12ZXJzYSkuDQogICAgLy8NCiAgICAvLyBDb3VudHJpZXMgdGhhdCBzaXQgaW4gY29udGluZW50ICJBc2lhIiBidXQgYXJlIGdlb2dyYXBoaWNhbGx5IGNsb3Nlc3QgdG8gb3VyIEN5cHJ1cw0KICAgIC8vIChMaW1hc3NvbCkgZGF0YWNlbnRlciByYXRoZXIgdGhhbiBNdW1iYWkuIFdpdGhvdXQgdGhpcyBvdmVycmlkZSwgaXBhcGkuY28ncyBjb250aW5lbnQNCiAgICAvLyBjb2RlIHJvdXRlcyB0aGUgd2hvbGUgTmVhciBFYXN0IOKAlCBUdXJrZXksIHRoZSBMZXZhbnQsIG11Y2ggb2YgQXJhYmlhLCB0aGUgQ2F1Y2FzdXMgYW5kDQogICAgLy8gSXJhbiDigJQgdG8gSW5kaWEsIHdoaWNoIGlzIHRoZSB3cm9uZyAoZmFyKSBkYXRhY2VudGVyIChlLmcuIEFua2FyYeKGkkN5cHJ1cyB+NTgwIGttIHZzDQogICAgLy8gfjQsNDAwIGttIHRvIE11bWJhaSkuIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVzLg0KICAgIC8vIFRoZSB3aG9sZSBHdWxmIChpbmNsLiBVQUUvT21hbikgcm91dGVzIHRvIEN5cHJ1cyBieSBidXNpbmVzcyBkZWNpc2lvbiwgZXZlbiB0aG91Z2gNCiAgICAvLyBNdW1iYWkgaXMgbWFyZ2luYWxseSBjbG9zZXIgdG8gdGhlIGVhc3Rlcm5tb3N0IHN0YXRlcy4NCiAgICBjb25zdCBDWVBSVVNfUFJFRkVSUkVEX0NPVU5UUklFUyA9IG5ldyBTZXQoWw0KICAgICAgJ0NZJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeXBydXMNCiAgICAgICdUUicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVya2V5DQogICAgICAnU1knLCAnTEInLCAnSUwnLCAnUFMnLCAnSk8nLCAgICAgICAgICAgICAgIC8vIExldmFudA0KICAgICAgJ0lRJywgJ0lSJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcmFxLCBJcmFuDQogICAgICAnU0EnLCAnS1cnLCAnQkgnLCAnUUEnLCAnQUUnLCAnT00nLCAnWUUnLCAgIC8vIEFyYWJpYW4gcGVuaW5zdWxhIC8gR3VsZg0KICAgICAgJ0FNJywgJ0dFJywgJ0FaJywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXVjYXN1cw0KICAgIF0pOw0KDQogICAgLy8gTWFwcyB0aGUgdmlzaXRvcidzIGdlbyAoY291bnRyeSBmaXJzdCwgdGhlbiBjb250aW5lbnQpIHRvIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSByZWdpb24uDQogICAgLy8gT25seSByZXR1cm4gYSB2YWx1ZSB3aGVuIHdlIGFjdHVhbGx5IHdhbnQgdG8gYXV0by1zd2l0Y2ggZnJvbSB0aGUgQ3lwcnVzIGRlZmF1bHQuDQogICAgZnVuY3Rpb24gZ2VvVG9Mb2NhdGlvbihjb3VudHJ5Q29kZSwgY29udGluZW50Q29kZSkgew0KICAgICAgLy8gTmVhci1FYXN0IC8gQ2F1Y2FzdXMgY291bnRyaWVzIGFyZSBpbiBjb250aW5lbnQgIkFzaWEiIGJ1dCBhcmUgbmVhcmVzdCB0byBDeXBydXMuDQogICAgICBpZiAoY291bnRyeUNvZGUgJiYgQ1lQUlVTX1BSRUZFUlJFRF9DT1VOVFJJRVMuaGFzKGNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkpKSB7DQogICAgICAgIHJldHVybiBudWxsOyAvLyBrZWVwIHRoZSBDeXBydXMgZGVmYXVsdA0KICAgICAgfQ0KICAgICAgc3dpdGNoIChjb250aW5lbnRDb2RlKSB7DQogICAgICAgIGNhc2UgJ0FTJzogLy8gQXNpYQ0KICAgICAgICBjYXNlICdPQyc6IC8vIE9jZWFuaWEgLSBnZW9ncmFwaGljYWxseSBjbG9zZXIgdG8gTXVtYmFpIHRoYW4gTGltYXNzb2wNCiAgICAgICAgICByZXR1cm4gJ2luZGlhJzsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAvLyBFVSwgTkEsIFNBLCBBRiwgQU4gLT4ga2VlcCBDeXBydXMgZGVmYXVsdA0KICAgICAgICAgIC8vIChVU0EgVGV4YXMgbm90IHlldCBhdmFpbGFibGU7IFVTL1NBIHVzZXJzIGZhbGwgYmFjayB0byBDeXBydXMpDQogICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAvLyBHRU8gQVVUTy1ST1VUSU5HIChoYXJkIGF1dG8tcm91dGUsIG5vIHBpY2tlcikNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIFN3aXRjaGluZyBpcyBmdWxseSBjbGllbnQtc2lkZTogd2UgbG9vayB1cCB0aGUgdmlzaXRvcidzIElQIHZpYSBpcGFwaS5jbywgbWFwIHRoZQ0KICAgIC8vIGNvbnRpbmVudCB0byB0aGUgbmVhcmVzdCBkYXRhY2VudGVyLCBhbmQgYXV0by1yb3V0ZSB0aGUgU3RyaXBlIGNoZWNrb3V0IHRoZXJlIHNvIHRoZQ0KICAgIC8vIHJlbnRlZCBNYWMgY29tZXMgZnJvbSB0aGUgY2xvc2VzdCBEQy4gTm8gYmFja2VuZC9jb29raWUgaW52b2x2ZW1lbnQuIFRoZSBwaWNrZXIgc3RheXMgaGlkZGVuLg0KDQogICAgLy8gR2VvLXN1Z2dlc3RlZCBsb2NhdGlvbiAoTE9DQVRJT05TIGtleSkgYmVmb3JlIHRoZSBjYXBhY2l0eSBmYWxsYmFjayBpcyBhcHBsaWVkLg0KICAgIGxldCBnZW9QcmVmZXJyZWRMb2NhdGlvbiA9IG51bGw7DQoNCiAgICAvLyBSZXNvbHZlIHRoZSBuZWFyZXN0IGRhdGFjZW50ZXIgZnJvbSB0aGUgdmlzaXRvcidzIElQIChjb250aW5lbnQpLCB0aGVuIGFwcGx5IGl0Lg0KICAgIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVHZW9QcmVmZXJyZWRMb2NhdGlvbigpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIC8vIGlwYXBpLmNvIHN1cHBvcnRzIENPUlMgb24gdGhlIGZyZWUgdGllciBhbmQgcmV0dXJucyBgY291bnRyeV9jb2RlYCArIGBjb250aW5lbnRfY29kZWAuDQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vaXBhcGkuY28vanNvbi8nKTsNCiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuOw0KDQogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7DQogICAgICAgIGlmICghZGF0YSB8fCBkYXRhLmVycm9yKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSBnZW9Ub0xvY2F0aW9uKGRhdGEuY291bnRyeV9jb2RlLCBkYXRhLmNvbnRpbmVudF9jb2RlKTsNCiAgICAgICAgaWYgKCFkZXRlY3RlZCkgcmV0dXJuOyAvLyBFVS9OQSArIE5lYXItRWFzdC9DYXVjYXN1cyBrZWVwIHRoZSBDeXBydXMgZGVmYXVsdA0KDQogICAgICAgIGdlb1ByZWZlcnJlZExvY2F0aW9uID0gZGV0ZWN0ZWQ7DQogICAgICAgIGFwcGx5R2VvRGF0YWNlbnRlcigpOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAvLyBTaWxlbnQgZmFpbCAtIHRoZSBwYWdlIGFscmVhZHkgc2hvd3MgdGhlIEN5cHJ1cyBkZWZhdWx0LCB3aGljaCBpcyBmaW5lLg0KICAgICAgICBjb25zb2xlLndhcm4oJ0xvY2F0aW9uIGF1dG8tZGV0ZWN0IGZhaWxlZDsga2VlcGluZyBkZWZhdWx0LicsIGUpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIFRvdGFsIGRldmljZXMgYXZhaWxhYmxlIGluIGEgZGF0YWNlbnRlciBhY3Jvc3MgYWxsIHN0b3JhZ2UgdGllcnMgKG51bGwgd2hlbiB1bmtub3duKS4NCiAgICBmdW5jdGlvbiB0b3RhbEF2YWlsYWJsZUZvckxvY2F0aW9uKGxvY2F0aW9uS2V5KSB7DQogICAgICBjb25zdCBiYWNrZW5kS2V5ID0gTE9DQVRJT05TW2xvY2F0aW9uS2V5XT8uYmFja2VuZEtleTsNCiAgICAgIGNvbnN0IGRjID0gbGFzdEF2YWlsYWJpbGl0eVBheWxvYWQ\/LmRhdGFjZW50ZXJzPy5maW5kKGQgPT4gZC5sb2NhdGlvbiA9PT0gYmFja2VuZEtleSk7DQogICAgICBpZiAoIWRjKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlcyA\/PyAwKQ0KICAgICAgICArIE51bWJlcihkYy5hdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPz8gMCkNCiAgICAgICAgKyBOdW1iZXIoZGMuYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID8\/IDApOw0KICAgIH0NCg0KICAgIC8vIEFwcGx5IHRoZSBnZW8tc3VnZ2VzdGVkIGRhdGFjZW50ZXIgdG8gdGhlIGFjdGl2ZSBzZWxlY3Rpb24sIHdpdGggYSBjYXBhY2l0eSBmYWxsYmFjazoNCiAgICAvLyBpZiB0aGUgbmVhcmVzdCBkYXRhY2VudGVyIGlzIHNvbGQgb3V0IGJ1dCB0aGUgb3RoZXIgaGFzIHN0b2NrLCByb3V0ZSB0aGVyZSBpbnN0ZWFkLg0KICAgIC8vIFJldHVybnMgdHJ1ZSBvbmNlIGEgc3VnZ2VzdGlvbiBpcyBrbm93bjsgdGhlIGNhcGFjaXR5IGZhbGxiYWNrIGlzIHJlLWFwcGxpZWQgd2hlbg0KICAgIC8vIGF2YWlsYWJpbGl0eSBkYXRhIGFycml2ZXMgKGZldGNoQXZhaWxhYmlsaXR5U3RhdHVzIGNhbGxzIHRoaXMgYWdhaW4pLg0KICAgIGZ1bmN0aW9uIGFwcGx5R2VvRGF0YWNlbnRlcigpIHsNCiAgICAgIGlmICh1c2VySW50ZXJhY3RlZFdpdGhMb2NhdGlvbikgcmV0dXJuIHRydWU7IC8vIHVzZXIncyBwaWNrIHdpbnMgKHBpY2tlciBoaWRkZW4sIGJ1dCBiZSBzYWZlKQ0KDQogICAgICBjb25zdCBwcmVmZXJyZWQgPSBnZW9QcmVmZXJyZWRMb2NhdGlvbjsNCiAgICAgIGlmICghcHJlZmVycmVkKSByZXR1cm4gZmFsc2U7DQoNCiAgICAgIGxldCB0YXJnZXQgPSBMT0NBVElPTlNbcHJlZmVycmVkXT8uYXZhaWxhYmxlID8gcHJlZmVycmVkIDogJ2N5cHJ1cyc7DQoNCiAgICAgIC8vIENhcGFjaXR5IGZhbGxiYWNrIChvbmx5IG9uY2UgYXZhaWxhYmlsaXR5IGRhdGEgaXMgaW4pLiBJbmRpYSBvbmx5IGNhcnJpZXMgYmFzZSAyNTYgR0IgYW5kDQogICAgICAvLyBpcyB0aGUgb25seSBub24taG9tZSBEQywgc28gaWYgaXQncyBzb2xkIG91dCB3ZSBhbHdheXMgZmFsbCBiYWNrIHRvIEN5cHJ1cyAoaG9tZSBiYXNlLCBmdWxsDQogICAgICAvLyBjYXRhbG9nKSDigJQgZXZlbiBpZiBDeXBydXMgaXMgYWxzbyBsb3cuIEZvciBDeXBydXMgd2Ugb25seSByZXJvdXRlIHRvIEluZGlhIHdoZW4gSW5kaWEgaGFzIHN0b2NrLg0KICAgICAgY29uc3Qgb3RoZXIgPSB0YXJnZXQgPT09ICdpbmRpYScgPyAnY3lwcnVzJyA6ICdpbmRpYSc7DQogICAgICBjb25zdCBwcmVmZXJyZWRBdmFpbGFibGUgPSB0b3RhbEF2YWlsYWJsZUZvckxvY2F0aW9uKHRhcmdldCk7DQogICAgICBjb25zdCBvdGhlckF2YWlsYWJsZSA9IHRvdGFsQXZhaWxhYmxlRm9yTG9jYXRpb24ob3RoZXIpOw0KICAgICAgaWYgKHRhcmdldCA9PT0gJ2luZGlhJyAmJiBwcmVmZXJyZWRBdmFpbGFibGUgPT09IDApIHsNCiAgICAgICAgdGFyZ2V0ID0gJ2N5cHJ1cyc7DQogICAgICB9IGVsc2UgaWYgKHByZWZlcnJlZEF2YWlsYWJsZSA9PT0gMCAmJiAob3RoZXJBdmFpbGFibGUgPz8gMCkgPiAwICYmIExPQ0FUSU9OU1tvdGhlcl0\/LmF2YWlsYWJsZSkgew0KICAgICAgICB0YXJnZXQgPSBvdGhlcjsNCiAgICAgIH0NCg0KICAgICAgaWYgKHRhcmdldCAhPT0gc2VsZWN0ZWRMb2NhdGlvbikgew0KICAgICAgICBzZWxlY3RlZExvY2F0aW9uID0gdGFyZ2V0Ow0KICAgICAgICBhcHBseUF2YWlsYWJpbGl0eUZvclNlbGVjdGVkTG9jYXRpb24oKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgLy8gUFJJQ0lORyBGVU5DVElPTlMNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogICAgZnVuY3Rpb24gZ2V0U3RvcmFnZVByaWNlKHN0b3JhZ2VLZXksIGN5Y2xlS2V5KSB7DQogICAgICBjb25zdCBzdG9yYWdlID0gUFJJQ0lOR19DT05GSUcuc3RvcmFnZVtzdG9yYWdlS2V5XTsNCiAgICAgIGlmICghc3RvcmFnZSB8fCBzdG9yYWdlLnByaWNlID09PSAwKSByZXR1cm4gMDsNCg0KICAgICAgLy8gRm9yIHdlZWtseSBhbmQgbW9udGhseSwgdXNlIHRoZSBtb250aGx5IHByaWNlDQogICAgICBpZiAoY3ljbGVLZXkgPT09ICd3ZWVrbHknIHx8IGN5Y2xlS2V5ID09PSAnbW9udGhseScpIHsNCiAgICAgICAgcmV0dXJuIHN0b3JhZ2UubW9udGhseVByaWNlOw0KICAgICAgfQ0KDQogICAgICAvLyBGb3IgMyBtb250aHMNCiAgICAgIGlmIChjeWNsZUtleSA9PT0gJzNtb250aCcpIHsNCiAgICAgICAgcmV0dXJuIHN0b3JhZ2UubW9udGhseVByaWNlICogKHN0b3JhZ2VbJzNtb250aE11bHRpcGxpZXInXSB8fCAzKTsNCiAgICAgIH0NCg0KICAgICAgLy8gRm9yIDYgbW9udGhzDQogICAgICBpZiAoY3ljbGVLZXkgPT09ICc2bW9udGgnKSB7DQogICAgICAgIHJldHVybiBzdG9yYWdlLm1vbnRobHlQcmljZSAqIChzdG9yYWdlWyc2bW9udGhNdWx0aXBsaWVyJ10gfHwgNik7DQogICAgICB9DQoNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsKCkgew0KICAgICAgY29uc3QgY3ljbGUgPSBQUklDSU5HX0NPTkZJRy5jeWNsZXNbc2VsZWN0ZWRDeWNsZV07DQogICAgICBjb25zdCBiYXNlUHJpY2UgPSBjeWNsZS5iYXNlUHJpY2U7DQogICAgICBjb25zdCBzdG9yYWdlUHJpY2UgPSBnZXRTdG9yYWdlUHJpY2Uoc2VsZWN0ZWRTdG9yYWdlLCBzZWxlY3RlZEN5Y2xlKTsNCiAgICAgIHJldHVybiBiYXNlUHJpY2UgKyBzdG9yYWdlUHJpY2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0UHJpY2UocHJpY2UpIHsNCiAgICAgIGlmIChwcmljZSAlIDEgPT09IDApIHsNCiAgICAgICAgcmV0dXJuIGAkJHtwcmljZX1gOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGAkJHtwcmljZS50b0ZpeGVkKDIpfWA7DQogICAgfQ0KDQogICAgLy8gVG90YWwgcGh5c2ljYWwgZGV2aWNlcyBpbiB0aGUgKnNlbGVjdGVkKiBkYXRhY2VudGVyIChiYXNlICsgaXRzIG93biBkcml2ZS1lcXVpcHBlZCB1bml0cyksDQogICAgLy8gdXNlZCBmb3IgdGhlIGRhaWx5LXBsYW4gZ2F0ZS4gUmVhZHMgdGhlIHNlbGVjdGVkIERDJ3Mgb3duIGNvdW50cyBzdHJhaWdodCBmcm9tIHRoZSBwYXlsb2FkIOKAlA0KICAgIC8vIE5PVCB0aGUgYWRkLW9uIGdsb2JhbHMgYWJvdmUsIHdoaWNoIGFyZSBDeXBydXMtc291cmNlZCAoZHJpdmVzIGFyZSBvbmx5IHN0b2NrZWQgaW4gQ3lwcnVzKSwNCiAgICAvLyBzbyB0aGV5IG11c3Qgbm90IGluZmxhdGUgYW4gSW5kaWEtcm91dGVkIHZpc2l0b3IncyBkYWlseSBhdmFpbGFiaWxpdHkuDQogICAgZnVuY3Rpb24gZ2V0VG90YWxBdmFpbGFibGVEZXZpY2VzKCkgew0KICAgICAgY29uc3QgdG90YWwgPSB0b3RhbEF2YWlsYWJsZUZvckxvY2F0aW9uKHNlbGVjdGVkTG9jYXRpb24pOw0KICAgICAgcmV0dXJuIHRvdGFsID8\/IChjdXJyZW50QXZhaWxhYmxlRGV2aWNlcyArIGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSArIGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSk7DQogICAgfQ0KDQogICAgLy8gU2tlbGV0b24gcGxhY2Vob2xkZXJzIHNob3duIHVudGlsIGF2YWlsYWJpbGl0eSBkYXRhIGFycml2ZXMgYW5kIHRoZSByZWFsDQogICAgLy8gY3ljbGUgdGFicyAvIHN0b3JhZ2Ugb3B0aW9ucyBhcmUgcmVuZGVyZWQuDQogICAgZnVuY3Rpb24gcmVuZGVyQ3ljbGVUYWJzU2tlbGV0b24oKSB7DQogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3ljbGVUYWJzJyk7DQogICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOw0KICAgICAgbGV0IGh0bWwgPSAnJzsNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7DQogICAgICAgIGh0bWwgKz0gYA0KICAgICAgICAgIDxkaXYgY2xhc3M9ImN5Y2xlLXRhYiBpcy1za2VsZXRvbiI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2VsZXRvbi1iYXIiIHN0eWxlPSJoZWlnaHQ6MTRweDt3aWR0aDo1NSU7bWFyZ2luOjZweCBhdXRvIDhweDsiPjwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2tlbGV0b24tYmFyIiBzdHlsZT0iaGVpZ2h0OjEwcHg7d2lkdGg6NDAlO21hcmdpbjowIGF1dG87Ij48L2Rpdj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYDsNCiAgICAgIH0NCiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbmRlclN0b3JhZ2VPcHRpb25zU2tlbGV0b24oKSB7DQogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvcmFnZUNvbnRhaW5lcicpOw0KICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCiAgICAgIGxldCBvcHRpb25zSHRtbCA9ICcnOw0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHsNCiAgICAgICAgb3B0aW9uc0h0bWwgKz0gYA0KICAgICAgICAgIDxkaXYgY2xhc3M9InN0b3JhZ2Utb3B0aW9uIGlzLXNrZWxldG9uIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNrZWxldG9uLWJhciIgc3R5bGU9ImhlaWdodDoxOHB4O3dpZHRoOjQ1JTttYXJnaW46MCBhdXRvIDhweDsiPjwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2tlbGV0b24tYmFyIiBzdHlsZT0iaGVpZ2h0OjEycHg7d2lkdGg6NzAlO21hcmdpbjowIGF1dG8gOHB4OyI+PC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJza2VsZXRvbi1iYXIiIHN0eWxlPSJoZWlnaHQ6MTNweDt3aWR0aDozNSU7bWFyZ2luOjAgYXV0bzsiPjwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICBgOw0KICAgICAgfQ0KICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJzdG9yYWdlLW9wdGlvbnMiPiR7b3B0aW9uc0h0bWx9PC9kaXY+YDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJDeWNsZVRhYnMoKSB7DQogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3ljbGVUYWJzJyk7DQogICAgICBpZiAoIWNvbnRhaW5lcikgew0KICAgICAgICBjb25zb2xlLmVycm9yKCdSZW50YU1hYyBQcmljaW5nOiAjY3ljbGVUYWJzIGVsZW1lbnQgbm90IGZvdW5kJyk7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsNCg0KICAgICAgT2JqZWN0LmVudHJpZXMoUFJJQ0lOR19DT05GSUcuY3ljbGVzKS5mb3JFYWNoKChba2V5LCBjeWNsZV0pID0+IHsNCiAgICAgICAgY29uc3QgdGFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIGNvbnN0IGlzRGFpbHlVbmF2YWlsYWJsZSA9IGtleSA9PT0gJ2RhaWx5JyAmJiBnZXRUb3RhbEF2YWlsYWJsZURldmljZXMoKSA8PSBkYWlseVBsYW5BdmFpbGFiaWxpdHlUaHJlc2hvbGQ7DQogICAgICAgIHRhYi5jbGFzc05hbWUgPSBgY3ljbGUtdGFiICR7a2V5ID09PSBzZWxlY3RlZEN5Y2xlID8gJ2FjdGl2ZScgOiAnJ30gJHtpc0RhaWx5VW5hdmFpbGFibGUgPyAndW5hdmFpbGFibGUnIDogJyd9YDsNCiAgICAgICAgdGFiLmRhdGFzZXQuY3ljbGUgPSBrZXk7DQoNCiAgICAgICAgbGV0IGh0bWwgPSBgDQogICAgICAgICAgPHNwYW4gY2xhc3M9ImN5Y2xlLW5hbWUiPiR7Y3ljbGUubmFtZX08L3NwYW4+DQogICAgICAgICAgPHNwYW4gY2xhc3M9ImN5Y2xlLXByaWNlIj4ke2Zvcm1hdFByaWNlKGN5Y2xlLnByaWNlUGVyRGF5KX0vZGF5PC9zcGFuPg0KICAgICAgICBgOw0KDQogICAgICAgIGlmIChjeWNsZS5wb3B1bGFyKSB7DQogICAgICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9InBvcHVsYXItYmFkZ2UiPlBvcHVsYXI8L3NwYW4+YDsNCiAgICAgICAgfSBlbHNlIGlmIChjeWNsZS5zYXZpbmdzKSB7DQogICAgICAgICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9InNhdmluZ3MtYmFkZ2UiPiR7Y3ljbGUuc2F2aW5nc308L3NwYW4+YDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRhYi5pbm5lckhUTUwgPSBodG1sOw0KICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgICAgaWYgKGlzRGFpbHlVbmF2YWlsYWJsZSkgew0KICAgICAgICAgICAgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5KTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICB9DQogICAgICAgICAgc2VsZWN0Q3ljbGUoa2V5KTsNCiAgICAgICAgfSk7DQogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyU3RvcmFnZU9wdGlvbnMoKSB7DQogICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvcmFnZUNvbnRhaW5lcicpOw0KICAgICAgaWYgKCFjb250YWluZXIpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignUmVudGFNYWMgUHJpY2luZzogI3N0b3JhZ2VDb250YWluZXIgZWxlbWVudCBub3QgZm91bmQnKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgY29uc3QgY3ljbGUgPSBQUklDSU5HX0NPTkZJRy5jeWNsZXNbc2VsZWN0ZWRDeWNsZV07DQogICAgICBjb25zdCBoYXNTdG9yYWdlID0gY3ljbGUuaGFzU3RvcmFnZTsNCg0KICAgICAgLy8gUmVzZXQgdG8gYmFzZSBzdG9yYWdlIGlmIGN1cnJlbnQgY3ljbGUgZG9lc24ndCBzdXBwb3J0IGFkZG9ucw0KICAgICAgaWYgKCFoYXNTdG9yYWdlICYmIHNlbGVjdGVkU3RvcmFnZSAhPT0gJ2Jhc2UnKSB7DQogICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdiYXNlJzsNCiAgICAgIH0NCg0KICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBzdG9yYWdlIGlzIHVuYXZhaWxhYmxlDQogICAgICBjb25zdCBpc0N1cnJlbnRTZWxlY3Rpb25VbmF2YWlsYWJsZSA9DQogICAgICAgIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdiYXNlJyAmJiBjdXJyZW50QXZhaWxhYmxlRGV2aWNlcyA9PT0gMCkgfHwNCiAgICAgICAgKHNlbGVjdGVkU3RvcmFnZSA9PT0gJ2FkZG9uMjU2JyAmJiBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDApIHx8DQogICAgICAgIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdhZGRvbjUxMicgJiYgYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID09PSAwKTsNCg0KICAgICAgLy8gQXV0by1zZWxlY3QgZmlyc3QgYXZhaWxhYmxlIHN0b3JhZ2Ugb3B0aW9uIGlmIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHVuYXZhaWxhYmxlDQogICAgICBpZiAoaXNDdXJyZW50U2VsZWN0aW9uVW5hdmFpbGFibGUgJiYgaGFzU3RvcmFnZSkgew0KICAgICAgICBpZiAoY3VycmVudEF2YWlsYWJsZURldmljZXMgPiAwKSB7DQogICAgICAgICAgc2VsZWN0ZWRTdG9yYWdlID0gJ2Jhc2UnOw0KICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZXNXaXRoMjU2R2JEcml2ZSA+IDApIHsNCiAgICAgICAgICBzZWxlY3RlZFN0b3JhZ2UgPSAnYWRkb24yNTYnOw0KICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA+IDApIHsNCiAgICAgICAgICBzZWxlY3RlZFN0b3JhZ2UgPSAnYWRkb241MTInOw0KICAgICAgICB9DQogICAgICAgIC8vIElmIG5vdGhpbmcgaXMgYXZhaWxhYmxlLCBrZWVwIGN1cnJlbnQgc2VsZWN0aW9uICh3aWxsIHNob3cgSm9pbiBXYWl0bGlzdCkNCiAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50U2VsZWN0aW9uVW5hdmFpbGFibGUgJiYgIWhhc1N0b3JhZ2UpIHsNCiAgICAgICAgLy8gRm9yIGRhaWx5IHBsYW4sIGp1c3Qga2VlcCBiYXNlIGV2ZW4gaWYgdW5hdmFpbGFibGUNCiAgICAgICAgc2VsZWN0ZWRTdG9yYWdlID0gJ2Jhc2UnOw0KICAgICAgfQ0KDQogICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICBvcHRpb25zQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzdG9yYWdlLW9wdGlvbnMnOw0KICAgICAgb3B0aW9uc0NvbnRhaW5lci5pZCA9ICdzdG9yYWdlT3B0aW9ucyc7DQoNCiAgICAgIE9iamVjdC5lbnRyaWVzKFBSSUNJTkdfQ09ORklHLnN0b3JhZ2UpLmZvckVhY2goKFtrZXksIHN0b3JhZ2VdKSA9PiB7DQogICAgICAgIGNvbnN0IGlzQWRkb24gPSBrZXkgIT09ICdiYXNlJzsNCiAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IGlzQWRkb24gJiYgIWhhc1N0b3JhZ2U7DQoNCiAgICAgICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IGR5bmFtaWNhbGx5IGJhc2VkIG9uIEFQSSByZXNwb25zZSAoZGV2aWNlcyB3aXRoIGRyaXZlcyBhdHRhY2hlZCkNCiAgICAgICAgbGV0IGlzVW5hdmFpbGFibGUgPSBmYWxzZTsNCiAgICAgICAgaWYgKGtleSA9PT0gJ2Jhc2UnKSB7DQogICAgICAgICAgaXNVbmF2YWlsYWJsZSA9IGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID09PSAwOw0KICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FkZG9uMjU2Jykgew0KICAgICAgICAgIGlzVW5hdmFpbGFibGUgPSBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDA7DQogICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYWRkb241MTInKSB7DQogICAgICAgICAgaXNVbmF2YWlsYWJsZSA9IGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9PT0gMDsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBsZXQgY2xhc3NlcyA9ICdzdG9yYWdlLW9wdGlvbic7DQogICAgICAgIGlmIChrZXkgPT09IHNlbGVjdGVkU3RvcmFnZSAmJiAhaXNVbmF2YWlsYWJsZSkgY2xhc3NlcyArPSAnIGFjdGl2ZSc7DQogICAgICAgIGlmIChpc0Rpc2FibGVkKSBjbGFzc2VzICs9ICcgZGlzYWJsZWQnOw0KICAgICAgICBlbHNlIGlmIChpc1VuYXZhaWxhYmxlKSBjbGFzc2VzICs9ICcgdW5hdmFpbGFibGUnOw0KICAgICAgICBvcHRpb24uY2xhc3NOYW1lID0gY2xhc3NlczsNCiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc3RvcmFnZSA9IGtleTsNCg0KICAgICAgICAvLyBGb3IgZGlzYWJsZWQvdW5hdmFpbGFibGUgYWRkb25zLCBzaG93IG1vbnRobHkgcHJpY2UgYXMgcmVmZXJlbmNlDQogICAgICAgIGxldCBwcmljZSwgcHJpY2VMYWJlbDsNCiAgICAgICAgaWYgKChpc0Rpc2FibGVkIHx8IGlzVW5hdmFpbGFibGUpICYmIHN0b3JhZ2UubW9udGhseVByaWNlKSB7DQogICAgICAgICAgcHJpY2UgPSBzdG9yYWdlLm1vbnRobHlQcmljZTsNCiAgICAgICAgICBwcmljZUxhYmVsID0gYCske2Zvcm1hdFByaWNlKHByaWNlKX0vbW9gOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHByaWNlID0gZ2V0U3RvcmFnZVByaWNlKGtleSwgc2VsZWN0ZWRDeWNsZSk7DQogICAgICAgICAgcHJpY2VMYWJlbCA9IHByaWNlID09PSAwID8gJ0luY2x1ZGVkJyA6IGArJHtmb3JtYXRQcmljZShwcmljZSl9YDsNCiAgICAgICAgfQ0KDQogICAgICAgIGxldCBjb250ZW50SHRtbCA9IGANCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdG9yYWdlLXNpemUiPiR7c3RvcmFnZS5zaXplfSBHQjwvZGl2Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9InN0b3JhZ2UtbGFiZWwiPiR7c3RvcmFnZS5sYWJlbH08L2Rpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdG9yYWdlLXByaWNlIj4ke3ByaWNlTGFiZWx9PC9kaXY+DQogICAgICAgIGA7DQoNCiAgICAgICAgaWYgKHN0b3JhZ2UuaXNEZWZhdWx0KSB7DQogICAgICAgICAgY29udGVudEh0bWwgKz0gYDxzcGFuIGNsYXNzPSJkZWZhdWx0LWJhZGdlIj5EZWZhdWx0PC9zcGFuPmA7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBXcmFwIGNvbnRlbnQgaW4gYSBkaXYgZm9yIHVuYXZhaWxhYmxlL2Rpc2FibGVkIG9wdGlvbnMgc28gYmx1ciBkb2Vzbid0IGFmZmVjdCB0b29sdGlwDQogICAgICAgIGlmIChpc1VuYXZhaWxhYmxlIHx8IGlzRGlzYWJsZWQpIHsNCiAgICAgICAgICBvcHRpb24uaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9InN0b3JhZ2UtY29udGVudCI+JHtjb250ZW50SHRtbH08L2Rpdj5gOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBjb250ZW50SHRtbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghaXNEaXNhYmxlZCAmJiAhaXNVbmF2YWlsYWJsZSkgew0KICAgICAgICAgIG9wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNlbGVjdFN0b3JhZ2Uoa2V5KSk7DQogICAgICAgIH0NCg0KICAgICAgICBvcHRpb25zQ29udGFpbmVyLmFwcGVuZENoaWxkKG9wdGlvbik7DQogICAgICB9KTsNCg0KICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOw0KICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG9wdGlvbnNDb250YWluZXIpOw0KDQogICAgICAvLyBBZGQgbm90ZSB3aGVuIHN0b3JhZ2UgYWRkb25zIGFyZSBkaXNhYmxlZA0KICAgICAgaWYgKCFoYXNTdG9yYWdlKSB7DQogICAgICAgIGNvbnN0IG5vdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgbm90ZS5jbGFzc05hbWUgPSAnc3RvcmFnZS1hZGRvbi1kaXNhYmxlZC1ub3RlJzsNCiAgICAgICAgbm90ZS50ZXh0Q29udGVudCA9ICdTdG9yYWdlIGFkZC1vbnMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBkYWlseSBwbGFuLiBTZWxlY3QgYSB3ZWVrbHkgb3IgbG9uZ2VyIGJpbGxpbmcgY3ljbGUgdG8gYWRkIGV4dHJhIHN0b3JhZ2UuJzsNCiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5vdGUpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVByaWNlRGlzcGxheSgpIHsNCiAgICAgIGNvbnN0IHRvdGFsID0gY2FsY3VsYXRlVG90YWwoKTsNCiAgICAgIGNvbnN0IGN5Y2xlID0gUFJJQ0lOR19DT05GSUcuY3ljbGVzW3NlbGVjdGVkQ3ljbGVdOw0KDQogICAgICBjb25zdCB0b3RhbFByaWNlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90YWxQcmljZScpOw0KICAgICAgY29uc3QgcHJpY2VCcmVha2Rvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmljZUJyZWFrZG93bicpOw0KICAgICAgY29uc3QgYWNjZXNzRHVyYXRpb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2Nlc3NEdXJhdGlvbicpOw0KICAgICAgY29uc3Qgc3RvcmFnZU5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvcmFnZU5vdGUnKTsNCg0KICAgICAgaWYgKCF0b3RhbFByaWNlRWwgfHwgIXByaWNlQnJlYWtkb3duRWwpIHsNCiAgICAgICAgY29uc29sZS5lcnJvcignUmVudGFNYWMgUHJpY2luZzogUHJpY2UgZGlzcGxheSBlbGVtZW50cyBub3QgZm91bmQnKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KDQogICAgICB0b3RhbFByaWNlRWwudGV4dENvbnRlbnQgPSBmb3JtYXRQcmljZSh0b3RhbCk7DQogICAgICBwcmljZUJyZWFrZG93bkVsLnRleHRDb250ZW50ID0gY3ljbGUuYmlsbGluZ0xhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY3ljbGUuYmlsbGluZ0xhYmVsLnNsaWNlKDEpOw0KICAgICAgaWYgKGFjY2Vzc0R1cmF0aW9uRWwpIGFjY2Vzc0R1cmF0aW9uRWwudGV4dENvbnRlbnQgPSBjeWNsZS5hY2Nlc3NEdXJhdGlvbjsNCg0KICAgICAgLy8gU3RvcmFnZSBub3RlDQogICAgICBpZiAoc3RvcmFnZU5vdGUpIHsNCiAgICAgICAgaWYgKHNlbGVjdGVkU3RvcmFnZSAhPT0gJ2Jhc2UnKSB7DQogICAgICAgICAgY29uc3Qgc3RvcmFnZVByaWNlID0gZ2V0U3RvcmFnZVByaWNlKHNlbGVjdGVkU3RvcmFnZSwgc2VsZWN0ZWRDeWNsZSk7DQogICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IFBSSUNJTkdfQ09ORklHLnN0b3JhZ2Vbc2VsZWN0ZWRTdG9yYWdlXTsNCiAgICAgICAgICBzdG9yYWdlTm90ZS50ZXh0Q29udGVudCA9IGBJbmNsdWRlcyAke3N0b3JhZ2UubGFiZWx9IHN0b3JhZ2UgKCske2Zvcm1hdFByaWNlKHN0b3JhZ2VQcmljZSl9KWA7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgc3RvcmFnZU5vdGUudGV4dENvbnRlbnQgPSAnJzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNlbGVjdEN5Y2xlKGN5Y2xlS2V5KSB7DQogICAgICBzZWxlY3RlZEN5Y2xlID0gY3ljbGVLZXk7DQoNCiAgICAgIC8vIFJlc2V0IHN0b3JhZ2UgdG8gYmFzZSBpZiBuZXcgY3ljbGUgZG9lc24ndCBzdXBwb3J0IHN0b3JhZ2UNCiAgICAgIGlmICghUFJJQ0lOR19DT05GSUcuY3ljbGVzW2N5Y2xlS2V5XS5oYXNTdG9yYWdlKSB7DQogICAgICAgIHNlbGVjdGVkU3RvcmFnZSA9ICdiYXNlJzsNCiAgICAgIH0NCg0KICAgICAgLy8gU2hvdyBTSVAgY3VzdG9taXphdGlvbiBmZWF0dXJlIG9ubHkgZm9yIDYtbW9udGggcGxhbnMNCiAgICAgIGNvbnN0IHNpcEZlYXR1cmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lwRmVhdHVyZScpOw0KICAgICAgaWYgKHNpcEZlYXR1cmUpIHsNCiAgICAgICAgc2lwRmVhdHVyZS5zdHlsZS5kaXNwbGF5ID0gY3ljbGVLZXkgPT09ICc2bW9udGgnID8gJycgOiAnbm9uZSc7DQogICAgICB9DQoNCiAgICAgIHJlbmRlckN5Y2xlVGFicygpOw0KICAgICAgcmVuZGVyU3RvcmFnZU9wdGlvbnMoKTsNCiAgICAgIHVwZGF0ZVByaWNlRGlzcGxheSgpOw0KICAgICAgdXBkYXRlQ3RhQnV0dG9uU3RhdGUoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZWxlY3RTdG9yYWdlKHN0b3JhZ2VLZXkpIHsNCiAgICAgIGlmICghUFJJQ0lOR19DT05GSUcuY3ljbGVzW3NlbGVjdGVkQ3ljbGVdLmhhc1N0b3JhZ2UpIHJldHVybjsNCg0KICAgICAgLy8gUHJldmVudCBzZWxlY3RpbmcgdW5hdmFpbGFibGUgc3RvcmFnZSBvcHRpb25zIChubyBkZXZpY2VzIHdpdGggdGhhdCBkcml2ZSBhdmFpbGFibGUpDQogICAgICBpZiAoc3RvcmFnZUtleSA9PT0gJ2FkZG9uMjU2JyAmJiBhdmFpbGFibGVEZXZpY2VzV2l0aDI1NkdiRHJpdmUgPT09IDApIHJldHVybjsNCiAgICAgIGlmIChzdG9yYWdlS2V5ID09PSAnYWRkb241MTInICYmIGF2YWlsYWJsZURldmljZXNXaXRoNTEyR2JEcml2ZSA9PT0gMCkgcmV0dXJuOw0KDQogICAgICBzZWxlY3RlZFN0b3JhZ2UgPSBzdG9yYWdlS2V5Ow0KICAgICAgcmVuZGVyU3RvcmFnZU9wdGlvbnMoKTsNCiAgICAgIHVwZGF0ZVByaWNlRGlzcGxheSgpOw0KICAgICAgdXBkYXRlQ3RhQnV0dG9uU3RhdGUoKTsNCiAgICB9DQoNCiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVDaGVja291dCgpIHsNCiAgICAgIC8vIENoZWNrIGlmIHNlbGVjdGVkIHN0b3JhZ2Ugb3B0aW9uIGlzIG91dCBvZiBzdG9jayAtIHNob3cgYXZhaWxhYmlsaXR5IGRpYWxvZw0KICAgICAgbGV0IGlzU2VsZWN0ZWRTdG9yYWdlT3V0T2ZTdG9jayA9IGZhbHNlOw0KICAgICAgaWYgKHNlbGVjdGVkU3RvcmFnZSA9PT0gJ2Jhc2UnKSB7DQogICAgICAgIGlzU2VsZWN0ZWRTdG9yYWdlT3V0T2ZTdG9jayA9IGN1cnJlbnRBdmFpbGFibGVEZXZpY2VzID09PSAwOw0KICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdhZGRvbjI1NicpIHsNCiAgICAgICAgaXNTZWxlY3RlZFN0b3JhZ2VPdXRPZlN0b2NrID0gYXZhaWxhYmxlRGV2aWNlc1dpdGgyNTZHYkRyaXZlID09PSAwOw0KICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFN0b3JhZ2UgPT09ICdhZGRvbjUxMicpIHsNCiAgICAgICAgaXNTZWxlY3RlZFN0b3JhZ2VPdXRPZlN0b2NrID0gYXZhaWxhYmxlRGV2aWNlc1dpdGg1MTJHYkRyaXZlID09PSAwOw0KICAgICAgfQ0KDQogICAgICBpZiAoaXNTZWxlY3RlZFN0b3JhZ2VPdXRPZlN0b2NrKSB7DQogICAgICAgIC8vIERldGVybWluZSB3aGljaCBwcmljaW5nIG9wdGlvbiBuZXdzbGV0dGVyIHRvIHN1YnNjcmliZSB0byAodXNpbmcgZW51bSB2YWx1ZXMpDQogICAgICAgIGxldCBwcmljaW5nT3B0aW9uID0gQXZhaWxhYmlsaXR5Tm90aWZpY2F0aW9uVHlwZS5CYXNlU3RvcmFnZTsNCiAgICAgICAgaWYgKHNlbGVjdGVkU3RvcmFnZSA9PT0gJ2FkZG9uMjU2Jykgew0KICAgICAgICAgIHByaWNpbmdPcHRpb24gPSBBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkV4dGVybmFsMjU2R2I7DQogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRTdG9yYWdlID09PSAnYWRkb241MTInKSB7DQogICAgICAgICAgcHJpY2luZ09wdGlvbiA9IEF2YWlsYWJpbGl0eU5vdGlmaWNhdGlvblR5cGUuRXh0ZXJuYWw1MTJHYjsNCiAgICAgICAgfQ0KICAgICAgICBvcGVuQXZhaWxhYmlsaXR5RGlhbG9nKHByaWNpbmdPcHRpb24pOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQoNCiAgICAgIC8vIFNwZWNpYWwgbG9naWMgZm9yIGRhaWx5IHBsYW4gLSByZXF1aXJlcyBtb3JlIGRldmljZXMgdGhhbiB0aGUgdGhyZXNob2xkDQogICAgICBpZiAoc2VsZWN0ZWRDeWNsZSA9PT0gJ2RhaWx5JyAmJiBnZXRUb3RhbEF2YWlsYWJsZURldmljZXMoKSA8PSBkYWlseVBsYW5BdmFpbGFiaWxpdHlUaHJlc2hvbGQpIHsNCiAgICAgICAgb3BlbkF2YWlsYWJpbGl0eURpYWxvZyhBdmFpbGFiaWxpdHlOb3RpZmljYXRpb25UeXBlLkRhaWx5KTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KDQogICAgICBjb25zdCBjeWNsZSA9IHNlbGVjdGVkQ3ljbGU7DQogICAgICBjb25zdCBzdG9yYWdlID0gc2VsZWN0ZWRTdG9yYWdlOw0KDQogICAgICAvLyBFbnN1cmUgQURUIHBheWxvYWQgZXhpc3RzDQogICAgICBjb25zdCBhZHRQYXlsb2FkID0gYXdhaXQgZW5zdXJlQWR0UGF5bG9hZCgpOw0KICAgICAgY29uc3QgY2xpZW50UmVmZXJlbmNlSWQgPSBhZHRQYXlsb2FkPy5DbGllbnRSZWZlcmVuY2VJZCA\/PyBnZW5lcmF0ZUd1aWQoKTsNCg0KICAgICAgLy8gR2V0IHRoZSBjaGVja291dCBVUkwgZm9yIHRoZSBjaGVja291dCBkYXRhY2VudGVyLiBFYWNoIERDIGhhcyBpdHMgb3duIFN0cmlwZSBQYXltZW50IExpbmsNCiAgICAgIC8vIHdpdGggbWV0YWRhdGEuZGF0YWNlbnRlciBzZXQgc28gdGhlIGJhY2tlbmQgY2FuIHJvdXRlIHRoZSByZW50ZWQgZGV2aWNlIHRvIHRoZSBjb3JyZWN0DQogICAgICAvLyBsb2NhdGlvbi4gRXh0ZXJuYWwtZHJpdmUgYWRkLW9ucyAoNTEyIEdCIC8gNzY4IEdCKSBhcmUgb25seSBzdG9ja2VkIGluIEN5cHJ1cywgc28gdGhleQ0KICAgICAgLy8gYWx3YXlzIGNoZWNrIG91dCB0aHJvdWdoIEN5cHJ1cyByZWdhcmRsZXNzIG9mIHRoZSBnZW8tcm91dGVkIGRhdGFjZW50ZXI7IGJhc2Ugc3RvcmFnZSB1c2VzDQogICAgICAvLyB0aGUgc2VsZWN0ZWQgKGdlby1yb3V0ZWQsIEluZGlhLTAtZmFsbHMtYmFjay10by1DeXBydXMpIGRhdGFjZW50ZXIuDQogICAgICBjb25zdCBjaGVja291dExvY2F0aW9uID0gc3RvcmFnZSA9PT0gJ2Jhc2UnID8gc2VsZWN0ZWRMb2NhdGlvbiA6ICdjeXBydXMnOw0KICAgICAgY29uc3QgZGNVcmxzID0gTE9DQVRJT05TW2NoZWNrb3V0TG9jYXRpb25dPy5jaGVja291dFVybHM7DQogICAgICBjb25zdCBkY1N0b3JhZ2VVcmxzID0gTE9DQVRJT05TW2NoZWNrb3V0TG9jYXRpb25dPy5zdG9yYWdlQ2hlY2tvdXRVcmxzOw0KICAgICAgbGV0IHVybCA9IGRjVXJscz8uW2N5Y2xlXSB8fCAnIyc7DQoNCiAgICAgIC8vIElmIHN0b3JhZ2UgYWRkLW9uIGlzIHNlbGVjdGVkLCB1c2Ugc3RvcmFnZS1zcGVjaWZpYyBVUkwgaWYgYXZhaWxhYmxlDQogICAgICBpZiAoc3RvcmFnZSAhPT0gJ2Jhc2UnICYmIGRjU3RvcmFnZVVybHMpIHsNCiAgICAgICAgY29uc3Qgc3RvcmFnZVVybCA9IGRjU3RvcmFnZVVybHNbY3ljbGVdPy5bc3RvcmFnZV07DQogICAgICAgIGlmIChzdG9yYWdlVXJsKSB7DQogICAgICAgICAgdXJsID0gc3RvcmFnZVVybDsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyBBcHBlbmQgY2xpZW50X3JlZmVyZW5jZV9pZCBmb3IgdHJhY2tpbmcNCiAgICAgIHVybCArPSAnP2NsaWVudF9yZWZlcmVuY2VfaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRSZWZlcmVuY2VJZCk7DQoNCiAgICAgIC8vIE9wZW4gY2hlY2tvdXQgaW4gbmV3IHRhYg0KICAgICAgY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7DQoNCiAgICAgIC8vIFRyYWNrIGNvbnZlcnNpb24gKGZpcmUgYW5kIGZvcmdldCkNCiAgICAgIGlmIChuZXdXaW5kb3cpIHsNCiAgICAgICAgdHJhY2tBZENvbnZlcnNpb24oY2xpZW50UmVmZXJlbmNlSWQsIGN5Y2xlKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIC8vIElOSVRJQUxJWkFUSU9ODQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICAgIGZ1bmN0aW9uIGluaXRSZW50YW1hY1ByaWNpbmcoKSB7DQogICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkIHRvIHByZXZlbnQgZG91YmxlIGluaXQNCiAgICAgIGlmICh3aW5kb3cucmVudGFtYWNQcmljaW5nSW5pdGlhbGl6ZWQpIHJldHVybjsNCiAgICAgIHdpbmRvdy5yZW50YW1hY1ByaWNpbmdJbml0aWFsaXplZCA9IHRydWU7DQoNCiAgICAgIC8vIEluaXRpYWxpemUgRE9NIGVsZW1lbnQgcmVmZXJlbmNlcw0KICAgICAgYXZhaWxhYmlsaXR5RGlhbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF2YWlsYWJpbGl0eURpYWxvZyIpOw0KICAgICAgYXZhaWxhYmlsaXR5T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlPdmVybGF5Iik7DQogICAgICBhdmFpbGFiaWxpdHlEaWFsb2dDbG9zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlEaWFsb2dDbG9zZSIpOw0KICAgICAgYXZhaWxhYmlsaXR5Rm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlGb3JtIik7DQogICAgICBhdmFpbGFiaWxpdHlGZWVkYmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdmFpbGFiaWxpdHlGZWVkYmFjayIpOw0KICAgICAgYXZhaWxhYmlsaXR5RW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXZhaWxhYmlsaXR5RW1haWwiKTsNCg0KICAgICAgcXVhbnRpdHlTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVhbnRpdHlTbGlkZXIiKTsNCiAgICAgIGR1cmF0aW9uU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImR1cmF0aW9uU2xpZGVyIik7DQogICAgICBxdWFudGl0eVZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInF1YW50aXR5VmFsdWUiKTsNCiAgICAgIGR1cmF0aW9uVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZHVyYXRpb25WYWx1ZSIpOw0KICAgICAgcXVhbnRpdHlEaXNjb3VudEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInF1YW50aXR5RGlzY291bnRCYWRnZSIpOw0KICAgICAgZHVyYXRpb25EaXNjb3VudEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImR1cmF0aW9uRGlzY291bnRCYWRnZSIpOw0KICAgICAgZW50ZXJwcmlzZVByaWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVudGVycHJpc2VQcmljZSIpOw0KICAgICAgZGlzY291bnRCYWRnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpc2NvdW50QmFkZ2UiKTsNCiAgICAgIHByaWNlQnJlYWtkb3duRW50ZXJwcmlzZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcmljZUJyZWFrZG93bkVudGVycHJpc2UiKTsNCiAgICAgIG5vbkN1bXVsYXRpdmVOb3RpY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9uQ3VtdWxhdGl2ZU5vdGljZSIpOw0KDQogICAgICAvLyBSZW5kZXIgVUkNCiAgICAgIC8vIExvY2F0aW9uIHBpY2tlciBkaXNhYmxlZCDigJQgQ3lwcnVzIGlzIHRoZSBmaXhlZCBkZWZhdWx0IChzZWxlY3RlZExvY2F0aW9uID0gJ2N5cHJ1cycpLg0KICAgICAgLy8gcmVuZGVyTG9jYXRpb25UYWJzKCk7DQogICAgICAvLyBTaG93IHNrZWxldG9uIGxvYWRlcnMgdW50aWwgYXZhaWxhYmlsaXR5IGRhdGEgYXJyaXZlcy4gVGhlIHJlYWwgY3ljbGUgdGFicyBhbmQNCiAgICAgIC8vIHN0b3JhZ2Ugb3B0aW9ucyBhcmUgcmVuZGVyZWQgYnkgYXBwbHlBdmFpbGFiaWxpdHlGb3JTZWxlY3RlZExvY2F0aW9uKCksIGNhbGxlZA0KICAgICAgLy8gd2hlbiBmZXRjaEF2YWlsYWJpbGl0eVN0YXR1cygpIHJlc29sdmVzIChvciB0aGUgc2FmZXR5IHRpbWVvdXQgYmVsb3cgZmlyZXMpLg0KICAgICAgcmVuZGVyQ3ljbGVUYWJzU2tlbGV0b24oKTsNCiAgICAgIHJlbmRlclN0b3JhZ2VPcHRpb25zU2tlbGV0b24oKTsNCiAgICAgIHVwZGF0ZVByaWNlRGlzcGxheSgpOw0KDQogICAgICAvLyBHZW8gYXV0by1yb3V0ZSAoY2xpZW50LXNpZGUpOiBkZXRlY3QgdGhlIHZpc2l0b3IncyBuZWFyZXN0IGRhdGFjZW50ZXIgZnJvbSB0aGVpciBJUCBhbmQNCiAgICAgIC8vIHJvdXRlIGNoZWNrb3V0IHRoZXJlLiBSZXNvbHZlcyBvbmNlIGFzeW5jaHJvbm91c2x5OyB0aGUgY2FwYWNpdHkgZmFsbGJhY2sgaXMgcmUtYXBwbGllZA0KICAgICAgLy8gd2hlbiBhdmFpbGFiaWxpdHkgZGF0YSBhcnJpdmVzLiBUaGUgbG9jYXRpb24gcGlja2VyIHN0YXlzIGhpZGRlbi4NCiAgICAgIHJlc29sdmVHZW9QcmVmZXJyZWRMb2NhdGlvbigpOw0KDQogICAgICAvLyBDVEEgYnV0dG9uDQogICAgICBjb25zdCBjdGFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3RhQnV0dG9uJyk7DQogICAgICBpZiAoY3RhQnV0dG9uKSBjdGFCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDaGVja291dCk7DQoNCiAgICAgIC8vIEF2YWlsYWJpbGl0eSBkaWFsb2cgZXZlbnRzDQogICAgICBhdmFpbGFiaWxpdHlGb3JtPy5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBzdWJtaXRBdmFpbGFiaWxpdHlGb3JtKTsNCiAgICAgIGF2YWlsYWJpbGl0eUVtYWlsPy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsNCiAgICAgICAgYXZhaWxhYmlsaXR5RmVlZGJhY2sudGV4dENvbnRlbnQgPSAiV2Ugb25seSBlbWFpbCB5b3UgYWJvdXQgYXZhaWxhYmlsaXR5LiI7DQogICAgICAgIGF2YWlsYWJpbGl0eUZlZWRiYWNrLmNsYXNzTmFtZSA9ICJhdmFpbGFiaWxpdHktZmVlZGJhY2sgaW5mbyI7DQogICAgICB9KTsNCiAgICAgIGF2YWlsYWJpbGl0eURpYWxvZ0Nsb3NlPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlQXZhaWxhYmlsaXR5RGlhbG9nKTsNCiAgICAgIGF2YWlsYWJpbGl0eU92ZXJsYXk\/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY2xvc2VBdmFpbGFiaWxpdHlEaWFsb2cpOw0KDQogICAgICAvLyBGZXRjaCBhdmFpbGFiaWxpdHkgc3RhdHVzDQogICAgICBmZXRjaEF2YWlsYWJpbGl0eVN0YXR1cygpOw0KDQogICAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgYXZhaWxhYmlsaXR5IHJlcXVlc3QgaGFuZ3MgYW5kIG5ldmVyIHJlc29sdmVzL3JlamVjdHMsIHN3YXAgdGhlDQogICAgICAvLyBza2VsZXRvbnMgZm9yIHJlYWwgY2FyZHMgKHdpdGggb3B0aW1pc3RpYyBkZWZhdWx0cykgc28gdGhlIHBhZ2UgbmV2ZXIgc3RheXMgbG9hZGluZy4NCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoIWF2YWlsYWJpbGl0eUFwcGxpZWQpIGFwcGx5QXZhaWxhYmlsaXR5Rm9yU2VsZWN0ZWRMb2NhdGlvbigpOw0KICAgICAgfSwgNzAwMCk7DQoNCiAgICAgIC8vIEVuc3VyZSBBRFQgcGF5bG9hZCBleGlzdHMgb24gcGFnZSBsb2FkDQogICAgICBlbnN1cmVBZHRQYXlsb2FkKCk7DQoNCiAgICAgIC8vIFB1cmNoYXNlIGRyb3Bkb3duIHRvZ2dsZQ0KICAgICAgY29uc3QgcHVyY2hhc2VEcm9wZG93blRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHVyY2hhc2VEcm9wZG93blRyaWdnZXInKTsNCiAgICAgIGNvbnN0IHB1cmNoYXNlRHJvcGRvd25Db250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B1cmNoYXNlRHJvcGRvd25Db250ZW50Jyk7DQoNCiAgICAgIHB1cmNoYXNlRHJvcGRvd25UcmlnZ2VyPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHB1cmNoYXNlRHJvcGRvd25UcmlnZ2VyLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7DQogICAgICAgIHB1cmNoYXNlRHJvcGRvd25UcmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICFpc0V4cGFuZGVkKTsNCiAgICAgICAgcHVyY2hhc2VEcm9wZG93bkNvbnRlbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIGlzRXhwYW5kZWQpOw0KICAgICAgICBwdXJjaGFzZURyb3Bkb3duQ29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdleHBhbmRlZCcpOw0KICAgICAgfSk7DQoNCiAgICAgIC8vIEVudGVycHJpc2Ugc2xpZGVyIGV2ZW50cw0KICAgICAgcXVhbnRpdHlTbGlkZXI\/LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgY2FsY3VsYXRlRW50ZXJwcmlzZVByaWNlKTsNCiAgICAgIGR1cmF0aW9uU2xpZGVyPy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGNhbGN1bGF0ZUVudGVycHJpc2VQcmljZSk7DQoNCiAgICAgIC8vIEluaXRpYWwgZW50ZXJwcmlzZSBjYWxjdWxhdGlvbg0KICAgICAgaWYgKHF1YW50aXR5U2xpZGVyICYmIGR1cmF0aW9uU2xpZGVyKSB7DQogICAgICAgIGNhbGN1bGF0ZUVudGVycHJpc2VQcmljZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyBMb2FkIEdvb2dsZSBSZXZpZXdzDQogICAgICBsb2FkR29vZ2xlUmV2aWV3cygpOw0KICAgIH0NCg0KICAgIC8vIFJ1biBpbml0OiBpZiBET00gYWxyZWFkeSBsb2FkZWQsIHJ1biBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdhaXQNCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7DQogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdFJlbnRhbWFjUHJpY2luZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIC8vIERPTSBhbHJlYWR5IGxvYWRlZCAoY29tbW9uIGluIFdvcmRQcmVzcyBlbWJlZHMpDQogICAgICBpbml0UmVudGFtYWNQcmljaW5nKCk7DQogICAgfQ0KDQogICAgLy8gRXhwb3NlIG5hdmlnYXRlV2l0aExhbmd1YWdlIHRvIGdsb2JhbCBzY29wZSBmb3Igb25jbGljayBoYW5kbGVycw0KICAgIHdpbmRvdy5uYXZpZ2F0ZVdpdGhMYW5ndWFnZSA9IG5hdmlnYXRlV2l0aExhbmd1YWdlOw0KICAgIH0pKCk7DQogIA==\");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>\r\n","protected":false},"excerpt":{"rendered":"<p>All instances are currently allocated &times; We&#8217;re at full capacity right now, but we can let you know the moment a Mac becomes available again. Leave your email below and you&#8217;ll be first in line when we spin up new instances. Email address Notify me We only use this email to update you about availability. [&hellip;]<\/p>\n","protected":false},"author":1,"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\/ar\/wp-json\/wp\/v2\/pages\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":634,"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/pages\/26\/revisions"}],"predecessor-version":[{"id":5325,"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/pages\/26\/revisions\/5325"}],"wp:attachment":[{"href":"https:\/\/rentamac.io\/ar\/wp-json\/wp\/v2\/media?parent=26"}],"curies":[{"name":"\u062f\u0628\u0644\u064a\u0648 \u0628\u064a","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}