@charset "UTF-8";:root{--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-500:#adb5bd;--color-link:#0055bb;--color-visited-link:#8440f1;--body-background:white;--body-font-color:black;--icon-filter:none;--hint-color-info:#6bf;--hint-color-warning:#fd6;--hint-color-danger:#f66}/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.flex{display:flex}.flex-auto{flex:auto}.flex-even{flex:1 1}.flex-wrap{flex-wrap:wrap}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.align-center{align-items:center}.mx-auto{margin:0 auto}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.hidden{display:none}input.toggle{height:0;width:0;overflow:hidden;opacity:0;position:absolute}.clearfix::after{content:"";display:table;clear:both}html{font-size:16px;scroll-behavior:smooth;touch-action:manipulation;-webkit-text-size-adjust:100%}body{min-width:20rem;color:var(--body-font-color);background:var(--body-background);letter-spacing:.33px;font-weight:400;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.6;box-sizing:border-box}body *{box-sizing:inherit}h1,h2,h3,h4,h5{font-weight:600;line-height:1.3;margin-top:2rem;margin-bottom:1rem;color:var(--body-font-color)}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1{font-size:1.5rem;border-bottom:2px solid var(--color-link);padding-bottom:.5rem}h2{font-size:1.25rem;border-bottom:1px solid var(--gray-200);padding-bottom:.5rem}h3{font-size:1.125rem;color:var(--color-link)}a{text-decoration:none;color:var(--color-link);transition:color .2s ease}a:hover{color:#3395ff;text-decoration:underline}img{vertical-align:baseline}:focus{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}aside nav ul{padding:0;margin:0;list-style:none}aside nav ul li{margin:1em 0;position:relative}aside nav ul a{display:block}aside nav ul a:hover{opacity:.5}aside nav ul ul{padding-inline-start:1rem}ul.pagination{display:flex;justify-content:center;list-style-type:none}ul.pagination .page-item a{padding:1rem}.container{max-width:80rem;margin:0 auto}.book-icon{filter:var(--icon-filter)}.book-brand{margin-top:0;margin-bottom:1rem}.book-brand img{height:1.5em;width:1.5em;margin-inline-end:.5rem}.book-menu{flex:0 0 16rem;font-size:.875rem;background:var(--body-background);border-right:1px solid var(--gray-200)}.book-menu .book-menu-content{width:16rem;padding:1rem;background:var(--body-background);height:100vh;overflow-y:auto;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-menu .book-menu-content::-webkit-scrollbar{width:6px}.book-menu .book-menu-content::-webkit-scrollbar-track{background:var(--gray-100)}.book-menu .book-menu-content::-webkit-scrollbar-thumb{background:var(--gray-500);border-radius:3px}.book-menu a,.book-menu label{color:inherit;cursor:pointer;word-wrap:break-word;transition:color .2s ease;padding:.5rem .75rem;border-radius:.25rem;display:block;margin:2px 0}.book-menu a:hover,.book-menu label:hover{background:var(--gray-100);color:var(--color-link)}.book-menu a.active{color:var(--color-link);background:var(--gray-100);font-weight:600;border-left:3px solid var(--color-link)}.book-menu input.toggle+label+ul{display:none}.book-menu input.toggle:checked+label+ul{display:block}.book-menu input.toggle+label::after{content:"▸";float:right;transition:transform .2s ease}.book-menu input.toggle:checked+label::after{content:"▾";transform:rotate(90deg)}body[dir=rtl] .book-menu input.toggle+label::after{content:"◂"}body[dir=rtl] .book-menu input.toggle:checked+label::after{content:"▾"}.book-section-flat{margin:2rem 0}.book-section-flat>a,.book-section-flat>span,.book-section-flat>label{font-weight:bolder}.book-section-flat>ul{padding-inline-start:0}.book-page{min-width:20rem;flex-grow:1;padding:1rem}.book-post{margin-bottom:3rem}.book-header{display:none;margin-bottom:1rem}.book-header label{line-height:0}.book-header img.book-icon{height:1.5em;width:1.5em}.book-search{position:relative;margin:1rem 0;border-bottom:1px solid transparent}.book-search input{width:100%;padding:.5rem;border:0;border-radius:.25rem;background:var(--gray-100);color:var(--body-font-color)}.book-search input:required+.book-search-spinner{display:block}.book-search .book-search-spinner{position:absolute;top:0;margin:.5rem;margin-inline-start:calc(100% - 1.5rem);width:1rem;height:1rem;border:1px solid transparent;border-top-color:var(--body-font-color);border-radius:50%;animation:spin 1s ease infinite}@keyframes spin{100%{transform:rotate(360deg)}}.book-search small{opacity:.5}.book-toc{flex:0 0 16rem;font-size:.75rem}.book-toc .book-toc-content{width:16rem;padding:1rem;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-toc img{height:1em;width:1em}.book-toc nav>ul>li:first-child{margin-top:0}.book-footer{padding-top:1rem;font-size:.875rem}.book-footer img{height:1em;width:1em;margin-inline-end:.5rem}.book-comments{margin-top:1rem}.book-languages{margin-block-end:2rem}.book-languages .book-icon{height:1em;width:1em;margin-inline-end:.5em}.book-languages ul{padding-inline-start:1.5em}.book-menu-content,.book-toc-content,.book-page,.book-header aside,.markdown{transition:.2s ease-in-out;transition-property:transform,margin,opacity,visibility;will-change:transform,margin,opacity}@media screen and (max-width:56rem){#menu-control,#toc-control{display:inline}.book-menu{visibility:hidden;margin-inline-start:-16rem;font-size:16px;z-index:1000;transition:transform .3s ease,visibility .3s ease}.book-toc{display:none}.book-header{display:flex;align-items:center;justify-content:space-between;padding:1rem;background:var(--body-background);border-bottom:1px solid var(--gray-200);position:sticky;top:0;z-index:100}.book-header label{padding:.5rem;border-radius:.25rem;cursor:pointer}.book-header label:hover{background:var(--gray-100)}#menu-control:focus~main label[for=menu-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#menu-control:checked~main .book-menu{visibility:visible;transform:translateX(16rem)}#menu-control:checked~main .book-menu .book-menu-content{transform:translateX(0);box-shadow:0 0 20px rgba(0,0,0,.2)}#menu-control:checked~main .book-page{opacity:.25;pointer-events:none}#menu-control:checked~main .book-menu-overlay{display:block;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:999;cursor:pointer}#toc-control:focus~main label[for=toc-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#toc-control:checked~main .book-header aside{display:block;position:fixed;top:3.5rem;right:0;bottom:0;width:80%;max-width:300px;background:var(--body-background);border-left:1px solid var(--gray-200);padding:1rem;overflow-y:auto;z-index:100;box-shadow:-2px 0 10px rgba(0,0,0,.1)}#toc-control:checked~main .book-toc-overlay{display:block;position:fixed;top:3.5rem;left:0;right:0;bottom:0;background:rgba(0,0,0,.3);z-index:99;cursor:pointer}body[dir=rtl] #menu-control:checked~main .book-menu .book-menu-content{transform:translateX(-16rem)}.book-page{padding:1rem}.book-page h1{font-size:1.25rem}.book-page h2{font-size:1.125rem}.book-page h3{font-size:1rem}}@media screen and (min-width:80rem){.book-page,.book-menu .book-menu-content,.book-toc .book-toc-content{padding:2rem 1rem}}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:swap;src:local(""),url(fonts/roboto-v27-latin-regular.woff2)format("woff2"),url(fonts/roboto-v27-latin-regular.woff)format("woff")}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:swap;src:local(""),url(fonts/roboto-v27-latin-700.woff2)format("woff2"),url(fonts/roboto-v27-latin-700.woff)format("woff")}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:swap;src:local(""),url(fonts/roboto-mono-v13-latin-regular.woff2)format("woff2"),url(fonts/roboto-mono-v13-latin-regular.woff)format("woff")}body{font-family:roboto,sans-serif}code{font-family:roboto mono,monospace}@media print{.book-menu,.book-footer,.book-toc{display:none}.book-header,.book-header aside{display:block}main{display:block!important}}.markdown{line-height:1.7;font-size:1rem;color:var(--body-font-color)}.markdown>:first-child{margin-top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-weight:600;line-height:1.3;margin-top:1.8em;margin-bottom:1rem;color:var(--body-font-color)}.markdown h1 a.anchor,.markdown h2 a.anchor,.markdown h3 a.anchor,.markdown h4 a.anchor,.markdown h5 a.anchor,.markdown h6 a.anchor{opacity:0;font-size:.75em;vertical-align:middle;text-decoration:none;margin-left:.5rem;color:var(--gray-500);transition:opacity .2s ease}.markdown h1:hover a.anchor,.markdown h1 a.anchor:focus,.markdown h2:hover a.anchor,.markdown h2 a.anchor:focus,.markdown h3:hover a.anchor,.markdown h3 a.anchor:focus,.markdown h4:hover a.anchor,.markdown h4 a.anchor:focus,.markdown h5:hover a.anchor,.markdown h5 a.anchor:focus,.markdown h6:hover a.anchor,.markdown h6 a.anchor:focus{opacity:1}.markdown h4,.markdown h5,.markdown h6{font-weight:bolder}.markdown h5{font-size:.875em}.markdown h6{font-size:.75em}.markdown b,.markdown optgroup,.markdown strong{font-weight:bolder}.markdown a{text-decoration:none}.markdown a:hover{text-decoration:underline}.markdown a:visited{color:var(--color-visited-link)}.markdown img{max-width:100%;height:auto}.markdown code{padding:.25rem .5rem;background:var(--gray-100);border-radius:8px;font-size:.9em;font-family:roboto mono,sf mono,Monaco,Inconsolata,roboto mono,monospace;border:1px solid var(--gray-200);color:var(--body-font-color)}.markdown pre{padding:1rem;background:var(--gray-100);border-radius:8px;overflow-x:auto;border:1px solid var(--gray-200);margin:1rem 0;box-shadow:0 4px 6px rgba(0,0,0,.1)}.markdown pre code{padding:0;background:0 0;border:none;font-size:.95em;line-height:1.5;color:var(--body-font-color)}.highlight .markdown pre{background:#f8f9fa!important;border:1px solid #e9ecef!important}.highlight .markdown pre[style*="background-color:#272822"]{background:#f8f9fa!important}.highlight .markdown pre code{color:#2b2b2b!important}.highlight .markdown pre[style*="color:#f8f8f2"]{color:#2b2b2b!important;background-color:#f8f9fa!important}.highlight .markdown pre[style*="color:#f8f8f2"] span{color:inherit!important}.highlight .markdown pre .ge{color:#2b2b2b!important;font-style:italic!important}.highlight .markdown pre .gs{color:#2b2b2b!important;font-weight:700!important}.highlight .markdown pre .c,.highlight .markdown pre .cm,.highlight .markdown pre .c1,.highlight .markdown pre .cs{color:#6a737d!important}.highlight .markdown pre .k,.highlight .markdown pre .kc,.highlight .markdown pre .kd,.highlight .markdown pre .kn,.highlight .markdown pre .kp,.highlight .markdown pre .kr,.highlight .markdown pre .kt{color:#d73a49!important}.highlight .markdown pre .na,.highlight .markdown pre .nb,.highlight .markdown pre .nc,.highlight .markdown pre .no,.highlight .markdown pre .nd,.highlight .markdown pre .ni,.highlight .markdown pre .ne,.highlight .markdown pre .nf{color:#6f42c1!important}.highlight .markdown pre .nl,.highlight .markdown pre .nn,.highlight .markdown pre .nx,.highlight .markdown pre .py{color:#2b2b2b!important}.highlight .markdown pre .nt{color:#22863a!important}.highlight .markdown pre .nv,.highlight .markdown pre .vc,.highlight .markdown pre .vg,.highlight .markdown pre .vi{color:#e36209!important}.highlight .markdown pre .s,.highlight .markdown pre .sb,.highlight .markdown pre .sc,.highlight .markdown pre .sd,.highlight .markdown pre .s2,.highlight .markdown pre .se,.highlight .markdown pre .sh,.highlight .markdown pre .si,.highlight .markdown pre .sx,.highlight .markdown pre .sr,.highlight .markdown pre .s1,.highlight .markdown pre .ss{color:#032f62!important}.highlight .markdown pre .m,.highlight .markdown pre .mf,.highlight .markdown pre .mh,.highlight .markdown pre .mi,.highlight .markdown pre .il,.highlight .markdown pre .mo{color:#005cc5!important}.highlight .markdown pre .o{color:#d73a49!important}.highlight .markdown pre .ow{color:#d73a49!important}.highlight .markdown pre .w{color:#2b2b2b!important}.highlight .markdown pre .err{color:#960050!important;background-color:#ffeef0!important}.highlight .markdown pre span[style*="color:#"]{color:inherit!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#66d9ef"]{color:#005cc5!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#f92672"]{color:#d73a49!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#e6db74"]{color:#032f62!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#ae81ff"]{color:#6f42c1!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#75715e"]{color:#6a737d!important}.highlight .markdown pre[style*="color:#f8f8f2"] span[style*="color:#fd971f"]{color:#e36209!important}.markdown blockquote{margin:1rem 0;padding:.5rem 1rem .5rem .75rem;border-inline-start:.25rem solid var(--gray-200);border-radius:.25rem}.markdown blockquote :first-child{margin-top:0}.markdown blockquote :last-child{margin-bottom:0}.markdown table{overflow:auto;display:block;border-spacing:0;border-collapse:collapse;margin-top:1rem;margin-bottom:1rem}.markdown table tr th,.markdown table tr td{padding:.5rem 1rem;border:1px solid var(--gray-200)}.markdown table tr:nth-child(2n){background:var(--gray-100)}.markdown hr{height:1px;border:none;background:var(--gray-200)}.markdown ul,.markdown ol{padding-inline-start:2rem}.markdown dl dt{font-weight:bolder;margin-top:1rem}.markdown dl dd{margin-inline-start:0;margin-bottom:1rem}.markdown .highlight table tr td:nth-child(1) pre{margin:0;padding-inline-end:0}.markdown .highlight table tr td:nth-child(2) pre{margin:0;padding-inline-start:0}.markdown details{padding:1rem;border:1px solid var(--gray-200);border-radius:.25rem}.markdown details summary{line-height:1;padding:1rem;margin:-1rem;cursor:pointer}.markdown details[open] summary{margin-bottom:0}.markdown figure{margin:1rem 0}.markdown figure figcaption p{margin-top:0}.markdown-inner>:first-child{margin-top:0}.markdown-inner>:last-child{margin-bottom:0}.markdown .book-expand{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden}.markdown .book-expand .book-expand-head{background:var(--gray-100);padding:.5rem 1rem;cursor:pointer}.markdown .book-expand .book-expand-content{display:none;padding:1rem}.markdown .book-expand input[type=checkbox]:checked+.book-expand-content{display:block}.markdown .book-tabs{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden;display:flex;flex-wrap:wrap}.markdown .book-tabs label{display:inline-block;padding:.5rem 1rem;border-bottom:1px transparent;cursor:pointer}.markdown .book-tabs .book-tabs-content{order:999;width:100%;border-top:1px solid var(--gray-100);padding:1rem;display:none}.markdown .book-tabs input[type=radio]:checked+label{border-bottom:1px solid var(--color-link)}.markdown .book-tabs input[type=radio]:checked+label+.book-tabs-content{display:block}.markdown .book-tabs input[type=radio]:focus+label{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}.markdown .book-columns{margin-left:-1rem;margin-right:-1rem}.markdown .book-columns>div{margin:1rem 0;min-width:10rem;padding:0 1rem}.markdown a.book-btn{display:inline-block;font-size:.875rem;color:var(--color-link);line-height:2rem;padding:0 1rem;border:1px solid var(--color-link);border-radius:.25rem;cursor:pointer}.markdown a.book-btn:hover{text-decoration:none}.markdown .book-hint.info{border-color:#6bf;background-color:rgba(102,187,255,.1)}.markdown .book-hint.warning{border-color:#fd6;background-color:rgba(255,221,102,.1)}.markdown .book-hint.danger{border-color:#f66;background-color:rgba(255,102,102,.1)}.tech-badge{display:inline-block;padding:.25rem .5rem;background:linear-gradient(135deg,#007bff,#6f42c1);color:#fff;border-radius:8px;font-size:.75rem;font-weight:600;margin:0 .25rem;vertical-align:middle}.tech-card{background:var(--body-background);border-radius:8px;box-shadow:0 4px 6px rgba(0,0,0,.1);padding:1rem;margin:1rem 0;border:1px solid var(--gray-200);transition:all .3s cubic-bezier(.4,0,.2,1)}.tech-card:hover{box-shadow:0 8px 25px rgba(0,0,0,.15);transform:translateY(-2px)}.tech-card-header{font-size:1.125rem;font-weight:600;margin-bottom:1rem;color:var(--color-link);border-bottom:2px solid var(--gray-200);padding-bottom:.5rem}.tech-card-content{line-height:1.6}.tech-button{background:linear-gradient(135deg,#007bff,#6f42c1);color:#fff;border:none;border-radius:8px;padding:.5rem 1rem;font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1)}.tech-button:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,123,255,.3)}.tech-button-outline{background:linear-gradient(135deg,#007bff,#6f42c1);color:#fff;border:none;border-radius:8px;padding:.5rem 1rem;font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:0 0;border:2px solid #007bff;color:#007bff}.tech-button-outline:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,123,255,.3)}.tech-button-outline:hover{background:#007bff;color:#fff}.markdown pre{position:relative}.markdown pre::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,#007bff,#6f42c1);border-radius:8px 8px 0 0}.highlight .markdown pre::before{background:linear-gradient(90deg,#005cc5,#6f42c1)}.markdown table{border-radius:8px;overflow:hidden;box-shadow:0 4px 6px rgba(0,0,0,.1)}.markdown table tr th{background:linear-gradient(135deg,var(--gray-100),var(--gray-200));font-weight:600;border-bottom:2px solid var(--gray-300)}.markdown table tr:nth-child(2n){background:var(--gray-50)}@media screen and (max-width:56rem){.tech-card{margin:.5rem 0;padding:.75rem}.markdown pre{margin:.5rem 0;padding:.75rem}.markdown pre code{font-size:.85em}.markdown table{font-size:.875rem}.markdown table tr th,.markdown table tr td{padding:.25rem .5rem}}@media(prefers-color-scheme:dark){.tech-badge{background:linear-gradient(135deg,#3395ff,#8c68ce)}.markdown pre{background:var(--gray-800);border-color:var(--gray-700)}.markdown pre::before{background:linear-gradient(90deg,#4da3ff,#9b7cd4)}}@keyframes tech-pulse{0%,100%{opacity:1}50%{opacity:.7}}.tech-highlight{animation:tech-pulse 2s ease-in-out infinite;background:linear-gradient(135deg,rgba(0,123,255,.1),rgba(111,66,193,.1));padding:.5rem 1rem;border-radius:8px;border-left:3px solid #007bff}