<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
     xmlns:atom="http://www.w3.org/2005/Atom" 
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>drakkein.me</title>
    <description>Personal blog by drakkein</description>
    <link>https://drakkein.me/</link>
    <atom:link href="https://drakkein.me/feed.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 03 Aug 2025 19:27:28 GMT</lastBuildDate>
    <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
    <language>en-us</language>
    <generator>Eleventy https://www.11ty.dev</generator>
    <managingEditor>drakkein@drakkein.me (drakkein)</managingEditor>
    <webMaster>drakkein@drakkein.me (drakkein)</webMaster><item>
        <title>Posts tagged &#39;gaming&#39;</title>
        <link>https://drakkein.me/tags/gaming/</link>
        <guid isPermaLink="true">https://drakkein.me/tags/gaming/</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description>All posts tagged with gaming</description>
        <content:encoded><![CDATA[
<div class="tag-page">
  <header class="page-header">
    <h1>Posts tagged "gaming"</h1>
    <p>
      1 post found
    </p>
  </header>

  <div class="articles-list">
      
    <article class="post-preview">
      <time datetime="2025-08-02">August 2, 2025</time>
      <span class="separator">•</span>
      <h3><a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a></h3>
      
      <div class="tags">
        
        <a href="https://drakkein.me/tags/proxmox/" class="tag">proxmox</a>
        
        <a href="https://drakkein.me/tags/lxc/" class="tag">lxc</a>
        
        <a href="https://drakkein.me/tags/gaming/" class="tag">gaming</a>
        
        <a href="https://drakkein.me/tags/steam/" class="tag">steam</a>
        
        <a href="https://drakkein.me/tags/kodi/" class="tag">kodi</a>
        
      </div>
      
    </article>
     
  </div>

  <div class="back-to-tags">
    <a href="https://drakkein.me/tags/" class="back-link">← All Tags</a>
  </div>
</div>
]]></content:encoded></item><item>
        <title>All Tags</title>
        <link>https://drakkein.me/tags/</link>
        <guid isPermaLink="true">https://drakkein.me/tags/</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description>Browse posts by category</description>
        <content:encoded><![CDATA[
<div class="tags-index">
  <header class="page-header">
    <h1>All Tags</h1>
    <p>Browse posts by category</p>
  </header>

  <div class="tags-grid">
     
    <div class="tag-card">
      <h3><a href="https://drakkein.me/tags/gaming/">gaming</a></h3>
      <p>
        1 post
      </p>
      
      <div class="recent-in-tag">
         
        <div class="tag-post-preview">
          <a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a>
        </div>
         
      </div>
      
    </div>
     
    <div class="tag-card">
      <h3><a href="https://drakkein.me/tags/kodi/">kodi</a></h3>
      <p>
        1 post
      </p>
      
      <div class="recent-in-tag">
         
        <div class="tag-post-preview">
          <a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a>
        </div>
         
      </div>
      
    </div>
     
    <div class="tag-card">
      <h3><a href="https://drakkein.me/tags/lxc/">lxc</a></h3>
      <p>
        1 post
      </p>
      
      <div class="recent-in-tag">
         
        <div class="tag-post-preview">
          <a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a>
        </div>
         
      </div>
      
    </div>
     
    <div class="tag-card">
      <h3><a href="https://drakkein.me/tags/proxmox/">proxmox</a></h3>
      <p>
        1 post
      </p>
      
      <div class="recent-in-tag">
         
        <div class="tag-post-preview">
          <a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a>
        </div>
         
      </div>
      
    </div>
     
    <div class="tag-card">
      <h3><a href="https://drakkein.me/tags/steam/">steam</a></h3>
      <p>
        1 post
      </p>
      
      <div class="recent-in-tag">
         
        <div class="tag-post-preview">
          <a href="https://drakkein.me/articles/gaming-in-proxmox-lxc/">Gaming in Proxmox LXC</a>
        </div>
         
      </div>
      
    </div>
    
  </div>
</div>
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/sitemap.xml</link>
        <guid isPermaLink="true">https://drakkein.me/sitemap.xml</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <!-- Homepage -->
  <url>
    <loc>https://drakkein.me/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  
  <!-- About page -->
  <url>
    <loc>https://drakkein.me/about/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  
  <!-- Articles index -->
  <url>
    <loc>https://drakkein.me/articles/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  
  <!-- Tags index -->
  <url>
    <loc>https://drakkein.me/tags/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.7</priority>
  </url>

  <!-- Articles -->
  
  <url>
    <loc>https://drakkein.me/articles/gaming-in-proxmox-lxc/</loc>
    <lastmod>2025-08-02</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  

  <!-- Tag pages -->
  
  <url>
    <loc>https://drakkein.me/tags/gaming/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  
  <url>
    <loc>https://drakkein.me/tags/kodi/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  
  <url>
    <loc>https://drakkein.me/tags/lxc/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  
  <url>
    <loc>https://drakkein.me/tags/proxmox/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  
  <url>
    <loc>https://drakkein.me/tags/steam/</loc>
    <lastmod>2025-08-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  
</urlset>
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/robots.txt</link>
        <guid isPermaLink="true">https://drakkein.me/robots.txt</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
User-agent: * Allow: / Sitemap: https://drakkein.me/sitemap.xml
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/manifest.json</link>
        <guid isPermaLink="true">https://drakkein.me/manifest.json</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
{ "name": "drakkein.me", "short_name": "drakkein.me", "description":
"Personal blog by drakkein focusing on web development, design, and technology", "start_url": "/", "display": "minimal-ui",
"background_color": "#ffffff", "theme_color": "#000000", "icons": [ { "src":
"/images/icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src":
"/images/icon-512.png", "sizes": "512x512", "type": "image/png" } ] }
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/images/icon-512.png</link>
        <guid isPermaLink="true">https://drakkein.me/images/icon-512.png</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
  <rect width="512" height="512" fill="#0a0a0a" rx="64" ry="64"></rect>
  <text x="256" y="256" font-family="system-ui, -apple-system, sans-serif" font-size="320" font-weight="bold" fill="#fff" text-anchor="middle" dominant-baseline="central">
    D
  </text>
</svg>
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/images/icon-192.png</link>
        <guid isPermaLink="true">https://drakkein.me/images/icon-192.png</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 192 192">
  <rect width="192" height="192" fill="#0a0a0a" rx="24" ry="24"></rect>
  <text x="96" y="96" font-family="system-ui, -apple-system, sans-serif" font-size="120" font-weight="bold" fill="#fff" text-anchor="middle" dominant-baseline="central">
    D
  </text>
</svg>
]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/css/style.css</link>
        <guid isPermaLink="true">https://drakkein.me/css/style.css</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[:where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}:where(h1){-webkit-margin-after:.67em;margin-block-end:.67em;-webkit-margin-before:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){-webkit-margin-after:0;margin-block-end:0;-webkit-margin-before:0;margin-block-start:0}:where(hr){-webkit-box-sizing:content-box;box-sizing:content-box}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(table){border-color:currentColor}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(select){text-transform:none}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(summary){display:list-item}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}:after,:before{text-decoration:inherit;vertical-align:inherit}:where(:root){cursor:default;line-height:1.5;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%}:where(body){margin:0}:where(h1){font-size:2em;margin:.67em 0}:where(dl,ol,ul) :where(dl,ol,ul){margin:0}:where(hr){color:inherit;height:0}:where(nav) :where(ol,ul){list-style-type:none;padding:0}:where(nav li):before{content:"\200B";float:left}:where(pre){font-family:monospace,monospace;font-size:1em;overflow:auto}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}:where(iframe){border-style:none}:where(svg:not([fill])){fill:currentColor}:where(table){border-collapse:collapse;border-color:inherit;text-indent:0}:where(button,input,select){margin:0}:where(button,[type=button i],[type=reset i],[type=submit i]){-webkit-appearance:button}:where(fieldset){border:1px solid #a0a0a0}:where(progress){vertical-align:baseline}:where(textarea){margin:0;resize:vertical}:where([type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:-webkit-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:-webkit-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(details>summary:first-of-type){display:list-item}:where([aria-busy=true i]){cursor:progress}:where([aria-controls]){cursor:pointer}:where([aria-disabled=true i],[disabled]){cursor:not-allowed}:where([aria-hidden=false i][hidden]){display:initial}:where([aria-hidden=false i][hidden]:not(:focus)){clip:rect(0,0,0,0);position:absolute}:root{--black:#0a0a0a;--dark-grey:#1a1a1a;--medium-grey:#333;--light-grey:#ccc;--white:#fff;--red:#d45456;--bg-primary:var(--black);--bg-secondary:var(--dark-grey);--bg-tertiary:var(--medium-grey);--bg-code:var(--dark-grey);--text-primary:var(--white);--text-secondary:var(--light-grey);--text-muted:#888;--text-code:#e6edf3;--accent-primary:var(--red);--accent-hover:#e56567;--border-color:var(--medium-grey);--syntax-comment:#8b949e;--syntax-punctuation:#e6edf3;--syntax-property:#79c0ff;--syntax-string:#a5d6ff;--syntax-keyword:#ff7b72;--syntax-function:#d2a8ff;--syntax-variable:#ffa657}@custom-media --mobile (max-width: 768px);@custom-media --tablet (max-width: 1024px);body{background:var(--bg-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:16px;line-height:1.7}body,h1,h2,h3,h4,h5,h6{color:var(--text-primary)}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.3;margin-bottom:1rem}h1{font-size:2.5rem;font-weight:700;margin-bottom:1.5rem}@media (--mobile ){h1{font-size:2rem}}h2{color:var(--accent-primary);font-size:2rem;margin-bottom:1rem;margin-top:3rem}@media (--mobile ){h2{font-size:1.75rem}}h3{font-size:1.5rem;margin-bottom:.75rem;margin-top:2rem}@media (--mobile ){h3{font-size:1.35rem}}h4,h5,h6{font-size:1.25rem;margin-bottom:.5rem;margin-top:1.5rem}p{color:var(--text-secondary);margin-bottom:1.5rem}a{color:var(--accent-primary);text-decoration:underline}a:is(:active,:hover){color:var(--accent-hover)}:focus{outline:2px solid var(--accent-primary);outline-offset:2px}::-moz-selection{background:var(--accent-primary);color:var(--white)}::selection{background:var(--accent-primary);color:var(--white)}header{background:var(--bg-primary);padding:1rem 0}nav{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 auto;max-width:900px;padding:0 2rem}@media (--mobile ){nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:1rem;padding:1rem}}.logo{color:var(--accent-primary);font-size:1.5rem;font-weight:700;text-decoration:underline}.nav-links{display:-webkit-box;display:-ms-flexbox;display:flex;gap:2rem;list-style:none}@media (--mobile ){.nav-links{gap:1.5rem}}.nav-links a{color:var(--text-secondary);font-weight:500;padding:.5rem 0}:is(.nav-links a):is(:hover,:focus){color:var(--accent-primary);text-decoration:underline}main{margin:0 auto;max-width:900px;min-height:calc(100vh - 140px);padding:3rem 2rem;text-align:justify}@media (--mobile ){main{padding:2rem 1rem}}footer{background:var(--bg-primary);color:var(--text-muted);padding:2rem 0;text-align:center}footer p{margin:.5rem 0}footer a{color:var(--accent-primary)}:is(footer a):hover{color:var(--accent-hover)}.home-header,.page-header{margin-bottom:3rem;text-align:center}:is(.page-header,.home-header) h1{margin-bottom:1rem}:is(.page-header,.home-header) p{color:var(--text-secondary);font-size:1.25rem}.home-header{margin-bottom:4rem}.tag{background:var(--bg-tertiary);border-radius:3px;color:var(--text-secondary);font-size:.75rem;padding:.2rem .4rem;-webkit-transition:all .2s ease;transition:all .2s ease;white-space:nowrap}.tag,.tag:hover{text-decoration:none}.tag:hover{background:var(--accent-primary);color:var(--white)}.tags{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:.5rem}@media (--mobile ){.tags{-ms-flex-wrap:wrap;flex-wrap:wrap}}.articles-list,.posts-grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:1rem}.post-preview{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid var(--border-color);display:-webkit-box;display:-ms-flexbox;display:flex;gap:.75rem;padding:.5rem 0}.post-preview:last-child{border-bottom:none}@media (--mobile ){.post-preview{-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.5rem}}.post-preview .separator,.post-preview time{color:var(--text-muted);font-size:.9rem;white-space:nowrap}@media (--mobile ){.post-preview .separator,.post-preview time{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}.post-preview h3{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0}@media (--mobile ){.post-preview h3{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}}:is(.post-preview h3) a{color:var(--accent-primary);font-size:1rem;font-weight:500;text-decoration:underline}:is(:is(.post-preview h3) a):hover{color:var(--accent-hover)}@media (--mobile ){.post-preview .tags{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.article-header{border-bottom:1px solid var(--border-color);margin-bottom:3rem;padding-bottom:2rem}.article-header h1{font-size:2.5rem;line-height:1.2;margin-bottom:1rem}.article-tags{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.article-tags .tag{border-radius:4px;font-size:.8rem;padding:.3rem .6rem}.article-date{color:var(--text-muted);font-size:.9rem;font-style:italic}.article-body{line-height:1.8}.article-body :is(h2,h3,h4):first-child{margin-top:0}.tags-grid{display:grid;gap:2rem;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:3rem}.tag-card{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:1.5rem}.tag-card h3{font-size:1.25rem;margin:0 0 .5rem}:is(.tag-card h3) a{color:var(--accent-primary);text-decoration:none}:is(:is(.tag-card h3) a):hover{color:var(--accent-hover);text-decoration:underline}.tag-card>p{color:var(--text-muted);font-size:.9rem;margin-bottom:1rem}.recent-in-tag{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.5rem}.tag-post-preview a{color:var(--text-secondary);font-size:.9rem;line-height:1.4;text-decoration:none}:is(.tag-post-preview a):hover{color:var(--accent-primary);text-decoration:underline}.about-content{margin:0 auto;max-width:700px}@media (--mobile ){.about-content{max-width:none}}.about-content section{margin-bottom:3rem}.about-content h2{color:var(--accent-primary);font-size:1.5rem;margin-bottom:1.5rem}.about-content p{font-size:1.1rem;line-height:1.7}.about-content p,.about-content ul{margin-bottom:1.5rem}.about-content li{font-size:1.05rem;line-height:1.6;margin-bottom:.75rem}.social-links{display:-webkit-box;display:-ms-flexbox;display:flex;gap:1rem;margin-top:1.5rem}@media (--mobile ){.social-links{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.social-link{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-weight:500;gap:.5rem;padding:.75rem 1.5rem;text-decoration:none;-webkit-transition:all .2s ease;transition:all .2s ease}@media (--mobile ){.social-link{text-align:center}}.social-link svg{height:16px;width:16px;stroke:currentColor}.social-link:hover{background:var(--accent-primary);border-color:var(--accent-primary);color:var(--white);text-decoration:none;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.back-link,.error-link{background:var(--bg-tertiary);border-radius:4px;color:var(--text-primary);display:inline-block;font-size:.9rem;padding:.5rem 1rem;text-decoration:none;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}:is(.back-link,.error-link):hover{background:var(--accent-primary);color:var(--white);text-decoration:none}.error-link{background:var(--bg-secondary);font-weight:500;padding:.75rem 1.5rem;-webkit-transition:all .2s ease;transition:all .2s ease}.back-to-tags{margin-top:3rem;text-align:center}.error-page{margin:0 auto;max-width:600px;padding:4rem 2rem;text-align:center}@media (--mobile ){.error-page{padding:3rem 1rem}}.error-page h1{color:var(--accent-primary);font-size:6rem;font-weight:700;margin-bottom:1rem}@media (--mobile ){.error-page h1{font-size:4rem}}.error-page h2{color:var(--text-primary);font-size:2rem;margin-bottom:1rem;margin-top:0}@media (--mobile ){.error-page h2{font-size:1.5rem}}.error-page p{color:var(--text-secondary);font-size:1.125rem;margin-bottom:2rem}.error-nav{display:-webkit-box;display:-ms-flexbox;display:flex;gap:1rem;margin-top:2rem}@media (--mobile ){.error-nav{gap:.5rem}}code{color:var(--text-code);font-family:monospace;font-size:.9rem;padding:.2rem .4rem}code,pre{background:var(--bg-code)}pre{margin:2rem 0;overflow-x:auto;padding:1.5rem}pre code{background:none;font-size:.9rem;line-height:1.5;padding:0}.token.comment{color:var(--syntax-comment);font-style:italic}.token.punctuation{color:var(--syntax-punctuation)}.token:is(.property,.tag,.boolean,.number){color:var(--syntax-property)}.token:is(.string,.attr-name){color:var(--syntax-string)}.token:is(.keyword,.operator){color:var(--syntax-keyword)}.token:is(.function,.class-name){color:var(--syntax-function)}.token.variable{color:var(--syntax-variable)}blockquote{border-left:4px solid var(--accent-primary);font-style:italic;margin:2rem 0;padding:1rem 1.5rem}blockquote,li{color:var(--text-secondary)}li{margin-bottom:.5rem}table{border-collapse:collapse;margin:2rem 0;width:100%}td,th{border-bottom:1px solid var(--border-color);padding:1rem;text-align:left}th{background:var(--bg-tertiary);color:var(--text-primary);font-weight:600}figure{display:block;margin:1em auto;overflow:hidden;padding:0;text-align:center}figure img,figure picture{display:block;height:auto;width:100%}figure figcaption{color:var(--syntax-comment);font-size:1rem;font-style:italic;padding:1em}hr{border:none;border-top:1px solid var(--border-color);margin:2rem 0}.utterances{max-width:900px}.color-primary{color:var(--accent-primary)}.sr-only{border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0 0 0 0);clip-path:inset(100%)}
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9AY3NzdG9vbHMvbm9ybWFsaXplLmNzcy9ub3JtYWxpemUuY3NzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3Nhbml0aXplLmNzcy9zYW5pdGl6ZS5jc3MiLCIuLi8uLi9zcmMvY3NzL3N0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxhQUNFLGdCQUFpQixDQUNqQiw2QkFBOEIsQ0FDOUIsMEJBQXNCLENBQXRCLHlCQUFzQixDQUF0QixxQkFDRixDQVVBLFdBRUUsMEJBQXdCLENBQXhCLHNCQUF3QixDQUN4QiwyQkFBMEIsQ0FBMUIsd0JBQ0YsQ0FTQSxrQ0FDRSxzQkFBbUIsQ0FBbkIsa0JBQW1CLENBQ25CLHVCQUFxQixDQUFyQixvQkFDRixDQU9BLFdBQ0UsOEJBQXVCLENBQXZCLHNCQUdGLENBMkJBLDBCQUNFLCtCQUFpQyxDQUNqQyxhQUNGLENBa0JBLGNBQ0UseUJBRUYsQ0FpQkEsZUFDRSxtQkFDRixDQU1BLHdFQUNFLHlCQUNGLENBY0EsZUFDRSxtQkFDRixDQWVBLDZCQUNFLDRCQUE2QixDQUM3QixtQkFDRixDQTBDQSx5R0FDRSxpQkFBa0IsQ0FDbEIsU0FDRixDQU1BLHVHQUNFLDZCQUNGLENBTUEseUJBQ0UsZUFDRixDQWdDQSxnQkFDRSxpQkFDRixDQ3hQQSxpQkFHRSw2QkFBc0IsQ0FBdEIscUJBRUYsQ0FPQSxlQUVFLHVCQUF3QixDQUN4QixzQkFDRixDQVdBLGNBQ0UsY0FBZSxDQUNmLGVBQWdCLENBQ2hCLHdCQUF5QixDQUN6QixlQUFnQixDQUNoQixhQUFXLENBQVgsVUFBVyxDQUNYLHVDQUF3QyxDQUN4Qyw2QkFDRixDQVNBLGFBQ0UsUUFDRixDQU9BLFdBQ0UsYUFBYyxDQUNkLGNBQ0YsQ0FTQSxrQ0FDRSxRQUNGLENBT0EsV0FDRSxhQUFjLENBQ2QsUUFDRixDQU1BLDBCQUNFLG9CQUFxQixDQUNyQixTQUNGLENBTUEsc0JBQ0UsZUFBZ0IsQ0FDaEIsVUFDRixDQVFBLFlBQ0Us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LGlCQUNGLENBRUEsbUJBQ0UsK0JBQ0YsQ0FFQSwyQ0FDRSw0QkFDRixDQUVBLDhCQUNFLDBCQUNGLENBRUEsOEJBQ0UsMkJBQ0YsQ0FFQSxpQ0FDRSw0QkFDRixDQUVBLGdCQUNFLDRCQUNGLENBSUYsV0FDRSwyQ0FBNEMsQ0FHNUMsaUJBQWtCLENBRGxCLGFBQWMsQ0FEZCxtQkFJRixDQUVBLGNBSEUsMkJBTUYsQ0FIQSxHQUNFLG1CQUVGLENBRUEsTUFFRSx3QkFBeUIsQ0FDekIsYUFBYyxDQUZkLFVBR0YsQ0FFQSxNQUlFLDJDQUE0QyxDQUY1QyxZQUFhLENBQ2IsZUFFRixDQUVBLEdBQ0UsNkJBQThCLENBQzlCLHlCQUEwQixDQUMxQixlQUNGLENBRUEsT0FDRSxhQUFjLENBQ2QsZUFBZ0IsQ0FFaEIsZUFBZ0IsQ0FEaEIsU0FBVSxDQUVWLGlCQWVGLENBYkUsMEJBRUUsYUFBYyxDQUVkLFdBQVksQ0FEWixVQUVGLENBRUEsa0JBRUUsMkJBQTRCLENBRDVCLGNBQWUsQ0FHZixpQkFBa0IsQ0FEbEIsV0FFRixDQUdGLEdBQ0UsV0FBWSxDQUNaLHdDQUF5QyxDQUN6QyxhQUNGLENBR0EsWUFDRSxlQUNGLENBR0EsZUFDRSwyQkFDRixDQUVBLFNBTUUsUUFBUyxDQUhULFVBQVcsQ0FDWCxXQUFZLENBR1osZUFBZ0IsQ0FGaEIsU0FBVSxDQUpWLGlCQUFrQixDQUNsQixTQUFVLENBTVYsa0JBQW1CLENBQ25CLHFCQUNGIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIERvY3VtZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuICovXG5cbjp3aGVyZShodG1sKSB7XG4gIGxpbmUtaGVpZ2h0OiAxLjE1OyAvKiAxICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogMiAqL1xuICB0ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG59XG5cbi8qIFNlY3Rpb25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcbiAqIGBhcnRpY2xlYCBjb250ZXh0cyBpbiBDaHJvbWUsIEVkZ2UsIEZpcmVmb3gsIGFuZCBTYWZhcmkuXG4gKi9cblxuOndoZXJlKGgxKSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW4tYmxvY2stZW5kOiAwLjY3ZW07XG4gIG1hcmdpbi1ibG9jay1zdGFydDogMC42N2VtO1xufVxuXG4vKiBHcm91cGluZyBjb250ZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIG9uIG5lc3RlZCBsaXN0cyBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKi9cblxuOndoZXJlKGRsLCBvbCwgdWwpIDp3aGVyZShkbCwgb2wsIHVsKSB7XG4gIG1hcmdpbi1ibG9jay1lbmQ6IDA7XG4gIG1hcmdpbi1ibG9jay1zdGFydDogMDtcbn1cblxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBGaXJlZm94LlxuICogMi4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2Ugb2YgYm9yZGVyIGNvbG9yIGluIEZpcmVmb3guXG4gKi9cblxuOndoZXJlKGhyKSB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAyICovXG4gIGhlaWdodDogMDsgLyogMSAqL1xufVxuXG4vKiBUZXh0LWxldmVsIHNlbWFudGljc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgdGV4dCBkZWNvcmF0aW9uIGluIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUoYWJiclt0aXRsZV0pIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5cbjp3aGVyZShiLCBzdHJvbmcpIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbjp3aGVyZShjb2RlLCBrYmQsIHByZSwgc2FtcCkge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7IC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG46d2hlcmUoc21hbGwpIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8qIFRhYnVsYXIgZGF0YVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRhYmxlIGJvcmRlciBjb2xvciBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKiAyLiBSZW1vdmUgdGV4dCBpbmRlbnRhdGlvbiBmcm9tIHRhYmxlIGNvbnRlbnRzIGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUodGFibGUpIHtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7IC8qIDEgKi9cbiAgdGV4dC1pbmRlbnQ6IDA7IC8qIDIgKi9cbn1cblxuLyogRm9ybXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gb24gY29udHJvbHMgaW4gU2FmYXJpLlxuICovXG5cbjp3aGVyZShidXR0b24sIGlucHV0LCBzZWxlY3QpIHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRmlyZWZveC5cbiAqL1xuXG46d2hlcmUoYnV0dG9uKSB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBidXR0b25zIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5cbjp3aGVyZShidXR0b24sIGlucHV0OmlzKFt0eXBlPVwiYnV0dG9uXCIgaV0sIFt0eXBlPVwicmVzZXRcIiBpXSwgW3R5cGU9XCJzdWJtaXRcIiBpXSkpIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBGaXJlZm94LlxuICovXG5cbjp3aGVyZShwcm9ncmVzcykge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5cbjp3aGVyZShzZWxlY3QpIHtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gRmlyZWZveCBhbmQgU2FmYXJpLlxuICovXG5cbjp3aGVyZSh0ZXh0YXJlYSkge1xuICBtYXJnaW46IDA7XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgb2RkIGFwcGVhcmFuY2UgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblxuOndoZXJlKGlucHV0W3R5cGU9XCJzZWFyY2hcIiBpXSkge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIFNhZmFyaS5cbiAqL1xuXG46Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG46Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgdGV4dCBzdHlsZSBvZiBwbGFjZWhvbGRlcnMgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5cbjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBvcGFjaXR5OiAwLjU0O1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkgb24gbWFjT1MuXG4gKi9cblxuOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSB1cGxvYWQgYnV0dG9ucyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDsgLyogMiAqL1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgYm9yZGVyIGFuZCBwYWRkaW5nIG9mIGZvY3VzIG91dGxpbmVzIGluIEZpcmVmb3guXG4gKi9cblxuOndoZXJlKGJ1dHRvbiwgaW5wdXQ6aXMoW3R5cGU9XCJidXR0b25cIiBpXSwgW3R5cGU9XCJjb2xvclwiIGldLCBbdHlwZT1cInJlc2V0XCIgaV0sIFt0eXBlPVwic3VibWl0XCIgaV0pKTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBmb2N1cyBvdXRsaW5lIHN0eWxlcyB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZSBpbiBGaXJlZm94LlxuICovXG5cbjp3aGVyZShidXR0b24sIGlucHV0OmlzKFt0eXBlPVwiYnV0dG9uXCIgaV0sIFt0eXBlPVwiY29sb3JcIiBpXSwgW3R5cGU9XCJyZXNldFwiIGldLCBbdHlwZT1cInN1Ym1pdFwiIGldKSk6Oi1tb3otZm9jdXNyaW5nIHtcbiAgb3V0bGluZTogMXB4IGRvdHRlZCBCdXR0b25UZXh0O1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgYWRkaXRpb25hbCA6aW52YWxpZCBzdHlsZXMgaW4gRmlyZWZveC5cbiAqL1xuXG46d2hlcmUoOi1tb3otdWktaW52YWxpZCkge1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4vKiBJbnRlcmFjdGl2ZVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBzdHlsZXMgaW4gU2FmYXJpLlxuICovXG5cbjp3aGVyZShkaWFsb2cpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlcjogc29saWQ7XG4gIGNvbG9yOiBibGFjaztcbiAgaGVpZ2h0OiAtbW96LWZpdC1jb250ZW50O1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IGF1dG87XG4gIHBhZGRpbmc6IDFlbTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbiAgd2lkdGg6IC1tb3otZml0LWNvbnRlbnQ7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbn1cblxuOndoZXJlKGRpYWxvZzpub3QoW29wZW5dKSkge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbjp3aGVyZShzdW1tYXJ5KSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cbiIsIi8qIERvY3VtZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIDEuIEFkZCBib3JkZXIgYm94IHNpemluZyBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqIDIuIEJhY2tncm91bmRzIGRvIG5vdCByZXBlYXQgYnkgZGVmYXVsdCAob3BpbmlvbmF0ZWQpLlxuICovXG5cbiosXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiAxLiBBZGQgdGV4dCBkZWNvcmF0aW9uIGluaGVyaXRhbmNlIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICogMi4gQWRkIHZlcnRpY2FsIGFsaWdubWVudCBpbmhlcml0YW5jZSBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7IC8qIDEgKi9cbiAgdmVydGljYWwtYWxpZ246IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiAxLiBVc2UgdGhlIGRlZmF1bHQgY3Vyc29yIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICogMi4gQ2hhbmdlIHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqIDMuIEJyZWFrcyB3b3JkcyB0byBwcmV2ZW50IG92ZXJmbG93IGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICogNC4gVXNlIGEgNC1zcGFjZSB0YWIgd2lkdGggaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKiA1LiBSZW1vdmUgdGhlIGdyZXkgaGlnaGxpZ2h0IG9uIGxpbmtzIGluIGlPUyAob3BpbmlvbmF0ZWQpLlxuICogNi4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXG4gKi9cblxuOndoZXJlKDpyb290KSB7XG4gIGN1cnNvcjogZGVmYXVsdDsgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS41OyAvKiAyICovXG4gIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7IC8qIDMgKi9cbiAgLW1vei10YWItc2l6ZTogNDsgLyogNCAqL1xuICB0YWItc2l6ZTogNDsgLyogNCAqL1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiA1ICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogNiAqL1xufVxuXG4vKiBTZWN0aW9uc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUoYm9keSkge1xuICBtYXJnaW46IDA7XG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxuICogYGFydGljbGVgIGNvbnRleHRzIGluIENocm9tZSwgRWRnZSwgRmlyZWZveCwgYW5kIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUoaDEpIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gb24gbmVzdGVkIGxpc3RzIGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUoZGwsIG9sLCB1bCkgOndoZXJlKGRsLCBvbCwgdWwpIHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIG9mIGJvcmRlciBjb2xvciBpbiBGaXJlZm94LlxuICogMi4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqL1xuXG46d2hlcmUoaHIpIHtcbiAgY29sb3I6IGluaGVyaXQ7IC8qIDEgKi9cbiAgaGVpZ2h0OiAwOyAvKiAyICovXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBsaXN0IHN0eWxlIG9uIG5hdmlnYXRpb24gbGlzdHMgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKi9cblxuOndoZXJlKG5hdikgOndoZXJlKG9sLCB1bCkge1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qKlxuICogUHJldmVudCBWb2ljZU92ZXIgZnJvbSBpZ25vcmluZyBsaXN0IHNlbWFudGljcyBpbiBTYWZhcmkgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUobmF2IGxpKTo6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXDIwMEJcIjtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqIDMuIFByZXZlbnQgb3ZlcmZsb3cgb2YgdGhlIGNvbnRhaW5lciBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUocHJlKSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTsgLyogMiAqL1xuICBvdmVyZmxvdzogYXV0bzsgLyogMyAqL1xufVxuXG4vKiBUZXh0LWxldmVsIHNlbWFudGljc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgdGV4dCBkZWNvcmF0aW9uIGluIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUoYWJiclt0aXRsZV0pIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5cbjp3aGVyZShiLCBzdHJvbmcpIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbjp3aGVyZShjb2RlLCBrYmQsIHNhbXApIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlOyAvKiAxICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuOndoZXJlKHNtYWxsKSB7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG4vKiBFbWJlZGRlZCBjb250ZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKlxuICogQ2hhbmdlIHRoZSBhbGlnbm1lbnQgb24gbWVkaWEgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKi9cblxuOndoZXJlKGF1ZGlvLCBjYW52YXMsIGlmcmFtZSwgaW1nLCBzdmcsIHZpZGVvKSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBib3JkZXIgb24gaWZyYW1lcyBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUoaWZyYW1lKSB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGZpbGwgY29sb3IgdG8gbWF0Y2ggdGhlIHRleHQgY29sb3IgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKi9cblxuOndoZXJlKHN2Zzpub3QoW2ZpbGxdKSkge1xuICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi8qIFRhYnVsYXIgZGF0YVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDb2xsYXBzZSBib3JkZXIgc3BhY2luZyBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqIDIuIENvcnJlY3QgdGFibGUgYm9yZGVyIGNvbG9yIGluaGVyaXRhbmNlIGluIGFsbCBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKiAzLiBSZW1vdmUgdGV4dCBpbmRlbnRhdGlvbiBmcm9tIHRhYmxlIGNvbnRlbnRzIGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUodGFibGUpIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLyogMSAqL1xuICBib3JkZXItY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgdGV4dC1pbmRlbnQ6IDA7IC8qIDMgKi9cbn1cblxuLyogRm9ybXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gb24gY29udHJvbHMgaW4gU2FmYXJpLlxuICovXG5cbjp3aGVyZShidXR0b24sIGlucHV0LCBzZWxlY3QpIHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBidXR0b25zIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5cbjp3aGVyZShidXR0b24sIFt0eXBlPVwiYnV0dG9uXCIgaV0sIFt0eXBlPVwicmVzZXRcIiBpXSwgW3R5cGU9XCJzdWJtaXRcIiBpXSkge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGluY29uc2lzdGVudCBhcHBlYXJhbmNlIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbjp3aGVyZShmaWVsZHNldCkge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYTBhMGEwO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgRmlyZWZveC5cbiAqL1xuXG46d2hlcmUocHJvZ3Jlc3MpIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG4vKipcbiAqIDEuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbiAqIDMuIENoYW5nZSB0aGUgcmVzaXplIGRpcmVjdGlvbiBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUodGV4dGFyZWEpIHtcbiAgbWFyZ2luOiAwOyAvKiAxICovXG4gIHJlc2l6ZTogdmVydGljYWw7IC8qIDMgKi9cbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cbiAqL1xuXG46d2hlcmUoW3R5cGU9XCJzZWFyY2hcIiBpXSkge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIFNhZmFyaS5cbiAqL1xuXG46Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG46Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgdGV4dCBzdHlsZSBvZiBwbGFjZWhvbGRlcnMgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5cbjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBvcGFjaXR5OiAwLjU0O1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkgb24gbWFjT1MuXG4gKi9cblxuOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSB1cGxvYWQgYnV0dG9ucyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDsgLyogMiAqL1xufVxuXG4vKiBJbnRlcmFjdGl2ZVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBzdHlsZXMgaW4gU2FmYXJpLlxuICovXG5cbjp3aGVyZShkaWFsb2cpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlcjogc29saWQ7XG4gIGNvbG9yOiBibGFjaztcbiAgaGVpZ2h0OiAtbW96LWZpdC1jb250ZW50O1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IGF1dG87XG4gIHBhZGRpbmc6IDFlbTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbiAgd2lkdGg6IC1tb3otZml0LWNvbnRlbnQ7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbn1cblxuOndoZXJlKGRpYWxvZzpub3QoW29wZW5dKSkge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gU2FmYXJpLlxuICovXG5cbjp3aGVyZShkZXRhaWxzID4gc3VtbWFyeTpmaXJzdC1vZi10eXBlKSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLyogQWNjZXNzaWJpbGl0eVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGN1cnNvciBvbiBidXN5IGVsZW1lbnRzIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbjp3aGVyZShbYXJpYS1idXN5PVwidHJ1ZVwiIGldKSB7XG4gIGN1cnNvcjogcHJvZ3Jlc3M7XG59XG5cbi8qXG4gKiBDaGFuZ2UgdGhlIGN1cnNvciBvbiBjb250cm9sIGVsZW1lbnRzIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbjp3aGVyZShbYXJpYS1jb250cm9sc10pIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4vKlxuICogQ2hhbmdlIHRoZSBjdXJzb3Igb24gZGlzYWJsZWQsIG5vdC1lZGl0YWJsZSwgb3Igb3RoZXJ3aXNlXG4gKiBpbm9wZXJhYmxlIGVsZW1lbnRzIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbjp3aGVyZShbYXJpYS1kaXNhYmxlZD1cInRydWVcIiBpXSwgW2Rpc2FibGVkXSkge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4vKlxuICogQ2hhbmdlIHRoZSBkaXNwbGF5IG9uIHZpc3VhbGx5IGhpZGRlbiBhY2Nlc3NpYmxlIGVsZW1lbnRzXG4gKiBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG46d2hlcmUoW2FyaWEtaGlkZGVuPVwiZmFsc2VcIiBpXVtoaWRkZW5dKSB7XG4gIGRpc3BsYXk6IGluaXRpYWw7XG59XG5cbjp3aGVyZShbYXJpYS1oaWRkZW49XCJmYWxzZVwiIGldW2hpZGRlbl06bm90KDpmb2N1cykpIHtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuIiwiQGltcG9ydCBcIm5vcm1hbGl6ZS5jc3NcIjtcbkBpbXBvcnQgXCJzYW5pdGl6ZS5jc3NcIjtcblxuLyogTW9kZXJuIFNpbXBsZSBCbG9nIC0gRGFyayBUaGVtZSAqL1xuOnJvb3Qge1xuICAtLWJsYWNrOiAjMGEwYTBhO1xuICAtLWRhcmstZ3JleTogIzFhMWExYTtcbiAgLS1tZWRpdW0tZ3JleTogIzMzMzMzMztcbiAgLS1saWdodC1ncmV5OiAjY2NjY2NjO1xuICAtLXdoaXRlOiAjZmZmZmZmO1xuICAtLXJlZDogI2Q0NTQ1NjtcblxuICAtLWJnLXByaW1hcnk6IHZhcigtLWJsYWNrKTtcbiAgLS1iZy1zZWNvbmRhcnk6IHZhcigtLWRhcmstZ3JleSk7XG4gIC0tYmctdGVydGlhcnk6IHZhcigtLW1lZGl1bS1ncmV5KTtcbiAgLS1iZy1jb2RlOiB2YXIoLS1kYXJrLWdyZXkpO1xuXG4gIC0tdGV4dC1wcmltYXJ5OiB2YXIoLS13aGl0ZSk7XG4gIC0tdGV4dC1zZWNvbmRhcnk6IHZhcigtLWxpZ2h0LWdyZXkpO1xuICAtLXRleHQtbXV0ZWQ6ICM4ODg4ODg7XG4gIC0tdGV4dC1jb2RlOiAjZTZlZGYzO1xuXG4gIC0tYWNjZW50LXByaW1hcnk6IHZhcigtLXJlZCk7XG4gIC0tYWNjZW50LWhvdmVyOiAjZTU2NTY3O1xuXG4gIC0tYm9yZGVyLWNvbG9yOiB2YXIoLS1tZWRpdW0tZ3JleSk7XG5cbiAgLS1zeW50YXgtY29tbWVudDogIzhiOTQ5ZTtcbiAgLS1zeW50YXgtcHVuY3R1YXRpb246ICNlNmVkZjM7XG4gIC0tc3ludGF4LXByb3BlcnR5OiAjNzljMGZmO1xuICAtLXN5bnRheC1zdHJpbmc6ICNhNWQ2ZmY7XG4gIC0tc3ludGF4LWtleXdvcmQ6ICNmZjdiNzI7XG4gIC0tc3ludGF4LWZ1bmN0aW9uOiAjZDJhOGZmO1xuICAtLXN5bnRheC12YXJpYWJsZTogI2ZmYTY1Nztcbn1cblxuLyogQ3VzdG9tIE1lZGlhIFF1ZXJpZXMgKi9cbkBjdXN0b20tbWVkaWEgLS1tb2JpbGUgKG1heC13aWR0aDogNzY4cHgpO1xuQGN1c3RvbS1tZWRpYSAtLXRhYmxldCAobWF4LXdpZHRoOiAxMDI0cHgpO1xuXG4vKiBCYXNlIFN0eWxlcyAqL1xuYm9keSB7XG4gIGZvbnQtZmFtaWx5OlxuICAgIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXByaW1hcnkpO1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgbGluZS1oZWlnaHQ6IDEuNztcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuXG4vKiBUeXBvZ3JhcGh5ICovXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cblxuaDEge1xuICBmb250LXNpemU6IDIuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbWFyZ2luLWJvdHRvbTogMS41cmVtO1xuXG4gIEBtZWRpYSAoLS1tb2JpbGUpIHtcbiAgICBmb250LXNpemU6IDJyZW07XG4gIH1cbn1cblxuaDIge1xuICBmb250LXNpemU6IDJyZW07XG4gIG1hcmdpbi10b3A6IDNyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGNvbG9yOiB2YXIoLS1hY2NlbnQtcHJpbWFyeSk7XG5cbiAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgIGZvbnQtc2l6ZTogMS43NXJlbTtcbiAgfVxufVxuXG5oMyB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICBtYXJnaW4tdG9wOiAycmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xuXG4gIEBtZWRpYSAoLS1tb2JpbGUpIHtcbiAgICBmb250LXNpemU6IDEuMzVyZW07XG4gIH1cbn1cblxuaDQsXG5oNSxcbmg2IHtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBtYXJnaW4tdG9wOiAxLjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cblxucCB7XG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbiAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbn1cblxuLyogTGlua3MgKi9cbmEge1xuICBjb2xvcjogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcblxuICAmOmlzKDphY3RpdmUsIDpob3Zlcikge1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtaG92ZXIpO1xuICB9XG59XG5cbi8qIEZvY3VzIGFuZCBTZWxlY3Rpb24gKi9cbio6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuXG46OnNlbGVjdGlvbiB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1wcmltYXJ5KTtcbiAgY29sb3I6IHZhcigtLXdoaXRlKTtcbn1cblxuLyogTGF5b3V0IENvbXBvbmVudHMgKi9cbmhlYWRlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXByaW1hcnkpO1xuICBwYWRkaW5nOiAxcmVtIDA7XG59XG5cbm5hdiB7XG4gIG1heC13aWR0aDogOTAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDJyZW07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcblxuICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDFyZW07XG4gICAgcGFkZGluZzogMXJlbTtcbiAgfVxufVxuXG4ubG9nbyB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLm5hdi1saW5rcyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMnJlbTtcbiAgbGlzdC1zdHlsZTogbm9uZTtcblxuICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgZ2FwOiAxLjVyZW07XG4gIH1cblxuICAmIGEge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBwYWRkaW5nOiAwLjVyZW0gMDtcblxuICAgICY6aXMoOmhvdmVyLCA6Zm9jdXMpIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtcHJpbWFyeSk7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICB9XG4gIH1cbn1cblxubWFpbiB7XG4gIG1heC13aWR0aDogOTAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAzcmVtIDJyZW07XG4gIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSAxNDBweCk7XG4gIHRleHQtYWxpZ246IGp1c3RpZnk7XG5cbiAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgIHBhZGRpbmc6IDJyZW0gMXJlbTtcbiAgfVxufVxuXG5mb290ZXIge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1wcmltYXJ5KTtcbiAgcGFkZGluZzogMnJlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcblxuICAmIHAge1xuICAgIG1hcmdpbjogMC41cmVtIDA7XG4gIH1cblxuICAmIGEge1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtcHJpbWFyeSk7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtaG92ZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKiBQYWdlIEhlYWRlcnMgKi9cbi5wYWdlLWhlYWRlcixcbi5ob21lLWhlYWRlciB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogM3JlbTtcblxuICAmIGgxIHtcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICB9XG5cbiAgJiBwIHtcbiAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbiAgfVxufVxuXG4uaG9tZS1oZWFkZXIge1xuICBtYXJnaW4tYm90dG9tOiA0cmVtO1xufVxuXG4vKiBUYWdzICovXG4udGFnIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctdGVydGlhcnkpO1xuICBwYWRkaW5nOiAwLjJyZW0gMC40cmVtO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1wcmltYXJ5KTtcbiAgICBjb2xvcjogdmFyKC0td2hpdGUpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxufVxuXG4udGFncyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMC41cmVtO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcblxuICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG59XG5cbi8qIFBvc3RzICovXG4ucG9zdHMtZ3JpZCxcbi5hcnRpY2xlcy1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxcmVtO1xufVxuXG4ucG9zdC1wcmV2aWV3IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjc1cmVtO1xuICBwYWRkaW5nOiAwLjVyZW0gMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICB9XG5cbiAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IDAuNXJlbTtcbiAgfVxuXG4gICYgdGltZSxcbiAgJiAuc2VwYXJhdG9yIHtcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG4gICAgZm9udC1zaXplOiAwLjlyZW07XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgIEBtZWRpYSAoLS1tb2JpbGUpIHtcbiAgICAgIG9yZGVyOiAxO1xuICAgIH1cbiAgfVxuXG4gICYgaDMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmbGV4OiAxO1xuXG4gICAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgICAgb3JkZXI6IDI7XG4gICAgICBmbGV4LWJhc2lzOiAxMDAlO1xuICAgIH1cblxuICAgICYgYSB7XG4gICAgICBjb2xvcjogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWFjY2VudC1ob3Zlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJiAudGFncyB7XG4gICAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgICAgb3JkZXI6IDM7XG4gICAgfVxuICB9XG59XG5cbi8qIEFydGljbGUgTGF5b3V0ICovXG4uYXJ0aWNsZS1oZWFkZXIge1xuICBtYXJnaW4tYm90dG9tOiAzcmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMnJlbTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XG5cbiAgJiBoMSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xuICB9XG59XG5cbi5hcnRpY2xlLXRhZ3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDAuNXJlbTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuXG4gICYgLnRhZyB7XG4gICAgcGFkZGluZzogMC4zcmVtIDAuNnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgZm9udC1zaXplOiAwLjhyZW07XG4gIH1cbn1cblxuLmFydGljbGUtZGF0ZSB7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgZm9udC1zaXplOiAwLjlyZW07XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLmFydGljbGUtYm9keSB7XG4gIGxpbmUtaGVpZ2h0OiAxLjg7XG5cbiAgJiA6aXMoaDIsIGgzLCBoNCk6Zmlyc3QtY2hpbGQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cbn1cblxuLyogVGFncyBJbmRleCAqL1xuLnRhZ3MtZ3JpZCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMzAwcHgsIDFmcikpO1xuICBnYXA6IDJyZW07XG4gIG1hcmdpbi1ib3R0b206IDNyZW07XG59XG5cbi50YWctY2FyZCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSk7XG4gIHBhZGRpbmc6IDEuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xuXG4gICYgaDMge1xuICAgIG1hcmdpbjogMCAwIDAuNXJlbSAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcblxuICAgICYgYSB7XG4gICAgICBjb2xvcjogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWFjY2VudC1ob3Zlcik7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYgPiBwIHtcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XG4gICAgZm9udC1zaXplOiAwLjlyZW07XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgfVxufVxuXG4ucmVjZW50LWluLXRhZyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMC41cmVtO1xufVxuXG4udGFnLXBvc3QtcHJldmlldyBhIHtcbiAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBmb250LXNpemU6IDAuOXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcblxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB9XG59XG5cbi8qIEFib3V0IFBhZ2UgKi9cbi5hYm91dC1jb250ZW50IHtcbiAgbWF4LXdpZHRoOiA3MDBweDtcbiAgbWFyZ2luOiAwIGF1dG87XG5cbiAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgIG1heC13aWR0aDogbm9uZTtcbiAgfVxuXG4gICYgc2VjdGlvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogM3JlbTtcbiAgfVxuXG4gICYgaDIge1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtcHJpbWFyeSk7XG4gICAgbWFyZ2luLWJvdHRvbTogMS41cmVtO1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICB9XG5cbiAgJiBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XG4gICAgZm9udC1zaXplOiAxLjFyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNztcbiAgfVxuXG4gICYgdWwge1xuICAgIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbiAgfVxuXG4gICYgbGkge1xuICAgIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG4gICAgZm9udC1zaXplOiAxLjA1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjY7XG4gIH1cbn1cblxuLnNvY2lhbC1saW5rcyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMXJlbTtcbiAgbWFyZ2luLXRvcDogMS41cmVtO1xuXG4gIEBtZWRpYSAoLS1tb2JpbGUpIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG59XG5cbi5zb2NpYWwtbGluayB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNXJlbTtcbiAgcGFkZGluZzogMC43NXJlbSAxLjVyZW07XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcblxuICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgJiBzdmcge1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTZweDtcbiAgICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgfVxuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1wcmltYXJ5KTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudC1wcmltYXJ5KTtcbiAgICBjb2xvcjogdmFyKC0td2hpdGUpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XG4gIH1cbn1cblxuLyogQnV0dG9ucyBhbmQgTGlua3MgKi9cbi5iYWNrLWxpbmssXG4uZXJyb3ItbGluayB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctdGVydGlhcnkpO1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBmb250LXNpemU6IDAuOXJlbTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICAgIGNvbG9yOiB2YXIoLS13aGl0ZSk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG59XG5cbi5lcnJvci1saW5rIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTtcbiAgcGFkZGluZzogMC43NXJlbSAxLjVyZW07XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XG59XG5cbi5iYWNrLXRvLXRhZ3Mge1xuICBtYXJnaW4tdG9wOiAzcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi8qIDQwNCBFcnJvciBQYWdlICovXG4uZXJyb3ItcGFnZSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWF4LXdpZHRoOiA2MDBweDtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmc6IDRyZW0gMnJlbTtcblxuICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgcGFkZGluZzogM3JlbSAxcmVtO1xuICB9XG5cbiAgJiBoMSB7XG4gICAgZm9udC1zaXplOiA2cmVtO1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtcHJpbWFyeSk7XG4gICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuXG4gICAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgICAgZm9udC1zaXplOiA0cmVtO1xuICAgIH1cbiAgfVxuXG4gICYgaDIge1xuICAgIGZvbnQtc2l6ZTogMnJlbTtcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICBAbWVkaWEgKC0tbW9iaWxlKSB7XG4gICAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgICB9XG4gIH1cblxuICAmIHAge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbiAgICBtYXJnaW4tYm90dG9tOiAycmVtO1xuICB9XG59XG5cbi5lcnJvci1uYXYge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDFyZW07XG4gIG1hcmdpbi10b3A6IDJyZW07XG5cbiAgQG1lZGlhICgtLW1vYmlsZSkge1xuICAgIGdhcDogMC41cmVtO1xuICB9XG59XG5cbi8qIENvZGUgKi9cbmNvZGUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2RlKTtcbiAgY29sb3I6IHZhcigtLXRleHQtY29kZSk7XG4gIHBhZGRpbmc6IDAuMnJlbSAwLjRyZW07XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xufVxuXG5wcmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2RlKTtcbiAgcGFkZGluZzogMS41cmVtO1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtYXJnaW46IDJyZW0gMDtcblxuICAmIGNvZGUge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS41O1xuICB9XG59XG5cbi8qIFN5bnRheCBIaWdobGlnaHRpbmcgKi9cbi50b2tlbiB7XG4gICYuY29tbWVudCB7XG4gICAgY29sb3I6IHZhcigtLXN5bnRheC1jb21tZW50KTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIH1cblxuICAmLnB1bmN0dWF0aW9uIHtcbiAgICBjb2xvcjogdmFyKC0tc3ludGF4LXB1bmN0dWF0aW9uKTtcbiAgfVxuXG4gICY6aXMoLnByb3BlcnR5LCAudGFnLCAuYm9vbGVhbiwgLm51bWJlcikge1xuICAgIGNvbG9yOiB2YXIoLS1zeW50YXgtcHJvcGVydHkpO1xuICB9XG5cbiAgJjppcyguc3RyaW5nLCAuYXR0ci1uYW1lKSB7XG4gICAgY29sb3I6IHZhcigtLXN5bnRheC1zdHJpbmcpO1xuICB9XG5cbiAgJjppcygua2V5d29yZCwgLm9wZXJhdG9yKSB7XG4gICAgY29sb3I6IHZhcigtLXN5bnRheC1rZXl3b3JkKTtcbiAgfVxuXG4gICY6aXMoLmZ1bmN0aW9uLCAuY2xhc3MtbmFtZSkge1xuICAgIGNvbG9yOiB2YXIoLS1zeW50YXgtZnVuY3Rpb24pO1xuICB9XG5cbiAgJi52YXJpYWJsZSB7XG4gICAgY29sb3I6IHZhcigtLXN5bnRheC12YXJpYWJsZSk7XG4gIH1cbn1cblxuLyogQ29udGVudCBFbGVtZW50cyAqL1xuYmxvY2txdW90ZSB7XG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tYWNjZW50LXByaW1hcnkpO1xuICBwYWRkaW5nOiAxcmVtIDEuNXJlbTtcbiAgbWFyZ2luOiAycmVtIDA7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbn1cblxubGkge1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG59XG5cbnRhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIG1hcmdpbjogMnJlbSAwO1xufVxuXG50aCxcbnRkIHtcbiAgcGFkZGluZzogMXJlbTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XG59XG5cbnRoIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctdGVydGlhcnkpO1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuZmlndXJlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBwaWN0dXJlLFxuICBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuXG4gIGZpZ2NhcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBjb2xvcjogdmFyKC0tc3ludGF4LWNvbW1lbnQpO1xuICAgIHBhZGRpbmc6IDFlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIH1cbn1cblxuaHIge1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xuICBtYXJnaW46IDJyZW0gMDtcbn1cblxuLyogVXR0ZXJhbmNlcyAqL1xuLnV0dGVyYW5jZXMge1xuICBtYXgtd2lkdGg6IDkwMHB4O1xufVxuXG4vKiBVdGlsaXR5IGNsYXNzZXMgKi9cbi5jb2xvci1wcmltYXJ5IHtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1wcmltYXJ5KTtcbn1cblxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTtcbn1cbiJdfQ== */]]></content:encoded></item><item>
        <title></title>
        <link>https://drakkein.me/apple-touch-icon.png</link>
        <guid isPermaLink="true">https://drakkein.me/apple-touch-icon.png</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description></description>
        <content:encoded><![CDATA[
<svg xmlns="http://www.w3.org/2000/svg" width="180" height="180" viewBox="0 0 180 180">
  <rect width="180" height="180" fill="#0a0a0a" rx="20" ry="20"></rect>
  <text x="90" y="90" font-family="system-ui, -apple-system, sans-serif" font-size="96" font-weight="bold" fill="#fff" text-anchor="middle" dominant-baseline="central">
    D
  </text>
</svg>
]]></content:encoded></item><item>
        <title>About</title>
        <link>https://drakkein.me/about/</link>
        <guid isPermaLink="true">https://drakkein.me/about/</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description>Learn about drakkein - a passionate developer, designer, and technology enthusiast. Discover the story behind drakkein.me and the philosophy of minimal design and clean code.</description>
        <content:encoded><![CDATA[
<div class="about-page">
  <header class="page-header">
    <h1>About Me</h1>
    <p>Passionate about self-hosting, gaming, technology, and programming</p>
  </header>

  <div class="about-content">
    <section class="about-intro">
      <h2>Hi, I’m drakkein</h2>
      <p>
        I’m dedicated to exploring the world of self-hosting, diving deep into
        gaming, and pushing the limits of technology and programming. This blog
        is where I share my experiences, insights, and practical knowledge about
        these passions.
      </p>
      <p>
        Whether it’s setting up my own servers, discovering new tech trends,
        developing software, or reviewing games, I aim to provide valuable
        content that both beginners and enthusiasts can appreciate.
      </p>
    </section>

    <section class="about-topics">
      <h2>What I Write About</h2>
      <ul>
        <li>
          <strong>Self-Hosting:</strong> Tips, guides, and projects for running
          your own servers and services
        </li>
        <li>
          <strong>Gaming:</strong> Thoughts on games I play, industry news, and
          gaming technology
        </li>
        <li>
          <strong>Technology:</strong> Insights into hardware, software, and
          emerging tech trends
        </li>
        <li>
          <strong>Programming:</strong> Tutorials, best practices, and
          explorations of different languages and frameworks
        </li>
      </ul>
    </section>

    <section class="about-connect">
      <h2>Get in Touch</h2>
      <p>Follow my projects or reach out through these platforms:</p>
      <div class="social-links">
        <a href="https://github.com/drakkein" target="_blank" rel="noopener" class="social-link">
          <svg class="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="16" height="16" fill="currentColor" aria-hidden="true">
            <path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM252.8 8c-138.7 0-244.8 105.3-244.8 244 0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1 100-33.2 167.8-128.1 167.8-239 0-138.7-112.5-244-251.2-244zM105.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path>
        </svg> GitHub
        </a>
        <a href="https://git.drakkein.me/explore/repos" target="_blank" rel="noopener" class="social-link">
          <svg class="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="16" height="16" fill="currentColor" aria-hidden="true">
            <path d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48zm80-24c0 32.8-19.7 61-48 73.3l0 70.7 176 0c26.5 0 48-21.5 48-48l0-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3l0 22.7c0 61.9-50.1 112-112 112l-176 0 0 70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3l0-205.3C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80zm232 0a24 24 0 1 0 -48 0 24 24 0 1 0 48 0zM80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z"></path>
        </svg> Forgejo
        </a>
        <a href="https://x.com/aeeeeeeeeekurla" target="_blank" rel="noopener" class="social-link">
          <svg class="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="16" height="16" fill="currentColor" aria-hidden="true">
            <path d="M357.2 48L427.8 48 273.6 224.2 455 464 313 464 201.7 318.6 74.5 464 3.8 464 168.7 275.5-5.2 48 140.4 48 240.9 180.9 357.2 48zM332.4 421.8l39.1 0-252.4-333.8-42 0 255.3 333.8z"></path>
        </svg> Twitter
        </a>
      </div>
    </section>
  </div>
</div>
]]></content:encoded></item><item>
        <title>404 - Page Not Found</title>
        <link>https://drakkein.me/404.html</link>
        <guid isPermaLink="true">https://drakkein.me/404.html</guid>
        <pubDate>Sun, 03 Aug 2025 19:27:28 GMT</pubDate>
        <description>The page you&#39;re looking for doesn&#39;t exist. Return to drakkein.me to explore articles about web development, design, and technology.</description>
        <content:encoded><![CDATA[
<div class="error-page">
  <header class="error-header">
    <h1>404</h1>
    <h2>Page Not Found</h2>
    <p>The page you're looking for doesn't exist or has been moved.</p>
  </header>

  <section class="error-actions">
    <p>Here are some helpful links instead:</p>
    <nav class="error-nav">
      <a href="https://drakkein.me/" class="error-link">← Back to Home</a>
      <a href="https://drakkein.me/articles/" class="error-link">Browse Articles</a>
      <a href="https://drakkein.me/feed.xml" class="error-link">RSS Feed</a>
    </nav>
  </section>
</div>
]]></content:encoded></item><item>
        <title>Gaming in Proxmox LXC</title>
        <link>https://drakkein.me/articles/gaming-in-proxmox-lxc/</link>
        <guid isPermaLink="true">https://drakkein.me/articles/gaming-in-proxmox-lxc/</guid>
        <pubDate>Sat, 02 Aug 2025 00:00:00 GMT</pubDate>
        <description>My journey to run Steam with video output in unprivileged LXC with Nvidia GPU</description>
        <content:encoded><![CDATA[<p>My journey to run Steam with video output in an unprivileged LXC container with Nvidia GPU passthrough.</p>
<h2>Why Even Bother?</h2>
<p>As the proud owner of an old CRT TV scavenged from my parents' garage, I wanted to use it for something more than booting Mario on the NES once a year. It occurred to me: why not reminisce about old times while watching classic cartoons and anime, and maybe even play some retro games? So I bought <strong>HDMI to SCART</strong> dongle and started to think.</p>
<p>The challenge was finding an efficient way to run gaming and media applications without dedicating an entire virtual machine to occasional use. This led me to explore running a full desktop environment within an LXC container with GPU passthrough.</p>
<h2>Hardware Setup</h2>
<p>My machine is rather powerful for this endeavor, featuring:</p>
<ul>
<li>AMD EPYC 7551P</li>
<li>128 GB ECC RAM</li>
<li>Nvidia RTX A400</li>
<li>Nvidia RTX 3090</li>
</ul>
<p>The system runs Proxmox <code>8.4.5</code> with kernel <code>6.12-12-pve</code>. Since I have two GPUs, the obvious solution would be to pass one through to a VM and easily achieve what I want. However, I won't be using this daily, so why waste processing power on an idle VM? You might suggest simply turning off the VM when it's not needed, but I'm too lazy for that – I want to have my cake and eat it too. So how do we accomplish this with an LXC container?</p>
<h2>Setting Up the LXC Container</h2>
<p>I've been daily driving Arch Linux for quite some time, so the obvious choice for me is the <code>archlinux-base_20240911-1_amd64</code> template. You should go with whatever distribution you're familiar with, but keep in mind that group mappings and package names will differ.</p>
<h3>Device Passthrough</h3>
<p>Proxmox 8.4.5 introduces a new method for passing devices to LXC containers, which we'll use instead of the previously viable mountpoint approach.</p>
<p>Let's add devices to my LXC by editing <code>/etc/pve/lxc/xxx.conf</code>:</p>
<pre class="language-conf"><code class="language-conf">dev0: /dev/dri/card2,gid=985,mode=0666
dev1: /dev/dri/renderD129,gid=989,mode=0666
dev10: /dev/snd/hwC1D0,gid=996
dev11: /dev/snd/pcmC1D7p,gid=996
dev12: /dev/snd/pcmC1D8p,gid=996
dev13: /dev/snd/pcmC1D9p,gid=996
dev2: /dev/nvidia1,mode=0666
dev3: /dev/nvidiactl,mode=0666
dev4: /dev/nvidia-modeset,mode=0666
dev5: /dev/nvidia-uvm,mode=0666
dev6: /dev/nvidia-uvm-tools,mode=0666
dev7: /dev/fb1,gid=985,mode=0666
dev8: /dev/snd/controlC1,gid=996
dev9: /dev/snd/pcmC1D3p,gid=996</code></pre>
<p>What do these mappings accomplish? We want devices to be usable within the container, which requires proper group mapping between the host and container.</p>
<p>To check groups in your container, run:</p>
<pre class="language-bash"><code class="language-bash">getent group render
<span class="token comment"># or</span>
<span class="token function">cat</span> /etc/group</code></pre>
<p>The important groups to map are:</p>
<pre class="language-text"><code class="language-text">render:x:989:
video:x:985:
audio:x:996:</code></pre>
<p>In my case, I'm passing through my RTX 3090, which is my second GPU. That's why you see <code>nvidia1</code>, <code>card2</code>, and <code>renderD129</code> instead of <code>nvidia0</code>, <code>card0</code>, and <code>renderD128</code>.</p>
<h3>I Use Arch BTW</h3>
<p>Once the LXC container is running, let's start by refreshing the pacman keys:</p>
<pre class="language-bash"><code class="language-bash">pacman-key <span class="token parameter variable">--init</span>
pacman-key <span class="token parameter variable">--populate</span> archlinux
pacman-key --refresh-keys</code></pre>
<p>Now update packages and install git:</p>
<pre class="language-bash"><code class="language-bash">pacman <span class="token parameter variable">-Syuu</span>
pacman <span class="token parameter variable">-S</span> <span class="token parameter variable">--needed</span> <span class="token function">git</span> base-devel</code></pre>
<p>Finally, create the user account:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">groupadd</span> drakkein
<span class="token function">useradd</span> <span class="token parameter variable">-m</span> <span class="token parameter variable">-g</span> drakkein <span class="token parameter variable">-d</span> /home/drakkein drakkein
<span class="token function">passwd</span> drakkein
<span class="token function">usermod</span> <span class="token parameter variable">-aG</span> sudo,render,video,audio,git drakkein</code></pre>
<p>From now on, I'll use <code>yay</code> for package management. You can use it as well or stick with <code>pacman</code>.</p>
<h3>Nvidia Driver Installation</h3>
<p>My host system has kernel modules for driver version <code>575.64.03</code>, so we'll use the same version in the container:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">curl</span> https://us.download.nvidia.com/XFree86/Linux-x86_64/575.64.03/NVIDIA-Linux-x86_64-575.64.03.run <span class="token parameter variable">-o</span> NVIDIA-Linux-x86_64-575.64.03.run
<span class="token function">chmod</span> +x ./NVIDIA-Linux-x86_64-575.64.03.run
<span class="token function">sudo</span> ./NVIDIA-Linux-x86_64-575.64.03.run --no-kernel-modules <span class="token parameter variable">--silent</span>
<span class="token comment"># The Nvidia installer will complain about missing Vulkan ICD loader</span>
yay <span class="token parameter variable">-S</span> vulkan-icd-loader</code></pre>
<p>Time for a test, and voilà! My GPU is detected by the driver:</p>
<pre class="language-bash"><code class="language-bash"><span class="token punctuation">[</span>drakkein@tvbox-arch ~<span class="token punctuation">]</span>$ nvidia-smi
Fri Aug  <span class="token number">1</span> <span class="token number">19</span>:06:56 <span class="token number">2025</span>
+-----------------------------------------------------------------------------------------+
<span class="token operator">|</span> NVIDIA-SMI <span class="token number">575.64</span>.03              Driver Version: <span class="token number">575.64</span>.03      CUDA Version: <span class="token number">12.9</span>     <span class="token operator">|</span>
<span class="token operator">|</span>-----------------------------------------+------------------------+----------------------+
<span class="token operator">|</span> GPU  Name                 Persistence-M <span class="token operator">|</span> Bus-Id          Disp.A <span class="token operator">|</span> Volatile Uncorr. ECC <span class="token operator">|</span>
<span class="token operator">|</span> Fan  Temp   Perf          Pwr:Usage/Cap <span class="token operator">|</span>           Memory-Usage <span class="token operator">|</span> GPU-Util  Compute M. <span class="token operator">|</span>
<span class="token operator">|</span>                                         <span class="token operator">|</span>                        <span class="token operator">|</span>               MIG M. <span class="token operator">|</span>
<span class="token operator">|</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span><span class="token operator">+=</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span><span class="token operator">+=</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span><span class="token operator">|</span>
<span class="token operator">|</span>   <span class="token number">0</span>  NVIDIA GeForce RTX <span class="token number">3090</span>        Off <span class="token operator">|</span>   00000000:21:00.0  On <span class="token operator">|</span>                  N/A <span class="token operator">|</span>
<span class="token operator">|</span>  <span class="token number">0</span>%   53C    P8             19W /  420W <span class="token operator">|</span>       8MiB /  24576MiB <span class="token operator">|</span>      <span class="token number">0</span>%      Default <span class="token operator">|</span>
<span class="token operator">|</span>                                         <span class="token operator">|</span>                        <span class="token operator">|</span>                  N/A <span class="token operator">|</span>
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
<span class="token operator">|</span> Processes:                                                                              <span class="token operator">|</span>
<span class="token operator">|</span>  GPU   GI   CI              PID   Type   Process name                        GPU Memory <span class="token operator">|</span>
<span class="token operator">|</span>        ID   ID                                                               Usage      <span class="token operator">|</span>
<span class="token operator">|</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span><span class="token operator">|</span>
<span class="token operator">|</span>  No running processes found                                                             <span class="token operator">|</span>
+-----------------------------------------------------------------------------------------+</code></pre>
<p>But how do we display something from the LXC container? Let's start by displaying some noise on the framebuffer:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">cat</span> /dev/urandom <span class="token operator">></span> /dev/fb1</code></pre>
<h2>Desktop Environment Setup</h2>
<p>Since our GPU is working and displaying noise on the screen, it's time to install <a href="https://wiki.archlinux.org/title/Xorg">Xorg</a> and <a href="https://wiki.archlinux.org/title/KDE#Plasma">Plasma</a>. We'll follow the Arch Wiki for this. The installation might complain about existing files for <code>mesa</code> and <code>libglvnd</code> – the culprit is the Nvidia driver.</p>
<p>Additional packages I want to install are <code>x11vnc steam firefox</code>, so it's a good time to enable the <code>multilib</code> repository.</p>
<p>Time to prepare X11 by editing <code>/etc/X11/xorg.conf</code> and adding our Nvidia card to the configuration:</p>
<pre class="language-conf"><code class="language-conf">Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/mouse"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "NvidiaCard"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce RTX 3090"
    BusID          "PCI:33:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "AllowEmptyInitialConfiguration" "true"
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DP-5"
    Option         "metamodes" "1024x768_60 +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection</code></pre>
<h3>How Do We Start It?</h3>
<p>In an LXC container, we don't have virtual terminals (VT), so the typical graphical login with a greeter won't work. We need to start X manually and launch Plasma. However, this creates another problem: <code>$DBUS_SESSION_BUS_ADDRESS</code> and <code>$XDG_RUNTIME_DIR</code> are missing, so none of our systemd user units will launch. We can set them manually:</p>
<pre class="language-bash"><code class="language-bash"><span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">XDG_RUNTIME_DIR</span></span><span class="token operator">=</span><span class="token string">"/run/user/<span class="token variable"><span class="token variable">$(</span><span class="token function">id</span> <span class="token parameter variable">-u</span><span class="token variable">)</span></span>"</span>
<span class="token function">mkdir</span> <span class="token parameter variable">-p</span> <span class="token string">"<span class="token environment constant">$XDG_RUNTIME_DIR</span>"</span>
<span class="token builtin class-name">eval</span> <span class="token variable"><span class="token variable">$(</span>dbus-launch --sh-syntax --exit-with-session<span class="token variable">)</span></span></code></pre>
<p>Unfortunately, it's still not working:</p>
<pre class="language-bash"><code class="language-bash">Failed to connect to user scope bus via <span class="token builtin class-name">local</span> transport: <span class="token environment constant">$DBUS_SESSION_BUS_ADDRESS</span> and <span class="token environment constant">$XDG_RUNTIME_DIR</span> not defined <span class="token punctuation">(</span>consider using <span class="token parameter variable">--machine</span><span class="token operator">=</span><span class="token operator">&lt;</span>user<span class="token operator">></span>@.host <span class="token parameter variable">--user</span> to connect to bus of other user<span class="token punctuation">)</span></code></pre>
<p>The solution is to either provide the machine parameter or use <code>machinectl shell drakkein@.host</code>, which makes our user units work properly. Here is the <a href="https://git.drakkein.me/drakkein/selfhosted/src/branch/main/scripts/startplasma-custom-x11">Convinient script</a> that I use to launch plasma.</p>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/NTbbm4IPr--900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="Plasma running in LXC" loading="lazy" decoding="async" src="https://drakkein.me/img/NTbbm4IPr--900.jpeg" width="900" height="678" /></picture><figcaption>Plasma successfully running inside the LXC container</figcaption></figure>
<h3>What If Sound Isn't Working?</h3>
<p>The likely reason is that no sink has been created for your audio device. In my case, I'm using the third HDMI port of my GPU, which corresponds to the second audio device.</p>
<p>To create a sink manually, create the file <code>/etc/pipewire/pipewire.conf.d/99-hdmi-alsa-sink.conf</code>:</p>
<pre class="language-conf"><code class="language-conf">context.objects = [
  {
    factory = adapter
    args = {
      factory.name    = api.alsa.pcm.sink
      node.name       = "alsa-hdmi-sink"
      node.description = "Manual HDMI Sink (hw:1,3)"
      media.class     = "Audio/Sink"
      audio.position  = "FL,FR"
      api.alsa.path   = "hw:1,3"
      api.alsa.format = "S16LE"
      api.alsa.rate   = 48000
      api.alsa.channels = 2
      priority.session = 1000
      node.exclusive = false
    }
  }
]</code></pre>
<h3>How to Remove System Policy Prompts</h3>
<p>First, add your user to the <code>network</code> group. Then create a polkit rule at <code>/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules</code>:</p>
<pre class="language-conf"><code class="language-conf">polkit.addRule(function(action, subject) {
  if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) {
    return polkit.Result.YES;
  }
});</code></pre>
<h2>Gaming Setup</h2>
<p>For gaming, I installed <code>steam</code>, <code>gamescope</code>, and <code>rpcs3</code>. However, we need input devices, so the first step is to pass them to the LXC container:</p>
<pre class="language-conf"><code class="language-conf">dev14: /dev/input/js0,gid=994
dev15: /dev/input/event13,gid=994</code></pre>
<p>Remember to add your user to the <code>input</code> group.</p>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/XT-NY8HRT8-900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="Gamepad visible in Plasma" loading="lazy" decoding="async" src="https://drakkein.me/img/XT-NY8HRT8-900.jpeg" width="900" height="678" /></picture><figcaption>Gamepad successfully detected Plasma system settings</figcaption></figure>
<p>If you're wondering why my device shows as <code>8bitDo Virtual Gamepad</code>, it's because Steam has a problem with reattaching disconnected devices. I decided to create a virtual device with <code>uinput</code> and mirror all events from my real device while ignoring disconnects. This also solves the issue with my <code>8BitDo Ultimate</code> controller under Linux, where it immediately disconnects if nothing grabs its events.</p>
<p>Everything appears to be working, so I can finally create a systemd unit that will start Plasma after LXC launch:</p>
<pre class="language-ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Unit</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">Description</span><span class="token punctuation">=</span><span class="token value attr-value">Start plasma after LXC start</span>
<span class="token key attr-name">After</span><span class="token punctuation">=</span><span class="token value attr-value">network.target</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Service</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">Type</span><span class="token punctuation">=</span><span class="token value attr-value">simple</span>
<span class="token key attr-name">ExecStart</span><span class="token punctuation">=</span><span class="token value attr-value">/usr/bin/startplasma-lxc</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Install</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">WantedBy</span><span class="token punctuation">=</span><span class="token value attr-value">multi-user.target</span></code></pre>
<h3>Gamescope Configuration</h3>
<p>I want a Steam Deck-like experience using a gamepad, so my goal is to launch a gamescope session. After installing <code>gamescope</code>, <code>mangohud</code>, and <code>lib32-mangohud</code>, the first step is to create a new script at <code>/usr/bin/gamescope-session</code>. Besides launching Steam, we also move the cursor out of the way:</p>
<pre class="language-bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
xdotool mousemove <span class="token number">1023</span> <span class="token number">767</span>
gamescope <span class="token parameter variable">--mangoapp</span> <span class="token parameter variable">-f</span> <span class="token parameter variable">-e</span> <span class="token parameter variable">-W</span> <span class="token number">1024</span> <span class="token parameter variable">-H</span> <span class="token number">768</span> -- steam <span class="token parameter variable">-gamepadui</span> <span class="token parameter variable">-steamos3</span> <span class="token parameter variable">-steampal</span> <span class="token parameter variable">-steamdeck</span></code></pre>
<p>Create <code>/usr/bin/steamos-session-select</code> to allow returning to Plasma:</p>
<pre class="language-bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
steam <span class="token parameter variable">-shutdown</span></code></pre>
<p>Create <code>/usr/bin/steamos-update</code> and <code>/usr/bin/jupiter-biosupdate</code> to mock SteamOS and Deck BIOS updates:</p>
<pre class="language-bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
<span class="token builtin class-name">exit</span> <span class="token number">0</span><span class="token punctuation">;</span></code></pre>
<p>For convenience, I also created a desktop shortcut for <code>gamescope-session</code>:</p>
<pre class="language-ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Desktop Entry</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">Exec</span><span class="token punctuation">=</span><span class="token value attr-value">gamescope-session</span>
<span class="token key attr-name">Icon</span><span class="token punctuation">=</span><span class="token value attr-value">steam</span>
<span class="token key attr-name">Name</span><span class="token punctuation">=</span><span class="token value attr-value">Steam Gamescope</span>
<span class="token key attr-name">StartupNotify</span><span class="token punctuation">=</span><span class="token value attr-value">true</span>
<span class="token key attr-name">Terminal</span><span class="token punctuation">=</span><span class="token value attr-value">false</span>
<span class="token key attr-name">Type</span><span class="token punctuation">=</span><span class="token value attr-value">Application</span></code></pre>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/U3qK7Gkhwh-900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="Gamescope running under LXC" loading="lazy" decoding="async" src="https://drakkein.me/img/U3qK7Gkhwh-900.jpeg" width="900" height="680" /></picture><figcaption>Gamescope is starting in the LXC container</figcaption></figure>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/3079Fbyeaj-900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="Steam welcome screen" loading="lazy" decoding="async" src="https://drakkein.me/img/3079Fbyeaj-900.jpeg" width="900" height="674" /></picture><figcaption>Successful login to Steam</figcaption></figure>
<p>For now, we can exit Steam and continue with the setup.</p>
<h3>EmuDeck Integration</h3>
<p>The next step is to integrate emulation into Steam. For this, I'll use <a href="https://www.emudeck.com/">EmuDeck</a>.</p>
<p>For <code>RPCS3</code>, we need to set a higher memory lock limit, so I need to update my LXC configuration. We also want to pin CPU cores for this LXC container:</p>
<pre class="language-conf"><code class="language-conf">lxc.prlimit.memlock: unlimited
lxc.cgroup.cpuset.cpus=0-15</code></pre>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/692FoIf-3w-900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="RPCS3 in LXC" loading="lazy" decoding="async" src="https://drakkein.me/img/692FoIf-3w-900.jpeg" width="900" height="673" /></picture><figcaption>RPCS3 running successfully in the LXC container</figcaption></figure>
<h3>Kodi Setup</h3>
<p>Kodi setup is straightforward – all we need to install is <code>kodi</code> and the <code>kodi-peripheral-joystick</code> plugin. I self-host Jellyfin, so in my case, an additional dependency is the <a href="https://jellyfin.org/docs/general/clients/kodi/">Jellyfin plugin</a>.</p>
<p>All we need to do now is add a Kodi shortcut to Steam.</p>
<h3>Final Configuration</h3>
<p>Now we need to automatically launch our <code>gamescope-session</code>. I opted to do this via Plasma Settings → Startup and Shutdown → Autostart → Login Scripts.</p>
<figure><picture><source type="image/webp" srcset="https://drakkein.me/img/tvfN2YSFcs-900.webp 900w" sizes="calc(100vw - 2rem)" /><img alt="CRT TV" loading="lazy" decoding="async" src="https://drakkein.me/img/tvfN2YSFcs-900.jpeg" width="900" height="653" /></picture><figcaption>Mission success! Steam is showing on CRT TV</figcaption></figure>
]]></content:encoded><category>proxmox</category><category>lxc</category><category>gaming</category><category>steam</category><category>kodi</category></item></channel>
</rss>
