@font-face{font-family:Inter;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/Inter-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/Inter-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:300 700;font-display:swap;src:url(/fonts/Inter-Italic-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:300 700;font-display:swap;src:url(/fonts/Inter-Italic-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Berkeley Mono;src:url("/fonts/Berkeley Mono Variable.woff2") format("woff2");font-stretch:60% 100%;font-weight:100 900;font-style:oblique 0deg 16deg;font-feature-settings:"calt";font-display:swap}.chroma{color:#f8f8f2;-webkit-text-size-adjust:none}.chroma .x,.chroma .err{color:#f8f8f2}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#454158}.chroma .lnt,.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7970a9}.chroma .line{display:flex}.chroma .k,.chroma .kc{color:#ff80bf}.chroma .kd{color:#80ffea;font-style:italic}.chroma .kn,.chroma .kp,.chroma .kr{color:#ff80bf}.chroma .kt{color:#80ffea}.chroma .na,.chroma .nc{color:#8aff80}.chroma .no,.chroma .nd,.chroma .ni,.chroma .ne{color:#f8f8f2}.chroma .nl{color:#80ffea;font-style:italic}.chroma .nn,.chroma .nx{color:#f8f8f2}.chroma .nt{color:#ff80bf}.chroma .nb{color:#80ffea;font-style:italic}.chroma .bp{font-style:italic}.chroma .nv,.chroma .vc,.chroma .vg,.chroma .vi,.chroma .vm{color:#80ffea;font-style:italic}.chroma .nf,.chroma .fm{color:#8aff80}.chroma .ld{color:#f8f8f2}.chroma .s,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .dl,.chroma .sd,.chroma .s2,.chroma .se,.chroma .sh,.chroma .si,.chroma .sx,.chroma .sr,.chroma .s1,.chroma .ss{color:#ffff80}.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .il,.chroma .mo{color:#9580ff}.chroma .o,.chroma .ow,.chroma .or{color:#ff80bf}.chroma .p{color:#f8f8f2}.chroma .c,.chroma .ch,.chroma .cm,.chroma .c1,.chroma .cs{color:#7970a9}.chroma .cp,.chroma .cpf{color:#ff80bf}.chroma .gd{color:#ff9580}.chroma .ge{text-decoration:underline}.chroma .gr{color:#f8f8f2}.chroma .gh{font-weight:700}.chroma .gi{color:#8aff80;font-weight:700}.chroma .go{color:#c6c6c2}.chroma .gp,.chroma .gs{color:#f8f8f2}.chroma .gu{font-weight:700}.chroma .gt{color:#f8f8f2}.chroma .gl{text-decoration:underline}.chroma .w{color:#f8f8f2}:root{--background: #22212c;--foreground: #f8f8f2;--accent: #aa99ff;--secondary: #ff80bf;--cyan: #80ffea;--green: #8aff80;--yellow: #ffff80;--red: #ff9580;--selection: #454158;--border: #504c67;--code-border: color-mix(in srgb, var(--foreground) 10%, transparent);--code-text: color-mix(in srgb, var(--foreground) 5%, var(--accent));--muted: color-mix(in srgb, var(--foreground) 50%, transparent);--tint-code: color-mix(in srgb, var(--accent) 10%, var(--background));--tint-box: color-mix(in srgb, var(--accent) 5%, var(--background));--tint-hover: color-mix(in srgb, var(--accent) 15%, transparent);--rule: linear-gradient( to right, color-mix(in srgb, var(--border) 70%, transparent), color-mix(in srgb, var(--border) 10%, transparent) 85%, transparent );--font-size: 1rem;--line-height: 1.54;--font-sans: "Inter", system-ui, sans-serif;--font-mono: "Berkeley Mono", ui-monospace, monospace;--list-indent: 20px;--list-inset: 20px;--bullet: "\25cf";--bullet-size: .5em;--radius: 6px;--icon-size: 24px;--header-height: 59px;--scroll-offset: calc(var(--header-height) + 20px)}html{box-sizing:border-box;scrollbar-gutter:stable}*,*:before,*:after{box-sizing:inherit;margin:0;padding:0}body{font-family:var(--font-sans);font-size:var(--font-size);font-weight:300;line-height:var(--line-height);background-color:var(--background);color:var(--foreground);text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;overflow-wrap:break-word;padding:0 40px}h1{font-size:calc(var(--font-size) * 1.45)}h2{font-size:calc(var(--font-size) * 1.35)}h3{font-size:calc(var(--font-size) * 1.15)}h4,h5,h6{font-size:var(--font-size)}h1,h2,h3,h4,h5,h6,b,strong,th{font-weight:700}h1,h2,h3,h4,h5,h6,p,ul,ol,img,figure,video,table{margin:25px 0}::selection{background:var(--selection)}:is(pre,.table-wrap)::selection{background:transparent}a{color:var(--accent);text-decoration:none}a:hover,a:focus,a:active{color:var(--secondary)}a:focus-visible,button:focus-visible{outline:1px solid var(--accent);outline-offset:2px}button{font:inherit;color:var(--accent);background:transparent;border:0;cursor:pointer}img{display:block;max-width:100%;border:8px solid var(--border);padding:8px}figure{width:fit-content}figure img,figure video{margin-bottom:0}figure figcaption{background:var(--border);text-align:center;font-size:.85em;margin-top:-8px}ul,ol{margin-left:var(--list-indent)}:not(li)>:is(ul,ol){margin-left:calc(var(--list-inset) + var(--list-indent))}ul ul,ul ol,ol ul,ol ol{margin-top:0;margin-bottom:0}li::marker{color:var(--accent)}code,kbd{font-family:var(--font-mono);font-weight:400;font-feature-settings:"liga" 1,"calt" 1;font-size:.95em;background:var(--tint-code);color:var(--code-text);padding:0 6px;margin:0 2px}kbd{border-top:1px solid color-mix(in srgb,var(--accent) 25%,transparent);border-left:1px solid var(--accent);border-right:1px solid var(--accent);border-bottom:4px solid var(--accent);border-radius:4px}pre{tab-size:4;font-size:.9em;background:var(--tint-code);color:var(--code-text);padding:10px;overflow:auto}pre code{background:none;color:inherit;font-size:inherit;padding:0;margin:0}.highlight{margin:20px 0;border:1px solid var(--code-border)}blockquote{background-color:var(--tint-code);padding:10px 25px;border:1px solid var(--code-border)}blockquote:before{content:"\203a";float:left;margin-left:-15px;color:var(--accent);font-weight:700}blockquote p:first-child{margin-top:0}blockquote p:last-child{margin-bottom:0}.alert{--alert: var(--accent);padding-left:20px;border:0;border-left:4px solid var(--alert);background-color:color-mix(in srgb,var(--alert) 8%,var(--background))}.alert:before{content:none}.alert-title{margin:0 0 10px;font-weight:700;color:var(--alert)}.alert-note{--alert: var(--cyan)}.alert-tip{--alert: var(--green)}.alert-important{--alert: var(--secondary)}.alert-warning{--alert: var(--yellow)}.alert-caution{--alert: var(--red)}table{border-collapse:collapse}.table-wrap{margin:25px 0;overflow-x:auto}.table-wrap table{margin:0}table,th,td{border:2px solid var(--border);padding:10px}th{text-align:left;text-transform:uppercase;letter-spacing:.04em}hr{border:none;height:1px;background:var(--rule)}abbr{text-decoration-style:wavy;text-decoration-color:var(--accent);cursor:help}mark{background:color-mix(in srgb,var(--accent) 45%,transparent);color:var(--foreground)}sub,sup{line-height:0}.footnotes{color:var(--muted)}fieldset{margin:25px 0;padding:15px;border:1px solid var(--code-border);border-radius:var(--radius);background:var(--tint-box)}input:not([type=checkbox],[type=radio],[type=range]),select,textarea{font:inherit;color:var(--foreground);background:transparent;border:2px solid var(--border);border-radius:var(--radius);padding:5px 10px;margin:5px 0;max-width:100%}input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;border-color:var(--accent)}::placeholder{color:var(--muted)}textarea{resize:both;min-height:4em;vertical-align:top}select{appearance:none;padding-right:30px;background-image:linear-gradient(45deg,transparent 50%,var(--accent) 50%),linear-gradient(135deg,var(--accent) 50%,transparent 50%);background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%;background-size:5px 5px;background-repeat:no-repeat}select option{background:var(--background)}input[type=range]{accent-color:var(--accent)}input[type=checkbox],input[type=radio]{appearance:none;font:inherit;width:1.25em;height:1.25em;vertical-align:-.25em;margin-right:8px;border:2px solid var(--border);border-radius:4px;background:transparent center / 70% no-repeat;cursor:pointer}input[type=radio]{border-radius:50%}input[type=checkbox]:hover,input[type=radio]:hover{background-color:var(--tint-hover)}input[type=checkbox]:checked,input[type=radio]:checked{border-color:var(--accent);background-color:var(--accent)}input[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%2322212c' stroke-width='3' stroke-linecap='round' stroke-linejoin='round' d='M3 8.5l3.5 3.5L13 4.5'/%3E%3C/svg%3E")}input[type=radio]:checked{background-image:radial-gradient(circle,var(--background) 35%,transparent 40%)}details{margin:25px 0;padding:0 15px;border:1px solid var(--code-border);background:var(--tint-box)}summary{margin:0 -15px;padding:10px 15px;font-weight:700;color:var(--accent);cursor:pointer;list-style:none}summary::-webkit-details-marker{display:none}summary:before{content:"\203a";display:inline-block;margin-right:10px;transition:transform .15s ease}details[open]>summary:before{transform:rotate(90deg)}summary:hover{background:var(--tint-hover)}.skip-link{position:absolute;left:40px;top:-100px;z-index:300;padding:5px 10px;background:var(--accent);color:var(--background);font-weight:700;border-radius:var(--radius)}.skip-link:focus{top:10px;color:var(--background)}.header{position:sticky;top:0;z-index:100;display:flex;align-items:stretch;gap:10px;padding:10px 0;background-color:var(--background);-webkit-user-select:none;user-select:none}.header:after{content:"";position:absolute;left:0;right:0;bottom:-20px;height:20px;background:var(--background);mask-image:linear-gradient(black,rgb(0 0 0 / .9) 20%,rgb(0 0 0 / .65) 40%,rgb(0 0 0 / .35) 60%,rgb(0 0 0 / .1) 80%,transparent);pointer-events:none}.logo,.menu a,.radio__button,.post-body button,a.button{font-weight:700;padding:5px 10px;border:2px solid var(--accent);border-radius:var(--radius)}.logo{flex:0 0 auto;max-width:100%;display:flex;align-items:center;background:var(--accent);color:var(--background)}.logo__roll{display:flex;padding:0}.logo__roll:focus-visible{outline-color:var(--background)}.logo a{color:inherit}.logo h1{font-size:inherit;margin:0}.logo__icon{width:var(--icon-size);height:var(--icon-size);margin:0 8px 0 0;border:0;padding:0}.menu{display:flex;gap:10px;white-space:nowrap}.menu a{display:inline-flex;align-items:center}.post-body button,a.button{margin:5px 0}a.button{display:inline-block}.menu a:hover,.menu a:focus-visible,.menu a[aria-current],.radio__button:hover,.radio__button:focus-visible,.post-body button:hover,.post-body button:focus-visible,a.button:hover,a.button:focus-visible{color:var(--accent);background:var(--tint-hover)}.radio{flex:1;min-width:0;display:flex;justify-content:flex-end;gap:10px}.radio__track{--radio-fade: 24px;flex:1;min-width:0;align-self:center;margin:0;padding:0 10px 0 var(--radio-fade);overflow:hidden;white-space:nowrap;text-align:right;font-size:.85em;font-weight:450;color:color-mix(in srgb,var(--foreground) 65%,transparent);mask-image:linear-gradient(to right,transparent,black var(--radio-fade),black calc(100% - 10px),transparent);-webkit-user-select:text;user-select:text}.radio__track span{display:inline-block}.radio__track.scrolls{text-align:left}.radio__track.scrolls span{padding-left:100%;animation:radio-marquee var(--radio-duration, 20s) linear infinite}.radio__track:hover span{animation-play-state:paused}@keyframes radio-marquee{to{transform:translate(-100%)}}.radio__button{padding:5px;display:flex;align-items:center;justify-content:center}.radio__button[aria-pressed=true]{color:var(--background);background:var(--accent)}.radio__button[aria-disabled=true],.radio__button[aria-disabled=true]:hover,.radio__button[aria-disabled=true]:focus-visible{color:var(--border);border-color:var(--border);background:transparent;cursor:not-allowed}.radio__icon svg{display:block;width:var(--icon-size);height:var(--icon-size)}main{display:flex;flex-direction:column}.list-title{margin:30px 0 0;padding-bottom:15px}.post{padding-top:30px}.post:not(:last-of-type),.list-title{border-bottom:1px solid;border-image:var(--rule) 1}.post-title{margin:0 0 15px}.post-meta{margin-bottom:10px;color:color-mix(in srgb,var(--foreground) 65%,transparent)}.post-meta>*:not(:first-child):before{content:"::";display:inline-block;margin:0 8px}.post-tags{display:block;margin-bottom:20px;color:var(--accent)}.post-wrapper{display:flex;gap:40px}.post-content{flex:1;min-width:0}.post-content [id]{scroll-margin-top:var(--scroll-offset)}.post-body ul{list-style:none}.post-body ul>li:not(:empty):before{content:var(--bullet);float:left;margin-left:calc(-1 * var(--list-indent));font-size:var(--bullet-size);line-height:calc(var(--line-height) * var(--font-size));color:var(--accent);font-weight:700}.post-body li>:is(ul,ol){display:inline-flex;flex-direction:column;vertical-align:top;width:calc(100% - var(--list-indent))}.post :is(h1,h2,h3,h4,h5,h6) a{color:var(--foreground)}.post-title a:empty:after,.post-content :is(h1,h2,h3,h4,h5,h6) a:empty:after{content:"#";color:var(--accent);margin-left:10px;visibility:hidden}.post-title:hover a:empty:after,.post-title a:empty:focus:after,.post-content :is(h1,h2,h3,h4,h5,h6):hover a:empty:after,.post-content :is(h1,h2,h3,h4,h5,h6) a:empty:focus:after{visibility:visible}.post-title a:empty:hover:after,.post-content :is(h1,h2,h3,h4,h5,h6) a:empty:hover:after{color:var(--secondary)}.post-nav{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px}.post-nav .older{margin-left:auto}:is(.toc-sidebar,.toc-drawer) li::selection{background:transparent}:is(.toc-sidebar,.toc-drawer) h2{margin:0}:is(.toc-sidebar,.toc-drawer) nav ul{list-style:none;margin:0;font-size:.85em}:is(.toc-sidebar,.toc-drawer) nav ul ul{padding-left:1em}:is(.toc-sidebar,.toc-drawer) nav li a{display:block;padding:4px 0;color:var(--foreground);opacity:.7;font-weight:700}:is(.toc-sidebar,.toc-drawer) nav li a:hover,:is(.toc-sidebar,.toc-drawer) nav li a.active,:is(.toc-sidebar,.toc-drawer) nav li a:focus-visible{opacity:1;color:var(--accent)}:is(.toc-sidebar,.toc-drawer) nav li a:focus-visible{outline:none}:is(.toc-sidebar,.toc-drawer) nav li a:focus-visible:after{content:" #"}:is(.toc-sidebar,.toc-drawer) nav ul ul li a.active{border-left:2px solid var(--accent);padding-left:8px;margin-left:-10px}:is(.toc-sidebar nav h2,.toc-drawer-header) a{color:var(--foreground);font-weight:700}:is(.toc-sidebar nav h2,.toc-drawer-header) a:hover{color:var(--accent)}.toc-sidebar{width:250px;flex-shrink:0;position:sticky;top:calc(var(--header-height) + 30px);align-self:flex-start;max-height:calc(100vh - var(--header-height) - 50px);overflow-y:auto;z-index:101}.toc-drawer-toggle,.toc-drawer{display:none}.toc-drawer-toggle{position:fixed;right:0;top:50%;top:50svh;transform:translateY(-50%);z-index:202;align-items:center;justify-content:center;min-width:22px;min-height:44px;padding:16px 10px;font-size:1.2em;line-height:1;background:var(--background);border:2px solid var(--border);border-right:none;border-radius:var(--radius) 0 0 var(--radius);transition:right .3s ease}.toc-drawer-toggle:hover{background:color-mix(in srgb,var(--accent) 15%,var(--background))}.toc-drawer-toggle.open{right:280px}.toc-drawer-toggle:focus-visible,.toc-drawer-close:focus-visible,.toc-drawer-header a:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.toc-drawer{position:fixed;top:0;right:-280px;width:280px;height:100vh;height:100dvh;padding:20px;background:color-mix(in srgb,var(--background) 80%,transparent);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);border-left:2px solid var(--border);z-index:201;transition:right .3s ease;overflow:hidden}.toc-drawer.open{right:0}.toc-drawer-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;font-weight:700}.toc-drawer-close{font-size:1.4em;padding:0 4px}@media(max-width:1280px){.post-wrapper{flex-direction:column}.toc-sidebar{display:none}.toc-drawer-toggle{display:flex}.toc-drawer{display:flex;flex-direction:column}.toc-drawer nav{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain}}.footer{padding:40px 0;font-size:.85em;opacity:.65}.footer a:not(:hover){color:inherit}.copyright{display:flex;flex-wrap:wrap;justify-content:center;gap:.4ch}.copyright span{white-space:nowrap}@media(max-width:684px){:root{--font-size: .95rem}body{padding:0 max(20px,env(safe-area-inset-right)) 0 max(20px,env(safe-area-inset-left))}}@media(max-width:560px){.radio__track{display:none}}@media(prefers-reduced-motion:reduce){.toc-drawer,.toc-drawer-toggle,summary:before{transition:none}.radio__track.scrolls span{animation:none;padding-left:0}}@media print{.skip-link,.header,.toc-sidebar,.toc-drawer-toggle,.toc-drawer,.radio,.footer{display:none}:root{print-color-adjust:exact}pre{white-space:pre-wrap;overflow-wrap:anywhere}}
