From b03bd8d3902cb5b89680ac2ba8b46ce7e299a43d Mon Sep 17 00:00:00 2001
From: "Forgejo actions[bot]" <forgejo-actions[bot]@noreply.pleshevski.ru>
Date: Thu, 3 Apr 2025 21:13:22 +0000
Subject: [PATCH] Deploy 2025-04-03

---
 404.html                                               | 10 +++++-----
 assets/{404.html-uFOVky09.js => 404.html-BlRV83Ta.js}  |  2 +-
 assets/{app-tk-nPD_r.js => app-DZpkSsji.js}            |  4 ++--
 .../{index.html-Woighx2z.js => index.html-B992a44K.js} |  2 +-
 .../{index.html-UKCz4hfb.js => index.html-CmmWOU6g.js} |  2 +-
 assets/{style-CVjY3BV_.css => style-0okUxGr0.css}      |  2 +-
 .../{works.html-CZFprrn5.js => works.html-AkvQjJeg.js} |  2 +-
 .../{works.html-mij4Hd53.js => works.html-CnSsBJaM.js} |  2 +-
 eng/index.html                                         |  8 ++++----
 eng/works.html                                         |  8 ++++----
 index.html                                             |  8 ++++----
 works.html                                             |  8 ++++----
 12 files changed, 29 insertions(+), 29 deletions(-)
 rename assets/{404.html-uFOVky09.js => 404.html-BlRV83Ta.js} (91%)
 rename assets/{app-tk-nPD_r.js => app-DZpkSsji.js} (99%)
 rename assets/{index.html-Woighx2z.js => index.html-B992a44K.js} (99%)
 rename assets/{index.html-UKCz4hfb.js => index.html-CmmWOU6g.js} (99%)
 rename assets/{style-CVjY3BV_.css => style-0okUxGr0.css} (99%)
 rename assets/{works.html-CZFprrn5.js => works.html-AkvQjJeg.js} (99%)
 rename assets/{works.html-mij4Hd53.js => works.html-CnSsBJaM.js} (99%)

diff --git a/404.html b/404.html
index f98eb9e..fa2ea13 100644
--- a/404.html
+++ b/404.html
@@ -32,12 +32,12 @@
       }
     </script>
     <meta property="og:url" content="https://pleshevski.ru/404.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":""}</script><title>Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-CVjY3BV_.css" as="style"><link rel="stylesheet" href="/assets/style-CVjY3BV_.css">
-    <link rel="modulepreload" href="/assets/app-tk-nPD_r.js"><link rel="modulepreload" href="/assets/404.html-uFOVky09.js">
-    <link rel="prefetch" href="/assets/index.html-UKCz4hfb.js" as="script"><link rel="prefetch" href="/assets/works.html-CZFprrn5.js" as="script"><link rel="prefetch" href="/assets/index.html-Woighx2z.js" as="script"><link rel="prefetch" href="/assets/works.html-mij4Hd53.js" as="script">
+    <link rel="preload" href="/assets/style-0okUxGr0.css" as="style"><link rel="stylesheet" href="/assets/style-0okUxGr0.css">
+    <link rel="modulepreload" href="/assets/app-DZpkSsji.js"><link rel="modulepreload" href="/assets/404.html-BlRV83Ta.js">
+    <link rel="prefetch" href="/assets/index.html-CmmWOU6g.js" as="script"><link rel="prefetch" href="/assets/works.html-AkvQjJeg.js" as="script"><link rel="prefetch" href="/assets/index.html-B992a44K.js" as="script"><link rel="prefetch" href="/assets/works.html-CnSsBJaM.js" as="script">
   </head>
   <body>
-    <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-a22fad92><main class="page" data-v-a22fad92><div vp-content data-v-a22fad92><h1 data-v-a22fad92>404</h1><blockquote data-v-a22fad92>Вы заблокированы в лабиринте.</blockquote><a class="route-link" href="/" data-v-a22fad92>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-tk-nPD_r.js" defer></script>
+    <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-5421f896><main class="page" data-v-5421f896><div vp-content data-v-5421f896><h1 data-v-5421f896>404</h1><blockquote data-v-5421f896>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-5421f896>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
+    <script type="module" src="/assets/app-DZpkSsji.js" defer></script>
   </body>
 </html>
diff --git a/assets/404.html-uFOVky09.js b/assets/404.html-BlRV83Ta.js
similarity index 91%
rename from assets/404.html-uFOVky09.js
rename to assets/404.html-BlRV83Ta.js
index 91e543f..df50d71 100644
--- a/assets/404.html-uFOVky09.js
+++ b/assets/404.html-BlRV83Ta.js
@@ -1 +1 @@
-import{_ as e,c as o,a,o as n}from"./app-tk-nPD_r.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
+import{_ as e,c as o,a,o as n}from"./app-DZpkSsji.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
diff --git a/assets/app-tk-nPD_r.js b/assets/app-DZpkSsji.js
similarity index 99%
rename from assets/app-tk-nPD_r.js
rename to assets/app-DZpkSsji.js
index 8b2844b..55b4a8f 100644
--- a/assets/app-tk-nPD_r.js
+++ b/assets/app-DZpkSsji.js
@@ -15,14 +15,14 @@ var bc=Object.defineProperty;var yc=(e,t,n)=>t in e?bc(e,t,{enumerable:!0,config
 * @vue/runtime-dom v3.5.13
 * (c) 2018-present Yuxi (Evan) You and Vue contributors
 * @license MIT
-**/let Go;const ci=typeof window<"u"&&window.trustedTypes;if(ci)try{Go=ci.createPolicy("vue",{createHTML:e=>e})}catch{}const Ea=Go?e=>Go.createHTML(e):e=>e,Pf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",xt=typeof document<"u"?document:null,ui=xt&&xt.createElement("template"),xf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?xt.createElementNS(Pf,e):t==="mathml"?xt.createElementNS(Cf,e):n?xt.createElement(e,{is:n}):xt.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>xt.createTextNode(e),createComment:e=>xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ui.innerHTML=Ea(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=ui.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$t="transition",$n="animation",or=Symbol("_vtc"),Pa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Tf=Me({},Gl,Pa),kf=e=>(e.displayName="Transition",e.props=Tf,e),gs=kf((e,{slots:t})=>q(vu,Lf(e),t)),Qt=(e,t=[])=>{te(e)?e.forEach(n=>n(...t)):e&&e(...t)},fi=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function Lf(e){const t={};for(const x in e)x in Pa||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=Af(o),y=m&&m[0],E=m&&m[1],{onBeforeEnter:w,onEnter:S,onEnterCancelled:v,onLeave:_,onLeaveCancelled:M,onBeforeAppear:G=w,onAppear:D=S,onAppearCancelled:Q=v}=t,I=(x,F,ie,me)=>{x._enterCancelled=me,Xt(x,F?u:l),Xt(x,F?c:i),ie&&ie()},T=(x,F)=>{x._isLeaving=!1,Xt(x,f),Xt(x,h),Xt(x,p),F&&F()},L=x=>(F,ie)=>{const me=x?D:S,J=()=>I(F,x,ie);Qt(me,[F,J]),di(()=>{Xt(F,x?a:s),wt(F,x?u:l),fi(me)||pi(F,r,y,J)})};return Me(t,{onBeforeEnter(x){Qt(w,[x]),wt(x,s),wt(x,i)},onBeforeAppear(x){Qt(G,[x]),wt(x,a),wt(x,c)},onEnter:L(!1),onAppear:L(!0),onLeave(x,F){x._isLeaving=!0;const ie=()=>T(x,F);wt(x,f),x._enterCancelled?(wt(x,p),vi()):(vi(),wt(x,p)),di(()=>{x._isLeaving&&(Xt(x,f),wt(x,h),fi(_)||pi(x,r,E,ie))}),Qt(_,[x,ie])},onEnterCancelled(x){I(x,!1,void 0,!0),Qt(v,[x])},onAppearCancelled(x){I(x,!0,void 0,!0),Qt(Q,[x])},onLeaveCancelled(x){T(x),Qt(M,[x])}})}function Af(e){if(e==null)return null;if(Ce(e))return[Po(e.enter),Po(e.leave)];{const t=Po(e);return[t,t]}}function Po(e){return Tc(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[or]||(e[or]=new Set)).add(t)}function Xt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[or];n&&(n.delete(t),n.size||(e[or]=void 0))}function di(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Rf=0;function pi(e,t,n,r){const o=e._endId=++Rf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Of(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,p),s()},p=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,p)}function Of(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||"").split(", "),o=r(`${$t}Delay`),s=r(`${$t}Duration`),i=hi(o,s),l=r(`${$n}Delay`),a=r(`${$n}Duration`),c=hi(l,a);let u=null,f=0,p=0;t===$t?i>0&&(u=$t,f=i,p=s.length):t===$n?c>0&&(u=$n,f=c,p=a.length):(f=Math.max(i,c),u=f>0?i>c?$t:$n:null,p=u?u===$t?s.length:a.length:0);const h=u===$t&&/\b(transform|all)(,|$)/.test(r(`${$t}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:h}}function hi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>gi(n)+gi(e[r])))}function gi(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function vi(){return document.body.offsetHeight}function Df(e,t,n){const r=e[or];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qr=Symbol("_vod"),Ca=Symbol("_vsh"),zr={beforeMount(e,{value:t},{transition:n}){e[qr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Nn(e,!0),r.enter(e)):r.leave(e,()=>{Nn(e,!1)}):Nn(e,t))},beforeUnmount(e,{value:t}){Nn(e,t)}};function Nn(e,t){e.style.display=t?e[qr]:"none",e[Ca]=!t}const If=Symbol(""),Mf=/(^|;)\s*display\s*:/;function $f(e,t,n){const r=e.style,o=Oe(n);let s=!1;if(n&&!o){if(t)if(Oe(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&$r(r,l,"")}else for(const i in t)n[i]==null&&$r(r,i,"");for(const i in n)i==="display"&&(s=!0),$r(r,i,n[i])}else if(o){if(t!==n){const i=r[If];i&&(n+=";"+i),r.cssText=n,s=Mf.test(n)}}else t&&e.removeAttribute("style");qr in e&&(e[qr]=s?r.display:"",e[Ca]&&(r.display="none"))}const mi=/\s*!important$/;function $r(e,t,n){if(te(n))n.forEach(r=>$r(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Nf(e,t);mi.test(n)?e.setProperty(Kt(r),n.replace(mi,""),"important"):e[r]=n}}const _i=["Webkit","Moz","ms"],Co={};function Nf(e,t){const n=Co[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return Co[t]=r;r=ur(r);for(let o=0;o<_i.length;o++){const s=_i[o]+r;if(s in e)return Co[t]=s}return t}const bi="http://www.w3.org/1999/xlink";function yi(e,t,n,r,o,s=Dc(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(bi,t.slice(6,t.length)):e.setAttributeNS(bi,t,n):n==null||s&&!gl(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Ot(n)?String(n):n)}function Si(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Ea(n):n);return}const s=e.tagName;if(t==="value"&&s!=="PROGRESS"&&!s.includes("-")){const l=s==="OPTION"?e.getAttribute("value")||"":e.value,a=n==null?e.type==="checkbox"?"on":"":String(n);(l!==a||!("_value"in e))&&(e.value=a),n==null&&e.removeAttribute(t),e._value=n;return}let i=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=gl(n):n==null&&l==="string"?(n="",i=!0):l==="number"&&(n=0,i=!0)}try{e[t]=n}catch{}i&&e.removeAttribute(o||t)}function Hf(e,t,n,r){e.addEventListener(t,n,r)}function Vf(e,t,n,r){e.removeEventListener(t,n,r)}const wi=Symbol("_vei");function jf(e,t,n,r,o=null){const s=e[wi]||(e[wi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Ff(t);if(r){const c=s[t]=Uf(r,o);Hf(e,l,c,a)}else i&&(Vf(e,l,i,a),s[t]=void 0)}}const Ei=/(?:Once|Passive|Capture)$/;function Ff(e){let t;if(Ei.test(e)){t={};let r;for(;r=e.match(Ei);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):Kt(e.slice(2)),t]}let xo=0;const Bf=Promise.resolve(),Wf=()=>xo||(Bf.then(()=>xo=0),xo=Date.now());function Uf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;pt(Gf(r,n.value),t,5,[r])};return n.value=e,n.attached=Wf(),n}function Gf(e,t){if(te(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Pi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Kf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?Df(e,r,i):t==="style"?$f(e,n,r):cr(t)?Xo(t)||jf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):qf(e,t,r,i))?(Si(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&yi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?Si(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),yi(e,t,r,i))};function qf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Pi(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Pi(t)&&Oe(n)?!1:t in e}const zf={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Jf=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=Kt(o.key);if(t.some(i=>i===s||zf[i]===s))return e(o)})},Yf=Me({patchProp:Kf},xf);let To,Ci=!1;function Qf(){return To=Ci?To:Qu(Yf),Ci=!0,To}const Xf=(...e)=>{const t=Qf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ed(r);if(o)return n(o,!0,Zf(o))},t};function Zf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ed(e){return Oe(e)?document.querySelector(e):e}var gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),td=/.md((\?|#).*)?$/,nd=(e,t="/")=>gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!td.test(e),vr=e=>/^(https?:)?\/\//.test(e),xi=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},rd="http://.",od=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return xi(new URL(`${n}/${e}`,rd).pathname)}return xi(e)},sd=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},id=/(#|\?)/,xa=e=>{const[t,...n]=e.split(id);return{pathname:t,hashAndQueries:n.join("")}},ld=["link","meta","script","style","noscript","template"],ad=["title","base"],cd=([e,t,n])=>ad.includes(e)?e:ld.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,ud=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=cd(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},fd=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,Ta=e=>e.endsWith("/")?e.slice(0,-1):e,ka=e=>e.startsWith("/")?e.slice(1):e,vs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const dd="modulepreload",pd=function(e){return"/"+e},Ti={},Hn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=pd(s),s in Ti)return;Ti[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":dd,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,u)=>{a.addEventListener("load",c),a.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},hd=JSON.parse("{}"),gd=Object.fromEntries([["/",{loader:()=>Hn(()=>import("./index.html-UKCz4hfb.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Hn(()=>import("./works.html-CZFprrn5.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Hn(()=>import("./index.html-Woighx2z.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Hn(()=>import("./works.html-mij4Hd53.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Hn(()=>import("./404.html-uFOVky09.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*!
+**/let Go;const ci=typeof window<"u"&&window.trustedTypes;if(ci)try{Go=ci.createPolicy("vue",{createHTML:e=>e})}catch{}const Ea=Go?e=>Go.createHTML(e):e=>e,Pf="http://www.w3.org/2000/svg",Cf="http://www.w3.org/1998/Math/MathML",xt=typeof document<"u"?document:null,ui=xt&&xt.createElement("template"),xf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?xt.createElementNS(Pf,e):t==="mathml"?xt.createElementNS(Cf,e):n?xt.createElement(e,{is:n}):xt.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>xt.createTextNode(e),createComment:e=>xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ui.innerHTML=Ea(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=ui.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$t="transition",$n="animation",or=Symbol("_vtc"),Pa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Tf=Me({},Gl,Pa),kf=e=>(e.displayName="Transition",e.props=Tf,e),gs=kf((e,{slots:t})=>q(vu,Lf(e),t)),Qt=(e,t=[])=>{te(e)?e.forEach(n=>n(...t)):e&&e(...t)},fi=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function Lf(e){const t={};for(const x in e)x in Pa||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=Af(o),y=m&&m[0],E=m&&m[1],{onBeforeEnter:w,onEnter:S,onEnterCancelled:v,onLeave:_,onLeaveCancelled:M,onBeforeAppear:G=w,onAppear:D=S,onAppearCancelled:Q=v}=t,I=(x,F,ie,me)=>{x._enterCancelled=me,Xt(x,F?u:l),Xt(x,F?c:i),ie&&ie()},T=(x,F)=>{x._isLeaving=!1,Xt(x,f),Xt(x,h),Xt(x,p),F&&F()},L=x=>(F,ie)=>{const me=x?D:S,J=()=>I(F,x,ie);Qt(me,[F,J]),di(()=>{Xt(F,x?a:s),wt(F,x?u:l),fi(me)||pi(F,r,y,J)})};return Me(t,{onBeforeEnter(x){Qt(w,[x]),wt(x,s),wt(x,i)},onBeforeAppear(x){Qt(G,[x]),wt(x,a),wt(x,c)},onEnter:L(!1),onAppear:L(!0),onLeave(x,F){x._isLeaving=!0;const ie=()=>T(x,F);wt(x,f),x._enterCancelled?(wt(x,p),vi()):(vi(),wt(x,p)),di(()=>{x._isLeaving&&(Xt(x,f),wt(x,h),fi(_)||pi(x,r,E,ie))}),Qt(_,[x,ie])},onEnterCancelled(x){I(x,!1,void 0,!0),Qt(v,[x])},onAppearCancelled(x){I(x,!0,void 0,!0),Qt(Q,[x])},onLeaveCancelled(x){T(x),Qt(M,[x])}})}function Af(e){if(e==null)return null;if(Ce(e))return[Po(e.enter),Po(e.leave)];{const t=Po(e);return[t,t]}}function Po(e){return Tc(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[or]||(e[or]=new Set)).add(t)}function Xt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[or];n&&(n.delete(t),n.size||(e[or]=void 0))}function di(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Rf=0;function pi(e,t,n,r){const o=e._endId=++Rf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Of(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,p),s()},p=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,p)}function Of(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||"").split(", "),o=r(`${$t}Delay`),s=r(`${$t}Duration`),i=hi(o,s),l=r(`${$n}Delay`),a=r(`${$n}Duration`),c=hi(l,a);let u=null,f=0,p=0;t===$t?i>0&&(u=$t,f=i,p=s.length):t===$n?c>0&&(u=$n,f=c,p=a.length):(f=Math.max(i,c),u=f>0?i>c?$t:$n:null,p=u?u===$t?s.length:a.length:0);const h=u===$t&&/\b(transform|all)(,|$)/.test(r(`${$t}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:h}}function hi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>gi(n)+gi(e[r])))}function gi(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function vi(){return document.body.offsetHeight}function Df(e,t,n){const r=e[or];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qr=Symbol("_vod"),Ca=Symbol("_vsh"),zr={beforeMount(e,{value:t},{transition:n}){e[qr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Nn(e,!0),r.enter(e)):r.leave(e,()=>{Nn(e,!1)}):Nn(e,t))},beforeUnmount(e,{value:t}){Nn(e,t)}};function Nn(e,t){e.style.display=t?e[qr]:"none",e[Ca]=!t}const If=Symbol(""),Mf=/(^|;)\s*display\s*:/;function $f(e,t,n){const r=e.style,o=Oe(n);let s=!1;if(n&&!o){if(t)if(Oe(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&$r(r,l,"")}else for(const i in t)n[i]==null&&$r(r,i,"");for(const i in n)i==="display"&&(s=!0),$r(r,i,n[i])}else if(o){if(t!==n){const i=r[If];i&&(n+=";"+i),r.cssText=n,s=Mf.test(n)}}else t&&e.removeAttribute("style");qr in e&&(e[qr]=s?r.display:"",e[Ca]&&(r.display="none"))}const mi=/\s*!important$/;function $r(e,t,n){if(te(n))n.forEach(r=>$r(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Nf(e,t);mi.test(n)?e.setProperty(Kt(r),n.replace(mi,""),"important"):e[r]=n}}const _i=["Webkit","Moz","ms"],Co={};function Nf(e,t){const n=Co[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return Co[t]=r;r=ur(r);for(let o=0;o<_i.length;o++){const s=_i[o]+r;if(s in e)return Co[t]=s}return t}const bi="http://www.w3.org/1999/xlink";function yi(e,t,n,r,o,s=Dc(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(bi,t.slice(6,t.length)):e.setAttributeNS(bi,t,n):n==null||s&&!gl(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Ot(n)?String(n):n)}function Si(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Ea(n):n);return}const s=e.tagName;if(t==="value"&&s!=="PROGRESS"&&!s.includes("-")){const l=s==="OPTION"?e.getAttribute("value")||"":e.value,a=n==null?e.type==="checkbox"?"on":"":String(n);(l!==a||!("_value"in e))&&(e.value=a),n==null&&e.removeAttribute(t),e._value=n;return}let i=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=gl(n):n==null&&l==="string"?(n="",i=!0):l==="number"&&(n=0,i=!0)}try{e[t]=n}catch{}i&&e.removeAttribute(o||t)}function Hf(e,t,n,r){e.addEventListener(t,n,r)}function Vf(e,t,n,r){e.removeEventListener(t,n,r)}const wi=Symbol("_vei");function jf(e,t,n,r,o=null){const s=e[wi]||(e[wi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Ff(t);if(r){const c=s[t]=Uf(r,o);Hf(e,l,c,a)}else i&&(Vf(e,l,i,a),s[t]=void 0)}}const Ei=/(?:Once|Passive|Capture)$/;function Ff(e){let t;if(Ei.test(e)){t={};let r;for(;r=e.match(Ei);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):Kt(e.slice(2)),t]}let xo=0;const Bf=Promise.resolve(),Wf=()=>xo||(Bf.then(()=>xo=0),xo=Date.now());function Uf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;pt(Gf(r,n.value),t,5,[r])};return n.value=e,n.attached=Wf(),n}function Gf(e,t){if(te(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Pi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Kf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?Df(e,r,i):t==="style"?$f(e,n,r):cr(t)?Xo(t)||jf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):qf(e,t,r,i))?(Si(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&yi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?Si(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),yi(e,t,r,i))};function qf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Pi(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Pi(t)&&Oe(n)?!1:t in e}const zf={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Jf=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=Kt(o.key);if(t.some(i=>i===s||zf[i]===s))return e(o)})},Yf=Me({patchProp:Kf},xf);let To,Ci=!1;function Qf(){return To=Ci?To:Qu(Yf),Ci=!0,To}const Xf=(...e)=>{const t=Qf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ed(r);if(o)return n(o,!0,Zf(o))},t};function Zf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ed(e){return Oe(e)?document.querySelector(e):e}var gr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),td=/.md((\?|#).*)?$/,nd=(e,t="/")=>gr(e)||e.startsWith("/")&&!e.startsWith(t)&&!td.test(e),vr=e=>/^(https?:)?\/\//.test(e),xi=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=`${t.substring(0,t.length-3)}.html`:t.endsWith(".html")||(t=`${t}.html`),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},rd="http://.",od=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return xi(new URL(`${n}/${e}`,rd).pathname)}return xi(e)},sd=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},id=/(#|\?)/,xa=e=>{const[t,...n]=e.split(id);return{pathname:t,hashAndQueries:n.join("")}},ld=["link","meta","script","style","noscript","template"],ad=["title","base"],cd=([e,t,n])=>ad.includes(e)?e:ld.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,ud=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=cd(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},fd=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,Ta=e=>e.endsWith("/")?e.slice(0,-1):e,ka=e=>e.startsWith("/")?e.slice(1):e,vs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const dd="modulepreload",pd=function(e){return"/"+e},Ti={},Hn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=pd(s),s in Ti)return;Ti[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":dd,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,u)=>{a.addEventListener("load",c),a.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},hd=JSON.parse("{}"),gd=Object.fromEntries([["/",{loader:()=>Hn(()=>import("./index.html-CmmWOU6g.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Hn(()=>import("./works.html-AkvQjJeg.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Hn(()=>import("./index.html-B992a44K.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Hn(()=>import("./works.html-CnSsBJaM.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Hn(()=>import("./404.html-BlRV83Ta.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*!
   * vue-router v4.5.0
   * (c) 2024 Eduardo San Martin Morote
   * @license MIT
   */const mn=typeof document<"u";function La(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function vd(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&La(e.default)}const he=Object.assign;function ko(e,t){const n={};for(const r in t){const o=t[r];n[r]=ht(o)?o.map(e):e(o)}return n}const Jn=()=>{},ht=Array.isArray,Aa=/#/g,md=/&/g,_d=/\//g,bd=/=/g,yd=/\?/g,Ra=/\+/g,Sd=/%5B/g,wd=/%5D/g,Oa=/%5E/g,Ed=/%60/g,Da=/%7B/g,Pd=/%7C/g,Ia=/%7D/g,Cd=/%20/g;function ms(e){return encodeURI(""+e).replace(Pd,"|").replace(Sd,"[").replace(wd,"]")}function xd(e){return ms(e).replace(Da,"{").replace(Ia,"}").replace(Oa,"^")}function Ko(e){return ms(e).replace(Ra,"%2B").replace(Cd,"+").replace(Aa,"%23").replace(md,"%26").replace(Ed,"`").replace(Da,"{").replace(Ia,"}").replace(Oa,"^")}function Td(e){return Ko(e).replace(bd,"%3D")}function kd(e){return ms(e).replace(Aa,"%23").replace(yd,"%3F")}function Ld(e){return e==null?"":kd(e).replace(_d,"%2F")}function sr(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const Ad=/\/$/,Rd=e=>e.replace(Ad,"");function Lo(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l<a&&l>=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=Md(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:sr(i)}}function Od(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function ki(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Dd(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&Tn(t.matched[r],n.matched[o])&&Ma(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ma(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Id(e[n],t[n]))return!1;return!0}function Id(e,t){return ht(e)?Li(e,t):ht(t)?Li(t,e):e===t}function Li(e,t){return ht(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function Md(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i<r.length;i++)if(l=r[i],l!==".")if(l==="..")s>1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}const Ct={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var ir;(function(e){e.pop="pop",e.push="push"})(ir||(ir={}));var Yn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Yn||(Yn={}));function $d(e){if(!e)if(mn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Rd(e)}const Nd=/^[^#]+#/;function Hd(e,t){return e.replace(Nd,"#")+t}function Vd(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const so=()=>({left:window.scrollX,top:window.scrollY});function jd(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Vd(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ai(e,t){return(history.state?history.state.position-t:-1)+e}const qo=new Map;function Fd(e,t){qo.set(e,t)}function Bd(e){const t=qo.get(e);return qo.delete(e),t}let Wd=()=>location.protocol+"//"+location.host;function $a(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),ki(a,"")}return ki(n,e)+r+o}function Ud(e,t,n,r){let o=[],s=[],i=null;const l=({state:p})=>{const h=$a(e,location),m=n.value,y=t.value;let E=0;if(p){if(n.value=h,t.value=p,i&&i===m){i=null;return}E=y?p.position-y.position:0}else r(h);o.forEach(w=>{w(n.value,m,{delta:E,type:ir.pop,direction:E?E>0?Yn.forward:Yn.back:Yn.unknown})})};function a(){i=n.value}function c(p){o.push(p);const h=()=>{const m=o.indexOf(p);m>-1&&o.splice(m,1)};return s.push(h),h}function u(){const{history:p}=window;p.state&&p.replaceState(he({},p.state,{scroll:so()}),"")}function f(){for(const p of s)p();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:a,listen:c,destroy:f}}function Ri(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?so():null}}function Gd(e){const{history:t,location:n}=window,r={value:$a(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,c,u){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Wd()+e+a;try{t[u?"replaceState":"pushState"](c,"",p),o.value=c}catch(h){console.error(h),n[u?"replace":"assign"](p)}}function i(a,c){const u=he({},t.state,Ri(o.value.back,a,o.value.forward,!0),c,{position:o.value.position});s(a,u,!0),r.value=a}function l(a,c){const u=he({},o.value,t.state,{forward:a,scroll:so()});s(u.current,u,!0);const f=he({},Ri(r.value,a,null),{position:u.position+1},c);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Kd(e){e=$d(e);const t=Gd(e),n=Ud(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=he({location:"",base:e,go:r,createHref:Hd.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function qd(e){return typeof e=="string"||e&&typeof e=="object"}function Na(e){return typeof e=="string"||typeof e=="symbol"}const Ha=Symbol("");var Oi;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Oi||(Oi={}));function kn(e,t){return he(new Error,{type:e,[Ha]:!0},t)}function Et(e,t){return e instanceof Error&&Ha in e&&(t==null||!!(e.type&t))}const Di="[^/]+?",zd={sensitive:!1,strict:!1,start:!0,end:!0},Jd=/[.+*?^${}()[\]/\\]/g;function Yd(e,t){const n=he({},zd,t),r=[];let o=n.start?"^":"";const s=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let f=0;f<c.length;f++){const p=c[f];let h=40+(n.sensitive?.25:0);if(p.type===0)f||(o+="/"),o+=p.value.replace(Jd,"\\$&"),h+=40;else if(p.type===1){const{value:m,repeatable:y,optional:E,regexp:w}=p;s.push({name:m,repeatable:y,optional:E});const S=w||Di;if(S!==Di){h+=10;try{new RegExp(`(${S})`)}catch(_){throw new Error(`Invalid custom RegExp for param "${m}" (${S}): `+_.message)}}let v=y?`((?:${S})(?:/(?:${S}))*)`:`(${S})`;f||(v=E&&c.length<2?`(?:/${v})`:"/"+v),E&&(v+="?"),o+=v,h+=20,E&&(h+=-8),y&&(h+=-20),S===".*"&&(h+=-50)}u.push(h)}r.push(u)}if(n.strict&&n.end){const c=r.length-1;r[c][r[c].length-1]+=.7000000000000001}n.strict||(o+="/?"),n.end?o+="$":n.strict&&!o.endsWith("/")&&(o+="(?:/|$)");const i=new RegExp(o,n.sensitive?"":"i");function l(c){const u=c.match(i),f={};if(!u)return null;for(let p=1;p<u.length;p++){const h=u[p]||"",m=s[p-1];f[m.name]=h&&m.repeatable?h.split("/"):h}return f}function a(c){let u="",f=!1;for(const p of e){(!f||!u.endsWith("/"))&&(u+="/"),f=!1;for(const h of p)if(h.type===0)u+=h.value;else if(h.type===1){const{value:m,repeatable:y,optional:E}=h,w=m in c?c[m]:"";if(ht(w)&&!y)throw new Error(`Provided param "${m}" is an array but it is not repeatable (* or + modifiers)`);const S=ht(w)?w.join("/"):w;if(!S)if(E)p.length<2&&(u.endsWith("/")?u=u.slice(0,-1):f=!0);else throw new Error(`Missing required param "${m}"`);u+=S}}return u||"/"}return{re:i,score:r,keys:s,parse:l,stringify:a}}function Qd(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===80?-1:1:e.length>t.length?t.length===1&&t[0]===80?1:-1:0}function Va(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const s=Qd(r[n],o[n]);if(s)return s;n++}if(Math.abs(o.length-r.length)===1){if(Ii(r))return 1;if(Ii(o))return-1}return o.length-r.length}function Ii(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const Xd={type:0,value:""},Zd=/[a-zA-Z0-9_]/;function ep(e){if(!e)return[[]];if(e==="/")return[[Xd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${n})/"${c}": ${h}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,c="",u="";function f(){c&&(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=a}for(;l<e.length;){if(a=e[l++],a==="\\"&&n!==2){r=n,n=4;continue}switch(n){case 0:a==="/"?(c&&f(),i()):a===":"?(f(),n=1):p();break;case 4:p(),n=r;break;case 1:a==="("?n=2:Zd.test(a)?p():(f(),n=0,a!=="*"&&a!=="?"&&a!=="+"&&l--);break;case 2:a===")"?u[u.length-1]=="\\"?u=u.slice(0,-1)+a:n=3:u+=a;break;case 3:f(),n=0,a!=="*"&&a!=="?"&&a!=="+"&&l--,u="";break;default:t("Unknown state");break}}return n===2&&t(`Unfinished custom RegExp for param "${c}"`),f(),i(),o}function tp(e,t,n){const r=Yd(ep(e.path),n),o=he(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function np(e,t){const n=[],r=new Map;t=Hi({strict:!1,end:!0,sensitive:!1},t);function o(f){return r.get(f)}function s(f,p,h){const m=!h,y=$i(f);y.aliasOf=h&&h.record;const E=Hi(t,f),w=[y];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const M of _)w.push($i(he({},y,{components:h?h.record.components:y.components,path:M,aliasOf:h?h.record:y})))}let S,v;for(const _ of w){const{path:M}=_;if(p&&M[0]!=="/"){const G=p.record.path,D=G[G.length-1]==="/"?"":"/";_.path=p.record.path+(M&&D+M)}if(S=tp(_,p,E),h?h.alias.push(S):(v=v||S,v!==S&&v.alias.push(S),m&&f.name&&!Ni(S)&&i(f.name)),ja(S)&&a(S),y.children){const G=y.children;for(let D=0;D<G.length;D++)s(G[D],S,h&&h.children[D])}h=h||S}return v?()=>{i(v)}:Jn}function i(f){if(Na(f)){const p=r.get(f);p&&(r.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&r.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const p=sp(f,n);n.splice(p,0,f),f.record.name&&!Ni(f)&&r.set(f.record.name,f)}function c(f,p){let h,m={},y,E;if("name"in f&&f.name){if(h=r.get(f.name),!h)throw kn(1,{location:f});E=h.record.name,m=he(Mi(p.params,h.keys.filter(v=>!v.optional).concat(h.parent?h.parent.keys.filter(v=>v.optional):[]).map(v=>v.name)),f.params&&Mi(f.params,h.keys.map(v=>v.name))),y=h.stringify(m)}else if(f.path!=null)y=f.path,h=n.find(v=>v.re.test(y)),h&&(m=h.parse(y),E=h.record.name);else{if(h=p.name?r.get(p.name):n.find(v=>v.re.test(p.path)),!h)throw kn(1,{location:f,currentLocation:p});E=h.record.name,m=he({},p.params,f.params),y=h.stringify(m)}const w=[];let S=h;for(;S;)w.unshift(S.record),S=S.parent;return{name:E,path:y,params:m,matched:w,meta:op(w)}}e.forEach(f=>s(f));function u(){n.length=0,r.clear()}return{addRoute:s,resolve:c,removeRoute:i,clearRoutes:u,getRoutes:l,getRecordMatcher:o}}function Mi(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function $i(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:rp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function rp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Ni(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function op(e){return e.reduce((t,n)=>he(t,n.meta),{})}function Hi(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function sp(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;Va(e,t[s])<0?r=s:n=s+1}const o=ip(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function ip(e){let t=e;for(;t=t.parent;)if(ja(t)&&Va(e,t)===0)return t}function ja({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function lp(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;o<r.length;++o){const s=r[o].replace(Ra," "),i=s.indexOf("="),l=sr(i<0?s:s.slice(0,i)),a=i<0?null:sr(s.slice(i+1));if(l in t){let c=t[l];ht(c)||(c=t[l]=[c]),c.push(a)}else t[l]=a}return t}function Vi(e){let t="";for(let n in e){const r=e[n];if(n=Td(n),r==null){r!==void 0&&(t+=(t.length?"&":"")+n);continue}(ht(r)?r.map(s=>s&&Ko(s)):[r&&Ko(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function ap(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ht(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const cp=Symbol(""),ji=Symbol(""),io=Symbol(""),_s=Symbol(""),zo=Symbol("");function Vn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function jt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const c=p=>{p===!1?a(kn(4,{from:n,to:t})):p instanceof Error?a(p):qd(p)?a(kn(2,{from:t,to:p})):(i&&r.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),l())},u=s(()=>e.call(r&&r.instances[o],t,n,c));let f=Promise.resolve(u);e.length<3&&(f=f.then(c)),f.catch(p=>a(p))})}function Ao(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(La(a)){const u=(a.__vccOpts||a)[t];u&&s.push(jt(u,n,r,i,l,o))}else{let c=a();s.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=vd(u)?u.default:u;i.mods[l]=u,i.components[l]=f;const h=(f.__vccOpts||f)[t];return h&&jt(h,n,r,i,l,o)()}))}}return s}function Fi(e){const t=qe(io),n=qe(_s),r=R(()=>{const a=Lt(e.to);return t.resolve(a)}),o=R(()=>{const{matched:a}=r.value,{length:c}=a,u=a[c-1],f=n.matched;if(!u||!f.length)return-1;const p=f.findIndex(Tn.bind(null,u));if(p>-1)return p;const h=Bi(a[c-2]);return c>1&&Bi(u)===h&&f[f.length-1].path!==h?f.findIndex(Tn.bind(null,a[c-2])):p}),s=R(()=>o.value>-1&&hp(n.params,r.value.params)),i=R(()=>o.value>-1&&o.value===n.matched.length-1&&Ma(n.params,r.value.params));function l(a={}){if(pp(a)){const c=t[Lt(e.replace)?"replace":"push"](Lt(e.to)).catch(Jn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:r,href:R(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}function up(e){return e.length===1?e[0]:e}const fp=ae({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Fi,setup(e,{slots:t}){const n=an(Fi(e)),{options:r}=qe(io),o=R(()=>({[Wi(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Wi(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&up(t.default(n));return e.custom?s:q("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),dp=fp;function pp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function hp(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ht(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Bi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Wi=(e,t,n)=>e??t??n,gp=ae({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=qe(zo),o=R(()=>e.route||r.value),s=qe(ji,0),i=R(()=>{let c=Lt(s);const{matched:u}=o.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),l=R(()=>o.value.matched[i.value]);Wt(ji,R(()=>i.value+1)),Wt(cp,l),Wt(zo,o);const a=Ve();return je(()=>[a.value,l.value,e.name],([c,u,f],[p,h,m])=>{u&&(u.instances[f]=c,h&&h!==u&&c&&c===p&&(u.leaveGuards.size||(u.leaveGuards=h.leaveGuards),u.updateGuards.size||(u.updateGuards=h.updateGuards))),c&&u&&(!h||!Tn(u,h)||!p)&&(u.enterCallbacks[f]||[]).forEach(y=>y(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,f=l.value,p=f&&f.components[u];if(!p)return Ui(n.default,{Component:p,route:c});const h=f.props[u],m=h?h===!0?c.params:typeof h=="function"?h(c):h:null,E=q(p,he({},m,t,{onVnodeUnmounted:w=>{w.component.isUnmounted&&(f.instances[u]=null)},ref:a}));return Ui(n.default,{Component:E,route:c})||E}}});function Ui(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const vp=gp;function mp(e){const t=np(e.routes,e),n=e.parseQuery||lp,r=e.stringifyQuery||Vi,o=e.history,s=Vn(),i=Vn(),l=Vn(),a=ye(Ct);let c=Ct;mn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=ko.bind(null,C=>""+C),f=ko.bind(null,Ld),p=ko.bind(null,sr);function h(C,U){let B,Y;return Na(C)?(B=t.getRecordMatcher(C),Y=U):Y=C,t.addRoute(Y,B)}function m(C){const U=t.getRecordMatcher(C);U&&t.removeRoute(U)}function y(){return t.getRoutes().map(C=>C.record)}function E(C){return!!t.getRecordMatcher(C)}function w(C,U){if(U=he({},U||a.value),typeof C=="string"){const g=Lo(n,C,U.path),b=t.resolve({path:g.path},U),k=o.createHref(g.fullPath);return he(g,b,{params:p(b.params),hash:sr(g.hash),redirectedFrom:void 0,href:k})}let B;if(C.path!=null)B=he({},C,{path:Lo(n,C.path,U.path).path});else{const g=he({},C.params);for(const b in g)g[b]==null&&delete g[b];B=he({},C,{params:f(g)}),U.params=f(U.params)}const Y=t.resolve(B,U),pe=C.hash||"";Y.params=u(p(Y.params));const Te=Od(r,he({},C,{hash:xd(pe),path:Y.path})),d=o.createHref(Te);return he({fullPath:Te,hash:pe,query:r===Vi?ap(C.query):C.query||{}},Y,{redirectedFrom:void 0,href:d})}function S(C){return typeof C=="string"?Lo(n,C,a.value.path):he({},C)}function v(C,U){if(c!==C)return kn(8,{from:U,to:C})}function _(C){return D(C)}function M(C){return _(he(S(C),{replace:!0}))}function G(C){const U=C.matched[C.matched.length-1];if(U&&U.redirect){const{redirect:B}=U;let Y=typeof B=="function"?B(C):B;return typeof Y=="string"&&(Y=Y.includes("?")||Y.includes("#")?Y=S(Y):{path:Y},Y.params={}),he({query:C.query,hash:C.hash,params:Y.path!=null?{}:C.params},Y)}}function D(C,U){const B=c=w(C),Y=a.value,pe=C.state,Te=C.force,d=C.replace===!0,g=G(B);if(g)return D(he(S(g),{state:typeof g=="object"?he({},pe,g.state):pe,force:Te,replace:d}),U||B);const b=B;b.redirectedFrom=U;let k;return!Te&&Dd(r,Y,B)&&(k=kn(16,{to:b,from:Y}),vt(Y,Y,!0,!1)),(k?Promise.resolve(k):T(b,Y)).catch(P=>Et(P)?Et(P,2)?P:Mt(P):z(P,b,Y)).then(P=>{if(P){if(Et(P,2))return D(he({replace:d},S(P.to),{state:typeof P.to=="object"?he({},pe,P.to.state):pe,force:Te}),U||b)}else P=x(b,Y,!0,d,pe);return L(b,Y,P),P})}function Q(C,U){const B=v(C,U);return B?Promise.reject(B):Promise.resolve()}function I(C){const U=pn.values().next().value;return U&&typeof U.runWithContext=="function"?U.runWithContext(C):C()}function T(C,U){let B;const[Y,pe,Te]=_p(C,U);B=Ao(Y.reverse(),"beforeRouteLeave",C,U);for(const g of Y)g.leaveGuards.forEach(b=>{B.push(jt(b,C,U))});const d=Q.bind(null,C,U);return B.push(d),st(B).then(()=>{B=[];for(const g of s.list())B.push(jt(g,C,U));return B.push(d),st(B)}).then(()=>{B=Ao(pe,"beforeRouteUpdate",C,U);for(const g of pe)g.updateGuards.forEach(b=>{B.push(jt(b,C,U))});return B.push(d),st(B)}).then(()=>{B=[];for(const g of Te)if(g.beforeEnter)if(ht(g.beforeEnter))for(const b of g.beforeEnter)B.push(jt(b,C,U));else B.push(jt(g.beforeEnter,C,U));return B.push(d),st(B)}).then(()=>(C.matched.forEach(g=>g.enterCallbacks={}),B=Ao(Te,"beforeRouteEnter",C,U,I),B.push(d),st(B))).then(()=>{B=[];for(const g of i.list())B.push(jt(g,C,U));return B.push(d),st(B)}).catch(g=>Et(g,8)?g:Promise.reject(g))}function L(C,U,B){l.list().forEach(Y=>I(()=>Y(C,U,B)))}function x(C,U,B,Y,pe){const Te=v(C,U);if(Te)return Te;const d=U===Ct,g=mn?history.state:{};B&&(Y||d?o.replace(C.fullPath,he({scroll:d&&g&&g.scroll},pe)):o.push(C.fullPath,pe)),a.value=C,vt(C,U,B,d),Mt()}let F;function ie(){F||(F=o.listen((C,U,B)=>{if(!br.listening)return;const Y=w(C),pe=G(Y);if(pe){D(he(pe,{replace:!0,force:!0}),Y).catch(Jn);return}c=Y;const Te=a.value;mn&&Fd(Ai(Te.fullPath,B.delta),so()),T(Y,Te).catch(d=>Et(d,12)?d:Et(d,2)?(D(he(S(d.to),{force:!0}),Y).then(g=>{Et(g,20)&&!B.delta&&B.type===ir.pop&&o.go(-1,!1)}).catch(Jn),Promise.reject()):(B.delta&&o.go(-B.delta,!1),z(d,Y,Te))).then(d=>{d=d||x(Y,Te,!1),d&&(B.delta&&!Et(d,8)?o.go(-B.delta,!1):B.type===ir.pop&&Et(d,20)&&o.go(-1,!1)),L(Y,Te,d)}).catch(Jn)}))}let me=Vn(),J=Vn(),ne;function z(C,U,B){Mt(C);const Y=J.list();return Y.length?Y.forEach(pe=>pe(C,U,B)):console.error(C),Promise.reject(C)}function Ae(){return ne&&a.value!==Ct?Promise.resolve():new Promise((C,U)=>{me.add([C,U])})}function Mt(C){return ne||(ne=!C,ie(),me.list().forEach(([U,B])=>C?B(C):U()),me.reset()),C}function vt(C,U,B,Y){const{scrollBehavior:pe}=e;if(!mn||!pe)return Promise.resolve();const Te=!B&&Bd(Ai(C.fullPath,0))||(Y||!B)&&history.state&&history.state.scroll||null;return fn().then(()=>pe(C,U,Te)).then(d=>d&&jd(d)).catch(d=>z(d,C,U))}const Qe=C=>o.go(C);let dn;const pn=new Set,br={currentRoute:a,listening:!0,addRoute:h,removeRoute:m,clearRoutes:t.clearRoutes,hasRoute:E,getRoutes:y,resolve:w,options:e,push:_,replace:M,go:Qe,back:()=>Qe(-1),forward:()=>Qe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:J.add,isReady:Ae,install(C){const U=this;C.component("RouterLink",dp),C.component("RouterView",vp),C.config.globalProperties.$router=U,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>Lt(a)}),mn&&!dn&&a.value===Ct&&(dn=!0,_(o.location).catch(pe=>{}));const B={};for(const pe in Ct)Object.defineProperty(B,pe,{get:()=>a.value[pe],enumerable:!0});C.provide(io,U),C.provide(_s,Dl(B)),C.provide(zo,a);const Y=C.unmount;pn.add(C),C.unmount=function(){pn.delete(C),pn.size<1&&(c=Ct,F&&F(),F=null,a.value=Ct,dn=!1,ne=!1),Y()}}};function st(C){return C.reduce((U,B)=>U.then(()=>I(B)),Promise.resolve())}return br}function _p(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;i<s;i++){const l=t.matched[i];l&&(e.matched.find(c=>Tn(c,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>Tn(c,a))||o.push(a))}return[n,r,o]}function mr(){return qe(io)}function On(e){return qe(_s)}var bs=Symbol(""),gt=()=>{const e=qe(bs);if(!e)throw new Error("useClientData() is called without provider.");return e},bp=()=>gt().pageComponent,ys=()=>gt().pageData,_r=()=>gt().pageFrontmatter,yp=()=>gt().pageHead,Ss=()=>gt().pageLang,Sp=()=>gt().pageLayout,wp=()=>gt().routeLocale,Fa=()=>gt().routePath,Ep=()=>gt().routes,Pp=()=>gt().siteData,Nr=ye([]),lo=e=>{Nr.value.push(e),no(()=>{Nr.value=Nr.value.filter(t=>t!==e)})},Cp=Symbol(""),Jo=ye(hd),En=ye(gd),Ba=(e,t)=>{const n=od(e,t);if(En.value[n])return n;const r=encodeURI(n);if(En.value[r])return r;const o=Jo.value[n]||Jo.value[r];return o||n},lr=(e,t)=>{const{pathname:n,hashAndQueries:r}=xa(e),o=Ba(n,t),s=o+r;return En.value[o]?{...En.value[o],path:s,notFound:!1}:{...En.value["/404.html"],path:s,notFound:!0}},xp=(e,t)=>{const{pathname:n,hashAndQueries:r}=xa(e);return Ba(n,t)+r},Tp=e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget){const t=e.currentTarget.getAttribute("target");if(t!=null&&t.match(/\b_blank\b/i))return}return e.preventDefault(),!0}},ao=ae({name:"RouteLink",props:{to:{type:String,required:!0},active:Boolean,activeClass:{type:String,default:"route-link-active"}},slots:Object,setup(e,{slots:t}){const n=mr(),r=On(),o=R(()=>e.to.startsWith("#")||e.to.startsWith("?")?e.to:`/${xp(e.to,r.path).substring(1)}`);return()=>q("a",{class:["route-link",{[e.activeClass]:e.active}],href:o.value,onClick:(s={})=>{Tp(s)&&n.push(e.to).catch()}},t.default())}}),kp=ae({name:"AutoLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=Hl(e,"config"),r=On(),o=Pp(),s=R(()=>gr(n.value.link)),i=R(()=>n.value.target||(s.value?"_blank":void 0)),l=R(()=>i.value==="_blank"),a=R(()=>!s.value&&!l.value),c=R(()=>n.value.rel||(l.value?"noopener noreferrer":null)),u=R(()=>n.value.ariaLabel??n.value.text),f=R(()=>{if(n.value.exact)return!1;const h=Object.keys(o.value.locales);return h.length?h.every(m=>m!==n.value.link):n.value.link!=="/"}),p=R(()=>a.value?n.value.activeMatch?(n.value.activeMatch instanceof RegExp?n.value.activeMatch:new RegExp(n.value.activeMatch,"u")).test(r.path):f.value?r.path.startsWith(n.value.link):r.path===n.value.link:!1);return()=>{const{before:h,after:m,default:y}=t,E=(y==null?void 0:y(n.value))??[h==null?void 0:h(n.value),n.value.text,m==null?void 0:m(n.value)];return a.value?q(ao,{class:"auto-link",to:n.value.link,active:p.value,"aria-label":u.value},()=>E):q("a",{class:"auto-link external-link",href:n.value.link,"aria-label":u.value,rel:c.value,target:i.value},E)}}}),ws=ae({name:"ClientOnly",setup(e,t){const n=Ve(!1);return Ze(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),xr=e=>{Nr.value.forEach(t=>t(e))},Es=ae({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=bp(),n=R(()=>{if(!e.path)return t.value;const o=lr(e.path);return wu(async()=>o.loader().then(({comp:s})=>s))}),r=_r();return je(r,()=>{xr("updated")},{deep:!0,flush:"post"}),()=>q(n.value,{onVnodeMounted:()=>{xr("mounted")},onVnodeUpdated:()=>{xr("updated")},onVnodeBeforeUnmount:()=>{xr("beforeUnmount")}})}}),Lp="Layout",Ap="en-US",Zt=an({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageHead:(e,t,n)=>{const r=dt(t.description)?t.description:n.description,o=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return ud(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||Ap,resolvePageLayout:(e,t)=>{const n=dt(e.frontmatter.layout)?e.frontmatter.layout:Lp;if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>sd(e,decodeURI(t)),resolveSiteLocaleData:({base:e,locales:t,...n},r)=>{var o;return{...n,...t[r],head:[...((o=t[r])==null?void 0:o.head)??[],...n.head]}}}),It=(e={})=>e,Ps=e=>vr(e)?e:`/${ka(e)}`,Rp=Object.defineProperty,Op=(e,t)=>{for(var n in t)Rp(e,n,{get:t[n],enumerable:!0})},Dp={};Op(Dp,{COMPONENT_STATE_TYPE:()=>Ip,INSPECTOR_ID:()=>Mp,INSPECTOR_LABEL:()=>$p,INSPECTOR_NODES:()=>Np,INSPECTOR_STATE_SECTION_NAME:()=>Hp,PLUGIN_ID:()=>Wa,PLUGIN_LABEL:()=>Cs});var Wa="org.vuejs.vuepress",Cs="VuePress",Ip=Cs,Mp=Wa,$p=Cs,Gi={id:"INTERNAL",label:"Internal",keys:["layouts","routes","redirects"]},Ki={id:"SITE",label:"Site",keys:["siteData","siteLocaleData"]},qi={id:"ROUTE",label:"Route",keys:["routePath","routeLocale"]},zi={id:"PAGE",label:"Page",keys:["pageData","pageFrontmatter","pageLang","pageHead","pageHeadTitle","pageLayout","pageComponent"]},Np={[Gi.id]:Gi,[Ki.id]:Ki,[qi.id]:qi,[zi.id]:zi},Hp="State";function xs(e){return ts()?(_l(e),!0):!1}const Pn=new WeakMap,Ua=(...e)=>{var t;const n=e[0],r=(t=Jt())==null?void 0:t.proxy;if(r==null&&!ta())throw new Error("injectLocal must be called in setup");return r&&Pn.has(r)&&n in Pn.get(r)?Pn.get(r)[n]:qe(...e)},Vp=(e,t)=>{var n;const r=(n=Jt())==null?void 0:n.proxy;if(r==null)throw new Error("provideLocal must be called in setup");Pn.has(r)||Pn.set(r,Object.create(null));const o=Pn.get(r);o[e]=t,Wt(e,t)},Ts=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jp=Object.prototype.toString,Fp=e=>jp.call(e)==="[object Object]",un=()=>{};function Bp(...e){if(e.length!==1)return Hl(...e);const t=e[0];return typeof t=="function"?Rn($l(()=>({get:t,set:un}))):Ve(t)}function ks(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const Ga=e=>e();function Wp(e,t={}){let n,r,o=un;const s=a=>{clearTimeout(a),o(),o=un};let i;return a=>{const c=Pe(e),u=Pe(t.maxWait);return n&&s(n),c<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise((f,p)=>{o=t.rejectOnCancel?p:f,i=a,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,f(i())},u)),n=setTimeout(()=>{r&&s(r),r=null,f(a())},c)})}}function Up(...e){let t=0,n,r=!0,o=un,s,i,l,a,c;!Ie(e[0])&&typeof e[0]=="object"?{delay:i,trailing:l=!0,leading:a=!0,rejectOnCancel:c=!1}=e[0]:[i,l=!0,a=!0,c=!1]=e;const u=()=>{n&&(clearTimeout(n),n=void 0,o(),o=un)};return p=>{const h=Pe(i),m=Date.now()-t,y=()=>s=p();return u(),h<=0?(t=Date.now(),y()):(m>h&&(a||!r)?(t=Date.now(),y()):l&&(s=new Promise((E,w)=>{o=c?w:E,n=setTimeout(()=>{t=Date.now(),r=!0,E(y()),u()},Math.max(0,h-m))})),!a&&!n&&(n=setTimeout(()=>r=!0,h)),r=!1,s)}}function Gp(e=Ga,t={}){const{initialState:n="active"}=t,r=Bp(n==="active");function o(){r.value=!1}function s(){r.value=!0}const i=(...l)=>{r.value&&e(...l)};return{isActive:Rn(r),pause:o,resume:s,eventFilter:i}}function Kp(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const r=t;t=void 0,r&&await r},n}function Ji(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Hr(e){return Array.isArray(e)?e:[e]}function qp(e){return Jt()}function Ka(e,t=200,n={}){return ks(Wp(t,n),e)}function zp(e,t=200,n=!1,r=!0,o=!1){return ks(Up(t,n,r,o),e)}function Jp(e,t,n={}){const{eventFilter:r=Ga,...o}=n;return je(e,ks(r,t),o)}function Yp(e,t,n={}){const{eventFilter:r,initialState:o="active",...s}=n,{eventFilter:i,pause:l,resume:a,isActive:c}=Gp(r,{initialState:o});return{stop:Jp(e,t,{...s,eventFilter:i}),pause:l,resume:a,isActive:c}}function co(e,t=!0,n){qp()?Ze(e,n):t?e():fn(e)}function Qp(e,t,n={}){const{immediate:r=!0,immediateCallback:o=!1}=n,s=ye(!1);let i=null;function l(){i&&(clearTimeout(i),i=null)}function a(){s.value=!1,l()}function c(...u){o&&e(),l(),s.value=!0,i=setTimeout(()=>{s.value=!1,i=null,e(...u)},Pe(t))}return r&&(s.value=!0,Ts&&c()),xs(a),{isPending:Rn(s),start:c,stop:a}}function Ls(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=Ie(e),s=ye(e);function i(l){if(arguments.length)return s.value=l,s.value;{const a=Pe(n);return s.value=s.value===a?Pe(r):a,s.value}}return o?i:[s,i]}function As(e,t,n){return je(e,t,{...n,immediate:!0})}const Rt=Ts?window:void 0,qa=Ts?window.navigator:void 0;function Ft(e){var t;const n=Pe(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Fe(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},r=(l,a,c,u)=>(l.addEventListener(a,c,u),()=>l.removeEventListener(a,c,u)),o=R(()=>{const l=Hr(Pe(e[0])).filter(a=>a!=null);return l.every(a=>typeof a!="string")?l:void 0}),s=As(()=>{var l,a;return[(a=(l=o.value)==null?void 0:l.map(c=>Ft(c)))!=null?a:[Rt].filter(c=>c!=null),Hr(Pe(o.value?e[1]:e[0])),Hr(Lt(o.value?e[2]:e[1])),Pe(o.value?e[3]:e[2])]},([l,a,c,u])=>{if(n(),!(l!=null&&l.length)||!(a!=null&&a.length)||!(c!=null&&c.length))return;const f=Fp(u)?{...u}:u;t.push(...l.flatMap(p=>a.flatMap(h=>c.map(m=>r(p,h,m,f)))))},{flush:"post"}),i=()=>{s(),n()};return xs(n),i}function Xp(){const e=ye(!1),t=Jt();return t&&Ze(()=>{e.value=!0},t),e}function uo(e){const t=Xp();return R(()=>(t.value,!!e()))}const Zp=Symbol("vueuse-ssr-width");function eh(){const e=ta()?Ua(Zp,null):null;return typeof e=="number"?e:void 0}function Rs(e,t={}){const{window:n=Rt,ssrWidth:r=eh()}=t,o=uo(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),s=ye(typeof r=="number"),i=ye(),l=ye(!1),a=c=>{l.value=c.matches};return nf(()=>{if(s.value){s.value=!o.value;const c=Pe(e).split(",");l.value=c.some(u=>{const f=u.includes("not all"),p=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),h=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let m=!!(p||h);return p&&m&&(m=r>=Ji(p[1])),h&&m&&(m=r<=Ji(h[1])),f?!m:m});return}o.value&&(i.value=n.matchMedia(Pe(e)),l.value=i.value.matches)}),Fe(i,"change",a,{passive:!0}),R(()=>l.value)}function Yi(e,t={}){const{controls:n=!1,navigator:r=qa}=t,o=uo(()=>r&&"permissions"in r),s=ye(),i=typeof e=="string"?{name:e}:e,l=ye(),a=()=>{var u,f;l.value=(f=(u=s.value)==null?void 0:u.state)!=null?f:"prompt"};Fe(s,"change",a,{passive:!0});const c=Kp(async()=>{if(o.value){if(!s.value)try{s.value=await r.permissions.query(i)}catch{s.value=void 0}finally{a()}if(n)return fe(s.value)}});return c(),n?{state:l,isSupported:o,query:c}:l}function th(e={}){const{navigator:t=qa,read:n=!1,source:r,copiedDuring:o=1500,legacy:s=!1}=e,i=uo(()=>t&&"clipboard"in t),l=Yi("clipboard-read"),a=Yi("clipboard-write"),c=R(()=>i.value||s),u=ye(""),f=ye(!1),p=Qp(()=>f.value=!1,o,{immediate:!1});async function h(){let S=!(i.value&&w(l.value));if(!S)try{u.value=await t.clipboard.readText()}catch{S=!0}S&&(u.value=E())}c.value&&n&&Fe(["copy","cut"],h,{passive:!0});async function m(S=Pe(r)){if(c.value&&S!=null){let v=!(i.value&&w(a.value));if(!v)try{await t.clipboard.writeText(S)}catch{v=!0}v&&y(S),u.value=S,f.value=!0,p.start()}}function y(S){const v=document.createElement("textarea");v.value=S??"",v.style.position="absolute",v.style.opacity="0",document.body.appendChild(v),v.select(),document.execCommand("copy"),v.remove()}function E(){var S,v,_;return(_=(v=(S=document==null?void 0:document.getSelection)==null?void 0:S.call(document))==null?void 0:v.toString())!=null?_:""}function w(S){return S==="granted"||S==="prompt"}return{isSupported:c,text:u,copied:f,copy:m}}const Tr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},kr="__vueuse_ssr_handlers__",nh=rh();function rh(){return kr in Tr||(Tr[kr]=Tr[kr]||{}),Tr[kr]}function oh(e,t){return nh[e]||t}function sh(e){return Rs("(prefers-color-scheme: dark)",e)}function ih(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const lh={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Qi="vueuse-storage";function Os(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=Rt,eventFilter:p,onError:h=L=>{console.error(L)},initOnMounted:m}=r,y=(u?ye:Ve)(typeof t=="function"?t():t),E=R(()=>Pe(e));if(!n)try{n=oh("getDefaultStorage",()=>{var L;return(L=Rt)==null?void 0:L.localStorage})()}catch(L){h(L)}if(!n)return y;const w=Pe(t),S=ih(w),v=(o=r.serializer)!=null?o:lh[S],{pause:_,resume:M}=Yp(y,()=>D(y.value),{flush:s,deep:i,eventFilter:p});je(E,()=>I(),{flush:s}),f&&l&&co(()=>{n instanceof Storage?Fe(f,"storage",I,{passive:!0}):Fe(f,Qi,T),m&&I()}),m||I();function G(L,x){if(f){const F={key:E.value,oldValue:L,newValue:x,storageArea:n};f.dispatchEvent(n instanceof Storage?new StorageEvent("storage",F):new CustomEvent(Qi,{detail:F}))}}function D(L){try{const x=n.getItem(E.value);if(L==null)G(x,null),n.removeItem(E.value);else{const F=v.write(L);x!==F&&(n.setItem(E.value,F),G(x,F))}}catch(x){h(x)}}function Q(L){const x=L?L.newValue:n.getItem(E.value);if(x==null)return a&&w!=null&&n.setItem(E.value,v.write(w)),w;if(!L&&c){const F=v.read(x);return typeof c=="function"?c(F,w):S==="object"&&!Array.isArray(F)?{...w,...F}:F}else return typeof x!="string"?x:v.read(x)}function I(L){if(!(L&&L.storageArea!==n)){if(L&&L.key==null){y.value=w;return}if(!(L&&L.key!==E.value)){_();try{(L==null?void 0:L.newValue)!==v.write(y.value)&&(y.value=Q(L))}catch(x){h(x)}finally{L?fn(M):M()}}}}function T(L){I(L.detail)}return y}function ah(e,t,n={}){const{window:r=Rt,...o}=n;let s;const i=uo(()=>r&&"ResizeObserver"in r),l=()=>{s&&(s.disconnect(),s=void 0)},a=R(()=>{const f=Pe(e);return Array.isArray(f)?f.map(p=>Ft(p)):[Ft(f)]}),c=je(a,f=>{if(l(),i.value&&r){s=new ResizeObserver(t);for(const p of f)p&&s.observe(p,o)}},{immediate:!0,flush:"post"}),u=()=>{l(),c()};return xs(u),{isSupported:i,stop:u}}function ch(e,t={width:0,height:0},n={}){const{window:r=Rt,box:o="content-box"}=n,s=R(()=>{var f,p;return(p=(f=Ft(e))==null?void 0:f.namespaceURI)==null?void 0:p.includes("svg")}),i=ye(t.width),l=ye(t.height),{stop:a}=ah(e,([f])=>{const p=o==="border-box"?f.borderBoxSize:o==="content-box"?f.contentBoxSize:f.devicePixelContentBoxSize;if(r&&s.value){const h=Ft(e);if(h){const m=h.getBoundingClientRect();i.value=m.width,l.value=m.height}}else if(p){const h=Hr(p);i.value=h.reduce((m,{inlineSize:y})=>m+y,0),l.value=h.reduce((m,{blockSize:y})=>m+y,0)}else i.value=f.contentRect.width,l.value=f.contentRect.height},n);co(()=>{const f=Ft(e);f&&(i.value="offsetWidth"in f?f.offsetWidth:t.width,l.value="offsetHeight"in f?f.offsetHeight:t.height)});const c=je(()=>Ft(e),f=>{i.value=f?t.width:0,l.value=f?t.height:0});function u(){a(),c()}return{width:i,height:l,stop:u}}const Xi=1;function uh(e,t={}){const{throttle:n=0,idle:r=200,onStop:o=un,onScroll:s=un,offset:i={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:a="auto",window:c=Rt,onError:u=D=>{console.error(D)}}=t,f=ye(0),p=ye(0),h=R({get(){return f.value},set(D){y(D,void 0)}}),m=R({get(){return p.value},set(D){y(void 0,D)}});function y(D,Q){var I,T,L,x;if(!c)return;const F=Pe(e);if(!F)return;(L=F instanceof Document?c.document.body:F)==null||L.scrollTo({top:(I=Pe(Q))!=null?I:m.value,left:(T=Pe(D))!=null?T:h.value,behavior:Pe(a)});const ie=((x=F==null?void 0:F.document)==null?void 0:x.documentElement)||(F==null?void 0:F.documentElement)||F;h!=null&&(f.value=ie.scrollLeft),m!=null&&(p.value=ie.scrollTop)}const E=ye(!1),w=an({left:!0,right:!1,top:!0,bottom:!1}),S=an({left:!1,right:!1,top:!1,bottom:!1}),v=D=>{E.value&&(E.value=!1,S.left=!1,S.right=!1,S.top=!1,S.bottom=!1,o(D))},_=Ka(v,n+r),M=D=>{var Q;if(!c)return;const I=((Q=D==null?void 0:D.document)==null?void 0:Q.documentElement)||(D==null?void 0:D.documentElement)||Ft(D),{display:T,flexDirection:L,direction:x}=getComputedStyle(I),F=x==="rtl"?-1:1,ie=I.scrollLeft;S.left=ie<f.value,S.right=ie>f.value;const me=Math.abs(ie*F)<=(i.left||0),J=Math.abs(ie*F)+I.clientWidth>=I.scrollWidth-(i.right||0)-Xi;T==="flex"&&L==="row-reverse"?(w.left=J,w.right=me):(w.left=me,w.right=J),f.value=ie;let ne=I.scrollTop;D===c.document&&!ne&&(ne=c.document.body.scrollTop),S.top=ne<p.value,S.bottom=ne>p.value;const z=Math.abs(ne)<=(i.top||0),Ae=Math.abs(ne)+I.clientHeight>=I.scrollHeight-(i.bottom||0)-Xi;T==="flex"&&L==="column-reverse"?(w.top=Ae,w.bottom=z):(w.top=z,w.bottom=Ae),p.value=ne},G=D=>{var Q;if(!c)return;const I=(Q=D.target.documentElement)!=null?Q:D.target;M(I),E.value=!0,_(D),s(D)};return Fe(e,"scroll",n?zp(G,n,!0,!1):G,l),co(()=>{try{const D=Pe(e);if(!D)return;M(D)}catch(D){u(D)}}),Fe(e,"scrollend",v,l),{x:h,y:m,isScrolling:E,arrivedState:w,directions:S,measure(){const D=Pe(e);c&&D&&M(D)}}}function fh(e={}){const{window:t=Rt,...n}=e;return uh(t,n)}function dh(e={}){const{window:t=Rt,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:o=!0,includeScrollbar:s=!0,type:i="inner"}=e,l=ye(n),a=ye(r),c=()=>{if(t)if(i==="outer")l.value=t.outerWidth,a.value=t.outerHeight;else if(i==="visual"&&t.visualViewport){const{width:f,height:p,scale:h}=t.visualViewport;l.value=Math.round(f*h),a.value=Math.round(p*h)}else s?(l.value=t.innerWidth,a.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,a.value=t.document.documentElement.clientHeight)};c(),co(c);const u={passive:!0};if(Fe("resize",c,u),t&&i==="visual"&&t.visualViewport&&Fe(t.visualViewport,"resize",c,u),o){const f=Rs("(orientation: portrait)");je(f,()=>c())}return{width:l,height:a}}const Zi=async(e,t)=>{const{path:n,query:r}=e.currentRoute.value,{scrollBehavior:o}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:r,hash:t}),e.options.scrollBehavior=o},ph=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=mr();Fe("scroll",Ka(()=>{var m,y;const i=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(i-0)<r){Zi(o,"");return}const a=window.innerHeight+i,c=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),u=Math.abs(c-a)<r,f=Array.from(document.querySelectorAll(e)),h=Array.from(document.querySelectorAll(t)).filter(E=>f.some(w=>w.hash===E.hash));for(let E=0;E<h.length;E++){const w=h[E],S=h[E+1],v=i>=(((m=w.parentElement)==null?void 0:m.offsetTop)??0)-r,_=!S||i<(((y=S.parentElement)==null?void 0:y.offsetTop)??0)-r;if(!(v&&_))continue;const G=decodeURIComponent(o.currentRoute.value.hash),D=decodeURIComponent(w.hash);if(G===D)return;if(u){for(let Q=E+1;Q<h.length;Q++)if(G===decodeURIComponent(h[Q].hash))return}Zi(o,D);return}},n))},hh="a.vp-sidebar-item",gh=".header-anchor",vh=300,mh=5,_h=It({setup(){ph({headerLinkSelector:hh,headerAnchorSelector:gh,delay:vh,offset:mh})}}),bh=Object.freeze(Object.defineProperty({__proto__:null,default:_h},Symbol.toStringTag,{value:"Module"})),za=[...new Array(6)].map((e,t)=>`[vp-content] h${t+1}`).join(","),yh=(e,t=2)=>{if(t===!1)return[];const[n,r]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t,o=e.filter(i=>i.level>=n&&i.level<=r),s=[];e:for(let i=0;i<o.length;i++){const l=o[i];if(i===0)s.push(l);else{for(let a=i-1;a>=0;a--){const c=o[a];if(c.level<l.level){c.children.push(l);continue e}}s.push(l)}}return s},Sh=(e,t=[])=>{let n;if(t.length){const r=e.cloneNode(!0);r.querySelectorAll(t.join(",")).forEach(o=>{o.remove()}),n=r.textContent||""}else n=e.textContent||"";return n.trim()},wh=(e=za,t=[])=>Array.from(document.querySelectorAll(e)).filter(n=>n.id&&n.hasChildNodes()).map(n=>({element:n,title:Sh(n,t),link:`#${n.id}`,slug:n.id,level:Number(n.tagName[1]),children:[]})),Eh=({selector:e=za,levels:t=2,ignore:n=[]}={})=>yh(wh(e,n),t),Ja=(e,t)=>{var r;const n=(r=Jt())==null?void 0:r.appContext.components;return n?e in n||Xe(e)in n||ur(Xe(e))in n:!1},Ph=e=>typeof e<"u",Ya=(e,t)=>dt(e)&&e.startsWith(t),{keys:Qa}=Object,Xa=e=>Ya(e,"/")&&e[1]!=="/",Za=e=>!nd(e)&&!gr(e),Ro="message-container";class Ds{constructor(){Bs(this,"elements");this.elements={}}static get containerElement(){let t=document.getElementById(Ro);return t||(t=document.createElement("div"),t.id=Ro,document.body.appendChild(t),t)}getElement(t){return this.elements[t]}pop(t,n=2e3,r=!0){const o=Date.now(),s=document.createElement("div");return s.className="message-item move-in",s.innerHTML=t,Ds.containerElement.appendChild(s),this.elements[o]=s,r&&s.addEventListener("click",()=>{this.close(o)}),n>0&&setTimeout(()=>{this.close(o)},n),o}close(t){if(t){const n=this.elements[t];n.classList.remove("move-in"),n.classList.add("move-out"),n.addEventListener("animationend",()=>{n.remove(),delete this.elements[t]})}else Qa(this.elements).forEach(n=>{this.close(Number(n))})}destroy(){const t=document.getElementById(Ro);t&&document.body.removeChild(t),this.elements={}}}const Is=e=>{const t=wp();return R(()=>Pe(e)[t.value]??{})},Ch=()=>{const e=Ep();return R(()=>Object.keys(e.value))};var xh={"/":{backToTop:"Вернуться к началу"},"/eng/":{backToTop:"Back to top"}};const Th=ae({name:"BackToTop",setup(){const e=_r(),t=Is(xh),n=ye(),{height:r}=ch(n),{height:o}=dh(),{y:s}=fh(),i=R(()=>(e.value.backToTop??!0)&&s.value>100),l=R(()=>s.value/(r.value-o.value)*100);return Ze(()=>{n.value=document.body}),()=>q(gs,{name:"back-to-top"},()=>i.value?q("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[q("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":l.value},q("svg",q("circle",{cx:"26",cy:"26",r:"24",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-dasharray":`${Math.PI*l.value*.48} ${Math.PI*(100-l.value)*.48}`}))),q("div",{class:"back-to-top-icon"})]):null)}}),kh=It({rootComponents:[Th]}),Lh=Object.freeze(Object.defineProperty({__proto__:null,default:kh},Symbol.toStringTag,{value:"Module"})),Ah='<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#06a35a"><path d="M822.812 824.618c-83.076 81.992-188.546 124.614-316.05 127.865-122.085-3.251-223.943-45.873-305.935-127.865S76.213 640.406 72.962 518.682c3.251-127.503 45.873-232.973 127.865-316.05 81.992-83.075 184.211-126.058 305.936-129.309 127.503 3.251 232.973 46.234 316.049 129.31 83.076 83.076 126.059 188.546 129.31 316.05-2.89 121.723-46.234 223.943-129.31 305.935zM432.717 684.111c3.973 3.974 8.307 5.78 13.364 6.14 5.057.362 9.753-1.444 13.365-5.417l292.57-287.515c3.974-3.973 5.78-8.307 5.78-13.364s-1.806-9.753-5.78-13.365l1.807 1.806c-3.973-3.973-8.669-5.779-14.087-6.14-5.418-.361-10.475 1.445-14.809 5.418L460.529 592.006c-3.973 3.25-8.669 4.695-14.448 4.695-5.78 0-10.836-1.445-15.531-3.973l-94.273-72.962c-4.335-3.251-9.392-4.335-14.448-3.973s-9.392 3.25-12.642 7.585l-2.89 3.973c-3.25 4.334-4.334 9.391-3.973 14.81.722 5.417 2.528 10.113 5.779 14.086L432.717 684.11z"/></svg>',Rh=/language-(shellscript|shell|bash|sh|zsh)/,Oh=({selector:e,ignoreSelector:t,inlineSelector:n,duration:r=2e3,locales:o,showInMobile:s,transform:i})=>{const l=Rs("(max-width: 419px)"),a=R(()=>!l.value||s),c=Is(o),u=E=>{var S;if(E.hasAttribute("copy-code"))return;const w=document.createElement("button");w.type="button",w.classList.add("vp-copy-code-button"),w.setAttribute("aria-label",c.value.copy),w.setAttribute("data-copied",c.value.copied),(S=E.parentElement)==null||S.insertBefore(w,E),E.setAttribute("copy-code","")},f=()=>{document.body.classList.toggle("no-copy-code",!a.value),a.value&&document.querySelectorAll(e).forEach(u)};As(a,f,{flush:"post"}),lo(E=>{E!=="beforeUnmount"&&f()});const{copy:p}=th({legacy:!0}),h=new WeakMap;let m=null;const y=async(E,w,S)=>{const v=w.cloneNode(!0);t&&v.querySelectorAll(t).forEach(G=>{G.remove()}),i&&i(v);let _=v.textContent||"";if(Rh.test(E.className)&&(_=_.replace(/^ *(\$|>) /gm,"")),await p(_),r<=0)return;S.classList.add("copied"),clearTimeout(h.get(S));const M=setTimeout(()=>{S.classList.remove("copied"),S.blur(),h.delete(S)},r);h.set(S,M)};Fe("click",E=>{const w=E.target;if(a.value&&w.matches('div[class*="language-"] > button.vp-copy-code-button')){const S=w.parentElement,v=w.nextElementSibling;if(!S||!v)return;y(S,v,w)}},{passive:!0}),n&&Fe("dblclick",E=>{const w=E.target;if(a.value&&w.matches(n)){const S=window.getSelection();S&&(w.contains(S.anchorNode)||w.contains(S.focusNode))&&S.removeAllRanges(),p(w.textContent||""),(m??(m=new Ds)).pop(`${Ah}<span>${c.value.copied} </span>`,r)}},{passive:!0})};var Dh={"/":{copy:"Скопировать код",copied:"Скопировано"},"/eng/":{copy:"Copy code",copied:"Copied"}};const Ih=It({setup:()=>{Oh({selector:'[vp-content] div[class*="language-"] pre',ignoreSelector:"",inlineSelector:"",locales:Dh,duration:2e3,showInMobile:!1})}}),Mh=Object.freeze(Object.defineProperty({__proto__:null,default:Ih},Symbol.toStringTag,{value:"Module"})),$h=It({setup(){Fe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})},{passive:!0})}}),Nh=Object.freeze(Object.defineProperty({__proto__:null,default:$h},Symbol.toStringTag,{value:"Module"}));var el={provider:null,pattern:{},repo:"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru"};const tl=typeof el>"u"?{}:el,Hh=(e,t)=>!e||vr(e)?e:t==="github"?`https://github.com/${e}`:t==="gitee"?`https://gitee.com/${e}`:e,Vh=/#(\d+)/g,jh=(e=!0)=>{const t=_r(),n=Ss(),r=ys(),{pattern:o={},provider:s}=tl,i=Hh(tl.repo,s);return R(()=>{var a;if(t.value.changelog===!1||!Pe(e))return[];const l=new Intl.DateTimeFormat(n.value,{dateStyle:"short"});return(((a=r.value.git)==null?void 0:a.changelog)??[]).map(c=>{const u={date:l.format(c.time),...c};return o.issue&&i&&(u.message=u.message.replace(Vh,(f,p)=>`<a href="${o.issue.replace(":issue",p).replace(":repo",i)}" target="_blank" rel="noopener noreferrer">${f}</a>`)),o.commit&&i&&(u.commitUrl=o.commit.replace(":hash",u.hash).replace(":repo",i)),o.tag&&i&&u.tag&&(u.tagUrl=o.tag.replace(":tag",u.tag).replace(":repo",i)),u})})},ec=(e=!0)=>{const t=_r(),n=ys();return R(()=>{var r;return t.value.contributors===!1||!Pe(e)?[]:((r=n.value.git)==null?void 0:r.contributors)??[]})};var nl={"/":{contributors:"Участники",changelog:"История изменений",timeOn:"в",viewChangelog:"Показать всю историю изменений",latestUpdateAt:"Последнее обновление:"},"/eng/":{contributors:"Contributors",changelog:"Changelog",timeOn:"on",viewChangelog:"View All Changelog",latestUpdateAt:"Last Updated:"}};const Fh=typeof nl>"u"?{}:nl,Ms=()=>Is(Fh),tc=(e=!0)=>{const t=Ss(),n=Ms(),r=ys();return R(()=>{var l,a,c;if(!Pe(e))return null;const o=((l=r.value.git)==null?void 0:l.updatedTime)??((c=(a=r.value.git)==null?void 0:a.changelog)==null?void 0:c[0].time);if(!o)return null;const s=new Date(o),i=new Intl.DateTimeFormat(t.value,{dateStyle:"short",timeStyle:"short"}).format(o);return{date:s,text:i,iso:s.toISOString(),locale:n.value.latestUpdateAt}})},nc=({level:e=2,text:t,anchor:n})=>q(`h${e||2}`,{id:n,tabindex:"-1"},q("a",{href:`#${n}`,class:"header-anchor"},q("span",t))),Bh=({name:e,url:t,avatar:n})=>q(t?"a":"span",{href:t,target:"_blank",rel:"noreferrer",class:"vp-contributor"},[n?q("img",{src:n,alt:"",class:"vp-contributor-avatar"}):null,q("span",{class:"vp-contributor-name"},e)]),Wh=ae({name:"GitContributors",props:{title:String,headerLevel:{type:Number,default:2}},setup(e){const t=ec(),n=Ms();return()=>t.value.length?[q(nc,{level:e.headerLevel,anchor:"doc-contributors",text:e.title||n.value.contributors}),q("div",{class:"vp-contributors"},t.value.map(r=>q(Bh,r)))]:null}}),Uh=ae({name:"GitChangelog",props:{title:String,headerLevel:{type:Number,default:2}},setup(e){const t=jh(),n=Ms(),r=tc(),[o,s]=Ls(),i=()=>q("div",{class:"vp-changelog-header",onClick:()=>s()},[q("div",{class:"vp-latest-updated"},[q("span",{class:"vp-changelog-icon"}),q("span",{"data-allow-mismatch":""},r.value.text)]),q("div",[q("span",{class:"vp-changelog-menu-icon"}),q("span",n.value.viewChangelog)])]),l=({item:c})=>q("li",{class:"vp-changelog-item-tag"},q("div",[q("a",{class:"vp-changelog-tag"},q("code",c.tag)),q("span",{class:"vp-changelog-date","data-allow-mismatch":""},[n.value.timeOn," ",q("time",{datetime:new Date(c.time).toISOString()},c.date)])])),a=({item:c})=>q("li",{class:"vp-changelog-item-commit"},[q(c.commitUrl?"a":"span",{class:"vp-changelog-hash",href:c.commitUrl,target:"_blank",rel:"noreferrer"},[q("code",c.hash.slice(0,5))]),q("span",{class:"vp-changelog-divider"},"-"),q("span",{class:"vp-changelog-message",innerHTML:c.message}),q("span",{class:"vp-changelog-date","data-allow-mismatch":""},[n.value.timeOn||"on"," ",q("time",{datetime:new Date(c.time).toISOString()},c.date)])]);return()=>t.value.length?[q(nc,{level:e.headerLevel,anchor:"doc-changelog",text:e.title||n.value.changelog}),q("div",{class:["vp-changelog-wrapper",{active:o.value}]},[q(i),q("ul",{class:"vp-changelog-list"},[t.value.map(c=>c.tag?q(l,{item:c,key:c.tag}):q(a,{item:c,key:c.hash}))])])]:null}}),Gh={enhance:({app:e})=>{e.component("GitContributors",Wh),e.component("GitChangelog",Uh)}},Kh=Object.freeze(Object.defineProperty({__proto__:null,default:Gh},Symbol.toStringTag,{value:"Module"}));/**
  * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
  * @license MIT
- */const rl=(e,t)=>{e.classList.add(t)},ol=(e,t)=>{e.classList.remove(t)},qh=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Oo=(e,t,n)=>e<t?t:e>n?n:e,sl=e=>(-1+e)*100,zh=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),Jh=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Lr=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=s=>{const{style:i}=document.body;if(s in i)return s;const l=s.charAt(0).toUpperCase()+s.slice(1);let a=e.length;for(;a--;){const c=`${e[a]}${l}`;if(c in i)return c}return s},r=s=>{const i=Jh(s);return t[i]??(t[i]=n(i))},o=(s,i,l)=>{s.style[r(i)]=l};return(s,i)=>{for(const l in i){const a=i[l];Object.hasOwn(i,l)&&Ph(a)&&o(s,l,a)}}})(),Pt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'<div class="bar" role="bar"></div>'},Re={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Pt,r=Re.isStarted(),o=Oo(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,zh(l=>{Lr(i,{transform:`translate3d(${sl(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Lr(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Lr(s,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Re.remove(),l()},t)},t)):setTimeout(()=>{l()},t)}),Re},isStarted:()=>typeof Re.percent=="number",start:()=>{Re.percent||Re.set(0);const e=()=>{setTimeout(()=>{Re.percent&&(Re.trickle(),e())},Pt.trickleSpeed)};return e(),Re},done:e=>!e&&!Re.percent?Re:Re.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Re;return t?(t=Oo(t+(typeof e=="number"?e:(1-t)*Oo(Math.random()*t,.1,.95)),0,.994),Re.set(t)):Re.start()},trickle:()=>Re.increase(Math.random()*Pt.trickleRate),render:e=>{if(Re.isRendered())return document.getElementById("nprogress");rl(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Pt.template;const n=t.querySelector(Pt.barSelector),r=document.querySelector(Pt.parent),o=e?"-100":sl(Re.percent??0);return Lr(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&rl(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{ol(document.documentElement,"nprogress-busy"),ol(document.querySelector(Pt.parent),"nprogress-custom-parent"),qh(document.getElementById("nprogress"))}},Yh=()=>{Ze(()=>{const e=mr(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Re.start()}),e.afterEach(n=>{t.add(n.path),Re.done()})})},Qh=It({setup(){Yh()}}),Xh=Object.freeze(Object.defineProperty({__proto__:null,default:Qh},Symbol.toStringTag,{value:"Module"})),Zh=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{Fe("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}},{passive:!0})},eg={setup(){Zh()}},tg=Object.freeze(Object.defineProperty({__proto__:null,default:eg},Symbol.toStringTag,{value:"Module"})),ng="VUEPRESS_CODE_TAB_STORE",Ar=Os(ng,{}),rg=ae({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=Ve(e.active),r=ye([]),o=()=>{e.tabId&&(Ar.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),e.tabId&&(Ar.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Ar.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Ar.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?q("div",{class:"vp-code-tabs"},[q("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return q("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return q("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[q("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),og="VUEPRESS_TAB_STORE",Do=Os(og,{}),sg=ae({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=Ve(e.active),r=ye([]),o=()=>{e.tabId&&(Do.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),o()},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Do.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Do.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?q("div",{class:"vp-tabs"},[q("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return q("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return q("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[q("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),ig={enhance:({app:e})=>{e.component("CodeTabs",rg),e.component("Tabs",sg)}},lg=Object.freeze(Object.defineProperty({__proto__:null,default:ig},Symbol.toStringTag,{value:"Module"})),ag=JSON.parse(`{"repo":"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru","locales":{"/":{"selectLanguageName":"Русский","navbar":["/","/works"],"notFound":["Верните страницу!","Мы потеряли страницу...","Вы заблокированы в лабиринте.","Искали кота?","Страница украдена.","Ошиблись в параллельной вселенной."],"backToHome":"Вернуться на главную","worksTable":{"name":"Название","description":"Описание","role":"Роль","technologies":"Технологии","status":"Статус","dates":"Даты"}},"/eng/":{"selectLanguageName":"English","navbar":["/eng/","/eng/works"],"notFound":["Return the page!","We lost a page...","You're blocked in a labyrinth.","Looking for a cat?","The page has been stolen.","Wrong turn in parallel universe."],"backToHome":"Back to home","worksTable":{"name":"Name","description":"Description","role":"Role","technologies":"Technologies","status":"Status","dates":"Dates"}}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),cg=Ve(ag),rc=()=>cg,oc=Symbol(""),ug=()=>{const e=qe(oc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},fg=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},dg=It({enhance({app:e}){const t=rc(),n=e._context.provides[bs],r=R(()=>fg(t.value,n.routeLocale.value));e.provide(oc,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),pg=Object.freeze(Object.defineProperty({__proto__:null,default:dg},Symbol.toStringTag,{value:"Module"})),He=()=>{const{pageData:e,pageFrontmatter:t,pageLang:n,siteData:r,siteLocaleData:o,...s}=gt();return{...s,page:e,frontmatter:t,lang:n,site:r,siteLocale:o,theme:rc(),themeLocale:ug()}},sc=Symbol(""),hg=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{As(e,t)}),no(()=>{t()})},$s=()=>{const e=qe(sc);if(!e)throw new Error("useDarkMode() is called without provider.");return e},gg=()=>{const{themeLocale:e}=He(),t=sh(),n=Os("vuepress-color-scheme",e.value.colorMode),r=R({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(sc,r),hg(r)},ic=Symbol("headers"),vg=()=>{const e=Ua(ic);if(!e)throw new Error("useHeaders() is called without provider.");return e},mg=()=>{const{frontmatter:e,themeLocale:t}=He(),n=Ve([]),r=R(()=>e.value.sidebarDepth??t.value.sidebarDepth??2),o=()=>{if(r.value<=0){n.value=[];return}n.value=Eh({levels:[2,r.value+1],ignore:[".vp-badge"]})};Vp(ic,n),lo(s=>{s==="beforeUnmount"?n.value=[]:o()})};let Io=null,jn=null;const _g={wait:()=>Io,pending:()=>{Io=new Promise(e=>{jn=e})},resolve:()=>{jn==null||jn(),Io=null,jn=null}},lc=()=>_g,Ln=(e,t)=>{const{notFound:n,meta:r,path:o}=lr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},Cn=(e="",t="")=>Xa(t)||gr(t)?t:`${fd(e)}${t}`,bg=e=>({text:e.title,link:e.link,children:Ns(e.children)}),Ns=e=>e?e.map(t=>bg(t)):[],ac=(e,t)=>[{text:e.title,children:Ns(t)}],cc=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Ln(Cn(i,s)):dt(s.link)?{...s,link:Za(s.link)?Ln(Cn(i,s.link)).link:s.link}:s;if("children"in l)return{...l,children:l.children.map(c=>o(c,Cn(i,l.prefix)))};if(l.link===n){const c=((a=t[0])==null?void 0:a.level)===1?t[0].children:t;return{...l,children:Ns(c)}}return l};return e.map(s=>o(s,r))},yg=(e,t,n,r)=>{const o=Qa(e).sort((s,i)=>i.length-s.length);for(const s of o)if(Ya(decodeURI(r),s)){const i=e[s];return i?i==="heading"?ac(t,n):cc(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},uc=Symbol("sidebarItems"),Hs=()=>{const e=qe(uc);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Sg=(e,t,n,r,o)=>e===!1?[]:e==="heading"?ac(t,o):Array.isArray(e)?cc(e,o,n,r):vs(e)?yg(e,t,o,n):[],wg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=He(),o=vg(),s=Fa(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>Sg(i.value,t.value,s.value,n.value,o.value));Wt(uc,l)},Eg=ae({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Se=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function Pg(e,t,n,r,o,s){return V(),Z("span",{class:Ke(["vp-badge",n.type]),style:An({verticalAlign:n.vertical})},[xe(e.$slots,"default",{},()=>[Gt(ue(n.text),1)])],6)}const Cg=Se(Eg,[["render",Pg],["__file","Badge.vue"]]),xg=ae({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Tg(e,t,n,r,o,s){return V(),Le(gs,{name:"vp-fade-slide-y",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:ke(()=>[xe(e.$slots,"default")]),_:3})}const kg=Se(xg,[["render",Tg],["__file","VPFadeSlideYTransition.vue"]]),Lg=ae({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const{frontmatter:n}=He(),r=R(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Ag={key:0,class:"vp-features"};function Rg(e,t,n,r,o,s){return r.features.length?(V(),Z("div",Ag,[(V(!0),Z(be,null,At(r.features,i=>(V(),Z("div",{key:i.title,class:"vp-feature"},[K("h2",null,ue(i.title),1),K("p",null,ue(i.details),1)]))),128))])):De("",!0)}const Og=Se(Lg,[["render",Rg],["__file","VPHomeFeatures.vue"]]),Dg=ae({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=_r(),r=R(()=>n.value.footer),o=R(()=>n.value.footerHtml),s={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Ig=["innerHTML"],Mg=["textContent"];function $g(e,t,n,r,o,s){return r.footer?(V(),Z(be,{key:0},[r.footerHtml?(V(),Z("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,Ig)):(V(),Z("div",{key:1,class:"vp-footer","vp-footer":"",textContent:ue(r.footer)},null,8,Mg))],64)):De("",!0)}const Ng=Se(Dg,[["render",$g],["__file","VPHomeFooter.vue"]]),Hg=ae({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return kp}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Vg(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},$u({before:ke(()=>[xe(e.$slots,"before",ho(Mr(n.config)))]),after:ke(()=>[xe(e.$slots,"after",ho(Mr(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:ke(()=>[xe(e.$slots,"default",ho(Mr(n.config)))]),key:"0"}:void 0]),1032,["config"])}const Dn=Se(Hg,[["render",Vg],["__file","VPAutoLink.vue"]]),jg=ae({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=He(),o=$s(),s=R(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),i=R(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),l=R(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),a=R(()=>n.value.heroAlt||s.value||"hero"),c=R(()=>n.value.heroHeight??280),u=R(()=>Array.isArray(n.value.actions)?n.value.actions.map(({type:h="primary",...m})=>({type:h,...m})):[]),p={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:s,tagline:i,heroImage:l,heroAlt:a,heroHeight:c,actions:u,HomeHeroImage:()=>{if(!l.value)return null;const h=q("img",{class:"vp-hero-image",src:Ps(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?h:q(ws,()=>h)},VPAutoLink:Dn};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Fg={class:"vp-hero"},Bg={key:0,id:"main-title"},Wg={key:1,class:"vp-hero-description"},Ug={key:2,class:"vp-hero-actions"};function Gg(e,t,n,r,o,s){return V(),Z("header",Fg,[oe(r.HomeHeroImage),r.heroText?(V(),Z("h1",Bg,ue(r.heroText),1)):De("",!0),r.tagline?(V(),Z("p",Wg,ue(r.tagline),1)):De("",!0),r.actions.length?(V(),Z("p",Ug,[(V(!0),Z(be,null,At(r.actions,i=>(V(),Le(r.VPAutoLink,{key:i.text,class:Ke(["vp-hero-action-button",[i.type]]),config:i},null,8,["class","config"]))),128))])):De("",!0)])}const Kg=Se(jg,[["render",Gg],["__file","VPHomeHero.vue"]]),qg=ae({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:Og,VPHomeFooter:Ng,VPHomeHero:Kg,get Content(){return Es}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),zg={class:"vp-home"},Jg={"vp-content":""};function Yg(e,t,n,r,o,s){return V(),Z("main",zg,[oe(r.VPHomeHero),oe(r.VPHomeFeatures),K("div",Jg,[oe(r.Content)]),oe(r.VPHomeFooter)])}const Qg=Se(qg,[["render",Yg],["__file","VPHome.vue"]]),Xg=ae({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=He(),s=$s(),i=R(()=>o.value.home||n.value),l=R(()=>r.value.title),a=R(()=>s.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),c=R(()=>o.value.logoAlt??l.value),u=R(()=>l.value.toLocaleUpperCase().trim()===c.value.toLocaleUpperCase().trim()),p={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:s,navbarBrandLink:i,navbarBrandTitle:l,navbarBrandLogo:a,navbarBrandLogoAlt:c,navBarLogoAltMatchesTitle:u,NavbarBrandLogo:()=>{if(!a.value)return null;const h=q("img",{class:"vp-site-logo",src:Ps(a.value),alt:c.value});return o.value.logoDark===void 0?h:q(ws,()=>h)},get RouteLink(){return ao}};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Zg=["aria-hidden"];function ev(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:ke(()=>[oe(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),Z("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},ue(r.navbarBrandTitle),11,Zg)):De("",!0)]),_:1},8,["to"])}const tv=Se(Xg,[["render",ev],["__file","VPNavbarBrand.vue"]]),nv=ae({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:s=>{s.style.height=`${s.scrollHeight}px`},unsetHeight:s=>{s.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function rv(e,t,n,r,o,s){return V(),Le(gs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:ke(()=>[xe(e.$slots,"default")]),_:3})}const fc=Se(nv,[["render",rv],["__file","VPDropdownTransition.vue"]]),ov=ae({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Nl(n),[o,s]=Ls(),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};lo(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:Dn,VPDropdownTransition:fc};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),sv=["aria-label"],iv={class:"title"},lv=["aria-label"],av={class:"title"},cv={class:"vp-navbar-dropdown"},uv={class:"vp-navbar-dropdown-subtitle"},fv={key:1},dv={class:"vp-navbar-dropdown-subitem-wrapper"};function pv(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[K("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[K("span",iv,ue(r.config.text),1),t[1]||(t[1]=K("span",{class:"arrow down"},null,-1))],8,sv),K("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[K("span",av,ue(r.config.text),1),K("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,lv),oe(r.VPDropdownTransition,null,{default:ke(()=>[Ur(K("ul",cv,[(V(!0),Z(be,null,At(r.config.children,i=>(V(),Z("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),Z(be,{key:0},[K("h4",uv,[i.link?(V(),Le(r.VPAutoLink,{key:0,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&i.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(V(),Z("span",fv,ue(i.text),1))]),K("ul",dv,[(V(!0),Z(be,null,At(i.children,l=>(V(),Z("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[oe(r.VPAutoLink,{config:l,onFocusout:()=>{r.isLastItemOfArray(l,i.children)&&r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(V(),Le(r.VPAutoLink,{key:1,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[zr,r.open]])]),_:1})],2)}const hv=Se(ov,[["render",pv],["__file","VPNavbarDropdown.vue"]]),dc=(e,t="")=>dt(e)?Ln(Cn(t,e)):"children"in e?{...e,children:e.children.map(n=>dc(n,Cn(t,e.prefix)))}:{...e,link:Za(e.link)?Ln(Cn(t,e.link)).link:e.link},gv=()=>{const{themeLocale:e}=He();return R(()=>(e.value.navbar||[]).map(t=>dc(t)))},pc=e=>!vr(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,vv=()=>{const{themeLocale:e}=He(),t=R(()=>e.value.repo),n=R(()=>t.value?pc(t.value):null),r=R(()=>t.value&&!vr(t.value)?`https://github.com/${t.value}`:t.value),o=R(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return R(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},mv=()=>{const e=On(),t=Ch(),{routeLocale:n,site:r,siteLocale:o,theme:s,themeLocale:i}=He();return R(()=>{const l=Object.keys(r.value.locales);if(l.length<2)return[];const a=e.path,c=e.fullPath;return[{text:`${i.value.selectLanguageText}`,ariaLabel:`${i.value.selectLanguageAriaLabel??i.value.selectLanguageText}`,children:l.map(f=>{var w,S;const p=((w=r.value.locales)==null?void 0:w[f])??{},h=((S=s.value.locales)==null?void 0:S[f])??{},m=`${p.lang}`,y=h.selectLanguageName??m;if(m===o.value.lang)return{text:y,activeMatch:".",link:e.fullPath};const E=a.replace(n.value,f);return{text:y,link:t.value.some(v=>v===E)?c.replace(a,E):h.home??f}})}]})},_v="719px",bv={mobile:_v};var ar;(function(e){e.Mobile="mobile"})(ar||(ar={}));const yv={[ar.Mobile]:Number.parseInt(bv.mobile.replace("px",""),10)},hc=(e,t)=>{const n=yv[e];Number.isInteger(n)&&(Fe("orientationchange",()=>{t(n)}),Fe("resize",()=>{t(n)}),Ze(()=>{t(n)}))},Sv=ae({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=gv(),o=mv(),s=vv(),i=Ve(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);hc(ar.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:Dn,VPNavbarDropdown:hv};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),wv=["aria-label"];function Ev(e,t,n,r,o,s){return r.navbarLinks.length?(V(),Z("nav",{key:0,class:"vp-navbar-items","aria-label":r.navbarLabel},[(V(!0),Z(be,null,At(r.navbarLinks,i=>(V(),Z("div",{key:i.text,class:"vp-navbar-item"},["children"in i?(V(),Le(r.VPNavbarDropdown,{key:0,class:Ke({mobile:r.isMobile}),config:i},null,8,["class","config"])):(V(),Le(r.VPAutoLink,{key:1,config:i},null,8,["config"]))]))),128))],8,wv)):De("",!0)}const gc=Se(Sv,[["render",Ev],["__file","VPNavbarItems.vue"]]),Pv={},Cv={class:"dark-icon",viewBox:"0 0 32 32"};function xv(e,t){return V(),Z("svg",Cv,t[0]||(t[0]=[K("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1)]))}const Tv=Se(Pv,[["render",xv],["__file","VPDarkIcon.vue"]]),kv={},Lv={class:"light-icon",viewBox:"0 0 32 32"};function Av(e,t){return V(),Z("svg",Lv,t[0]||(t[0]=[df('<path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path>',9)]))}const Rv=Se(kv,[["render",Av],["__file","VPLightIcon.vue"]]),Ov=ae({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=$s(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:Tv,VPLightIcon:Rv};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Dv=["title"];function Iv(e,t,n,r,o,s){return V(),Z("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[Ur(oe(r.VPLightIcon,null,null,512),[[zr,!r.isDarkMode]]),Ur(oe(r.VPDarkIcon,null,null,512),[[zr,r.isDarkMode]])],8,Dv)}const Mv=Se(Ov,[["render",Iv],["__file","VPToggleColorModeButton.vue"]]),$v=ae({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const{themeLocale:n}=He(),r={themeLocale:n};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Nv=["title"];function Hv(e,t,n,r,o,s){return V(),Z("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=i=>e.$emit("toggle"))},t[1]||(t[1]=[K("div",{class:"icon","aria-hidden":"true"},[K("span"),K("span"),K("span")],-1)]),8,Nv)}const Vv=Se($v,[["render",Hv],["__file","VPToggleSidebarButton.vue"]]),jv=ae({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=Ja("SearchBox")?Ql("SearchBox"):()=>null,{themeLocale:r}=He(),o=zs("navbar"),s=zs("navbar-brand"),i=Ve(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var m;const p=(m=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:m.getComputedStyle(u,null)[f],h=Number.parseInt(p,10);return Number.isNaN(h)?0:h};hc(ar.Mobile,u=>{var p;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((p=s.value)==null?void 0:p.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:tv,VPNavbarItems:gc,VPToggleColorModeButton:Mv,VPToggleSidebarButton:Vv};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Fv={ref:"navbar",class:"vp-navbar","vp-navbar":""},Bv={ref:"navbar-brand"};function Wv(e,t,n,r,o,s){return V(),Z("header",Fv,[oe(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),K("span",Bv,[oe(r.VPNavbarBrand)],512),K("div",{class:"vp-navbar-items-wrapper",style:An(r.linksWrapperStyle)},[xe(e.$slots,"before"),oe(r.VPNavbarItems,{class:"vp-hide-mobile"}),xe(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):De("",!0),oe(r.SearchBox)],4)],512)}const Uv=Se(jv,[["render",Wv],["__file","VPNavbar.vue"]]),Gv={},Kv={class:"edit-icon",viewBox:"0 0 1024 1024"};function qv(e,t){return V(),Z("svg",Kv,t[0]||(t[0]=[K("g",{fill:"currentColor"},[K("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),K("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const zv=Se(Gv,[["render",qv],["__file","VPEditIcon.vue"]]),Jv={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},Yv=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=pc(e);return n!==null?Jv[n]:null},Qv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=Yv({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,vr(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ka(`${Ta(n)}/${r}`)):null},Xv=()=>{const{frontmatter:e,page:t,themeLocale:n}=He();return R(()=>{if(!(e.value.editLink??n.value.editLink??!0))return null;const{repo:o,docsRepo:s=o,docsBranch:i="main",docsDir:l="",editLinkText:a}=n.value;if(!s)return null;const c=Qv({docsRepo:s,docsBranch:i,docsDir:l,filePathRelative:t.value.filePathRelative,editLinkPattern:e.value.editLinkPattern??n.value.editLinkPattern});return c?{text:a??"Edit this page",link:c}:null})},Zv=ae({__name:"VPPageMeta",setup(e,{expose:t}){t();const{frontmatter:n,themeLocale:r}=He(),o=ec(()=>n.value.contributors??r.value.contributors??!0),s=Xv(),i=tc(()=>n.value.lastUpdated??r.value.lastUpdated??!0),l={frontmatter:n,themeLocale:r,contributors:o,editLink:s,lastUpdated:i,VPAutoLink:Dn,VPEditIcon:zv};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),em={class:"vp-page-meta"},tm={key:0,class:"vp-meta-item edit-link"},nm={class:"vp-meta-item git-info"},rm={key:0,class:"vp-meta-item last-updated"},om={class:"meta-item-label"},sm=["datetime"],im={key:1,class:"vp-meta-item contributors"},lm={class:"meta-item-label"},am={class:"meta-item-info"},cm=["title"];function um(e,t,n,r,o,s){return V(),Z("footer",em,[r.editLink?(V(),Z("div",tm,[oe(r.VPAutoLink,{class:"label",config:r.editLink},{before:ke(()=>[oe(r.VPEditIcon)]),_:1},8,["config"])])):De("",!0),K("div",nm,[r.lastUpdated?(V(),Z("div",rm,[K("span",om,ue(r.themeLocale.lastUpdatedText??r.lastUpdated.locale)+": ",1),K("time",{class:"meta-item-info",datetime:r.lastUpdated.iso,"data-allow-mismatch":""},ue(r.lastUpdated.text),9,sm)])):De("",!0),r.contributors.length?(V(),Z("div",im,[K("span",lm,ue(r.themeLocale.contributorsText)+": ",1),K("span",am,[(V(!0),Z(be,null,At(r.contributors,(i,l)=>(V(),Z(be,{key:l},[K("span",{class:"contributor",title:`email: ${i.email}`},ue(i.name),9,cm),l!==r.contributors.length-1?(V(),Z(be,{key:0},[Gt(", ")],64)):De("",!0)],64))),128))])])):De("",!0)])])}const fm=Se(Zv,[["render",um],["__file","VPPageMeta.vue"]]),dm=()=>{const e=mr(),t=On();return n=>{n&&(Xa(n)?t.fullPath!==n&&e.push(n):gr(n)?window.open(n):e.push(encodeURI(n)))}},il=(e,t)=>e===!1?!1:dt(e)?Ln(e,t):vs(e)?{...e,link:Ln(e.link,t).link}:null,Yo=(e,t,n)=>{const r=e.findIndex(s=>s.link===t);if(r!==-1){const s=e[r+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Yo(s.children,t,n);if(i)return i}const o=e.findIndex(s=>"prefix"in s&&s.prefix===t);if(o!==-1){const s=e[o+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},pm=()=>{const{frontmatter:e,themeLocale:t}=He(),n=Hs(),r=Fa(),o=R(()=>{const i=il(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Yo(n.value,r.value,-1))}),s=R(()=>{const i=il(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Yo(n.value,r.value,1))});return{prevLink:o,nextLink:s}},hm=ae({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=dm(),{prevLink:o,nextLink:s}=pm(),i=R(()=>n.value.pageNavbarLabel??"page navigation");Fe("keydown",a=>{a.altKey&&(a.key==="ArrowRight"?s.value&&(r(s.value.link),a.preventDefault()):a.key==="ArrowLeft"&&o.value&&(r(o.value.link),a.preventDefault()))});const l={themeLocale:n,navigate:r,prevLink:o,nextLink:s,navbarLabel:i,VPAutoLink:Dn};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),gm=["aria-label"],vm={class:"hint"},mm={class:"link"},_m={class:"external-link"},bm={class:"hint"},ym={class:"link"},Sm={class:"external-link"};function wm(e,t,n,r,o,s){return r.prevLink||r.nextLink?(V(),Z("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(V(),Le(r.VPAutoLink,{key:0,class:"prev",config:r.prevLink},{default:ke(()=>[K("div",vm,[t[0]||(t[0]=K("span",{class:"arrow left"},null,-1)),Gt(" "+ue(r.themeLocale.prev??"Prev"),1)]),K("div",mm,[K("span",_m,ue(r.prevLink.text),1)])]),_:1},8,["config"])):De("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:ke(()=>[K("div",bm,[Gt(ue(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=K("span",{class:"arrow right"},null,-1))]),K("div",ym,[K("span",Sm,ue(r.nextLink.text),1)])]),_:1},8,["config"])):De("",!0)],8,gm)):De("",!0)}const Em=Se(hm,[["render",wm],["__file","VPPageNav.vue"]]),Pm=ae({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:fm,VPPageNav:Em,get Content(){return Es}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Cm={class:"vp-page"},xm={"vp-content":""};function Tm(e,t,n,r,o,s){return V(),Z("main",Cm,[xe(e.$slots,"top"),K("div",xm,[xe(e.$slots,"content-top"),oe(r.Content),xe(e.$slots,"content-bottom")]),oe(r.VPPageMeta),oe(r.VPPageNav),xe(e.$slots,"bottom")])}const km=Se(Pm,[["render",Tm],["__file","VPPage.vue"]]),ll=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Lm=(e,t)=>{if(t.hash===e)return!0;const n=ll(t.path),r=ll(e);return n===r},vc=(e,t)=>e.link&&Lm(e.link,t)?!0:"children"in e?e.children.some(n=>vc(n,t)):!1,Am=ae({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Nl(n),s=On(),i=mr(),l=R(()=>r.value.collapsible),a=R(()=>vc(r.value,s)),c=R(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:a.value,collapsible:l.value})),u=R(()=>l.value?a.value:!0),[f,p]=Ls(u.value),h=E=>{l.value&&(E.preventDefault(),p())},m=i.afterEach(()=>{fn(()=>{f.value=u.value})});us(()=>{m()});const y={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:p,onClick:h,unregisterRouterHook:m,VPAutoLink:Dn,VPDropdownTransition:fc};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}}),Rm={class:"vp-sidebar-children"};function Om(e,t,n,r,o,s){const i=Ql("VPSidebarItem",!0);return V(),Z("li",null,[r.item.link?(V(),Le(r.VPAutoLink,{key:0,class:Ke(r.itemClass),config:r.item},{after:ke(()=>[r.collapsible?(V(),Z("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):De("",!0)]),_:1},8,["class","config"])):(V(),Z("p",{key:1,tabindex:"0",class:Ke(r.itemClass),onClick:r.onClick,onKeydown:Jf(r.onClick,["enter"])},[Gt(ue(r.item.text)+" ",1),r.collapsible?(V(),Z("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):De("",!0)],34)),"children"in r.item&&r.item.children.length?(V(),Le(r.VPDropdownTransition,{key:2},{default:ke(()=>[Ur(K("ul",Rm,[(V(!0),Z(be,null,At(r.item.children,l=>(V(),Le(i,{key:`${r.depth}${l.text}${l.link}`,item:l,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[zr,r.isOpen]])]),_:1})):De("",!0)])}const Dm=Se(Am,[["render",Om],["__file","VPSidebarItem.vue"]]),Im=ae({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=On(),r=Hs();Ze(()=>{je(()=>n.hash,s=>{const i=document.querySelector(".vp-sidebar");if(!i)return;const l=document.querySelector(`.vp-sidebar .vp-sidebar-item.auto-link[href="${n.path}${s}"]`);if(!l)return;const{top:a,height:c}=i.getBoundingClientRect(),{top:u,height:f}=l.getBoundingClientRect();u<a?l.scrollIntoView(!0):u+f>a+c&&l.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:Dm};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Mm={key:0,class:"vp-sidebar-items"};function $m(e,t,n,r,o,s){return r.sidebarItems.length?(V(),Z("ul",Mm,[(V(!0),Z(be,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):De("",!0)}const Nm=Se(Im,[["render",$m],["__file","VPSidebarItems.vue"]]),Hm=ae({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:gc,VPSidebarItems:Nm};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Vm={class:"vp-sidebar","vp-sidebar":""};function jm(e,t,n,r,o,s){return V(),Z("aside",Vm,[oe(r.VPNavbarItems),xe(e.$slots,"top"),oe(r.VPSidebarItems),xe(e.$slots,"bottom")])}const Fm=Se(Hm,[["render",jm],["__file","VPSidebar.vue"]]),Bm=ae({__name:"Layout",setup(e,{expose:t}){t();const{frontmatter:n,page:r,themeLocale:o}=He(),s=R(()=>n.value.navbar??o.value.navbar??!0),i=Hs(),l=Ve(!1),a=S=>{l.value=typeof S=="boolean"?S:!l.value},c={x:0,y:0},u=S=>{c.x=S.changedTouches[0].clientX,c.y=S.changedTouches[0].clientY},f=S=>{const v=S.changedTouches[0].clientX-c.x,_=S.changedTouches[0].clientY-c.y;Math.abs(v)>Math.abs(_)&&Math.abs(v)>40&&(v>0&&c.x<=80?a(!0):a(!1))},p=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),h=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":p.value},n.value.pageClass]);lo(()=>{a(!1)});const m=lc(),y=m.resolve,E=m.pending,w={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:p,containerClass:h,scrollPromise:m,onBeforeEnter:y,onBeforeLeave:E,VPFadeSlideYTransition:kg,VPHome:Qg,VPNavbar:Uv,VPPage:km,VPSidebar:Fm};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}});function Wm(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[xe(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:ke(()=>[xe(e.$slots,"navbar-before")]),after:ke(()=>[xe(e.$slots,"navbar-after")]),_:3})):De("",!0)]),K("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),xe(e.$slots,"sidebar",{},()=>[oe(r.VPSidebar,null,{top:ke(()=>[xe(e.$slots,"sidebar-top")]),bottom:ke(()=>[xe(e.$slots,"sidebar-bottom")]),_:3})]),xe(e.$slots,"page",{},()=>[oe(r.VPFadeSlideYTransition,{onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:ke(()=>[r.frontmatter.home?(V(),Le(r.VPHome,{key:0})):(V(),Le(r.VPPage,{key:r.page.path},{top:ke(()=>[xe(e.$slots,"page-top")]),"content-top":ke(()=>[xe(e.$slots,"page-content-top")]),"content-bottom":ke(()=>[xe(e.$slots,"page-content-bottom")]),bottom:ke(()=>[xe(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const mc=Se(Bm,[["render",Wm],["__file","Layout.vue"]]),Um=ae({__name:"NotFound",setup(e,{expose:t}){t();const{routeLocale:n,themeLocale:r}=He(),o=R(()=>r.value.notFound??["Not Found"]),s=()=>o.value[Math.floor(Math.random()*o.value.length)],i=R(()=>r.value.home??n.value),l=R(()=>r.value.backToHome??"Back to home"),a={routeLocale:n,themeLocale:r,messages:o,getMsg:s,homeLink:i,homeText:l,get RouteLink(){return ao}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Gm={class:"vp-theme-container","vp-container":""},Km={class:"page"},qm={"vp-content":""};function zm(e,t,n,r,o,s){return V(),Z("div",Gm,[K("main",Km,[K("div",qm,[t[0]||(t[0]=K("h1",null,"404",-1)),K("blockquote",null,ue(r.getMsg()),1),oe(r.RouteLink,{to:r.homeLink},{default:ke(()=>[Gt(ue(r.homeText),1)]),_:1},8,["to"])])])])}const Jm=Se(Um,[["render",zm],["__scopeId","data-v-a22fad92"],["__file","NotFound.vue"]]),Ym=It({enhance({app:e,router:t}){Ja("Badge")||e.component("Badge",Cg);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await lc().wait(),n(...r))},setup(){gg(),mg(),wg()},layouts:{Layout:mc,NotFound:Jm}}),Qm=Object.freeze(Object.defineProperty({__proto__:null,default:Ym},Symbol.toStringTag,{value:"Module"}));function Xm(e){return ts()?(_l(e),!0):!1}function Vs(e){return typeof e=="function"?e():Lt(e)}const Zm=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const e_=Object.prototype.toString,t_=e=>e_.call(e)==="[object Object]",n_=()=>{};function r_(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const _c=e=>e();function o_(e=_c){const t=Ve(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:o}}function s_(e){return Jt()}function i_(e,t,n={}){const{eventFilter:r=_c,...o}=n;return je(e,r_(r,t),o)}function l_(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=o_(r);return{stop:i_(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function a_(e,t=!0,n){s_()?Ze(e,n):t?e():fn(e)}function c_(e){var t;const n=Vs(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Jr=Zm?window:void 0;function al(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=Jr):[t,n,r,o]=e,!t)return n_;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,p,h)=>(u.addEventListener(f,p,h),()=>u.removeEventListener(f,p,h)),a=je(()=>[c_(t),Vs(o)],([u,f])=>{if(i(),!u)return;const p=t_(f)?{...f}:f;s.push(...n.flatMap(h=>r.map(m=>l(u,h,m,p))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return Xm(c),c}const Rr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Or="__vueuse_ssr_handlers__",u_=f_();function f_(){return Or in Rr||(Rr[Or]=Rr[Or]||{}),Rr[Or]}function d_(e,t){return u_[e]||t}function p_(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const h_={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},cl="vueuse-storage";function g_(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=Jr,eventFilter:p,onError:h=T=>{console.error(T)},initOnMounted:m}=r,y=(u?ye:Ve)(typeof t=="function"?t():t);if(!n)try{n=d_("getDefaultStorage",()=>{var T;return(T=Jr)==null?void 0:T.localStorage})()}catch(T){h(T)}if(!n)return y;const E=Vs(t),w=p_(E),S=(o=r.serializer)!=null?o:h_[w],{pause:v,resume:_}=l_(y,()=>G(y.value),{flush:s,deep:i,eventFilter:p});f&&l&&a_(()=>{al(f,"storage",Q),al(f,cl,I),m&&Q()}),m||Q();function M(T,L){f&&f.dispatchEvent(new CustomEvent(cl,{detail:{key:e,oldValue:T,newValue:L,storageArea:n}}))}function G(T){try{const L=n.getItem(e);if(T==null)M(L,null),n.removeItem(e);else{const x=S.write(T);L!==x&&(n.setItem(e,x),M(L,x))}}catch(L){h(L)}}function D(T){const L=T?T.newValue:n.getItem(e);if(L==null)return a&&E!=null&&n.setItem(e,S.write(E)),E;if(!T&&c){const x=S.read(L);return typeof c=="function"?c(x,E):w==="object"&&!Array.isArray(x)?{...E,...x}:x}else return typeof L!="string"?L:S.read(L)}function Q(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){y.value=E;return}if(!(T&&T.key!==e)){v();try{(T==null?void 0:T.newValue)!==S.write(y.value)&&(y.value=D(T))}catch(L){h(L)}finally{T?fn(_):_()}}}}function I(T){Q(T.detail)}return y}function v_(e,t,n={}){const{window:r=Jr}=n;return g_(e,t,r==null?void 0:r.sessionStorage,n)}const m_=Object.entries;var __={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const b_=__;m_(b_.localeConfig);v_("VUEPRESS_REDIRECT_LOCALES",{});const y_=It({setup(){},rootComponents:[]}),S_=Object.freeze(Object.defineProperty({__proto__:null,default:y_},Symbol.toStringTag,{value:"Module"}));var le=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech&nbsp;lead",e.TeamLead="team&nbsp;lead",e.Developer="developer",e))(le||{}),de=(e=>(e.ActiveDeveloped="actively-developed",e.PassivelyMaintained="passively-maintained",e.AsIs="as-is",e.Experimental="experimental",e.LookingForMaintainer="looking-for-maintainer",e.Deprecated="deprecated",e))(de||{}),$=(e=>(e.C="C",e.Go="Go",e.JavaScript="JS",e.TypeScript="TS",e.Rust="Rust",e.Python="Python",e.Php="PHP",e.Deno="Deno",e.NodeJS="NodeJS",e.Flask="Flask",e.React="React",e.Antd="Antd",e.Postgresql="PostgreSQL",e.Docker="Docker",e.Drone="Drone CI",e.Woodpecker="Woodpecker CI",e.Bash="Bash",e.TreeSitter="TreeSitter",e.Nix="Nix",e.Lua="Lua",e.Sqlite="Sqlite",e.Vue="Vue",e.Vuepress="Vuepress",e.Godot="Godot",e.Haskell="Haskell",e))($||{});const w_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[le.Author],technologies:[$.Nix],startDate:new Date("2024-04-24"),status:de.ActiveDeveloped},{name:"picsg",url:"/pleshevskiy/picsg",description:"A tool for steganographing information in a picture encoded using the Vernam cipher.",roles:[le.Author],technologies:[$.Haskell],startDate:new Date("2024-04-13"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"Mindustry tools",url:"/pleshevskiy/mindustry-tools",description:"Tools for the Mindustry game",roles:[le.Author],technologies:[$.Nix,$.Godot],startDate:new Date("2024-01-07"),status:de.PassivelyMaintained},{name:"Master Progress Rosmintrud tools",url:"https://rosmintrud.masterprogress.ru",description:"Internal service to prepare documents for the rosmintrud (SPA)",roles:[le.TechLead],technologies:[$.Deno,$.Sqlite,$.TypeScript,$.Vue,$.Docker,$.Woodpecker,$.Nix],startDate:new Date("2023-07-03"),status:de.PassivelyMaintained},{name:"yandexgpt_tg_bot",url:"/pleshevskiy/yandexgpt_tg_bot",description:"The Telegram bot to describe article with link by YandexGPT.",roles:[le.Author],technologies:[$.JavaScript,$.NodeJS,$.Nix],startDate:new Date("2023-06-27"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"tree-sitter-plpgsql",url:"/pleshevskiy/tree-sitter-plpgsql",description:"plpgsql grammar for tree-sitter",roles:[le.Author],technologies:[$.C,$.JavaScript,$.TreeSitter,$.Nix],startDate:new Date("2023-01-05"),status:de.PassivelyMaintained},{name:"wd2",url:"/pleshevskiy/wd2",description:"A wrapper over d2 which allows to use additional configs from d2 file",roles:[le.Author],technologies:[$.Bash,$.Nix],startDate:new Date("2022-12-12"),endDate:new Date("2023-07-31"),status:de.AsIs},{name:"tree-sitter-d2",url:"/pleshevskiy/tree-sitter-d2",description:"d2 grammar for tree-sitter",roles:[le.Author],technologies:[$.C,$.JavaScript,$.TreeSitter,$.Nix],startDate:new Date("2022-12-04"),status:de.ActiveDeveloped},{name:"nix2lua",url:"/mynix/nix2lua",description:"This is a small but functional library that converts your nix configurations into lua format.",roles:[le.Author],technologies:[$.Nix,$.Lua],startDate:new Date("2022-11-22"),status:de.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-29"),status:de.PassivelyMaintained},{name:"estring",url:"/pleshevskiy/estring",description:"A simple way to parse a string using type annotations.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-23"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"enve",url:"/pleshevskiy/enve",description:"It helps you work with environment variables and convert it to any type using only type annotations",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-18"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"docker stack drone plugin",url:"/pleshevskiy/docker_stack",description:"Deploy to production using `docker stack deploy`",roles:[le.Author],technologies:[$.Docker,$.Drone,$.Woodpecker],startDate:new Date("2022-06-06"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"dexios",url:"/github/dexios",description:"Dexios is a fast, secure, and open source command-line encryption tool.",roles:[le.Collaborator],technologies:[$.Rust],startDate:new Date("2022-06-01"),endDate:new Date("2023-02-28")},{name:"recipes",url:"/pleshevskiy/recipes",description:"Site with recipes which cares about privacy",roles:[le.Author],technologies:[$.TypeScript,$.Deno,$.Rust],startDate:new Date("2022-05-04"),status:de.PassivelyMaintained},{name:"pleshevski.ru",url:"/pleshevskiy/pleshevski.ru",description:"Source code of my personal site",roles:[le.Author],technologies:[$.TypeScript,$.Vue,$.Vuepress,$.Nix],startDate:new Date("2022-03-16"),status:de.PassivelyMaintained},{name:"paren",url:"/pleshevskiy/paren",description:"Library for parsing and rendering information.",roles:[le.Author],technologies:[$.TypeScript,$.Deno],startDate:new Date("2022-03-14"),endDate:new Date("2024-07-25"),status:de.Experimental},{name:"hwt",url:"/pleshevskiy/hwt",description:"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-02-04"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"ood_persistence",url:"/pleshevskiy/ood_persistence",description:"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2021-10-12"),endDate:new Date("2021-10-21"),status:de.Deprecated},{name:"migra",url:"/pleshevskiy/migra",description:"Simple SQL migration manager for your project.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2021-01-31"),endDate:new Date("2022-03-17"),status:de.AsIs},{name:"espruino-starter",url:"/pleshevskiy/espruino-starter",description:"Quickly start creating your new project on the espruino board or a board based on it.",roles:[le.Author],technologies:[$.JavaScript],startDate:new Date("2021-08-23"),status:de.AsIs},{name:"react-rest-request",url:"/pleshevskiy/react-rest-request",description:"Minimalistic REST API client for React inspired by Apollo.",roles:[le.Author],technologies:[$.TypeScript,$.React],startDate:new Date("2020-10-04"),endDate:new Date("2023-03-02"),status:de.Deprecated},{name:"sonic-channel",url:"/pleshevskiy/sonic-channel",description:"Rust client for sonic search backend.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2020-07-18"),status:de.PassivelyMaintained},{name:"itconfig",url:"/pleshevskiy/itconfig",description:"Easy build a configs from environment variables and use it in globally.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2019-12-22"),endDate:new Date("2022-07-24"),status:de.Deprecated},{name:"it-fsm",url:"/pleshevskiy/it-fsm",description:"Simple full-featured finite state machine for your project",roles:[le.Author],technologies:[$.TypeScript,$.NodeJS,$.Deno],startDate:new Date("2019-10-11"),status:de.PassivelyMaintained},{name:"Cabinet Master Progress",url:"https://cabinet.masterprogress.ru",description:"Student's cabinet of the educational center Master Progress (SSR + SPA)",roles:[le.TechLead],technologies:[$.Python,$.Flask,$.Postgresql,$.TypeScript,$.React,$.Docker,$.Woodpecker,$.Nix],startDate:new Date("2019-09-22"),status:de.PassivelyMaintained},{name:"genrss",url:"/pleshevskiy/genrss",description:"RSS generator for python",roles:[le.Author],technologies:[$.Python],startDate:new Date("2019-07-23"),status:de.AsIs},{name:"marshmallow_pageinfo",url:"/pleshevskiy/marshmallow_pageinfo",description:"Page info marshmallow schema for api",roles:[le.Author],technologies:[$.Python],startDate:new Date("2019-10-05"),endDate:new Date("2023-03-02"),status:de.AsIs},{name:"Binary Management",url:"https://www.binarymanagement.com",description:"Project management tool for interior designers",roles:[le.Developer,le.TechLead,le.TeamLead],technologies:[$.TypeScript,$.NodeJS,$.React,$.Antd,$.Docker,$.Drone,$.Rust,$.Nix],startDate:new Date("2018-09-15"),status:de.ActiveDeveloped},{name:"Core Spirit",url:"https://corespirit.com",description:"Social platform focusing on human and planetary enhancement",roles:[le.Developer],technologies:[$.TypeScript,$.NodeJS,$.Go,$.Python,$.React,$.Docker,$.Drone],startDate:new Date("2018-09-05"),endDate:new Date("2019-12-31")},{name:"Master Progress",url:"https://masterprogress.ru",description:"Main website of the educational center Master Progress (SSR + Forms)",roles:[le.TechLead],technologies:[$.Python,$.Flask,$.JavaScript,$.Nix],startDate:new Date("2018-04-10"),status:de.PassivelyMaintained},{name:"ictmpl",url:"/pleshevskiy/ictmpl",description:"Generate projects from templates",roles:[le.Author],technologies:[$.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:de.AsIs}];function E_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const P_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),C_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:P_},Symbol.toStringTag,{value:"Module"}));function Fn(e){return(e==null?void 0:e.valueOf())??1/0}const x_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},T_=ae({...x_,setup(e,{expose:t}){t();const n=R(()=>w_.concat().sort((o,s)=>Fn(s.endDate)-Fn(o.endDate)||Fn(s.startDate)-Fn(o.startDate))),r={date2num:Fn,works:n,get renderDate(){return E_},get w(){return C_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),k_=["href"],L_=["innerHTML"],A_={key:0};function R_(e,t,n,r,o,s){return V(),Z("table",null,[K("thead",null,[K("tr",null,[K("th",null,ue(s.tableTheme.name),1),K("th",null,ue(s.tableTheme.description),1),K("th",null,ue(s.tableTheme.role),1),K("th",null,ue(s.tableTheme.technologies),1),K("th",null,ue(s.tableTheme.status),1),K("th",null,ue(s.tableTheme.dates),1)])]),K("tbody",null,[(V(!0),Z(be,null,At(r.works,i=>(V(),Z("tr",null,[K("td",null,[K("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},ue(i.name),9,k_)]),K("td",null,ue(i.description),1),K("td",{innerHTML:i.roles.join(", ")},null,8,L_),K("td",null,ue(i.technologies.join(", ")),1),K("td",null,ue(i.status),1),K("td",null,[K("div",null,[K("small",{class:Ke({grey:i.endDate})},ue(r.renderDate(i.startDate)),3)]),i.endDate?(V(),Z("div",A_,[K("small",null,ue(r.renderDate(i.endDate)),1)])):De("",!0)])]))),256))])])}const O_=Se(T_,[["render",R_],["__file","ChronologicalWorksTable.vue"]]),D_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:mc,get ChronologicalWorksTable(){return O_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},I_={class:"works-table-wrapper"};function M_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":ke(()=>[K("div",I_,[oe(r.ChronologicalWorksTable)])]),_:1})}const $_=Se(D_,[["render",M_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),N_=It({layouts:{WorksPage:$_}}),H_=Object.freeze(Object.defineProperty({__proto__:null,default:N_},Symbol.toStringTag,{value:"Module"})),Dr=[bh,Lh,Mh,Nh,Kh,Xh,tg,lg,pg,Qm,S_,H_].map(e=>e.default).filter(Boolean),V_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Wn=ye(V_),j_=Kd,F_=()=>{const e=mp({history:j_(Ta("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===Ct){const r=lr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},B_=e=>{e.component("ClientOnly",ws),e.component("Content",Es),e.component("RouteLink",ao)},W_=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=$l((E,w)=>({get(){return E(),t.currentRoute.value.meta._pageChunk},set(S){t.currentRoute.value.meta._pageChunk=S,w()}})),s=R(()=>Zt.resolveLayouts(n)),i=R(()=>Zt.resolveRouteLocale(Wn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Wn.value,i.value)),a=R(()=>o.value.comp),c=R(()=>o.value.data),u=R(()=>c.value.frontmatter),f=R(()=>Zt.resolvePageHeadTitle(c.value,l.value)),p=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),h=R(()=>Zt.resolvePageLang(c.value,l.value)),m=R(()=>Zt.resolvePageLayout(c.value,s.value)),y={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:p,pageHeadTitle:f,pageLang:h,pageLayout:m,redirects:Jo,routeLocale:i,routePath:r,routes:En,siteData:Wn,siteLocaleData:l};return e.provide(bs,y),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>p.value},$headTitle:{get:()=>f.value},$lang:{get:()=>h.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Wn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>Ps}}),y},U_=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>dt(a)?`[${l}=${JSON.stringify(a)}]`:a?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)??null},G_=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return vs(t)&&Object.entries(t).forEach(([o,s])=>{dt(s)?r.setAttribute(o,s):s&&r.setAttribute(o,"")}),dt(n)&&r.appendChild(document.createTextNode(n)),r},K_=()=>{const e=yp(),t=Ss();let n=[];const r=()=>{e.value.forEach(i=>{const l=U_(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=G_(l);a&&i.push(a)}),i},s=()=>{document.documentElement.lang=t.value;const i=o();n.forEach((l,a)=>{const c=i.findIndex(u=>l.isEqualNode(u));c===-1?(l.remove(),delete n[a]):i.splice(c,1)}),i.forEach(l=>document.head.appendChild(l)),n=[...n.filter(l=>!!l),...i]};Wt(Cp,s),Ze(()=>{r(),je(e,s,{immediate:!1})})},q_=Xf,z_=async()=>{var n;const e=q_({name:"Vuepress",setup(){var s;K_();for(const i of Dr)(s=i.setup)==null||s.call(i);const r=Dr.flatMap(({rootComponents:i=[]})=>i.map(l=>q(l))),o=Sp();return()=>[q(o.value),r]}}),t=F_();B_(e),W_(e,t,Dr);for(const r of Dr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Wn}));return e.use(t),{app:e,router:t}};z_().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Se as _,K as a,Gt as b,Z as c,z_ as createVueApp,oe as d,df as e,V as o,Ql as r,ke as w};
+ */const rl=(e,t)=>{e.classList.add(t)},ol=(e,t)=>{e.classList.remove(t)},qh=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Oo=(e,t,n)=>e<t?t:e>n?n:e,sl=e=>(-1+e)*100,zh=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),Jh=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Lr=(()=>{const e=["Webkit","O","Moz","ms"],t={},n=s=>{const{style:i}=document.body;if(s in i)return s;const l=s.charAt(0).toUpperCase()+s.slice(1);let a=e.length;for(;a--;){const c=`${e[a]}${l}`;if(c in i)return c}return s},r=s=>{const i=Jh(s);return t[i]??(t[i]=n(i))},o=(s,i,l)=>{s.style[r(i)]=l};return(s,i)=>{for(const l in i){const a=i[l];Object.hasOwn(i,l)&&Ph(a)&&o(s,l,a)}}})(),Pt={minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'<div class="bar" role="bar"></div>'},Re={percent:null,isRendered:()=>!!document.getElementById("nprogress"),set:e=>{const{speed:t,easing:n}=Pt,r=Re.isStarted(),o=Oo(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,zh(l=>{Lr(i,{transform:`translate3d(${sl(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Lr(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Lr(s,{transition:`all ${t}ms linear`,opacity:"0"}),setTimeout(()=>{Re.remove(),l()},t)},t)):setTimeout(()=>{l()},t)}),Re},isStarted:()=>typeof Re.percent=="number",start:()=>{Re.percent||Re.set(0);const e=()=>{setTimeout(()=>{Re.percent&&(Re.trickle(),e())},Pt.trickleSpeed)};return e(),Re},done:e=>!e&&!Re.percent?Re:Re.increase(.3+.5*Math.random()).set(1),increase:e=>{let{percent:t}=Re;return t?(t=Oo(t+(typeof e=="number"?e:(1-t)*Oo(Math.random()*t,.1,.95)),0,.994),Re.set(t)):Re.start()},trickle:()=>Re.increase(Math.random()*Pt.trickleRate),render:e=>{if(Re.isRendered())return document.getElementById("nprogress");rl(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=Pt.template;const n=t.querySelector(Pt.barSelector),r=document.querySelector(Pt.parent),o=e?"-100":sl(Re.percent??0);return Lr(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&rl(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{ol(document.documentElement,"nprogress-busy"),ol(document.querySelector(Pt.parent),"nprogress-custom-parent"),qh(document.getElementById("nprogress"))}},Yh=()=>{Ze(()=>{const e=mr(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||Re.start()}),e.afterEach(n=>{t.add(n.path),Re.done()})})},Qh=It({setup(){Yh()}}),Xh=Object.freeze(Object.defineProperty({__proto__:null,default:Qh},Symbol.toStringTag,{value:"Module"})),Zh=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{Fe("click",t=>{const n=t.target;if(n.matches(e)){const r=n.parentElement;r!=null&&r.classList.toggle("collapsed")&&r.scrollIntoView({block:"center",behavior:"instant"})}},{passive:!0})},eg={setup(){Zh()}},tg=Object.freeze(Object.defineProperty({__proto__:null,default:eg},Symbol.toStringTag,{value:"Module"})),ng="VUEPRESS_CODE_TAB_STORE",Ar=Os(ng,{}),rg=ae({name:"CodeTabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=Ve(e.active),r=ye([]),o=()=>{e.tabId&&(Ar.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),e.tabId&&(Ar.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Ar.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Ar.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?q("div",{class:"vp-code-tabs"},[q("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return q("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return q("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[q("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),og="VUEPRESS_TAB_STORE",Do=Os(og,{}),sg=ae({name:"Tabs",props:{active:{type:Number,default:0},data:{type:Array,required:!0},id:{type:String,required:!0},tabId:String},slots:Object,setup(e,{slots:t}){const n=Ve(e.active),r=ye([]),o=()=>{e.tabId&&(Do.value[e.tabId]=e.data[n.value].id)},s=(c=n.value)=>{n.value=c<r.value.length-1?c+1:0,r.value[n.value].focus()},i=(c=n.value)=>{n.value=c>0?c-1:r.value.length-1,r.value[n.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),n.value=u):c.key==="ArrowRight"?(c.preventDefault(),s()):c.key==="ArrowLeft"&&(c.preventDefault(),i()),o()},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Do.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),je(()=>e.tabId&&Do.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:p})=>p===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?q("div",{class:"vp-tabs"},[q("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return q("button",{type:"button",ref:p=>{p&&(r.value[u]=p)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:p=>{l(p,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return q("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[q("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),ig={enhance:({app:e})=>{e.component("CodeTabs",rg),e.component("Tabs",sg)}},lg=Object.freeze(Object.defineProperty({__proto__:null,default:ig},Symbol.toStringTag,{value:"Module"})),ag=JSON.parse(`{"repo":"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru","locales":{"/":{"selectLanguageName":"Русский","navbar":["/","/works"],"notFound":["Верните страницу!","Мы потеряли страницу...","Вы заблокированы в лабиринте.","Искали кота?","Страница украдена.","Ошиблись в параллельной вселенной."],"backToHome":"Вернуться на главную","worksTable":{"name":"Название","description":"Описание","role":"Роль","technologies":"Технологии","status":"Статус","dates":"Даты"}},"/eng/":{"selectLanguageName":"English","navbar":["/eng/","/eng/works"],"notFound":["Return the page!","We lost a page...","You're blocked in a labyrinth.","Looking for a cat?","The page has been stolen.","Wrong turn in parallel universe."],"backToHome":"Back to home","worksTable":{"name":"Name","description":"Description","role":"Role","technologies":"Technologies","status":"Status","dates":"Dates"}}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"heading","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),cg=Ve(ag),rc=()=>cg,oc=Symbol(""),ug=()=>{const e=qe(oc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},fg=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},dg=It({enhance({app:e}){const t=rc(),n=e._context.provides[bs],r=R(()=>fg(t.value,n.routeLocale.value));e.provide(oc,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),pg=Object.freeze(Object.defineProperty({__proto__:null,default:dg},Symbol.toStringTag,{value:"Module"})),He=()=>{const{pageData:e,pageFrontmatter:t,pageLang:n,siteData:r,siteLocaleData:o,...s}=gt();return{...s,page:e,frontmatter:t,lang:n,site:r,siteLocale:o,theme:rc(),themeLocale:ug()}},sc=Symbol(""),hg=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{As(e,t)}),no(()=>{t()})},$s=()=>{const e=qe(sc);if(!e)throw new Error("useDarkMode() is called without provider.");return e},gg=()=>{const{themeLocale:e}=He(),t=sh(),n=Os("vuepress-color-scheme",e.value.colorMode),r=R({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(sc,r),hg(r)},ic=Symbol("headers"),vg=()=>{const e=Ua(ic);if(!e)throw new Error("useHeaders() is called without provider.");return e},mg=()=>{const{frontmatter:e,themeLocale:t}=He(),n=Ve([]),r=R(()=>e.value.sidebarDepth??t.value.sidebarDepth??2),o=()=>{if(r.value<=0){n.value=[];return}n.value=Eh({levels:[2,r.value+1],ignore:[".vp-badge"]})};Vp(ic,n),lo(s=>{s==="beforeUnmount"?n.value=[]:o()})};let Io=null,jn=null;const _g={wait:()=>Io,pending:()=>{Io=new Promise(e=>{jn=e})},resolve:()=>{jn==null||jn(),Io=null,jn=null}},lc=()=>_g,Ln=(e,t)=>{const{notFound:n,meta:r,path:o}=lr(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},Cn=(e="",t="")=>Xa(t)||gr(t)?t:`${fd(e)}${t}`,bg=e=>({text:e.title,link:e.link,children:Ns(e.children)}),Ns=e=>e?e.map(t=>bg(t)):[],ac=(e,t)=>[{text:e.title,children:Ns(t)}],cc=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Ln(Cn(i,s)):dt(s.link)?{...s,link:Za(s.link)?Ln(Cn(i,s.link)).link:s.link}:s;if("children"in l)return{...l,children:l.children.map(c=>o(c,Cn(i,l.prefix)))};if(l.link===n){const c=((a=t[0])==null?void 0:a.level)===1?t[0].children:t;return{...l,children:Ns(c)}}return l};return e.map(s=>o(s,r))},yg=(e,t,n,r)=>{const o=Qa(e).sort((s,i)=>i.length-s.length);for(const s of o)if(Ya(decodeURI(r),s)){const i=e[s];return i?i==="heading"?ac(t,n):cc(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},uc=Symbol("sidebarItems"),Hs=()=>{const e=qe(uc);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Sg=(e,t,n,r,o)=>e===!1?[]:e==="heading"?ac(t,o):Array.isArray(e)?cc(e,o,n,r):vs(e)?yg(e,t,o,n):[],wg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=He(),o=vg(),s=Fa(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>Sg(i.value,t.value,s.value,n.value,o.value));Wt(uc,l)},Eg=ae({__name:"Badge",props:{type:{default:"tip"},text:{default:""},vertical:{default:void 0}},setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Se=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};function Pg(e,t,n,r,o,s){return V(),Z("span",{class:Ke(["vp-badge",n.type]),style:An({verticalAlign:n.vertical})},[xe(e.$slots,"default",{},()=>[Gt(ue(n.text),1)])],6)}const Cg=Se(Eg,[["render",Pg],["__file","Badge.vue"]]),xg=ae({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Tg(e,t,n,r,o,s){return V(),Le(gs,{name:"vp-fade-slide-y",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:ke(()=>[xe(e.$slots,"default")]),_:3})}const kg=Se(xg,[["render",Tg],["__file","VPFadeSlideYTransition.vue"]]),Lg=ae({__name:"VPHomeFeatures",setup(e,{expose:t}){t();const{frontmatter:n}=He(),r=R(()=>n.value.features??[]),o={frontmatter:n,features:r};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Ag={key:0,class:"vp-features"};function Rg(e,t,n,r,o,s){return r.features.length?(V(),Z("div",Ag,[(V(!0),Z(be,null,At(r.features,i=>(V(),Z("div",{key:i.title,class:"vp-feature"},[K("h2",null,ue(i.title),1),K("p",null,ue(i.details),1)]))),128))])):De("",!0)}const Og=Se(Lg,[["render",Rg],["__file","VPHomeFeatures.vue"]]),Dg=ae({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=_r(),r=R(()=>n.value.footer),o=R(()=>n.value.footerHtml),s={frontmatter:n,footer:r,footerHtml:o};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Ig=["innerHTML"],Mg=["textContent"];function $g(e,t,n,r,o,s){return r.footer?(V(),Z(be,{key:0},[r.footerHtml?(V(),Z("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,Ig)):(V(),Z("div",{key:1,class:"vp-footer","vp-footer":"",textContent:ue(r.footer)},null,8,Mg))],64)):De("",!0)}const Ng=Se(Dg,[["render",$g],["__file","VPHomeFooter.vue"]]),Hg=ae({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return kp}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Vg(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},$u({before:ke(()=>[xe(e.$slots,"before",ho(Mr(n.config)))]),after:ke(()=>[xe(e.$slots,"after",ho(Mr(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:ke(()=>[xe(e.$slots,"default",ho(Mr(n.config)))]),key:"0"}:void 0]),1032,["config"])}const Dn=Se(Hg,[["render",Vg],["__file","VPAutoLink.vue"]]),jg=ae({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=He(),o=$s(),s=R(()=>n.value.heroText===null?null:n.value.heroText||r.value.title||"Hello"),i=R(()=>n.value.tagline===null?null:n.value.tagline||r.value.description||"Welcome to your VuePress site"),l=R(()=>o.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),a=R(()=>n.value.heroAlt||s.value||"hero"),c=R(()=>n.value.heroHeight??280),u=R(()=>Array.isArray(n.value.actions)?n.value.actions.map(({type:h="primary",...m})=>({type:h,...m})):[]),p={frontmatter:n,siteLocale:r,isDarkMode:o,heroText:s,tagline:i,heroImage:l,heroAlt:a,heroHeight:c,actions:u,HomeHeroImage:()=>{if(!l.value)return null;const h=q("img",{class:"vp-hero-image",src:Ps(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?h:q(ws,()=>h)},VPAutoLink:Dn};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Fg={class:"vp-hero"},Bg={key:0,id:"main-title"},Wg={key:1,class:"vp-hero-description"},Ug={key:2,class:"vp-hero-actions"};function Gg(e,t,n,r,o,s){return V(),Z("header",Fg,[oe(r.HomeHeroImage),r.heroText?(V(),Z("h1",Bg,ue(r.heroText),1)):De("",!0),r.tagline?(V(),Z("p",Wg,ue(r.tagline),1)):De("",!0),r.actions.length?(V(),Z("p",Ug,[(V(!0),Z(be,null,At(r.actions,i=>(V(),Le(r.VPAutoLink,{key:i.text,class:Ke(["vp-hero-action-button",[i.type]]),config:i},null,8,["class","config"]))),128))])):De("",!0)])}const Kg=Se(jg,[["render",Gg],["__file","VPHomeHero.vue"]]),qg=ae({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:Og,VPHomeFooter:Ng,VPHomeHero:Kg,get Content(){return Es}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),zg={class:"vp-home"},Jg={"vp-content":""};function Yg(e,t,n,r,o,s){return V(),Z("main",zg,[oe(r.VPHomeHero),oe(r.VPHomeFeatures),K("div",Jg,[oe(r.Content)]),oe(r.VPHomeFooter)])}const Qg=Se(qg,[["render",Yg],["__file","VPHome.vue"]]),Xg=ae({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=He(),s=$s(),i=R(()=>o.value.home||n.value),l=R(()=>r.value.title),a=R(()=>s.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),c=R(()=>o.value.logoAlt??l.value),u=R(()=>l.value.toLocaleUpperCase().trim()===c.value.toLocaleUpperCase().trim()),p={routeLocale:n,siteLocale:r,themeLocale:o,isDarkMode:s,navbarBrandLink:i,navbarBrandTitle:l,navbarBrandLogo:a,navbarBrandLogoAlt:c,navBarLogoAltMatchesTitle:u,NavbarBrandLogo:()=>{if(!a.value)return null;const h=q("img",{class:"vp-site-logo",src:Ps(a.value),alt:c.value});return o.value.logoDark===void 0?h:q(ws,()=>h)},get RouteLink(){return ao}};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),Zg=["aria-hidden"];function ev(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:ke(()=>[oe(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),Z("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},ue(r.navbarBrandTitle),11,Zg)):De("",!0)]),_:1},8,["to"])}const tv=Se(Xg,[["render",ev],["__file","VPNavbarBrand.vue"]]),nv=ae({__name:"VPDropdownTransition",setup(e,{expose:t}){t();const o={setHeight:s=>{s.style.height=`${s.scrollHeight}px`},unsetHeight:s=>{s.style.height=""}};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}});function rv(e,t,n,r,o,s){return V(),Le(gs,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:ke(()=>[xe(e.$slots,"default")]),_:3})}const fc=Se(nv,[["render",rv],["__file","VPDropdownTransition.vue"]]),ov=ae({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Nl(n),[o,s]=Ls(),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};lo(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:Dn,VPDropdownTransition:fc};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),sv=["aria-label"],iv={class:"title"},lv=["aria-label"],av={class:"title"},cv={class:"vp-navbar-dropdown"},uv={class:"vp-navbar-dropdown-subtitle"},fv={key:1},dv={class:"vp-navbar-dropdown-subitem-wrapper"};function pv(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[K("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[K("span",iv,ue(r.config.text),1),t[1]||(t[1]=K("span",{class:"arrow down"},null,-1))],8,sv),K("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[K("span",av,ue(r.config.text),1),K("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,lv),oe(r.VPDropdownTransition,null,{default:ke(()=>[Ur(K("ul",cv,[(V(!0),Z(be,null,At(r.config.children,i=>(V(),Z("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),Z(be,{key:0},[K("h4",uv,[i.link?(V(),Le(r.VPAutoLink,{key:0,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&i.children.length===0&&(r.open=!1)}},null,8,["config","onFocusout"])):(V(),Z("span",fv,ue(i.text),1))]),K("ul",dv,[(V(!0),Z(be,null,At(i.children,l=>(V(),Z("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[oe(r.VPAutoLink,{config:l,onFocusout:()=>{r.isLastItemOfArray(l,i.children)&&r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"])]))),128))])],64)):(V(),Le(r.VPAutoLink,{key:1,config:i,onFocusout:()=>{r.isLastItemOfArray(i,r.config.children)&&r.toggleOpen(!1)}},null,8,["config","onFocusout"]))]))),128))],512),[[zr,r.open]])]),_:1})],2)}const hv=Se(ov,[["render",pv],["__file","VPNavbarDropdown.vue"]]),dc=(e,t="")=>dt(e)?Ln(Cn(t,e)):"children"in e?{...e,children:e.children.map(n=>dc(n,Cn(t,e.prefix)))}:{...e,link:Za(e.link)?Ln(Cn(t,e.link)).link:e.link},gv=()=>{const{themeLocale:e}=He();return R(()=>(e.value.navbar||[]).map(t=>dc(t)))},pc=e=>!vr(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,vv=()=>{const{themeLocale:e}=He(),t=R(()=>e.value.repo),n=R(()=>t.value?pc(t.value):null),r=R(()=>t.value&&!vr(t.value)?`https://github.com/${t.value}`:t.value),o=R(()=>r.value?e.value.repoLabel?e.value.repoLabel:n.value===null?"Source":n.value:null);return R(()=>!r.value||!o.value?[]:[{text:o.value,link:r.value}])},mv=()=>{const e=On(),t=Ch(),{routeLocale:n,site:r,siteLocale:o,theme:s,themeLocale:i}=He();return R(()=>{const l=Object.keys(r.value.locales);if(l.length<2)return[];const a=e.path,c=e.fullPath;return[{text:`${i.value.selectLanguageText}`,ariaLabel:`${i.value.selectLanguageAriaLabel??i.value.selectLanguageText}`,children:l.map(f=>{var w,S;const p=((w=r.value.locales)==null?void 0:w[f])??{},h=((S=s.value.locales)==null?void 0:S[f])??{},m=`${p.lang}`,y=h.selectLanguageName??m;if(m===o.value.lang)return{text:y,activeMatch:".",link:e.fullPath};const E=a.replace(n.value,f);return{text:y,link:t.value.some(v=>v===E)?c.replace(a,E):h.home??f}})}]})},_v="719px",bv={mobile:_v};var ar;(function(e){e.Mobile="mobile"})(ar||(ar={}));const yv={[ar.Mobile]:Number.parseInt(bv.mobile.replace("px",""),10)},hc=(e,t)=>{const n=yv[e];Number.isInteger(n)&&(Fe("orientationchange",()=>{t(n)}),Fe("resize",()=>{t(n)}),Ze(()=>{t(n)}))},Sv=ae({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=gv(),o=mv(),s=vv(),i=Ve(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);hc(ar.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:Dn,VPNavbarDropdown:hv};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),wv=["aria-label"];function Ev(e,t,n,r,o,s){return r.navbarLinks.length?(V(),Z("nav",{key:0,class:"vp-navbar-items","aria-label":r.navbarLabel},[(V(!0),Z(be,null,At(r.navbarLinks,i=>(V(),Z("div",{key:i.text,class:"vp-navbar-item"},["children"in i?(V(),Le(r.VPNavbarDropdown,{key:0,class:Ke({mobile:r.isMobile}),config:i},null,8,["class","config"])):(V(),Le(r.VPAutoLink,{key:1,config:i},null,8,["config"]))]))),128))],8,wv)):De("",!0)}const gc=Se(Sv,[["render",Ev],["__file","VPNavbarItems.vue"]]),Pv={},Cv={class:"dark-icon",viewBox:"0 0 32 32"};function xv(e,t){return V(),Z("svg",Cv,t[0]||(t[0]=[K("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1)]))}const Tv=Se(Pv,[["render",xv],["__file","VPDarkIcon.vue"]]),kv={},Lv={class:"light-icon",viewBox:"0 0 32 32"};function Av(e,t){return V(),Z("svg",Lv,t[0]||(t[0]=[df('<path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path>',9)]))}const Rv=Se(kv,[["render",Av],["__file","VPLightIcon.vue"]]),Ov=ae({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=$s(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:Tv,VPLightIcon:Rv};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Dv=["title"];function Iv(e,t,n,r,o,s){return V(),Z("button",{type:"button",class:"vp-toggle-color-mode-button",title:r.themeLocale.toggleColorMode,onClick:r.toggleColorMode},[Ur(oe(r.VPLightIcon,null,null,512),[[zr,!r.isDarkMode]]),Ur(oe(r.VPDarkIcon,null,null,512),[[zr,r.isDarkMode]])],8,Dv)}const Mv=Se(Ov,[["render",Iv],["__file","VPToggleColorModeButton.vue"]]),$v=ae({__name:"VPToggleSidebarButton",emits:["toggle"],setup(e,{expose:t}){t();const{themeLocale:n}=He(),r={themeLocale:n};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Nv=["title"];function Hv(e,t,n,r,o,s){return V(),Z("div",{class:"vp-toggle-sidebar-button",title:r.themeLocale.toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:t[0]||(t[0]=i=>e.$emit("toggle"))},t[1]||(t[1]=[K("div",{class:"icon","aria-hidden":"true"},[K("span"),K("span"),K("span")],-1)]),8,Nv)}const Vv=Se($v,[["render",Hv],["__file","VPToggleSidebarButton.vue"]]),jv=ae({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=Ja("SearchBox")?Ql("SearchBox"):()=>null,{themeLocale:r}=He(),o=zs("navbar"),s=zs("navbar-brand"),i=Ve(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var m;const p=(m=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:m.getComputedStyle(u,null)[f],h=Number.parseInt(p,10);return Number.isNaN(h)?0:h};hc(ar.Mobile,u=>{var p;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((p=s.value)==null?void 0:p.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:tv,VPNavbarItems:gc,VPToggleColorModeButton:Mv,VPToggleSidebarButton:Vv};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Fv={ref:"navbar",class:"vp-navbar","vp-navbar":""},Bv={ref:"navbar-brand"};function Wv(e,t,n,r,o,s){return V(),Z("header",Fv,[oe(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),K("span",Bv,[oe(r.VPNavbarBrand)],512),K("div",{class:"vp-navbar-items-wrapper",style:An(r.linksWrapperStyle)},[xe(e.$slots,"before"),oe(r.VPNavbarItems,{class:"vp-hide-mobile"}),xe(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):De("",!0),oe(r.SearchBox)],4)],512)}const Uv=Se(jv,[["render",Wv],["__file","VPNavbar.vue"]]),Gv={},Kv={class:"edit-icon",viewBox:"0 0 1024 1024"};function qv(e,t){return V(),Z("svg",Kv,t[0]||(t[0]=[K("g",{fill:"currentColor"},[K("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),K("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})],-1)]))}const zv=Se(Gv,[["render",qv],["__file","VPEditIcon.vue"]]),Jv={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},Yv=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=pc(e);return n!==null?Jv[n]:null},Qv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=Yv({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,vr(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ka(`${Ta(n)}/${r}`)):null},Xv=()=>{const{frontmatter:e,page:t,themeLocale:n}=He();return R(()=>{if(!(e.value.editLink??n.value.editLink??!0))return null;const{repo:o,docsRepo:s=o,docsBranch:i="main",docsDir:l="",editLinkText:a}=n.value;if(!s)return null;const c=Qv({docsRepo:s,docsBranch:i,docsDir:l,filePathRelative:t.value.filePathRelative,editLinkPattern:e.value.editLinkPattern??n.value.editLinkPattern});return c?{text:a??"Edit this page",link:c}:null})},Zv=ae({__name:"VPPageMeta",setup(e,{expose:t}){t();const{frontmatter:n,themeLocale:r}=He(),o=ec(()=>n.value.contributors??r.value.contributors??!0),s=Xv(),i=tc(()=>n.value.lastUpdated??r.value.lastUpdated??!0),l={frontmatter:n,themeLocale:r,contributors:o,editLink:s,lastUpdated:i,VPAutoLink:Dn,VPEditIcon:zv};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),em={class:"vp-page-meta"},tm={key:0,class:"vp-meta-item edit-link"},nm={class:"vp-meta-item git-info"},rm={key:0,class:"vp-meta-item last-updated"},om={class:"meta-item-label"},sm=["datetime"],im={key:1,class:"vp-meta-item contributors"},lm={class:"meta-item-label"},am={class:"meta-item-info"},cm=["title"];function um(e,t,n,r,o,s){return V(),Z("footer",em,[r.editLink?(V(),Z("div",tm,[oe(r.VPAutoLink,{class:"label",config:r.editLink},{before:ke(()=>[oe(r.VPEditIcon)]),_:1},8,["config"])])):De("",!0),K("div",nm,[r.lastUpdated?(V(),Z("div",rm,[K("span",om,ue(r.themeLocale.lastUpdatedText??r.lastUpdated.locale)+": ",1),K("time",{class:"meta-item-info",datetime:r.lastUpdated.iso,"data-allow-mismatch":""},ue(r.lastUpdated.text),9,sm)])):De("",!0),r.contributors.length?(V(),Z("div",im,[K("span",lm,ue(r.themeLocale.contributorsText)+": ",1),K("span",am,[(V(!0),Z(be,null,At(r.contributors,(i,l)=>(V(),Z(be,{key:l},[K("span",{class:"contributor",title:`email: ${i.email}`},ue(i.name),9,cm),l!==r.contributors.length-1?(V(),Z(be,{key:0},[Gt(", ")],64)):De("",!0)],64))),128))])])):De("",!0)])])}const fm=Se(Zv,[["render",um],["__file","VPPageMeta.vue"]]),dm=()=>{const e=mr(),t=On();return n=>{n&&(Xa(n)?t.fullPath!==n&&e.push(n):gr(n)?window.open(n):e.push(encodeURI(n)))}},il=(e,t)=>e===!1?!1:dt(e)?Ln(e,t):vs(e)?{...e,link:Ln(e.link,t).link}:null,Yo=(e,t,n)=>{const r=e.findIndex(s=>s.link===t);if(r!==-1){const s=e[r+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Yo(s.children,t,n);if(i)return i}const o=e.findIndex(s=>"prefix"in s&&s.prefix===t);if(o!==-1){const s=e[o+n];return s?s.link?s:"prefix"in s&&!lr(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},pm=()=>{const{frontmatter:e,themeLocale:t}=He(),n=Hs(),r=Fa(),o=R(()=>{const i=il(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Yo(n.value,r.value,-1))}),s=R(()=>{const i=il(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Yo(n.value,r.value,1))});return{prevLink:o,nextLink:s}},hm=ae({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=dm(),{prevLink:o,nextLink:s}=pm(),i=R(()=>n.value.pageNavbarLabel??"page navigation");Fe("keydown",a=>{a.altKey&&(a.key==="ArrowRight"?s.value&&(r(s.value.link),a.preventDefault()):a.key==="ArrowLeft"&&o.value&&(r(o.value.link),a.preventDefault()))});const l={themeLocale:n,navigate:r,prevLink:o,nextLink:s,navbarLabel:i,VPAutoLink:Dn};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),gm=["aria-label"],vm={class:"hint"},mm={class:"link"},_m={class:"external-link"},bm={class:"hint"},ym={class:"link"},Sm={class:"external-link"};function wm(e,t,n,r,o,s){return r.prevLink||r.nextLink?(V(),Z("nav",{key:0,class:"vp-page-nav","aria-label":r.navbarLabel},[r.prevLink?(V(),Le(r.VPAutoLink,{key:0,class:"prev",config:r.prevLink},{default:ke(()=>[K("div",vm,[t[0]||(t[0]=K("span",{class:"arrow left"},null,-1)),Gt(" "+ue(r.themeLocale.prev??"Prev"),1)]),K("div",mm,[K("span",_m,ue(r.prevLink.text),1)])]),_:1},8,["config"])):De("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:ke(()=>[K("div",bm,[Gt(ue(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=K("span",{class:"arrow right"},null,-1))]),K("div",ym,[K("span",Sm,ue(r.nextLink.text),1)])]),_:1},8,["config"])):De("",!0)],8,gm)):De("",!0)}const Em=Se(hm,[["render",wm],["__file","VPPageNav.vue"]]),Pm=ae({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:fm,VPPageNav:Em,get Content(){return Es}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Cm={class:"vp-page"},xm={"vp-content":""};function Tm(e,t,n,r,o,s){return V(),Z("main",Cm,[xe(e.$slots,"top"),K("div",xm,[xe(e.$slots,"content-top"),oe(r.Content),xe(e.$slots,"content-bottom")]),oe(r.VPPageMeta),oe(r.VPPageNav),xe(e.$slots,"bottom")])}const km=Se(Pm,[["render",Tm],["__file","VPPage.vue"]]),ll=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Lm=(e,t)=>{if(t.hash===e)return!0;const n=ll(t.path),r=ll(e);return n===r},vc=(e,t)=>e.link&&Lm(e.link,t)?!0:"children"in e?e.children.some(n=>vc(n,t)):!1,Am=ae({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Nl(n),s=On(),i=mr(),l=R(()=>r.value.collapsible),a=R(()=>vc(r.value,s)),c=R(()=>({"vp-sidebar-item":!0,"vp-sidebar-heading":o.value===0,active:a.value,collapsible:l.value})),u=R(()=>l.value?a.value:!0),[f,p]=Ls(u.value),h=E=>{l.value&&(E.preventDefault(),p())},m=i.afterEach(()=>{fn(()=>{f.value=u.value})});us(()=>{m()});const y={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:p,onClick:h,unregisterRouterHook:m,VPAutoLink:Dn,VPDropdownTransition:fc};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}}),Rm={class:"vp-sidebar-children"};function Om(e,t,n,r,o,s){const i=Ql("VPSidebarItem",!0);return V(),Z("li",null,[r.item.link?(V(),Le(r.VPAutoLink,{key:0,class:Ke(r.itemClass),config:r.item},{after:ke(()=>[r.collapsible?(V(),Z("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):De("",!0)]),_:1},8,["class","config"])):(V(),Z("p",{key:1,tabindex:"0",class:Ke(r.itemClass),onClick:r.onClick,onKeydown:Jf(r.onClick,["enter"])},[Gt(ue(r.item.text)+" ",1),r.collapsible?(V(),Z("span",{key:0,class:Ke(["arrow",r.isOpen?"down":"right"])},null,2)):De("",!0)],34)),"children"in r.item&&r.item.children.length?(V(),Le(r.VPDropdownTransition,{key:2},{default:ke(()=>[Ur(K("ul",Rm,[(V(!0),Z(be,null,At(r.item.children,l=>(V(),Le(i,{key:`${r.depth}${l.text}${l.link}`,item:l,depth:r.depth+1},null,8,["item","depth"]))),128))],512),[[zr,r.isOpen]])]),_:1})):De("",!0)])}const Dm=Se(Am,[["render",Om],["__file","VPSidebarItem.vue"]]),Im=ae({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=On(),r=Hs();Ze(()=>{je(()=>n.hash,s=>{const i=document.querySelector(".vp-sidebar");if(!i)return;const l=document.querySelector(`.vp-sidebar .vp-sidebar-item.auto-link[href="${n.path}${s}"]`);if(!l)return;const{top:a,height:c}=i.getBoundingClientRect(),{top:u,height:f}=l.getBoundingClientRect();u<a?l.scrollIntoView(!0):u+f>a+c&&l.scrollIntoView(!1)})});const o={route:n,sidebarItems:r,VPSidebarItem:Dm};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),Mm={key:0,class:"vp-sidebar-items"};function $m(e,t,n,r,o,s){return r.sidebarItems.length?(V(),Z("ul",Mm,[(V(!0),Z(be,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):De("",!0)}const Nm=Se(Im,[["render",$m],["__file","VPSidebarItems.vue"]]),Hm=ae({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:gc,VPSidebarItems:Nm};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Vm={class:"vp-sidebar","vp-sidebar":""};function jm(e,t,n,r,o,s){return V(),Z("aside",Vm,[oe(r.VPNavbarItems),xe(e.$slots,"top"),oe(r.VPSidebarItems),xe(e.$slots,"bottom")])}const Fm=Se(Hm,[["render",jm],["__file","VPSidebar.vue"]]),Bm=ae({__name:"Layout",setup(e,{expose:t}){t();const{frontmatter:n,page:r,themeLocale:o}=He(),s=R(()=>n.value.navbar??o.value.navbar??!0),i=Hs(),l=Ve(!1),a=S=>{l.value=typeof S=="boolean"?S:!l.value},c={x:0,y:0},u=S=>{c.x=S.changedTouches[0].clientX,c.y=S.changedTouches[0].clientY},f=S=>{const v=S.changedTouches[0].clientX-c.x,_=S.changedTouches[0].clientY-c.y;Math.abs(v)>Math.abs(_)&&Math.abs(v)>40&&(v>0&&c.x<=80?a(!0):a(!1))},p=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),h=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":p.value},n.value.pageClass]);lo(()=>{a(!1)});const m=lc(),y=m.resolve,E=m.pending,w={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:p,containerClass:h,scrollPromise:m,onBeforeEnter:y,onBeforeLeave:E,VPFadeSlideYTransition:kg,VPHome:Qg,VPNavbar:Uv,VPPage:km,VPSidebar:Fm};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}});function Wm(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-theme-container",r.containerClass]),"vp-container":"",onTouchstart:r.onTouchStart,onTouchend:r.onTouchEnd},[xe(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:ke(()=>[xe(e.$slots,"navbar-before")]),after:ke(()=>[xe(e.$slots,"navbar-after")]),_:3})):De("",!0)]),K("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),xe(e.$slots,"sidebar",{},()=>[oe(r.VPSidebar,null,{top:ke(()=>[xe(e.$slots,"sidebar-top")]),bottom:ke(()=>[xe(e.$slots,"sidebar-bottom")]),_:3})]),xe(e.$slots,"page",{},()=>[oe(r.VPFadeSlideYTransition,{onBeforeEnter:r.onBeforeEnter,onBeforeLeave:r.onBeforeLeave},{default:ke(()=>[r.frontmatter.home?(V(),Le(r.VPHome,{key:0})):(V(),Le(r.VPPage,{key:r.page.path},{top:ke(()=>[xe(e.$slots,"page-top")]),"content-top":ke(()=>[xe(e.$slots,"page-content-top")]),"content-bottom":ke(()=>[xe(e.$slots,"page-content-bottom")]),bottom:ke(()=>[xe(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const mc=Se(Bm,[["render",Wm],["__file","Layout.vue"]]),Um=ae({__name:"NotFound",setup(e,{expose:t}){t();const{routeLocale:n,themeLocale:r}=He(),o=R(()=>r.value.notFound??["Not Found"]),s=()=>o.value[Math.floor(Math.random()*o.value.length)],i=R(()=>r.value.home??n.value),l=R(()=>r.value.backToHome??"Back to home"),a={routeLocale:n,themeLocale:r,messages:o,getMsg:s,homeLink:i,homeText:l,get RouteLink(){return ao}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),Gm={class:"vp-theme-container","vp-container":""},Km={class:"page"},qm={"vp-content":""};function zm(e,t,n,r,o,s){return V(),Z("div",Gm,[K("main",Km,[K("div",qm,[t[0]||(t[0]=K("h1",null,"404",-1)),K("blockquote",null,ue(r.getMsg()),1),oe(r.RouteLink,{to:r.homeLink},{default:ke(()=>[Gt(ue(r.homeText),1)]),_:1},8,["to"])])])])}const Jm=Se(Um,[["render",zm],["__scopeId","data-v-5421f896"],["__file","NotFound.vue"]]),Ym=It({enhance({app:e,router:t}){Ja("Badge")||e.component("Badge",Cg);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await lc().wait(),n(...r))},setup(){gg(),mg(),wg()},layouts:{Layout:mc,NotFound:Jm}}),Qm=Object.freeze(Object.defineProperty({__proto__:null,default:Ym},Symbol.toStringTag,{value:"Module"}));function Xm(e){return ts()?(_l(e),!0):!1}function Vs(e){return typeof e=="function"?e():Lt(e)}const Zm=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const e_=Object.prototype.toString,t_=e=>e_.call(e)==="[object Object]",n_=()=>{};function r_(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}const _c=e=>e();function o_(e=_c){const t=Ve(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:o}}function s_(e){return Jt()}function i_(e,t,n={}){const{eventFilter:r=_c,...o}=n;return je(e,r_(r,t),o)}function l_(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=o_(r);return{stop:i_(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function a_(e,t=!0,n){s_()?Ze(e,n):t?e():fn(e)}function c_(e){var t;const n=Vs(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Jr=Zm?window:void 0;function al(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=Jr):[t,n,r,o]=e,!t)return n_;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,p,h)=>(u.addEventListener(f,p,h),()=>u.removeEventListener(f,p,h)),a=je(()=>[c_(t),Vs(o)],([u,f])=>{if(i(),!u)return;const p=t_(f)?{...f}:f;s.push(...n.flatMap(h=>r.map(m=>l(u,h,m,p))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return Xm(c),c}const Rr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Or="__vueuse_ssr_handlers__",u_=f_();function f_(){return Or in Rr||(Rr[Or]=Rr[Or]||{}),Rr[Or]}function d_(e,t){return u_[e]||t}function p_(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const h_={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},cl="vueuse-storage";function g_(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:f=Jr,eventFilter:p,onError:h=T=>{console.error(T)},initOnMounted:m}=r,y=(u?ye:Ve)(typeof t=="function"?t():t);if(!n)try{n=d_("getDefaultStorage",()=>{var T;return(T=Jr)==null?void 0:T.localStorage})()}catch(T){h(T)}if(!n)return y;const E=Vs(t),w=p_(E),S=(o=r.serializer)!=null?o:h_[w],{pause:v,resume:_}=l_(y,()=>G(y.value),{flush:s,deep:i,eventFilter:p});f&&l&&a_(()=>{al(f,"storage",Q),al(f,cl,I),m&&Q()}),m||Q();function M(T,L){f&&f.dispatchEvent(new CustomEvent(cl,{detail:{key:e,oldValue:T,newValue:L,storageArea:n}}))}function G(T){try{const L=n.getItem(e);if(T==null)M(L,null),n.removeItem(e);else{const x=S.write(T);L!==x&&(n.setItem(e,x),M(L,x))}}catch(L){h(L)}}function D(T){const L=T?T.newValue:n.getItem(e);if(L==null)return a&&E!=null&&n.setItem(e,S.write(E)),E;if(!T&&c){const x=S.read(L);return typeof c=="function"?c(x,E):w==="object"&&!Array.isArray(x)?{...E,...x}:x}else return typeof L!="string"?L:S.read(L)}function Q(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){y.value=E;return}if(!(T&&T.key!==e)){v();try{(T==null?void 0:T.newValue)!==S.write(y.value)&&(y.value=D(T))}catch(L){h(L)}finally{T?fn(_):_()}}}}function I(T){Q(T.detail)}return y}function v_(e,t,n={}){const{window:r=Jr}=n;return g_(e,t,r==null?void 0:r.sessionStorage,n)}const m_=Object.entries;var __={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const b_=__;m_(b_.localeConfig);v_("VUEPRESS_REDIRECT_LOCALES",{});const y_=It({setup(){},rootComponents:[]}),S_=Object.freeze(Object.defineProperty({__proto__:null,default:y_},Symbol.toStringTag,{value:"Module"}));var le=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech&nbsp;lead",e.TeamLead="team&nbsp;lead",e.Developer="developer",e))(le||{}),de=(e=>(e.ActiveDeveloped="actively-developed",e.PassivelyMaintained="passively-maintained",e.AsIs="as-is",e.Experimental="experimental",e.LookingForMaintainer="looking-for-maintainer",e.Deprecated="deprecated",e))(de||{}),$=(e=>(e.C="C",e.Go="Go",e.JavaScript="JS",e.TypeScript="TS",e.Rust="Rust",e.Python="Python",e.Php="PHP",e.Deno="Deno",e.NodeJS="NodeJS",e.Flask="Flask",e.React="React",e.Antd="Antd",e.Postgresql="PostgreSQL",e.Docker="Docker",e.Drone="Drone CI",e.Woodpecker="Woodpecker CI",e.Bash="Bash",e.TreeSitter="TreeSitter",e.Nix="Nix",e.Lua="Lua",e.Sqlite="Sqlite",e.Vue="Vue",e.Vuepress="Vuepress",e.Godot="Godot",e.Haskell="Haskell",e))($||{});const w_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[le.Author],technologies:[$.Nix],startDate:new Date("2024-04-24"),status:de.ActiveDeveloped},{name:"picsg",url:"/pleshevskiy/picsg",description:"A tool for steganographing information in a picture encoded using the Vernam cipher.",roles:[le.Author],technologies:[$.Haskell],startDate:new Date("2024-04-13"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"Mindustry tools",url:"/pleshevskiy/mindustry-tools",description:"Tools for the Mindustry game",roles:[le.Author],technologies:[$.Nix,$.Godot],startDate:new Date("2024-01-07"),status:de.PassivelyMaintained},{name:"Master Progress Rosmintrud tools",url:"https://rosmintrud.masterprogress.ru",description:"Internal service to prepare documents for the rosmintrud (SPA)",roles:[le.TechLead],technologies:[$.Deno,$.Sqlite,$.TypeScript,$.Vue,$.Docker,$.Woodpecker,$.Nix],startDate:new Date("2023-07-03"),status:de.PassivelyMaintained},{name:"yandexgpt_tg_bot",url:"/pleshevskiy/yandexgpt_tg_bot",description:"The Telegram bot to describe article with link by YandexGPT.",roles:[le.Author],technologies:[$.JavaScript,$.NodeJS,$.Nix],startDate:new Date("2023-06-27"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"tree-sitter-plpgsql",url:"/pleshevskiy/tree-sitter-plpgsql",description:"plpgsql grammar for tree-sitter",roles:[le.Author],technologies:[$.C,$.JavaScript,$.TreeSitter,$.Nix],startDate:new Date("2023-01-05"),status:de.PassivelyMaintained},{name:"wd2",url:"/pleshevskiy/wd2",description:"A wrapper over d2 which allows to use additional configs from d2 file",roles:[le.Author],technologies:[$.Bash,$.Nix],startDate:new Date("2022-12-12"),endDate:new Date("2023-07-31"),status:de.AsIs},{name:"tree-sitter-d2",url:"/pleshevskiy/tree-sitter-d2",description:"d2 grammar for tree-sitter",roles:[le.Author],technologies:[$.C,$.JavaScript,$.TreeSitter,$.Nix],startDate:new Date("2022-12-04"),status:de.ActiveDeveloped},{name:"nix2lua",url:"/mynix/nix2lua",description:"This is a small but functional library that converts your nix configurations into lua format.",roles:[le.Author],technologies:[$.Nix,$.Lua],startDate:new Date("2022-11-22"),status:de.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-29"),status:de.PassivelyMaintained},{name:"estring",url:"/pleshevskiy/estring",description:"A simple way to parse a string using type annotations.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-23"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"enve",url:"/pleshevskiy/enve",description:"It helps you work with environment variables and convert it to any type using only type annotations",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-07-18"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"docker stack drone plugin",url:"/pleshevskiy/docker_stack",description:"Deploy to production using `docker stack deploy`",roles:[le.Author],technologies:[$.Docker,$.Drone,$.Woodpecker],startDate:new Date("2022-06-06"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"dexios",url:"/github/dexios",description:"Dexios is a fast, secure, and open source command-line encryption tool.",roles:[le.Collaborator],technologies:[$.Rust],startDate:new Date("2022-06-01"),endDate:new Date("2023-02-28")},{name:"recipes",url:"/pleshevskiy/recipes",description:"Site with recipes which cares about privacy",roles:[le.Author],technologies:[$.TypeScript,$.Deno,$.Rust],startDate:new Date("2022-05-04"),status:de.PassivelyMaintained},{name:"pleshevski.ru",url:"/pleshevskiy/pleshevski.ru",description:"Source code of my personal site",roles:[le.Author],technologies:[$.TypeScript,$.Vue,$.Vuepress,$.Nix],startDate:new Date("2022-03-16"),status:de.PassivelyMaintained},{name:"paren",url:"/pleshevskiy/paren",description:"Library for parsing and rendering information.",roles:[le.Author],technologies:[$.TypeScript,$.Deno],startDate:new Date("2022-03-14"),endDate:new Date("2024-07-25"),status:de.Experimental},{name:"hwt",url:"/pleshevskiy/hwt",description:"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2022-02-04"),endDate:new Date("2024-07-25"),status:de.AsIs},{name:"ood_persistence",url:"/pleshevskiy/ood_persistence",description:"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2021-10-12"),endDate:new Date("2021-10-21"),status:de.Deprecated},{name:"migra",url:"/pleshevskiy/migra",description:"Simple SQL migration manager for your project.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2021-01-31"),endDate:new Date("2022-03-17"),status:de.AsIs},{name:"espruino-starter",url:"/pleshevskiy/espruino-starter",description:"Quickly start creating your new project on the espruino board or a board based on it.",roles:[le.Author],technologies:[$.JavaScript],startDate:new Date("2021-08-23"),status:de.AsIs},{name:"react-rest-request",url:"/pleshevskiy/react-rest-request",description:"Minimalistic REST API client for React inspired by Apollo.",roles:[le.Author],technologies:[$.TypeScript,$.React],startDate:new Date("2020-10-04"),endDate:new Date("2023-03-02"),status:de.Deprecated},{name:"sonic-channel",url:"/pleshevskiy/sonic-channel",description:"Rust client for sonic search backend.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2020-07-18"),status:de.PassivelyMaintained},{name:"itconfig",url:"/pleshevskiy/itconfig",description:"Easy build a configs from environment variables and use it in globally.",roles:[le.Author],technologies:[$.Rust],startDate:new Date("2019-12-22"),endDate:new Date("2022-07-24"),status:de.Deprecated},{name:"it-fsm",url:"/pleshevskiy/it-fsm",description:"Simple full-featured finite state machine for your project",roles:[le.Author],technologies:[$.TypeScript,$.NodeJS,$.Deno],startDate:new Date("2019-10-11"),status:de.PassivelyMaintained},{name:"Cabinet Master Progress",url:"https://cabinet.masterprogress.ru",description:"Student's cabinet of the educational center Master Progress (SSR + SPA)",roles:[le.TechLead],technologies:[$.Python,$.Flask,$.Postgresql,$.TypeScript,$.React,$.Docker,$.Woodpecker,$.Nix],startDate:new Date("2019-09-22"),status:de.PassivelyMaintained},{name:"genrss",url:"/pleshevskiy/genrss",description:"RSS generator for python",roles:[le.Author],technologies:[$.Python],startDate:new Date("2019-07-23"),status:de.AsIs},{name:"marshmallow_pageinfo",url:"/pleshevskiy/marshmallow_pageinfo",description:"Page info marshmallow schema for api",roles:[le.Author],technologies:[$.Python],startDate:new Date("2019-10-05"),endDate:new Date("2023-03-02"),status:de.AsIs},{name:"Binary Management",url:"https://www.binarymanagement.com",description:"Project management tool for interior designers",roles:[le.Developer,le.TechLead,le.TeamLead],technologies:[$.TypeScript,$.NodeJS,$.React,$.Antd,$.Docker,$.Drone,$.Rust,$.Nix],startDate:new Date("2018-09-15"),status:de.ActiveDeveloped},{name:"Core Spirit",url:"https://corespirit.com",description:"Social platform focusing on human and planetary enhancement",roles:[le.Developer],technologies:[$.TypeScript,$.NodeJS,$.Go,$.Python,$.React,$.Docker,$.Drone],startDate:new Date("2018-09-05"),endDate:new Date("2019-12-31")},{name:"Master Progress",url:"https://masterprogress.ru",description:"Main website of the educational center Master Progress (SSR + Forms)",roles:[le.TechLead],technologies:[$.Python,$.Flask,$.JavaScript,$.Nix],startDate:new Date("2018-04-10"),status:de.PassivelyMaintained},{name:"ictmpl",url:"/pleshevskiy/ictmpl",description:"Generate projects from templates",roles:[le.Author],technologies:[$.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:de.AsIs}];function E_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const P_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),C_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:P_},Symbol.toStringTag,{value:"Module"}));function Fn(e){return(e==null?void 0:e.valueOf())??1/0}const x_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},T_=ae({...x_,setup(e,{expose:t}){t();const n=R(()=>w_.concat().sort((o,s)=>Fn(s.endDate)-Fn(o.endDate)||Fn(s.startDate)-Fn(o.startDate))),r={date2num:Fn,works:n,get renderDate(){return E_},get w(){return C_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),k_=["href"],L_=["innerHTML"],A_={key:0};function R_(e,t,n,r,o,s){return V(),Z("table",null,[K("thead",null,[K("tr",null,[K("th",null,ue(s.tableTheme.name),1),K("th",null,ue(s.tableTheme.description),1),K("th",null,ue(s.tableTheme.role),1),K("th",null,ue(s.tableTheme.technologies),1),K("th",null,ue(s.tableTheme.status),1),K("th",null,ue(s.tableTheme.dates),1)])]),K("tbody",null,[(V(!0),Z(be,null,At(r.works,i=>(V(),Z("tr",null,[K("td",null,[K("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},ue(i.name),9,k_)]),K("td",null,ue(i.description),1),K("td",{innerHTML:i.roles.join(", ")},null,8,L_),K("td",null,ue(i.technologies.join(", ")),1),K("td",null,ue(i.status),1),K("td",null,[K("div",null,[K("small",{class:Ke({grey:i.endDate})},ue(r.renderDate(i.startDate)),3)]),i.endDate?(V(),Z("div",A_,[K("small",null,ue(r.renderDate(i.endDate)),1)])):De("",!0)])]))),256))])])}const O_=Se(T_,[["render",R_],["__file","ChronologicalWorksTable.vue"]]),D_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:mc,get ChronologicalWorksTable(){return O_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},I_={class:"works-table-wrapper"};function M_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":ke(()=>[K("div",I_,[oe(r.ChronologicalWorksTable)])]),_:1})}const $_=Se(D_,[["render",M_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),N_=It({layouts:{WorksPage:$_}}),H_=Object.freeze(Object.defineProperty({__proto__:null,default:N_},Symbol.toStringTag,{value:"Module"})),Dr=[bh,Lh,Mh,Nh,Kh,Xh,tg,lg,pg,Qm,S_,H_].map(e=>e.default).filter(Boolean),V_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Wn=ye(V_),j_=Kd,F_=()=>{const e=mp({history:j_(Ta("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{if(t.path!==n.path||n===Ct){const r=lr(t.fullPath);if(r.path!==t.fullPath)return r.path;const o=await r.loader();t.meta={...r.meta,_pageChunk:o}}else t.path===n.path&&(t.meta=n.meta)}),e},B_=e=>{e.component("ClientOnly",ws),e.component("Content",Es),e.component("RouteLink",ao)},W_=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=$l((E,w)=>({get(){return E(),t.currentRoute.value.meta._pageChunk},set(S){t.currentRoute.value.meta._pageChunk=S,w()}})),s=R(()=>Zt.resolveLayouts(n)),i=R(()=>Zt.resolveRouteLocale(Wn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Wn.value,i.value)),a=R(()=>o.value.comp),c=R(()=>o.value.data),u=R(()=>c.value.frontmatter),f=R(()=>Zt.resolvePageHeadTitle(c.value,l.value)),p=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),h=R(()=>Zt.resolvePageLang(c.value,l.value)),m=R(()=>Zt.resolvePageLayout(c.value,s.value)),y={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:p,pageHeadTitle:f,pageLang:h,pageLayout:m,redirects:Jo,routeLocale:i,routePath:r,routes:En,siteData:Wn,siteLocaleData:l};return e.provide(bs,y),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>p.value},$headTitle:{get:()=>f.value},$lang:{get:()=>h.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Wn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>Ps}}),y},U_=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>dt(a)?`[${l}=${JSON.stringify(a)}]`:a?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)??null},G_=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return vs(t)&&Object.entries(t).forEach(([o,s])=>{dt(s)?r.setAttribute(o,s):s&&r.setAttribute(o,"")}),dt(n)&&r.appendChild(document.createTextNode(n)),r},K_=()=>{const e=yp(),t=Ss();let n=[];const r=()=>{e.value.forEach(i=>{const l=U_(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=G_(l);a&&i.push(a)}),i},s=()=>{document.documentElement.lang=t.value;const i=o();n.forEach((l,a)=>{const c=i.findIndex(u=>l.isEqualNode(u));c===-1?(l.remove(),delete n[a]):i.splice(c,1)}),i.forEach(l=>document.head.appendChild(l)),n=[...n.filter(l=>!!l),...i]};Wt(Cp,s),Ze(()=>{r(),je(e,s,{immediate:!1})})},q_=Xf,z_=async()=>{var n;const e=q_({name:"Vuepress",setup(){var s;K_();for(const i of Dr)(s=i.setup)==null||s.call(i);const r=Dr.flatMap(({rootComponents:i=[]})=>i.map(l=>q(l))),o=Sp();return()=>[q(o.value),r]}}),t=F_();B_(e),W_(e,t,Dr);for(const r of Dr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Wn}));return e.use(t),{app:e,router:t}};z_().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Se as _,K as a,Gt as b,Z as c,z_ as createVueApp,oe as d,df as e,V as o,Ql as r,ke as w};
 function __vite__mapDeps(indexes) {
   if (!__vite__mapDeps.viteFileDeps) {
     __vite__mapDeps.viteFileDeps = []
diff --git a/assets/index.html-Woighx2z.js b/assets/index.html-B992a44K.js
similarity index 99%
rename from assets/index.html-Woighx2z.js
rename to assets/index.html-B992a44K.js
index 6cffc94..df50779 100644
--- a/assets/index.html-Woighx2z.js
+++ b/assets/index.html-B992a44K.js
@@ -1 +1 @@
-import{_ as s,c as t,a as r,b as i,d as l,w as o,e as d,r as c,o as n}from"./app-tk-nPD_r.js";const h={};function m(p,e){const a=c("RouteLink");return n(),t("div",null,[r("p",null,[e[1]||(e[1]=i("Always up-to-date link to ")),l(a,{to:"/eng/"},{default:o(()=>e[0]||(e[0]=[i("resume")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=d('<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>As an open-source development enthusiast, I am always ready to collaborate and participate in exciting projects. I am inspired by the opportunity to contribute to the community and share knowledge. The core technologies I work with include <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, and <code>Docker</code>. I have a particular passion for functional programming, which enables writing clean and efficient code. As a NixOS evangelist, I not only actively use it in my projects but also promote its adoption among individuals and companies, highlighting its advantages and assisting in its implementation within their infrastructure. My extensive experience in backend and frontend development, as well as in DevOps, allows me to tackle complex challenges effectively. Additionally, I have expertise as an architect, team leader, and mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul>',30))])}const y=s(h,[["render",m],["__file","index.html.vue"]]),f=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2025-03-12T12:50:22.000Z"}],["meta",{"property":"article:modified_time","content":"2025-03-12T12:50:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1741783822000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":22},{"name":"janabhumi","username":"","email":"dmitriy@ideascup.me","commits":1}],"changelog":[{"hash":"d657ca6492a1b8094e206836441fc5baa76cc661","time":1741783822000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update bio"},{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","time":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","time":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","time":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","time":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","time":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","time":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","time":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","time":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","time":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","time":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","time":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","time":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","time":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","time":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","time":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","time":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","time":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","time":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","time":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","time":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"eng/index.md"}');export{y as comp,f as data};
+import{_ as s,c as t,a as r,b as i,d as l,w as o,e as d,r as c,o as n}from"./app-DZpkSsji.js";const h={};function m(p,e){const a=c("RouteLink");return n(),t("div",null,[r("p",null,[e[1]||(e[1]=i("Always up-to-date link to ")),l(a,{to:"/eng/"},{default:o(()=>e[0]||(e[0]=[i("resume")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=d('<h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>As an open-source development enthusiast, I am always ready to collaborate and participate in exciting projects. I am inspired by the opportunity to contribute to the community and share knowledge. The core technologies I work with include <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, and <code>Docker</code>. I have a particular passion for functional programming, which enables writing clean and efficient code. As a NixOS evangelist, I not only actively use it in my projects but also promote its adoption among individuals and companies, highlighting its advantages and assisting in its implementation within their infrastructure. My extensive experience in backend and frontend development, as well as in DevOps, allows me to tackle complex challenges effectively. Additionally, I have expertise as an architect, team leader, and mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul>',30))])}const y=s(h,[["render",m],["__file","index.html.vue"]]),f=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2025-03-12T12:50:22.000Z"}],["meta",{"property":"article:modified_time","content":"2025-03-12T12:50:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1741783822000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":22},{"name":"janabhumi","username":"","email":"dmitriy@ideascup.me","commits":1}],"changelog":[{"hash":"d657ca6492a1b8094e206836441fc5baa76cc661","time":1741783822000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update bio"},{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","time":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","time":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","time":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","time":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","time":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","time":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","time":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","time":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","time":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","time":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","time":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","time":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","time":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","time":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","time":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","time":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","time":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","time":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","time":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","time":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"eng/index.md"}');export{y as comp,f as data};
diff --git a/assets/index.html-UKCz4hfb.js b/assets/index.html-CmmWOU6g.js
similarity index 99%
rename from assets/index.html-UKCz4hfb.js
rename to assets/index.html-CmmWOU6g.js
index 5b9d9fb..5954718 100644
--- a/assets/index.html-UKCz4hfb.js
+++ b/assets/index.html-CmmWOU6g.js
@@ -1 +1 @@
-import{_ as s,c as t,a as l,b as i,d,w as r,e as o,r as c,o as h}from"./app-tk-nPD_r.js";const m={};function n(p,e){const a=c("RouteLink");return h(),t("div",null,[l("p",null,[e[1]||(e[1]=i("Всегда актуальная ссылка на ")),d(a,{to:"/"},{default:r(()=>e[0]||(e[0]=[i("резюме")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=o('<h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Как энтузиаст open-source разработки, я всегда готов к сотрудничеству и участию в интересных проектах. Меня вдохновляет возможность вносить вклад в сообщество и делиться знаниями. Основные технологии, с которыми я работаю, включают <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, <code>Docker</code>. Особенно люблю функциональное программирование, которое позволяет писать чистый и эффективный код. Как евангелист <code>NixOS</code>, я не только активно использую его в своих проектах, но и активно агитирую людей и компании переходить на эту систему, подчеркивая ее преимущества и помогая внедрять ее в их инфраструктуру. Большой опыт в разработке backend и frontend приложений, а также в DevOps, позволяет эффективно решать сложные задачи. Также имею опыт работы в качестве архитектора, руководителя команды и наставника.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul>',30))])}const f=s(m,[["render",n],["__file","index.html.vue"]]),b=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2025-03-12T12:50:22.000Z"}],["meta",{"property":"article:modified_time","content":"2025-03-12T12:50:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1741783822000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":22},{"name":"janabhumi","username":"","email":"dmitriy@ideascup.me","commits":1}],"changelog":[{"hash":"d657ca6492a1b8094e206836441fc5baa76cc661","time":1741783822000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update bio"},{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","time":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","time":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","time":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","time":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","time":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","time":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","time":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","time":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","time":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","time":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","time":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","time":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","time":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","time":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","time":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","time":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","time":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","time":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","time":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","time":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"index.md"}');export{f as comp,b as data};
+import{_ as s,c as t,a as l,b as i,d,w as r,e as o,r as c,o as h}from"./app-DZpkSsji.js";const m={};function n(p,e){const a=c("RouteLink");return h(),t("div",null,[l("p",null,[e[1]||(e[1]=i("Всегда актуальная ссылка на ")),d(a,{to:"/"},{default:r(()=>e[0]||(e[0]=[i("резюме")])),_:1}),e[2]||(e[2]=i("."))]),e[3]||(e[3]=o('<h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Как энтузиаст open-source разработки, я всегда готов к сотрудничеству и участию в интересных проектах. Меня вдохновляет возможность вносить вклад в сообщество и делиться знаниями. Основные технологии, с которыми я работаю, включают <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, <code>Docker</code>. Особенно люблю функциональное программирование, которое позволяет писать чистый и эффективный код. Как евангелист <code>NixOS</code>, я не только активно использую его в своих проектах, но и активно агитирую людей и компании переходить на эту систему, подчеркивая ее преимущества и помогая внедрять ее в их инфраструктуру. Большой опыт в разработке backend и frontend приложений, а также в DevOps, позволяет эффективно решать сложные задачи. Также имею опыт работы в качестве архитектора, руководителя команды и наставника.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul>',30))])}const f=s(m,[["render",n],["__file","index.html.vue"]]),b=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2025-03-12T12:50:22.000Z"}],["meta",{"property":"article:modified_time","content":"2025-03-12T12:50:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1741783822000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":22},{"name":"janabhumi","username":"","email":"dmitriy@ideascup.me","commits":1}],"changelog":[{"hash":"d657ca6492a1b8094e206836441fc5baa76cc661","time":1741783822000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update bio"},{"hash":"5136f457f1e20e7ca72115f5ff1ddc4862901732","time":1725574311000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"return simplex chat to the contacts"},{"hash":"506521107df025dfffc21a3660e2e7771d4f9e8e","time":1723016198000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update comment"},{"hash":"54e24de6034cb61e2ca074f2a9c8753cba521fd2","time":1722988324000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"rename gitea to forgejo"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"ba2fb4f95d14e5838b01ae27ee4e68dac4dc71f9","time":1721863623000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update resume"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"ddd2ff6d06efd2db9112cb2b99636c2179d929cd","time":1687213302000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change email"},{"hash":"2b427b8ae1f887f104677f57e90cf58c1571057b","time":1679300440000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add simplex address"},{"hash":"76c1027ab3308026296083278e963b34613d83ee","time":1678887571000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix: link to resume for each lang"},{"hash":"e2343b7c909476edc56263546fa94d5a1040f3a4","time":1678886389000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add devops"},{"hash":"95ecb0c8f1d3a9fbcbac0883b0373ea378db2537","time":1678885666000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: add stack"},{"hash":"22a7e2743e4ec4ca8ad8918827c443aea7fdb0cc","time":1678884672000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"about: change overview"},{"hash":"189e09f12c40cb084a03661b3a58acea726fb403","time":1677744320000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move all repositories to my gitea"},{"hash":"4d0b59f2c3c9701ec72fce8bd2e7756c59314516","time":1675383475000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"chore: increment exp"},{"hash":"0ae4bc6e024d705815a68df261dfffd0c370d80c","time":1665734716000,"email":"dmitriy@ideascup.me","author":"janabhumi","message":"page/about: change primary email address"},{"hash":"3c455bd530bab2229ba19d5c1bc663d4f129975c","time":1659608763000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"ui(page/about): add matrix to the contacts"},{"hash":"ddbe5d7ade289ccd2a1313833f0f31b3efab3a13","time":1655800801000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"restructure about page"},{"hash":"c039d82aed4b06a64a3a485d41ee1e24bdbea8f7","time":1655759267000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add overview header"},{"hash":"7107e9985886b60acfa6224af1d85010f162cfaa","time":1655759063000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add solid word to skills"},{"hash":"917fc7c766d7820db25517e580932399eba9faac","time":1655758881000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change about page"},{"hash":"e2cc5b2a2bbef168a7bb7b9621c7f16fca44c56b","time":1655500126000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"change page data"},{"hash":"d36bf0798f05bef2cd636b3360f49595810b26c8","time":1655156602000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"fixup: remove ignoring data folder"}]},"filePathRelative":"index.md"}');export{f as comp,b as data};
diff --git a/assets/style-CVjY3BV_.css b/assets/style-0okUxGr0.css
similarity index 99%
rename from assets/style-CVjY3BV_.css
rename to assets/style-0okUxGr0.css
index cc5dc1a..10b2d07 100644
--- a/assets/style-CVjY3BV_.css
+++ b/assets/style-0okUxGr0.css
@@ -1 +1 @@
-.vp-back-to-top-button{position:fixed!important;inset-inline-end:1rem;bottom:4rem;z-index:100;width:48px;height:48px;padding:12px;border-width:0;border-radius:50%;background:var(--back-to-top-c-bg);color:var(--back-to-top-c-accent-bg);box-shadow:2px 2px 10px 4px var(--back-to-top-c-shadow);cursor:pointer}@media (max-width: 959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-c-accent-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:24px;height:24px;margin:0 auto;background:var(--back-to-top-c-icon);-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;inset-inline-end:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--back-to-top-z-index: 5;--back-to-top-icon: url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='4'%20d='M24.008%2014.1V42M12%2026l12-12l12%2012M12%206h24'%20/%3e%3c/svg%3e");--back-to-top-c-bg: var(--vp-c-bg);--back-to-top-c-accent-bg: var(--vp-c-accent-bg);--back-to-top-c-accent-hover: var(--vp-c-accent-hover);--back-to-top-c-shadow: var(--vp-c-shadow);--back-to-top-c-icon: currentcolor}:root{--message-offset: calc(var(--vp-header-offset, 3.6rem) + 1rem);--message-timing-duration: .3s;--message-timing-function: ease-in-out;--message-gap: .5rem}@keyframes message-move-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes message-move-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}#message-container{position:fixed;inset:var(--message-offset) 0 auto;z-index:75;display:flex;flex-flow:column;gap:var(--message-gap);align-items:center;text-align:center}.message-item{display:inline-block;padding:8px 10px;border-radius:3px;background:var(--vp-c-bg);color:var(--vp-c-text);box-shadow:0 0 10px 0 var(--vp-c-shadow);font-size:14px}.message-item.move-in{animation:message-move-in var(--message-timing-duration) var(--message-timing-function)}.message-item.move-out{animation:message-move-out var(--message-timing-duration) var(--message-timing-function);animation-fill-mode:forwards}.message-item svg{position:relative;bottom:-.125em;margin-inline-end:5px}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:#0000;outline:none;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button:before{content:"";display:inline-block;width:1.25rem;height:1.25rem;padding:.625rem;background:currentcolor;color:var(--copy-code-c-text);font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.vp-copy-code-button:focus,.vp-copy-code-button.copied{opacity:1}.vp-copy-code-button:hover,.vp-copy-code-button.copied{background:var(--copy-code-c-hover)}.vp-copy-code-button.copied:before{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--copy-code-c-hover);color:var(--copy-code-c-text);font-weight:500;line-height:1.25rem;white-space:nowrap}.no-copy-code .vp-copy-code-button{display:none}body:not(.no-copy-code) div[class*=language-]:hover:before{display:none}body:not(.no-copy-code) div[class*=language-]:hover .vp-copy-code-button{opacity:1}:root{--code-copy-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2' /%3e%3c/svg%3e");--code-copied-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4' /%3e%3c/svg%3e");--copy-code-c-text: var(--code-c-line-number);--copy-code-c-hover: var(--code-c-highlight-bg)}.hint-container{position:relative;background:var(--hint-c-soft);transition:background var(--vp-t-color),color var(--vp-t-color)}@media print{.hint-container{page-break-inside:avoid}}.hint-container>.hint-container-title{color:var(--hint-c-title)}.hint-container :not(pre)>code{background:var(--hint-c-soft)}.hint-container .hint-container-title{position:relative;margin-block:.75em;font-weight:600;line-height:1.25}.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{margin-block:.75rem;padding:.25em 1em;border-radius:.5em;color:inherit;font-size:var(--hint-font-size)}@media print{.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{border-inline-start-width:.25em;border-inline-start-style:solid}}.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:1.75em}@media print{.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:0}}.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{content:" ";position:absolute;inset-inline-start:0;top:calc(50% - .6125em);width:1.25em;height:1.25em;font-size:1.25em}@media print{.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{display:none}}.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.caution p{line-height:1.5}.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.caution a{color:var(--vp-c-accent)}.hint-container.important{--hint-c-accent: var(--important-c-accent);--hint-c-title: var(--important-c-text);--hint-c-soft: var(--important-c-soft)}.hint-container.important>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.info{--hint-c-accent: var(--info-c-accent);--hint-c-title: var(--info-c-text);--hint-c-soft: var(--info-c-soft)}.hint-container.info>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.note{--hint-c-accent: var(--note-c-accent);--hint-c-title: var(--note-c-text);--hint-c-soft: var(--note-c-soft)}.hint-container.note>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.tip{--hint-c-accent: var(--tip-c-accent);--hint-c-title: var(--tip-c-text);--hint-c-soft: var(--tip-c-soft)}.hint-container.tip>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.warning{--hint-c-accent: var(--warning-c-accent);--hint-c-title: var(--warning-c-text);--hint-c-soft: var(--warning-c-soft)}.hint-container.warning>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.caution{--hint-c-accent: var(--caution-c-accent);--hint-c-title: var(--caution-c-text);--hint-c-soft: var(--caution-c-soft)}.hint-container.caution>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.details{position:relative;display:block;margin-block:.75rem;padding:1.25rem 1rem;border-radius:.5rem;background:var(--detail-c-bg);transition:background var(--vp-t-transform),color var(--vp-t-transform)}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-c-accent)}.hint-container.details :not(pre)>code{background:var(--detail-c-soft)}.hint-container.details summary{position:relative;margin:-1rem;padding-block:1em;padding-inline:3em 1.5em;list-style:none;font-size:var(--hint-font-size);cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:#0000;font-size:0}.hint-container.details summary:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:" ";position:absolute;inset-inline-start:.8em;top:calc(50% - .5em);width:1em;height:1em;font-size:1.25rem;line-height:normal;transition:color,var(--vp-t-color),transform var(--vp-t-transform);transform:rotate(90deg)}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:before{transform:rotate(180deg)}:root{--hint-font-size: .92rem;--important-c-accent: var(--vp-c-purple-bg);--important-c-text: var(--vp-c-purple-text);--important-c-soft: var(--vp-c-purple-soft);--info-c-accent: var(--vp-c-blue-bg);--info-c-text: var(--vp-c-blue-text);--info-c-soft: var(--vp-c-blue-soft);--note-c-accent: var(--vp-c-grey-bg);--note-c-text: var(--vp-c-grey-text);--note-c-soft: var(--vp-c-grey-soft);--tip-c-accent: var(--vp-c-green-bg);--tip-c-text: var(--vp-c-green-text);--tip-c-soft: var(--vp-c-green-soft);--warning-c-accent: var(--vp-c-yellow-bg);--warning-c-text: var(--vp-c-yellow-text);--warning-c-soft: var(--vp-c-yellow-soft);--caution-c-accent: var(--vp-c-red-bg);--caution-c-text: var(--vp-c-red-text);--caution-c-soft: var(--vp-c-red-soft);--detail-c-bg: var(--vp-c-control);--detail-c-icon: var(--vp-c-border);--detail-c-soft: var(--vp-c-grey-soft)}.vp-contributors{display:flex;flex-wrap:wrap;gap:1rem;align-items:center;justify-content:flex-start;margin:1rem 0}.vp-contributor{display:flex;gap:.25rem;align-items:center;color:inherit;font-size:1.125rem}.vp-contributor:after{display:none!important}.vp-contributor-avatar{-o-object-fit:contain;object-fit:contain;width:1.75rem;height:1.75rem;margin-inline-end:.25rem;border-radius:50%}a.vp-contributor{text-decoration:none!important}:root{--changelog-bg: var(--vp-c-bg-alt);--changelog-font-size: .875rem;--changelog-c-text: var(--vp-c-text)}.vp-changelog-wrapper{margin-block:1rem;padding-inline:1rem;border-radius:8px;background-color:var(--changelog-bg);color:var(--changelog-c-text);font-size:var(--changelog-font-size);line-height:1.7;transition:background-color var(--vp-t-color)}.vp-changelog-wrapper.active{padding-block:0 .5rem}.vp-changelog-wrapper a{text-decoration:none!important}.vp-changelog-wrapper a:after{display:none!important}.vp-changelog-header{display:flex;align-items:center;justify-content:space-between;padding-block:1rem;font-weight:700;cursor:pointer}@media (max-width: 419px){.vp-changelog-header{flex-wrap:wrap}}.vp-changelog-wrapper.active .vp-changelog-header{padding-block-end:.5rem}.vp-changelog-icon,.vp-changelog-menu-icon{display:inline-block;vertical-align:middle;width:1.2em;height:1.2em;margin-inline-end:4px;background-color:currentcolor;color:var(--vp-c-text-mute);-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;transition:color var(--vp-t-color);transform:translateY(-1px)}.vp-changelog-icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' d='M2.71 10.96a6.5 6.5 0 1 0-.69-3.53M2 8l1.5-1.5M2 8L.5 6.5m8 2v-4m0 4h3'/%3E%3C/svg%3E")}.vp-changelog-menu-icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M4 5h0.01'/%3E%3Cpath d='M8 5h12'/%3E%3Cpath d='M4 10h0.01'/%3E%3Cpath d='M8 10h12'/%3E%3Cpath d='M4 15h0.01'/%3E%3Cpath d='M8 15h12'/%3E%3Cpath d='M4 20h0.01'/%3E%3Cpath d='M8 20h12'/%3E%3C/g%3E%3C/svg%3E")}.vp-changelog-list{display:none;margin-block:.5rem;padding-inline-start:0;list-style:none}.vp-changelog-wrapper.active .vp-changelog-list{display:block}.vp-changelog-item-tag,.vp-changelog-item-commit{position:relative;margin-block-start:8px;padding-inline-start:20px}.vp-changelog-item-tag:first-child,.vp-changelog-item-commit:first-child{margin-block-start:0}.vp-changelog-item-tag:before,.vp-changelog-item-commit:before{content:"";position:absolute;top:3px;left:0;display:inline-block;width:1.25em;height:1.25em;background-color:currentcolor;color:var(--vp-c-text-subtle);-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;transition:color var(--vp-t-color)}.vp-changelog-item-commit:before{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12a3 3 0 1 0 6 0a3 3 0 1 0-6 0m3-9v6m0 6v6'/%3E%3C/svg%3E")}.vp-changelog-item-tag:before{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0'/%3E%3Cpath d='M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592-5.592a2.41 2.41 0 0 0 0-3.408l-7.71-7.71A2 2 0 0 0 11.172 3H6a3 3 0 0 0-3 3'/%3E%3C/g%3E%3C/svg%3E")}.vp-changelog-tag{margin-inline-end:4px;text-decoration:none}.vp-changelog-tag code{font-weight:500;font-size:14px}.vp-changelog-hash{margin-inline-end:4px;text-decoration:none}.vp-changelog-divider{margin-inline-end:8px}.vp-changelog-message{margin-inline-end:8px;line-height:1.7}.vp-changelog-date{color:var(--vp-c-text-subtle);font-size:.75rem;transition:color var(--vp-t-color)}:root{--nprogress-c: var(--vp-c-accent);--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{position:fixed;top:0;left:0;z-index:var(--nprogress-z-index);width:100%;height:2px;background:var(--nprogress-c)}:root{--code-padding-x: 1.25rem;--code-padding-y: 1rem;--code-border-radius: 6px;--code-line-height: 1.6;--code-font-size: .875em;--code-font-family: consolas, monaco, "Andale Mono", "Ubuntu Mono", monospace}div[class*=language-]{position:relative;border-radius:var(--code-border-radius);background-color:var(--code-c-bg)}div[class*=language-]:before{content:attr(data-ext);position:absolute;top:.8em;right:1em;z-index:3;color:var(--code-c-text);font-size:.75rem}div[class*=language-] pre{position:relative;z-index:1;overflow-x:auto;margin:0;border-radius:var(--code-border-radius);font-size:var(--code-font-size);font-family:var(--code-font-family);line-height:var(--code-line-height)}div[class*=language-] pre code{display:block;box-sizing:border-box;width:-moz-fit-content;width:fit-content;min-width:100%;padding:var(--code-padding-y) var(--code-padding-x);background-color:#0000!important;color:var(--code-c-text);overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--code-c-text: #f8f8f2;--code-c-bg: #2e3440;--code-c-highlight-bg: rgb(51.6454545455, 60.5484848485, 78.3545454545);--code-c-line-number: rgba(248, 248, 242, .67)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a3be8c}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#81a1c1}.token.atrule,.token.attr-value,.token.function,.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,.token.important{color:#ebcb8b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--code-line-number-width: 3rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-line-number-width);height:100%;border-right:1px solid var(--code-c-highlight-bg, var(--code-c-text));border-radius:var(--code-border-radius) 0 0 var(--code-border-radius);transition:border var(--vp-t-color)}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--code-line-number-width)}div[class*=language-].line-numbers-mode code{padding-left:1rem}div[class*=language-].line-numbers-mode .line-numbers{counter-reset:line-number;position:absolute;top:0;left:0;width:var(--code-line-number-width);padding-top:var(--code-padding-y);color:var(--code-c-line-number, var(--code-c-text));font-size:var(--code-font-size);line-height:var(--code-line-height);text-align:center}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:3;font-family:var(--code-font-family);-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);counter-increment:line-number}div[class*=language-] .line.highlighted{display:inline-block;width:100%;margin:0 calc(-1*var(--code-padding-x));padding:0 var(--code-padding-x);background-color:var(--code-c-highlight-bg)}@property --vp-collapsed-lines-bg{inherits:false;initial-value:#fff;syntax:"<color>"}@keyframes code-collapsed-lines{0%{opacity:.3;transform:translateY(-2px) rotate(var(--vp-collapsed-lines-rotate))}to{opacity:1;transform:translateY(2px) rotate(var(--vp-collapsed-lines-rotate))}}div[class*=language-].has-collapsed-lines .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg);--vp-collapsed-lines-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='m18 12l-6 6l-6-6m12-6l-6 6l-6-6'/%3E%3C/svg%3E");--vp-collapsed-lines-rotate: 0deg;position:absolute;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;height:28px;background:linear-gradient(to bottom,transparent 0%,var(--vp-collapsed-lines-bg) 55%,var(--vp-collapsed-lines-bg) 100%);cursor:pointer;transition:--vp-collapsed-lines-bg var(--vp-t-color)}div[class*=language-].has-collapsed-lines .collapsed-lines:hover{--vp-collapsed-lines-bg: var(--code-c-highlight-bg)}div[class*=language-].has-collapsed-lines .collapsed-lines:before{content:"";display:inline-block;width:24px;height:24px;background-color:var(--code-c-text);-webkit-mask-image:var(--vp-collapsed-lines-icon);mask-image:var(--vp-collapsed-lines-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:20px;mask-size:20px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;animation:code-collapsed-lines 1.2s infinite alternate-reverse ease-in-out}div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-light-bg))}[data-theme=dark] div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-dark-bg))}div[class*=language-].has-collapsed-lines.collapsed{overflow-y:hidden;height:calc(var(--vp-collapsed-lines)*var(--code-line-height)*var(--code-font-size) + var(--code-padding-y) + 28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) code{padding-bottom:max(var(--code-padding-y),28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines{--vp-collapsed-lines-rotate: 180deg}:root{--code-title-c-text: var(--vp-c-text-mute);--code-title-c-bg: var(--code-c-bg);--code-title-divider: var(--code-c-highlight-bg, var(--code-c-text))}.code-block-title div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}.code-block-title .code-block-title-bar{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0 12px;border-bottom:solid 1px var(--code-title-divider);border-radius:6px 6px 0 0;background:var(--code-title-c-bg);white-space:nowrap;transition:background var(--vp-t-color)}@media (max-width: 419px){.code-block-title .code-block-title-bar{margin:.75rem -1.5rem -.75rem;border-radius:0}}.code-block-title .code-block-title-bar .title{position:relative;display:inline-block;margin:0;padding:8px 12px;color:var(--code-title-c-text);font-weight:500;font-size:.875em;line-height:1.7;transition:background var(--vp-t-color)}.vp-code-tabs-nav{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-c-bg);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{position:relative;min-width:3rem;margin:0;padding:6px 12px;border-width:0;border-radius:6px 6px 0 0;background:#0000;color:var(--code-tabs-c-text);font-weight:600;font-size:.875em;line-height:1.4;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-code-tab-nav:hover{background:var(--code-tabs-c-hover)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-c-bg, var(--vp-c-bg-alt))}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav:first-child:before{display:none}[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.75rem -1.5rem;border-radius:0}}.vp-code-tab div[class*=language-].line-numbers-mode:after{border-top-left-radius:0}.vp-code-tab div[class*=language-] pre{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-] pre{border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.vp-tabs{margin:1.5rem 0;border:1px solid var(--vp-c-border);border-radius:8px}@media (max-width: 419px){[vp-content]>.vp-tabs{margin-inline:-1.5rem;border:none;border-bottom:1px solid var(--vp-c-border);border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:.5rem .5rem 0 0;background:var(--tab-c-bg-nav);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{position:relative;min-width:4rem;margin:0;padding:.5em 1em;border:none;border-radius:.5rem .5rem 0 0;background:#0000;color:var(--tab-c-nav);font-weight:600;font-size:.875em;line-height:1.75;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-tab-nav:hover{background:var(--tab-c-bg-nav-hover)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-c-bg)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;border-radius:0 0 .5rem .5rem;background:var(--tab-c-bg);transition:background var(--vp-t-color)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(n+2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-c-border);font-weight:500}@media print{.vp-tab-title{display:block}}:root{--code-tabs-c-text: var(--code-c-text);--code-tabs-c-bg: var(--code-c-highlight-bg);--code-tabs-c-hover: var(--code-c-bg, var(--vp-c-bg-alt));--tab-c-bg: var(--vp-c-bg);--tab-c-nav: var(--vp-c-text);--tab-c-bg-nav: var(--vp-c-grey-bg);--tab-c-bg-nav-hover: var(--vp-c-control-hover)}.vp-badge{display:inline-block;vertical-align:top;height:1.3em;padding:0 6px;border-radius:3px;background:var(--vp-c-accent-soft);color:var(--vp-c-accent);font-size:.875em;line-height:1.3;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-badge+.vp-badge{margin-inline-start:5px}.vp-badge.tip{background:var(--badge-c-tip-bg);color:var(--badge-c-tip-text)}.vp-badge.warning{background:var(--badge-c-warning-bg);color:var(--badge-c-warning-text)}.vp-badge.danger{background:var(--badge-c-danger-bg);color:var(--badge-c-danger-text)}.vp-badge.important{background:var(--badge-c-important-bg);color:var(--badge-c-important-text)}.vp-badge.info{background:var(--badge-c-info-bg);color:var(--badge-c-info-text)}.vp-badge.note{background:var(--badge-c-note-bg);color:var(--badge-c-note-text)}.vp-fade-slide-y-enter-active{transition:all .2s ease}.vp-fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.vp-fade-slide-y-enter-from,.vp-fade-slide-y-leave-to{opacity:0;transform:translateY(-10px)}.vp-features{display:flex;flex-wrap:wrap;place-content:stretch space-between;align-items:flex-start;margin-top:2.5rem;padding:1.2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-features{flex-flow:column}}.vp-feature{flex-grow:1;flex-basis:30%;max-width:30%}@media (max-width: 719px){.vp-feature{max-width:100%;padding:0 2.5rem}}.vp-feature h2{padding-bottom:0;border-bottom:none;font-weight:500;font-size:1.4rem}@media (max-width: 419px){.vp-feature h2{font-size:1.25rem}}.vp-feature p{color:var(--vp-c-text-mute)}.vp-footer{padding:2.5rem;border-top:1px solid var(--vp-c-border);color:var(--vp-c-text-mute);text-align:center;transition:border-color var(--vp-t-color)}.vp-hero{text-align:center}.vp-hero-image{display:block;max-width:100%;max-height:280px;margin:3rem auto 1.5rem}@media (max-width: 419px){.vp-hero-image{max-height:210px;margin:2rem auto 1.2rem}}#main-title{font-size:3rem}@media (max-width: 419px){#main-title{font-size:2rem}}#main-title,.vp-hero-description,.vp-hero-actions{margin:1.8rem auto}@media (max-width: 419px){#main-title,.vp-hero-description,.vp-hero-actions{margin:1.2rem auto}}.vp-hero-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.vp-hero-description{max-width:35rem;color:var(--vp-c-text-mute);font-size:1.6rem;line-height:1.3}@media (max-width: 419px){.vp-hero-description{font-size:1.2rem}}.vp-hero-action-button{display:inline-block;box-sizing:border-box;padding:.8rem 1.6rem;border:2px solid var(--vp-c-accent-bg);border-radius:4px;background-color:var(--vp-c-bg);color:var(--vp-c-accent);font-size:1.2rem;transition:background-color border-color color var(--vp-t-color)}@media (max-width: 419px){.vp-hero-action-button{padding:.6rem 1.2rem;font-size:1rem}}.vp-hero-action-button:hover{color:var(--vp-c-accent-text)}.vp-hero-action-button.primary{background-color:var(--vp-c-accent-bg);color:var(--vp-c-accent-text)}.vp-hero-action-button.primary:hover{border-color:var(--vp-c-accent-hover);background-color:var(--vp-c-accent-hover)}.vp-home{display:block;max-width:var(--homepage-width);margin:0 auto;padding:var(--navbar-height) 2rem 0}@media (max-width: 419px){.vp-home{padding-inline:1.5rem}}.vp-home [vp-content]{margin:0;padding:0}.vp-site-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:var(--navbar-padding-v)}.vp-site-name{position:relative;color:var(--vp-c-text);font-weight:600;font-size:1.3rem}@media screen and (max-width: 719px){.vp-site-name{display:block;overflow:hidden;width:calc(100vw - 11rem);text-overflow:ellipsis;white-space:nowrap}}.vp-dropdown-enter-from,.vp-dropdown-leave-to{height:0!important;opacity:0}.vp-dropdown-enter-active{transition:height .3s ease-in-out,opacity .6s ease-out}.vp-navbar-dropdown-wrapper{cursor:pointer}.vp-navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.vp-navbar-dropdown-wrapper:not(.mobile):hover .vp-navbar-dropdown,.vp-navbar-dropdown-wrapper:not(.mobile).open .vp-navbar-dropdown{display:block!important}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown{overflow:hidden;transition:height .1s ease-out;padding-top:.5rem}.vp-navbar-dropdown-wrapper:not(.mobile) .vp-navbar-dropdown{position:absolute;inset-inline-end:0;top:100%;display:none;overflow-y:auto;box-sizing:border-box;height:auto!important;max-height:calc(100vh - 2.7rem);margin:0;padding:.6rem 0;border:1px solid var(--vp-c-gutter);border-radius:.5rem;background-color:var(--vp-c-bg-elv);text-align:start;white-space:nowrap}.vp-navbar-dropdown-title{display:block;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:500;font-size:.9rem;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title{display:none}.vp-navbar-dropdown-title:hover{border-color:transparent}.vp-navbar-dropdown-title-mobile{display:none;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:600;font-size:inherit;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title-mobile{display:block}.vp-navbar-dropdown-title-mobile:hover{color:var(--vp-c-accent)}.vp-navbar-dropdown-item{color:inherit;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link{position:relative;display:block;margin-bottom:0;padding:0 1.25rem;border-bottom:none;font-weight:400;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link:hover,.vp-navbar-dropdown-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-dropdown-item .auto-link.auto-link-active:after{content:"";position:absolute;inset-inline-start:9px;top:calc(50% - 2px);width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-inline-start:5px solid var(--vp-c-accent)}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-item>a{line-height:2rem}.vp-navbar-dropdown-subtitle{margin:.45rem 0 0;padding:1rem 0 .45rem;border-top:1px solid var(--vp-c-gutter);font-size:.9rem}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;padding-bottom:0;border-top:0;line-height:2rem}.vp-navbar-dropdown-item:first-child .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.vp-navbar-dropdown-subtitle>span{padding-inline:1.25rem 1.5rem}.vp-navbar-dropdown-subtitle>.auto-link{font-weight:inherit}.vp-navbar-dropdown-subtitle>.auto-link.auto-link-active:after{display:none}.vp-navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.vp-navbar-dropdown-subitem{font-size:.9em}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subitem{padding-inline-start:1rem}.vp-navbar-items{display:inline-block}@media print{.vp-navbar-items{display:none}}.vp-navbar-items .auto-link{color:inherit;line-height:1.4rem}.vp-navbar-items .auto-link:hover,.vp-navbar-items .auto-link.auto-link-active{color:var(--vp-c-text)}.vp-navbar-item{position:relative;display:inline-block;margin-inline-start:1.5rem;line-height:var(--navbar-line-height)}@media (max-width: 719px){.vp-navbar-item{margin-inline-start:0}}.vp-navbar-item:first-child{margin-inline-start:0}.vp-navbar-item .auto-link:hover,.vp-navbar-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-item>.auto-link{display:inline-block}.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:-2px;border-bottom:2px solid var(--vp-c-accent)}@media (max-width: 719px){.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:0;border-bottom:none}}.vp-toggle-color-mode-button{display:flex;margin:auto;margin-inline-start:1rem;border:0;background:none;color:var(--vp-c-text);opacity:.8;cursor:pointer}@media print{.vp-toggle-color-mode-button{display:none}}.vp-toggle-color-mode-button:hover{opacity:1}.vp-toggle-color-mode-button .light-icon,.vp-toggle-color-mode-button .dark-icon{width:1.25rem;height:1.25rem}.vp-toggle-sidebar-button{position:absolute;inset-inline-start:1rem;top:.6rem;display:none;padding:.6rem;cursor:pointer}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block}}.vp-toggle-sidebar-button .icon{display:flex;flex-flow:column;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;cursor:inherit}.vp-toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--vp-c-text);transition:transform var(--vp-t-transform)}.vp-toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1),.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );position:fixed;top:0;right:0;left:0;z-index:20;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-padding-v) var(--navbar-padding-h);border-bottom:1px solid var(--vp-c-border);background-color:var(--vp-navbar-c-bg);line-height:var(--navbar-line-height);transition:background-color var(--vp-t-color),border-color var(--vp-t-color)}@media screen and (max-width: 719px){.vp-navbar{padding-inline-start:4rem}}.vp-navbar-items-wrapper{position:absolute;inset-inline-end:var(--navbar-padding-h);top:var(--navbar-padding-v);display:flex;box-sizing:border-box;height:var(--navbar-line-height);padding-inline-start:var(--navbar-padding-h);font-size:.9rem;white-space:nowrap}.vp-page-meta{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page-meta{padding:2rem}}@media (max-width: 419px){.vp-page-meta{padding:1.5rem}}.vp-page-meta{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media print{.vp-page-meta{margin:0!important;padding-inline:0!important}}@media (max-width: 719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--vp-c-text-mute)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--vp-c-text-mute);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:.875em}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .edit-icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.vp-page-meta .last-updated,.vp-page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:.875em}@media (max-width: 719px){.vp-page-meta .last-updated,.vp-page-meta .contributors{font-size:.825em;text-align:start}}.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-inline:auto;margin-top:0;padding:1rem 2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-top var(--vp-t-color)}@media (max-width: 959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .auto-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--vp-c-gutter);border-radius:.25rem}.vp-page-nav .auto-link:hover{background:var(--vp-c-control)}.vp-page-nav .auto-link.external-link:after{display:none}.vp-page-nav .auto-link:not(.external-link) .external-link:after{display:none}.vp-page-nav .auto-link .hint{color:var(--vp-c-text-mute);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end}.vp-page{display:block;padding-top:var(--navbar-height);padding-bottom:2rem;padding-inline-start:var(--sidebar-width)}@media (max-width: 959px){.vp-page{padding-inline-start:var(--sidebar-width-mobile)}}@media (max-width: 719px){.vp-page{padding-inline-start:0}}.vp-page [vp-content]{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page [vp-content]{padding:2rem}}@media (max-width: 419px){.vp-page [vp-content]{padding:1.5rem}}.vp-page [vp-content]{padding-top:0}.vp-sidebar-item{border-inline-start:.25rem solid transparent;color:var(--vp-c-text);cursor:default}.vp-sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.vp-sidebar-item.vp-sidebar-heading{box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:1.25rem 1.5rem;font-weight:700;font-size:1.1em;transition:color .15s ease}.vp-sidebar-item.vp-sidebar-heading+.vp-sidebar-children{overflow:hidden;transition:height .1s ease-out;margin-bottom:.75rem}.vp-sidebar-item.collapsible{cursor:pointer}.vp-sidebar-item:not(.vp-sidebar-heading){display:inline-block;box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:2rem 1rem;font-weight:400;font-size:1em;line-height:1.4}.vp-sidebar-item:not(.vp-sidebar-heading)+.vp-sidebar-children{padding-inline-start:1rem;font-size:.95em}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading){padding-block:.25rem;padding-inline:1.75rem 1rem}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent;font-weight:500}a.vp-sidebar-heading+.vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent}.vp-sidebar-item.active:not(p.vp-sidebar-heading){border-inline-start-color:var(--vp-c-accent);color:var(--vp-c-accent);font-weight:600}.vp-sidebar-item .auto-link{display:block}.vp-sidebar-item.auto-link{display:block;cursor:pointer}.vp-sidebar-item.auto-link:hover{color:var(--vp-c-accent)}.vp-sidebar-items{margin:0;padding:1.5rem 0;list-style-type:none}@media (max-width: 719px){.vp-sidebar-items{padding:1rem 0}}.vp-sidebar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar{position:fixed;inset-inline-start:0;top:var(--navbar-height);bottom:0;z-index:10;overflow-y:auto;box-sizing:border-box;width:var(--sidebar-width);margin:0;border-inline-end:1px solid var(--vp-c-border);background-color:var(--vp-sidebar-c-bg);font-size:1rem;transition:transform var(--vp-t-transform),background-color var(--vp-t-color),border-color var(--vp-t-color);scrollbar-color:var(--vp-c-accent-bg) var(--vp-c-gutter);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{width:var(--sidebar-width-mobile);font-size:.9rem}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}[dir=rtl] .vp-sidebar{transform:translate(100%)}}.vp-sidebar::-webkit-scrollbar{width:7px}.vp-sidebar::-webkit-scrollbar-track{background-color:var(--vp-c-gutter)}.vp-sidebar::-webkit-scrollbar-thumb{background-color:var(--vp-c-accent-bg)}.vp-sidebar .vp-navbar-items{display:none;padding:.5rem 0 .75rem;border-bottom:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-sidebar .vp-navbar-items{display:block}.vp-sidebar .vp-navbar-items .vp-navbar-dropdown-item .route-link-active:after{top:calc(1rem - 2px)}}.vp-sidebar .vp-navbar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar .vp-navbar-items .auto-link{font-weight:600}.vp-sidebar .vp-navbar-item{display:block;padding-block:.5rem;padding-inline:1.5rem 0;font-size:1.1em;line-height:1.25rem}.vp-sidebar-mask{position:fixed;top:0;left:0;z-index:9;display:none;width:100vw;height:100vh}.vp-theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.vp-theme-container.no-navbar .vp-sidebar{padding-top:0}}.vp-theme-container.no-navbar .vp-page{padding-top:0}.vp-theme-container.no-navbar [vp-content] h1,.vp-theme-container.no-navbar [vp-content] h2,.vp-theme-container.no-navbar [vp-content] h3,.vp-theme-container.no-navbar [vp-content] h4,.vp-theme-container.no-navbar [vp-content] h5,.vp-theme-container.no-navbar [vp-content] h6{margin-top:1.5rem;padding-top:0}.vp-theme-container.no-sidebar .vp-sidebar{display:none}@media (max-width: 719px){.vp-theme-container.no-sidebar .vp-sidebar{display:block}}.vp-theme-container.no-sidebar .vp-page{padding-inline-start:0}@media (max-width: 719px){.vp-theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.vp-theme-container.sidebar-open .vp-sidebar-mask{display:block}}.vp-theme-container[data-v-a22fad92]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-a22fad92]{padding:2rem}}:root{--vp-c-white: #fff;--vp-c-black: #000;--vp-c-grey-text: #656869;--vp-c-grey-hover: #e4e4e9;--vp-c-grey-bg: #ebebef;--vp-c-grey-soft: rgb(142 150 170 / 14%);--vp-c-indigo-text: #3451b2;--vp-c-indigo-hover: #3a5ccc;--vp-c-indigo-bg: #5672cd;--vp-c-indigo-soft: rgb(100 108 255 / 14%);--vp-c-purple-text: #6f42c1;--vp-c-purple-hover: #7e4cc9;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 14%);--vp-c-blue-text: #2888a7;--vp-c-blue-hover: #2d98ba;--vp-c-blue-bg: #2fa1c5;--vp-c-blue-soft: rgb(27 178 229 / 14%);--vp-c-green-text: #18794e;--vp-c-green-hover: #299764;--vp-c-green-bg: #30a46c;--vp-c-green-soft: rgb(16 185 129 / 14%);--vp-c-yellow-text: #915930;--vp-c-yellow-hover: #946300;--vp-c-yellow-bg: #c28100;--vp-c-yellow-soft: rgb(234 179 8 / 14%);--vp-c-red-text: #b8272c;--vp-c-red-hover: #d5393e;--vp-c-red-bg: #e0575b;--vp-c-red-soft: rgb(244 63 94 / 14%)}[data-theme=dark]{--vp-c-white: #000;--vp-c-black: #fff;--vp-c-grey-text: #939499;--vp-c-grey-hover: #414853;--vp-c-grey-bg: #32363f;--vp-c-grey-soft: rgb(101 117 133 / 16%);--vp-c-indigo-text: #a8b1ff;--vp-c-indigo-hover: #5c73e7;--vp-c-indigo-bg: #3e63dd;--vp-c-indigo-soft: rgb(100 108 255 / 16%);--vp-c-blue-text: #c9e8f2;--vp-c-blue-hover: #a6d9ea;--vp-c-blue-bg: #2785a3;--vp-c-blue-soft: rgb(27 178 229 / 16%);--vp-c-purple-text: #c8abfa;--vp-c-purple-hover: #a879e6;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 16%);--vp-c-green-text: #3dd68c;--vp-c-green-hover: #30a46c;--vp-c-green-bg: #298459;--vp-c-green-soft: rgb(16 185 129 / 16%);--vp-c-yellow-text: #f9b44e;--vp-c-yellow-hover: #da8b17;--vp-c-yellow-bg: #a46a0a;--vp-c-yellow-soft: rgb(234 179 8 / 16%);--vp-c-red-text: #f66f81;--vp-c-red-hover: #f14158;--vp-c-red-bg: #b62a3c;--vp-c-red-soft: rgb(244 63 94 / 16%)}:root{color-scheme:light}[data-theme=dark]{color-scheme:dark}html,body{background:var(--vp-c-bg, #fff);accent-color:var(--vp-c-accent, #299764);transition:background-color var(--vp-t-color)}html{font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}@media print{html{font-size:12pt}}html[data-theme=dark]{color-scheme:dark}body{min-height:100vh;margin:0;padding:0;color:var(--vp-c-text, rgb(60, 60, 67));font-size:1rem;font-synthesis:style}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25;overflow-wrap:break-word}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);font-size:1.65rem;transition:border-color var(--vp-t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}a{color:var(--vp-c-accent, #299764);font-weight:500;text-decoration:none;overflow-wrap:break-word}a.header-anchor{position:relative;color:inherit;text-decoration:none}a.header-anchor:before{content:"¶";position:absolute;top:.4167em;left:-.75em;display:none;color:var(--vp-c-accent, #299764);font-size:.75em}[dir=rtl] a.header-anchor:before{right:-.75em}a.header-anchor:hover:before{display:block}a.header-anchor:focus-visible{outline:none}a.header-anchor:focus-visible:before{display:block;outline:auto}strong{font-weight:600}blockquote{margin:1rem 0;padding-block:.25rem;padding-inline:1rem 0;border-inline-start:.2rem solid var(--vp-c-border-hard, #b8b8ba);color:var(--vp-c-text-mute, rgba(60, 60, 67, .78));font-size:1rem;overflow-wrap:break-word;transition:border-color var(--vp-t-color),color var(--vp-t-color)}blockquote>p{margin:0}hr{border:0;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);transition:border-color var(--vp-t-color)}:not(pre)>code{margin:0;padding:3px 6px;border-radius:4px;background:var(--vp-c-grey-soft, rgba(142, 150, 170, .14));font-size:.875em;overflow-wrap:break-word;transition:background-color var(--vp-t-color),color var(--vp-t-color)}p a code{color:var(--vp-c-accent, #299764);font-weight:400}table code{padding:.1rem .4rem}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid var(--vp-c-border, #c2c2c4);border-radius:.25em;box-shadow:1px 1px 4px 0 var(--vp-c-shadow, rgba(0, 0, 0, .15));line-height:1;letter-spacing:-.1em;text-align:center}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tbody tr:nth-child(odd){background:var(--vp-c-bg-alt, #f6f8fa);transition:background-color var(--vp-t-color)}th,td{padding:.6em 1em;border:1px solid var(--vp-c-border-hard, #d1d4d7);transition:border-color var(--vp-t-color)}pre{text-align:left;direction:ltr;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}@media print{pre{white-space:pre-wrap}}pre code{padding:0;border-radius:0}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a.header-anchor{text-decoration:none}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@media (prefers-reduced-motion: reduce){*,:before,:after{background-attachment:initial!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important}}:root{--vp-c-accent: #299764;--vp-c-accent-bg: #3eaf7c;--vp-c-accent-hover: #4abf8a;--vp-c-accent-text: var(--vp-c-white);--vp-c-accent-soft: rgb(16 185 129 / 14%);--vp-c-bg: #fff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #fff;--vp-c-text: rgb(60 60 67);--vp-c-text-mute: rgb(60 60 67 / 78%);--vp-c-text-subtle: rgb(60 60 67 / 56%);--vp-c-gutter: #e2e2e3;--vp-c-border: #c2c2c4;--vp-c-border-hard: #b8b8ba;--vp-c-shadow: rgb(0 0 0 / 15%);--vp-c-control: rgb(142 150 170 / 10%);--vp-c-control-hover: rgb(142 150 170 / 16%);--vp-c-control-disabled: #eaeaea;--vp-navbar-c-bg: var(--vp-c-bg);--vp-sidebar-c-bg: var(--vp-c-bg);--vp-c-code-tab-title: var(--code-c-text, rgb(255 255 255 / 90%));--vp-c-code-tab-bg: var(--code-bg-color, var(--code-c-bg));--vp-c-code-tab-active: var(--vp-c-accent);--badge-c-tip-text: var(--vp-c-green-text);--badge-c-tip-bg: var(--vp-c-green-soft);--badge-c-warning-text: var(--vp-c-yellow-text);--badge-c-warning-bg: var(--vp-c-yellow-soft);--badge-c-danger-text: var(--vp-c-red-text);--badge-c-danger-bg: var(--vp-c-red-soft);--badge-c-important-text: var(--vp-c-purple-text);--badge-c-important-bg: var(--vp-c-purple-soft);--badge-c-info-text: var(--vp-c-indigo-text);--badge-c-info-bg: var(--vp-c-indigo-soft);--badge-c-note-text: var(--vp-c-grey-text);--badge-c-note-bg: var(--vp-c-grey-soft);--font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px;--header-offset: var(--navbar-height);--vp-t-color: .3s ease;--vp-t-transform: .3s ease;--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z'/%3E%3C/svg%3E");--external-link-c-icon: var(--vp-c-text-mute)}[data-theme=dark]{--vp-c-accent: #3dd68c;--vp-c-accent-bg: #3aa675;--vp-c-accent-hover: #349469;--vp-c-accent-soft: rgb(16 185 129 / 16%);--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-text: rgb(235 235 245 / 86%);--vp-c-text-mute: rgb(235 235 245 / 60%);--vp-c-text-subtle: rgb(235 235 245 / 38%);--vp-c-gutter: #000;--vp-c-border: #3c3f44;--vp-c-border-hard: #45484e;--vp-c-shadow: rgb(0 0 0 / 30%);--vp-c-control: rgb(101 117 133 / 12%);--vp-c-control-hover: rgb(101 117 133 / 18%);--vp-c-control-disabled: #363636}body{font-family:var(--font-family)}code{font-family:var(--code-font-family)}[vp-content] h1,[vp-content] h2,[vp-content] h3,[vp-content] h4,[vp-content] h5,[vp-content] h6{margin-top:calc(.5rem - var(--header-offset));margin-bottom:0;padding-top:calc(1rem + var(--header-offset))}[vp-content] h1:first-child,[vp-content] h2:first-child,[vp-content] h3:first-child,[vp-content] h4:first-child,[vp-content] h5:first-child,[vp-content] h6:first-child{margin-bottom:1rem}[vp-content] h1:first-child+p,[vp-content] h1:first-child+pre,[vp-content] h1:first-child+.custom-container,[vp-content] h2:first-child+p,[vp-content] h2:first-child+pre,[vp-content] h2:first-child+.custom-container,[vp-content] h3:first-child+p,[vp-content] h3:first-child+pre,[vp-content] h3:first-child+.custom-container,[vp-content] h4:first-child+p,[vp-content] h4:first-child+pre,[vp-content] h4:first-child+.custom-container,[vp-content] h5:first-child+p,[vp-content] h5:first-child+pre,[vp-content] h5:first-child+.custom-container,[vp-content] h6:first-child+p,[vp-content] h6:first-child+pre,[vp-content] h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 419px){[vp-content] h1{font-size:1.9rem}}[vp-content] a:not(.header-anchor){text-decoration:underline}[vp-content] img{max-width:100%}div[class*=language-]{margin:.75rem 0;transition:background-color var(--vp-t-color),color var(--vp-t-color)}@media (max-width: 419px){div[class*=language-]{--code-border-radius: 0;margin:.75rem -1.5rem}}div[class*=language-] .line.diff,div[class*=language-] .line.highlighted{transition:background-color var(--vp-t-color)}.table-of-contents .vp-badge{vertical-align:middle}.arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}[data-theme=dark] .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}[dir=rtl] .arrow.right,.arrow.left{transform:rotate(-90deg)}[dir=rtl] .arrow.left{transform:rotate(90deg)}.vp-external-link-icon:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .external-link:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon [vp-content] a[href*="://"]:not(.no-external-link-icon):after,.external-link-icon [vp-content] a[target=_blank]:not(.no-external-link-icon):after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}:root{scroll-behavior:smooth}@media screen and (max-width: 719px){.vp-hide-mobile{display:none}}.vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-comment{padding:2rem}}@media (max-width: 419px){.vp-comment{padding:1.5rem}}.vp-navbar .DocSearch{transition:background-color var(--vp-t-color)}.vp-navbar .search-box{vertical-align:top;flex:0 0 auto}@media screen and (max-width: 719px){.hint-container{margin-inline:-.75rem}}.lang-modal-fade-enter-active,.lang-modal-fade-leave-active{transition:opacity .5s}.lang-modal-fade-enter,.lang-modal-fade-leave-to{opacity:0}.lang-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1499;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}@media print{.lang-modal-mask{display:none}}.lang-modal-wrapper{position:relative;z-index:1500;overflow:hidden;max-width:80vw;padding:1rem 2rem;border-radius:8px;background:var(--vp-bg);box-shadow:0 2px 6px 0 var(--card-shadow)}.lang-modal-action{display:block;width:100%;margin:1rem 0;padding:.5rem .75rem;border:none;border-radius:8px;background-color:var(--vp-bglt);color:var(--vp-c);cursor:pointer}.lang-modal-action:hover{background-color:var(--vp-bgl)}.lang-modal-action.primary{background-color:var(--vp-tc);color:var(--white)}.lang-modal-action.primary:hover{background-color:var(--vp-tcl)}.grey{color:#0006}.works-table-wrapper[data-v-765855fb]{margin:0 auto;padding:0 2rem;max-width:1224px;box-sizing:border-box}.works-table-wrapper[data-v-765855fb] table{width:100%}:root{--content-width: 960px}.vp-page .theme-default-content{padding-bottom:0!important}.vp-page-meta{display:none}
+.vp-back-to-top-button{position:fixed!important;inset-inline-end:1rem;bottom:4rem;z-index:100;width:48px;height:48px;padding:12px;border-width:0;border-radius:50%;background:var(--back-to-top-c-bg);color:var(--back-to-top-c-accent-bg);box-shadow:2px 2px 10px 4px var(--back-to-top-c-shadow);cursor:pointer}@media (max-width: 959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-c-accent-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:24px;height:24px;margin:0 auto;background:var(--back-to-top-c-icon);-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;inset-inline-end:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--back-to-top-z-index: 5;--back-to-top-icon: url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='4'%20d='M24.008%2014.1V42M12%2026l12-12l12%2012M12%206h24'%20/%3e%3c/svg%3e");--back-to-top-c-bg: var(--vp-c-bg);--back-to-top-c-accent-bg: var(--vp-c-accent-bg);--back-to-top-c-accent-hover: var(--vp-c-accent-hover);--back-to-top-c-shadow: var(--vp-c-shadow);--back-to-top-c-icon: currentcolor}:root{--message-offset: calc(var(--vp-header-offset, 3.6rem) + 1rem);--message-timing-duration: .3s;--message-timing-function: ease-in-out;--message-gap: .5rem}@keyframes message-move-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes message-move-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}#message-container{position:fixed;inset:var(--message-offset) 0 auto;z-index:75;display:flex;flex-flow:column;gap:var(--message-gap);align-items:center;text-align:center}.message-item{display:inline-block;padding:8px 10px;border-radius:3px;background:var(--vp-c-bg);color:var(--vp-c-text);box-shadow:0 0 10px 0 var(--vp-c-shadow);font-size:14px}.message-item.move-in{animation:message-move-in var(--message-timing-duration) var(--message-timing-function)}.message-item.move-out{animation:message-move-out var(--message-timing-duration) var(--message-timing-function);animation-fill-mode:forwards}.message-item svg{position:relative;bottom:-.125em;margin-inline-end:5px}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:#0000;outline:none;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button:before{content:"";display:inline-block;width:1.25rem;height:1.25rem;padding:.625rem;background:currentcolor;color:var(--copy-code-c-text);font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.vp-copy-code-button:focus,.vp-copy-code-button.copied{opacity:1}.vp-copy-code-button:hover,.vp-copy-code-button.copied{background:var(--copy-code-c-hover)}.vp-copy-code-button.copied:before{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--copy-code-c-hover);color:var(--copy-code-c-text);font-weight:500;line-height:1.25rem;white-space:nowrap}.no-copy-code .vp-copy-code-button{display:none}body:not(.no-copy-code) div[class*=language-]:hover:before{display:none}body:not(.no-copy-code) div[class*=language-]:hover .vp-copy-code-button{opacity:1}:root{--code-copy-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2' /%3e%3c/svg%3e");--code-copied-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4' /%3e%3c/svg%3e");--copy-code-c-text: var(--code-c-line-number);--copy-code-c-hover: var(--code-c-highlight-bg)}.hint-container{position:relative;background:var(--hint-c-soft);transition:background var(--vp-t-color),color var(--vp-t-color)}@media print{.hint-container{page-break-inside:avoid}}.hint-container>.hint-container-title{color:var(--hint-c-title)}.hint-container :not(pre)>code{background:var(--hint-c-soft)}.hint-container .hint-container-title{position:relative;margin-block:.75em;font-weight:600;line-height:1.25}.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{margin-block:.75rem;padding:.25em 1em;border-radius:.5em;color:inherit;font-size:var(--hint-font-size)}@media print{.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{border-inline-start-width:.25em;border-inline-start-style:solid}}.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:1.75em}@media print{.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:0}}.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{content:" ";position:absolute;inset-inline-start:0;top:calc(50% - .6125em);width:1.25em;height:1.25em;font-size:1.25em}@media print{.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{display:none}}.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.caution p{line-height:1.5}.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.caution a{color:var(--vp-c-accent)}.hint-container.important{--hint-c-accent: var(--important-c-accent);--hint-c-title: var(--important-c-text);--hint-c-soft: var(--important-c-soft)}.hint-container.important>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.info{--hint-c-accent: var(--info-c-accent);--hint-c-title: var(--info-c-text);--hint-c-soft: var(--info-c-soft)}.hint-container.info>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.note{--hint-c-accent: var(--note-c-accent);--hint-c-title: var(--note-c-text);--hint-c-soft: var(--note-c-soft)}.hint-container.note>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.tip{--hint-c-accent: var(--tip-c-accent);--hint-c-title: var(--tip-c-text);--hint-c-soft: var(--tip-c-soft)}.hint-container.tip>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.warning{--hint-c-accent: var(--warning-c-accent);--hint-c-title: var(--warning-c-text);--hint-c-soft: var(--warning-c-soft)}.hint-container.warning>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.caution{--hint-c-accent: var(--caution-c-accent);--hint-c-title: var(--caution-c-text);--hint-c-soft: var(--caution-c-soft)}.hint-container.caution>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.details{position:relative;display:block;margin-block:.75rem;padding:1.25rem 1rem;border-radius:.5rem;background:var(--detail-c-bg);transition:background var(--vp-t-transform),color var(--vp-t-transform)}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-c-accent)}.hint-container.details :not(pre)>code{background:var(--detail-c-soft)}.hint-container.details summary{position:relative;margin:-1rem;padding-block:1em;padding-inline:3em 1.5em;list-style:none;font-size:var(--hint-font-size);cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:#0000;font-size:0}.hint-container.details summary:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:" ";position:absolute;inset-inline-start:.8em;top:calc(50% - .5em);width:1em;height:1em;font-size:1.25rem;line-height:normal;transition:color,var(--vp-t-color),transform var(--vp-t-transform);transform:rotate(90deg)}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:before{transform:rotate(180deg)}:root{--hint-font-size: .92rem;--important-c-accent: var(--vp-c-purple-bg);--important-c-text: var(--vp-c-purple-text);--important-c-soft: var(--vp-c-purple-soft);--info-c-accent: var(--vp-c-blue-bg);--info-c-text: var(--vp-c-blue-text);--info-c-soft: var(--vp-c-blue-soft);--note-c-accent: var(--vp-c-grey-bg);--note-c-text: var(--vp-c-grey-text);--note-c-soft: var(--vp-c-grey-soft);--tip-c-accent: var(--vp-c-green-bg);--tip-c-text: var(--vp-c-green-text);--tip-c-soft: var(--vp-c-green-soft);--warning-c-accent: var(--vp-c-yellow-bg);--warning-c-text: var(--vp-c-yellow-text);--warning-c-soft: var(--vp-c-yellow-soft);--caution-c-accent: var(--vp-c-red-bg);--caution-c-text: var(--vp-c-red-text);--caution-c-soft: var(--vp-c-red-soft);--detail-c-bg: var(--vp-c-control);--detail-c-icon: var(--vp-c-border);--detail-c-soft: var(--vp-c-grey-soft)}.vp-contributors{display:flex;flex-wrap:wrap;gap:1rem;align-items:center;justify-content:flex-start;margin:1rem 0}.vp-contributor{display:flex;gap:.25rem;align-items:center;color:inherit;font-size:1.125rem}.vp-contributor:after{display:none!important}.vp-contributor-avatar{-o-object-fit:contain;object-fit:contain;width:1.75rem;height:1.75rem;margin-inline-end:.25rem;border-radius:50%}a.vp-contributor{text-decoration:none!important}:root{--changelog-bg: var(--vp-c-bg-alt);--changelog-font-size: .875rem;--changelog-c-text: var(--vp-c-text)}.vp-changelog-wrapper{margin-block:1rem;padding-inline:1rem;border-radius:8px;background-color:var(--changelog-bg);color:var(--changelog-c-text);font-size:var(--changelog-font-size);line-height:1.7;transition:background-color var(--vp-t-color)}.vp-changelog-wrapper.active{padding-block:0 .5rem}.vp-changelog-wrapper a{text-decoration:none!important}.vp-changelog-wrapper a:after{display:none!important}.vp-changelog-header{display:flex;align-items:center;justify-content:space-between;padding-block:1rem;font-weight:700;cursor:pointer}@media (max-width: 419px){.vp-changelog-header{flex-wrap:wrap}}.vp-changelog-wrapper.active .vp-changelog-header{padding-block-end:.5rem}.vp-changelog-icon,.vp-changelog-menu-icon{display:inline-block;vertical-align:middle;width:1.2em;height:1.2em;margin-inline-end:4px;background-color:currentcolor;color:var(--vp-c-text-mute);-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;transition:color var(--vp-t-color);transform:translateY(-1px)}.vp-changelog-icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' d='M2.71 10.96a6.5 6.5 0 1 0-.69-3.53M2 8l1.5-1.5M2 8L.5 6.5m8 2v-4m0 4h3'/%3E%3C/svg%3E")}.vp-changelog-menu-icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M4 5h0.01'/%3E%3Cpath d='M8 5h12'/%3E%3Cpath d='M4 10h0.01'/%3E%3Cpath d='M8 10h12'/%3E%3Cpath d='M4 15h0.01'/%3E%3Cpath d='M8 15h12'/%3E%3Cpath d='M4 20h0.01'/%3E%3Cpath d='M8 20h12'/%3E%3C/g%3E%3C/svg%3E")}.vp-changelog-list{display:none;margin-block:.5rem;padding-inline-start:0;list-style:none}.vp-changelog-wrapper.active .vp-changelog-list{display:block}.vp-changelog-item-tag,.vp-changelog-item-commit{position:relative;margin-block-start:8px;padding-inline-start:20px}.vp-changelog-item-tag:first-child,.vp-changelog-item-commit:first-child{margin-block-start:0}.vp-changelog-item-tag:before,.vp-changelog-item-commit:before{content:"";position:absolute;top:3px;left:0;display:inline-block;width:1.25em;height:1.25em;background-color:currentcolor;color:var(--vp-c-text-subtle);-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;transition:color var(--vp-t-color)}.vp-changelog-item-commit:before{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12a3 3 0 1 0 6 0a3 3 0 1 0-6 0m3-9v6m0 6v6'/%3E%3C/svg%3E")}.vp-changelog-item-tag:before{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0'/%3E%3Cpath d='M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592-5.592a2.41 2.41 0 0 0 0-3.408l-7.71-7.71A2 2 0 0 0 11.172 3H6a3 3 0 0 0-3 3'/%3E%3C/g%3E%3C/svg%3E")}.vp-changelog-tag{margin-inline-end:4px;text-decoration:none}.vp-changelog-tag code{font-weight:500;font-size:14px}.vp-changelog-hash{margin-inline-end:4px;text-decoration:none}.vp-changelog-divider{margin-inline-end:8px}.vp-changelog-message{margin-inline-end:8px;line-height:1.7}.vp-changelog-date{color:var(--vp-c-text-subtle);font-size:.75rem;transition:color var(--vp-t-color)}:root{--nprogress-c: var(--vp-c-accent);--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{position:fixed;top:0;left:0;z-index:var(--nprogress-z-index);width:100%;height:2px;background:var(--nprogress-c)}:root{--code-padding-x: 1.25rem;--code-padding-y: 1rem;--code-border-radius: 6px;--code-line-height: 1.6;--code-font-size: .875em;--code-font-family: consolas, monaco, "Andale Mono", "Ubuntu Mono", monospace}div[class*=language-]{position:relative;border-radius:var(--code-border-radius);background-color:var(--code-c-bg)}div[class*=language-]:before{content:attr(data-ext);position:absolute;top:.8em;right:1em;z-index:3;color:var(--code-c-text);font-size:.75rem}div[class*=language-] pre{position:relative;z-index:1;overflow-x:auto;margin:0;border-radius:var(--code-border-radius);font-size:var(--code-font-size);font-family:var(--code-font-family);line-height:var(--code-line-height)}div[class*=language-] pre code{display:block;box-sizing:border-box;width:-moz-fit-content;width:fit-content;min-width:100%;padding:var(--code-padding-y) var(--code-padding-x);background-color:#0000!important;color:var(--code-c-text);overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--code-c-text: #f8f8f2;--code-c-bg: #2e3440;--code-c-highlight-bg: rgb(51.6454545455, 60.5484848485, 78.3545454545);--code-c-line-number: rgba(248, 248, 242, .67)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a3be8c}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#81a1c1}.token.atrule,.token.attr-value,.token.function,.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,.token.important{color:#ebcb8b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--code-line-number-width: 3rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-line-number-width);height:100%;border-right:1px solid var(--code-c-highlight-bg, var(--code-c-text));border-radius:var(--code-border-radius) 0 0 var(--code-border-radius);transition:border var(--vp-t-color)}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--code-line-number-width)}div[class*=language-].line-numbers-mode code{padding-left:1rem}div[class*=language-].line-numbers-mode .line-numbers{counter-reset:line-number;position:absolute;top:0;left:0;width:var(--code-line-number-width);padding-top:var(--code-padding-y);color:var(--code-c-line-number, var(--code-c-text));font-size:var(--code-font-size);line-height:var(--code-line-height);text-align:center}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:3;font-family:var(--code-font-family);-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);counter-increment:line-number}div[class*=language-] .line.highlighted{display:inline-block;width:100%;margin:0 calc(-1*var(--code-padding-x));padding:0 var(--code-padding-x);background-color:var(--code-c-highlight-bg)}@property --vp-collapsed-lines-bg{inherits:false;initial-value:#fff;syntax:"<color>"}@keyframes code-collapsed-lines{0%{opacity:.3;transform:translateY(-2px) rotate(var(--vp-collapsed-lines-rotate))}to{opacity:1;transform:translateY(2px) rotate(var(--vp-collapsed-lines-rotate))}}div[class*=language-].has-collapsed-lines .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg);--vp-collapsed-lines-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='m18 12l-6 6l-6-6m12-6l-6 6l-6-6'/%3E%3C/svg%3E");--vp-collapsed-lines-rotate: 0deg;position:absolute;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;height:28px;background:linear-gradient(to bottom,transparent 0%,var(--vp-collapsed-lines-bg) 55%,var(--vp-collapsed-lines-bg) 100%);cursor:pointer;transition:--vp-collapsed-lines-bg var(--vp-t-color)}div[class*=language-].has-collapsed-lines .collapsed-lines:hover{--vp-collapsed-lines-bg: var(--code-c-highlight-bg)}div[class*=language-].has-collapsed-lines .collapsed-lines:before{content:"";display:inline-block;width:24px;height:24px;background-color:var(--code-c-text);-webkit-mask-image:var(--vp-collapsed-lines-icon);mask-image:var(--vp-collapsed-lines-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:20px;mask-size:20px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;animation:code-collapsed-lines 1.2s infinite alternate-reverse ease-in-out}div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-light-bg))}[data-theme=dark] div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-dark-bg))}div[class*=language-].has-collapsed-lines.collapsed{overflow-y:hidden;height:calc(var(--vp-collapsed-lines)*var(--code-line-height)*var(--code-font-size) + var(--code-padding-y) + 28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) code{padding-bottom:max(var(--code-padding-y),28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines{--vp-collapsed-lines-rotate: 180deg}:root{--code-title-c-text: var(--vp-c-text-mute);--code-title-c-bg: var(--code-c-bg);--code-title-divider: var(--code-c-highlight-bg, var(--code-c-text))}.code-block-title div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}.code-block-title .code-block-title-bar{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0 12px;border-bottom:solid 1px var(--code-title-divider);border-radius:6px 6px 0 0;background:var(--code-title-c-bg);white-space:nowrap;transition:background var(--vp-t-color)}@media (max-width: 419px){.code-block-title .code-block-title-bar{margin:.75rem -1.5rem -.75rem;border-radius:0}}.code-block-title .code-block-title-bar .title{position:relative;display:inline-block;margin:0;padding:8px 12px;color:var(--code-title-c-text);font-weight:500;font-size:.875em;line-height:1.7;transition:background var(--vp-t-color)}.vp-code-tabs-nav{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-c-bg);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{position:relative;min-width:3rem;margin:0;padding:6px 12px;border-width:0;border-radius:6px 6px 0 0;background:#0000;color:var(--code-tabs-c-text);font-weight:600;font-size:.875em;line-height:1.4;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-code-tab-nav:hover{background:var(--code-tabs-c-hover)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-c-bg, var(--vp-c-bg-alt))}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav:first-child:before{display:none}[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.75rem -1.5rem;border-radius:0}}.vp-code-tab div[class*=language-].line-numbers-mode:after{border-top-left-radius:0}.vp-code-tab div[class*=language-] pre{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-] pre{border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.vp-tabs{margin:1.5rem 0;border:1px solid var(--vp-c-border);border-radius:8px}@media (max-width: 419px){[vp-content]>.vp-tabs{margin-inline:-1.5rem;border:none;border-bottom:1px solid var(--vp-c-border);border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:.5rem .5rem 0 0;background:var(--tab-c-bg-nav);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{position:relative;min-width:4rem;margin:0;padding:.5em 1em;border:none;border-radius:.5rem .5rem 0 0;background:#0000;color:var(--tab-c-nav);font-weight:600;font-size:.875em;line-height:1.75;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-tab-nav:hover{background:var(--tab-c-bg-nav-hover)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-c-bg)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;border-radius:0 0 .5rem .5rem;background:var(--tab-c-bg);transition:background var(--vp-t-color)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(n+2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-c-border);font-weight:500}@media print{.vp-tab-title{display:block}}:root{--code-tabs-c-text: var(--code-c-text);--code-tabs-c-bg: var(--code-c-highlight-bg);--code-tabs-c-hover: var(--code-c-bg, var(--vp-c-bg-alt));--tab-c-bg: var(--vp-c-bg);--tab-c-nav: var(--vp-c-text);--tab-c-bg-nav: var(--vp-c-grey-bg);--tab-c-bg-nav-hover: var(--vp-c-control-hover)}.vp-badge{display:inline-block;vertical-align:top;height:1.3em;padding:0 6px;border-radius:3px;background:var(--vp-c-accent-soft);color:var(--vp-c-accent);font-size:.875em;line-height:1.3;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-badge+.vp-badge{margin-inline-start:5px}.vp-badge.tip{background:var(--badge-c-tip-bg);color:var(--badge-c-tip-text)}.vp-badge.warning{background:var(--badge-c-warning-bg);color:var(--badge-c-warning-text)}.vp-badge.danger{background:var(--badge-c-danger-bg);color:var(--badge-c-danger-text)}.vp-badge.important{background:var(--badge-c-important-bg);color:var(--badge-c-important-text)}.vp-badge.info{background:var(--badge-c-info-bg);color:var(--badge-c-info-text)}.vp-badge.note{background:var(--badge-c-note-bg);color:var(--badge-c-note-text)}.vp-fade-slide-y-enter-active{transition:all .2s ease}.vp-fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.vp-fade-slide-y-enter-from,.vp-fade-slide-y-leave-to{opacity:0;transform:translateY(-10px)}.vp-features{display:flex;flex-wrap:wrap;place-content:stretch space-between;align-items:flex-start;margin-top:2.5rem;padding:1.2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-features{flex-flow:column}}.vp-feature{flex-grow:1;flex-basis:30%;max-width:30%}@media (max-width: 719px){.vp-feature{max-width:100%;padding:0 2.5rem}}.vp-feature h2{padding-bottom:0;border-bottom:none;font-weight:500;font-size:1.4rem}@media (max-width: 419px){.vp-feature h2{font-size:1.25rem}}.vp-feature p{color:var(--vp-c-text-mute)}.vp-footer{padding:2.5rem;border-top:1px solid var(--vp-c-border);color:var(--vp-c-text-mute);text-align:center;transition:border-color var(--vp-t-color)}.vp-hero{text-align:center}.vp-hero-image{display:block;max-width:100%;max-height:280px;margin:3rem auto 1.5rem}@media (max-width: 419px){.vp-hero-image{max-height:210px;margin:2rem auto 1.2rem}}#main-title{font-size:3rem}@media (max-width: 419px){#main-title{font-size:2rem}}#main-title,.vp-hero-description,.vp-hero-actions{margin:1.8rem auto}@media (max-width: 419px){#main-title,.vp-hero-description,.vp-hero-actions{margin:1.2rem auto}}.vp-hero-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.vp-hero-description{max-width:35rem;color:var(--vp-c-text-mute);font-size:1.6rem;line-height:1.3}@media (max-width: 419px){.vp-hero-description{font-size:1.2rem}}.vp-hero-action-button{display:inline-block;box-sizing:border-box;padding:.8rem 1.6rem;border:2px solid var(--vp-c-accent-bg);border-radius:4px;background-color:var(--vp-c-bg);color:var(--vp-c-accent);font-size:1.2rem;transition:background-color border-color color var(--vp-t-color)}@media (max-width: 419px){.vp-hero-action-button{padding:.6rem 1.2rem;font-size:1rem}}.vp-hero-action-button:hover{color:var(--vp-c-accent-text)}.vp-hero-action-button.primary{background-color:var(--vp-c-accent-bg);color:var(--vp-c-accent-text)}.vp-hero-action-button.primary:hover{border-color:var(--vp-c-accent-hover);background-color:var(--vp-c-accent-hover)}.vp-home{display:block;max-width:var(--homepage-width);margin:0 auto;padding:var(--navbar-height) 2rem 0}@media (max-width: 419px){.vp-home{padding-inline:1.5rem}}.vp-home [vp-content]{margin:0;padding:0}.vp-site-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:var(--navbar-padding-v)}.vp-site-name{position:relative;color:var(--vp-c-text);font-weight:600;font-size:1.3rem}@media screen and (max-width: 719px){.vp-site-name{display:block;overflow:hidden;width:calc(100vw - 11rem);text-overflow:ellipsis;white-space:nowrap}}.vp-dropdown-enter-from,.vp-dropdown-leave-to{height:0!important;opacity:0}.vp-dropdown-enter-active{transition:height .3s ease-in-out,opacity .6s ease-out}.vp-navbar-dropdown-wrapper{cursor:pointer}.vp-navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.vp-navbar-dropdown-wrapper:not(.mobile):hover .vp-navbar-dropdown,.vp-navbar-dropdown-wrapper:not(.mobile).open .vp-navbar-dropdown{display:block!important}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown{overflow:hidden;transition:height .1s ease-out;padding-top:.5rem}.vp-navbar-dropdown-wrapper:not(.mobile) .vp-navbar-dropdown{position:absolute;inset-inline-end:0;top:100%;display:none;overflow-y:auto;box-sizing:border-box;height:auto!important;max-height:calc(100vh - 2.7rem);margin:0;padding:.6rem 0;border:1px solid var(--vp-c-gutter);border-radius:.5rem;background-color:var(--vp-c-bg-elv);text-align:start;white-space:nowrap}.vp-navbar-dropdown-title{display:block;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:500;font-size:.9rem;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title{display:none}.vp-navbar-dropdown-title:hover{border-color:transparent}.vp-navbar-dropdown-title-mobile{display:none;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:600;font-size:inherit;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title-mobile{display:block}.vp-navbar-dropdown-title-mobile:hover{color:var(--vp-c-accent)}.vp-navbar-dropdown-item{color:inherit;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link{position:relative;display:block;margin-bottom:0;padding:0 1.25rem;border-bottom:none;font-weight:400;line-height:1.7rem}.vp-navbar-dropdown-item .auto-link:hover,.vp-navbar-dropdown-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-dropdown-item .auto-link.auto-link-active:after{content:"";position:absolute;inset-inline-start:9px;top:calc(50% - 2px);width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-inline-start:5px solid var(--vp-c-accent)}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-item>a{line-height:2rem}.vp-navbar-dropdown-subtitle{margin:.45rem 0 0;padding:1rem 0 .45rem;border-top:1px solid var(--vp-c-gutter);font-size:.9rem}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;padding-bottom:0;border-top:0;line-height:2rem}.vp-navbar-dropdown-item:first-child .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.vp-navbar-dropdown-subtitle>span{padding-inline:1.25rem 1.5rem}.vp-navbar-dropdown-subtitle>.auto-link{font-weight:inherit}.vp-navbar-dropdown-subtitle>.auto-link.auto-link-active:after{display:none}.vp-navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.vp-navbar-dropdown-subitem{font-size:.9em}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subitem{padding-inline-start:1rem}.vp-navbar-items{display:inline-block}@media print{.vp-navbar-items{display:none}}.vp-navbar-items .auto-link{color:inherit;line-height:1.4rem}.vp-navbar-items .auto-link:hover,.vp-navbar-items .auto-link.auto-link-active{color:var(--vp-c-text)}.vp-navbar-item{position:relative;display:inline-block;margin-inline-start:1.5rem;line-height:var(--navbar-line-height)}@media (max-width: 719px){.vp-navbar-item{margin-inline-start:0}}.vp-navbar-item:first-child{margin-inline-start:0}.vp-navbar-item .auto-link:hover,.vp-navbar-item .auto-link.auto-link-active{color:var(--vp-c-accent)}.vp-navbar-item>.auto-link{display:inline-block}.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:-2px;border-bottom:2px solid var(--vp-c-accent)}@media (max-width: 719px){.vp-navbar-item>.auto-link:hover,.vp-navbar-item>.auto-link.auto-link-active{margin-bottom:0;border-bottom:none}}.vp-toggle-color-mode-button{display:flex;margin:auto;margin-inline-start:1rem;border:0;background:none;color:var(--vp-c-text);opacity:.8;cursor:pointer}@media print{.vp-toggle-color-mode-button{display:none}}.vp-toggle-color-mode-button:hover{opacity:1}.vp-toggle-color-mode-button .light-icon,.vp-toggle-color-mode-button .dark-icon{width:1.25rem;height:1.25rem}.vp-toggle-sidebar-button{position:absolute;inset-inline-start:1rem;top:.6rem;display:none;padding:.6rem;cursor:pointer}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block}}.vp-toggle-sidebar-button .icon{display:flex;flex-flow:column;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;cursor:inherit}.vp-toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--vp-c-text);transition:transform var(--vp-t-transform)}.vp-toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1),.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );position:fixed;top:0;right:0;left:0;z-index:20;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-padding-v) var(--navbar-padding-h);border-bottom:1px solid var(--vp-c-border);background-color:var(--vp-navbar-c-bg);line-height:var(--navbar-line-height);transition:background-color var(--vp-t-color),border-color var(--vp-t-color)}@media screen and (max-width: 719px){.vp-navbar{padding-inline-start:4rem}}.vp-navbar-items-wrapper{position:absolute;inset-inline-end:var(--navbar-padding-h);top:var(--navbar-padding-v);display:flex;box-sizing:border-box;height:var(--navbar-line-height);padding-inline-start:var(--navbar-padding-h);font-size:.9rem;white-space:nowrap}.vp-page-meta{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page-meta{padding:2rem}}@media (max-width: 419px){.vp-page-meta{padding:1.5rem}}.vp-page-meta{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media print{.vp-page-meta{margin:0!important;padding-inline:0!important}}@media (max-width: 719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--vp-c-text-mute)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--vp-c-text-mute);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:.875em}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .edit-icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.vp-page-meta .last-updated,.vp-page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:.875em}@media (max-width: 719px){.vp-page-meta .last-updated,.vp-page-meta .contributors{font-size:.825em;text-align:start}}.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-inline:auto;margin-top:0;padding:1rem 2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-top var(--vp-t-color)}@media (max-width: 959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .auto-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--vp-c-gutter);border-radius:.25rem}.vp-page-nav .auto-link:hover{background:var(--vp-c-control)}.vp-page-nav .auto-link.external-link:after{display:none}.vp-page-nav .auto-link:not(.external-link) .external-link:after{display:none}.vp-page-nav .auto-link .hint{color:var(--vp-c-text-mute);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end}.vp-page{display:block;padding-top:var(--navbar-height);padding-bottom:2rem;padding-inline-start:var(--sidebar-width)}@media (max-width: 959px){.vp-page{padding-inline-start:var(--sidebar-width-mobile)}}@media (max-width: 719px){.vp-page{padding-inline-start:0}}.vp-page [vp-content]{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page [vp-content]{padding:2rem}}@media (max-width: 419px){.vp-page [vp-content]{padding:1.5rem}}.vp-page [vp-content]{padding-top:0}.vp-sidebar-item{border-inline-start:.25rem solid transparent;color:var(--vp-c-text);cursor:default}.vp-sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.vp-sidebar-item.vp-sidebar-heading{box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:1.25rem 1.5rem;font-weight:700;font-size:1.1em;transition:color .15s ease}.vp-sidebar-item.vp-sidebar-heading+.vp-sidebar-children{overflow:hidden;transition:height .1s ease-out;margin-bottom:.75rem}.vp-sidebar-item.collapsible{cursor:pointer}.vp-sidebar-item:not(.vp-sidebar-heading){display:inline-block;box-sizing:border-box;width:100%;margin:0;padding-block:.35rem;padding-inline:2rem 1rem;font-weight:400;font-size:1em;line-height:1.4}.vp-sidebar-item:not(.vp-sidebar-heading)+.vp-sidebar-children{padding-inline-start:1rem;font-size:.95em}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading){padding-block:.25rem;padding-inline:1.75rem 1rem}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent;font-weight:500}a.vp-sidebar-heading+.vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-inline-start-color:transparent}.vp-sidebar-item.active:not(p.vp-sidebar-heading){border-inline-start-color:var(--vp-c-accent);color:var(--vp-c-accent);font-weight:600}.vp-sidebar-item .auto-link{display:block}.vp-sidebar-item.auto-link{display:block;cursor:pointer}.vp-sidebar-item.auto-link:hover{color:var(--vp-c-accent)}.vp-sidebar-items{margin:0;padding:1.5rem 0;list-style-type:none}@media (max-width: 719px){.vp-sidebar-items{padding:1rem 0}}.vp-sidebar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar{position:fixed;inset-inline-start:0;top:var(--navbar-height);bottom:0;z-index:10;overflow-y:auto;box-sizing:border-box;width:var(--sidebar-width);margin:0;border-inline-end:1px solid var(--vp-c-border);background-color:var(--vp-sidebar-c-bg);font-size:1rem;transition:transform var(--vp-t-transform),background-color var(--vp-t-color),border-color var(--vp-t-color);scrollbar-color:var(--vp-c-accent-bg) var(--vp-c-gutter);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{width:var(--sidebar-width-mobile);font-size:.9rem}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}[dir=rtl] .vp-sidebar{transform:translate(100%)}}.vp-sidebar::-webkit-scrollbar{width:7px}.vp-sidebar::-webkit-scrollbar-track{background-color:var(--vp-c-gutter)}.vp-sidebar::-webkit-scrollbar-thumb{background-color:var(--vp-c-accent-bg)}.vp-sidebar .vp-navbar-items{display:none;padding:.5rem 0 .75rem;border-bottom:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-sidebar .vp-navbar-items{display:block}.vp-sidebar .vp-navbar-items .vp-navbar-dropdown-item .route-link-active:after{top:calc(1rem - 2px)}}.vp-sidebar .vp-navbar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar .vp-navbar-items .auto-link{font-weight:600}.vp-sidebar .vp-navbar-item{display:block;padding-block:.5rem;padding-inline:1.5rem 0;font-size:1.1em;line-height:1.25rem}.vp-sidebar-mask{position:fixed;top:0;left:0;z-index:9;display:none;width:100vw;height:100vh}.vp-theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.vp-theme-container.no-navbar .vp-sidebar{padding-top:0}}.vp-theme-container.no-navbar .vp-page{padding-top:0}.vp-theme-container.no-navbar [vp-content] h1,.vp-theme-container.no-navbar [vp-content] h2,.vp-theme-container.no-navbar [vp-content] h3,.vp-theme-container.no-navbar [vp-content] h4,.vp-theme-container.no-navbar [vp-content] h5,.vp-theme-container.no-navbar [vp-content] h6{margin-top:1.5rem;padding-top:0}.vp-theme-container.no-sidebar .vp-sidebar{display:none}@media (max-width: 719px){.vp-theme-container.no-sidebar .vp-sidebar{display:block}}.vp-theme-container.no-sidebar .vp-page{padding-inline-start:0}@media (max-width: 719px){.vp-theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.vp-theme-container.sidebar-open .vp-sidebar-mask{display:block}}.vp-theme-container[data-v-5421f896]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-5421f896]{padding:2rem}}:root{--vp-c-white: #fff;--vp-c-black: #000;--vp-c-grey-text: #656869;--vp-c-grey-hover: #e4e4e9;--vp-c-grey-bg: #ebebef;--vp-c-grey-soft: rgb(142 150 170 / 14%);--vp-c-indigo-text: #3451b2;--vp-c-indigo-hover: #3a5ccc;--vp-c-indigo-bg: #5672cd;--vp-c-indigo-soft: rgb(100 108 255 / 14%);--vp-c-purple-text: #6f42c1;--vp-c-purple-hover: #7e4cc9;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 14%);--vp-c-blue-text: #2888a7;--vp-c-blue-hover: #2d98ba;--vp-c-blue-bg: #2fa1c5;--vp-c-blue-soft: rgb(27 178 229 / 14%);--vp-c-green-text: #18794e;--vp-c-green-hover: #299764;--vp-c-green-bg: #30a46c;--vp-c-green-soft: rgb(16 185 129 / 14%);--vp-c-yellow-text: #915930;--vp-c-yellow-hover: #946300;--vp-c-yellow-bg: #c28100;--vp-c-yellow-soft: rgb(234 179 8 / 14%);--vp-c-red-text: #b8272c;--vp-c-red-hover: #d5393e;--vp-c-red-bg: #e0575b;--vp-c-red-soft: rgb(244 63 94 / 14%)}[data-theme=dark]{--vp-c-white: #000;--vp-c-black: #fff;--vp-c-grey-text: #939499;--vp-c-grey-hover: #414853;--vp-c-grey-bg: #32363f;--vp-c-grey-soft: rgb(101 117 133 / 16%);--vp-c-indigo-text: #a8b1ff;--vp-c-indigo-hover: #5c73e7;--vp-c-indigo-bg: #3e63dd;--vp-c-indigo-soft: rgb(100 108 255 / 16%);--vp-c-blue-text: #c9e8f2;--vp-c-blue-hover: #a6d9ea;--vp-c-blue-bg: #2785a3;--vp-c-blue-soft: rgb(27 178 229 / 16%);--vp-c-purple-text: #c8abfa;--vp-c-purple-hover: #a879e6;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 16%);--vp-c-green-text: #3dd68c;--vp-c-green-hover: #30a46c;--vp-c-green-bg: #298459;--vp-c-green-soft: rgb(16 185 129 / 16%);--vp-c-yellow-text: #f9b44e;--vp-c-yellow-hover: #da8b17;--vp-c-yellow-bg: #a46a0a;--vp-c-yellow-soft: rgb(234 179 8 / 16%);--vp-c-red-text: #f66f81;--vp-c-red-hover: #f14158;--vp-c-red-bg: #b62a3c;--vp-c-red-soft: rgb(244 63 94 / 16%)}:root{color-scheme:light}[data-theme=dark]{color-scheme:dark}html,body{background:var(--vp-c-bg, #fff);accent-color:var(--vp-c-accent, #299764);transition:background-color var(--vp-t-color)}html{font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}@media print{html{font-size:12pt}}html[data-theme=dark]{color-scheme:dark}body{min-height:100vh;margin:0;padding:0;color:var(--vp-c-text, rgb(60, 60, 67));font-size:1rem;font-synthesis:style}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25;overflow-wrap:break-word}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);font-size:1.65rem;transition:border-color var(--vp-t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}a{color:var(--vp-c-accent, #299764);font-weight:500;text-decoration:none;overflow-wrap:break-word}a.header-anchor{position:relative;color:inherit;text-decoration:none}a.header-anchor:before{content:"¶";position:absolute;top:.4167em;left:-.75em;display:none;color:var(--vp-c-accent, #299764);font-size:.75em}[dir=rtl] a.header-anchor:before{right:-.75em}a.header-anchor:hover:before{display:block}a.header-anchor:focus-visible{outline:none}a.header-anchor:focus-visible:before{display:block;outline:auto}strong{font-weight:600}blockquote{margin:1rem 0;padding-block:.25rem;padding-inline:1rem 0;border-inline-start:.2rem solid var(--vp-c-border-hard, #b8b8ba);color:var(--vp-c-text-mute, rgba(60, 60, 67, .78));font-size:1rem;overflow-wrap:break-word;transition:border-color var(--vp-t-color),color var(--vp-t-color)}blockquote>p{margin:0}hr{border:0;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);transition:border-color var(--vp-t-color)}:not(pre)>code{margin:0;padding:3px 6px;border-radius:4px;background:var(--vp-c-grey-soft, rgba(142, 150, 170, .14));font-size:.875em;overflow-wrap:break-word;transition:background-color var(--vp-t-color),color var(--vp-t-color)}p a code{color:var(--vp-c-accent, #299764);font-weight:400}table code{padding:.1rem .4rem}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid var(--vp-c-border, #c2c2c4);border-radius:.25em;box-shadow:1px 1px 4px 0 var(--vp-c-shadow, rgba(0, 0, 0, .15));line-height:1;letter-spacing:-.1em;text-align:center}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tbody tr:nth-child(odd){background:var(--vp-c-bg-alt, #f6f8fa);transition:background-color var(--vp-t-color)}th,td{padding:.6em 1em;border:1px solid var(--vp-c-border-hard, #d1d4d7);transition:border-color var(--vp-t-color)}pre{text-align:left;direction:ltr;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}@media print{pre{white-space:pre-wrap}}pre code{padding:0;border-radius:0}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a.header-anchor{text-decoration:none}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@media (prefers-reduced-motion: reduce){*,:before,:after{background-attachment:initial!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important}}:root{--vp-c-accent: #299764;--vp-c-accent-bg: #3eaf7c;--vp-c-accent-hover: #4abf8a;--vp-c-accent-text: var(--vp-c-white);--vp-c-accent-soft: rgb(16 185 129 / 14%);--vp-c-bg: #fff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #fff;--vp-c-text: rgb(60 60 67);--vp-c-text-mute: rgb(60 60 67 / 78%);--vp-c-text-subtle: rgb(60 60 67 / 56%);--vp-c-gutter: #e2e2e3;--vp-c-border: #c2c2c4;--vp-c-border-hard: #b8b8ba;--vp-c-shadow: rgb(0 0 0 / 15%);--vp-c-control: rgb(142 150 170 / 10%);--vp-c-control-hover: rgb(142 150 170 / 16%);--vp-c-control-disabled: #eaeaea;--vp-navbar-c-bg: var(--vp-c-bg);--vp-sidebar-c-bg: var(--vp-c-bg);--vp-c-code-tab-title: var(--code-c-text, rgb(255 255 255 / 90%));--vp-c-code-tab-bg: var(--code-bg-color, var(--code-c-bg));--vp-c-code-tab-active: var(--vp-c-accent);--badge-c-tip-text: var(--vp-c-green-text);--badge-c-tip-bg: var(--vp-c-green-soft);--badge-c-warning-text: var(--vp-c-yellow-text);--badge-c-warning-bg: var(--vp-c-yellow-soft);--badge-c-danger-text: var(--vp-c-red-text);--badge-c-danger-bg: var(--vp-c-red-soft);--badge-c-important-text: var(--vp-c-purple-text);--badge-c-important-bg: var(--vp-c-purple-soft);--badge-c-info-text: var(--vp-c-indigo-text);--badge-c-info-bg: var(--vp-c-indigo-soft);--badge-c-note-text: var(--vp-c-grey-text);--badge-c-note-bg: var(--vp-c-grey-soft);--font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px;--header-offset: var(--navbar-height);--vp-t-color: .3s ease;--vp-t-transform: .3s ease;--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z'/%3E%3C/svg%3E");--external-link-c-icon: var(--vp-c-text-mute)}[data-theme=dark]{--vp-c-accent: #3dd68c;--vp-c-accent-bg: #3aa675;--vp-c-accent-hover: #349469;--vp-c-accent-soft: rgb(16 185 129 / 16%);--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-text: rgb(235 235 245 / 86%);--vp-c-text-mute: rgb(235 235 245 / 60%);--vp-c-text-subtle: rgb(235 235 245 / 38%);--vp-c-gutter: #000;--vp-c-border: #3c3f44;--vp-c-border-hard: #45484e;--vp-c-shadow: rgb(0 0 0 / 30%);--vp-c-control: rgb(101 117 133 / 12%);--vp-c-control-hover: rgb(101 117 133 / 18%);--vp-c-control-disabled: #363636}body{font-family:var(--font-family)}code{font-family:var(--code-font-family)}[vp-content] h1,[vp-content] h2,[vp-content] h3,[vp-content] h4,[vp-content] h5,[vp-content] h6{margin-top:calc(.5rem - var(--header-offset));margin-bottom:0;padding-top:calc(1rem + var(--header-offset))}[vp-content] h1:first-child,[vp-content] h2:first-child,[vp-content] h3:first-child,[vp-content] h4:first-child,[vp-content] h5:first-child,[vp-content] h6:first-child{margin-bottom:1rem}[vp-content] h1:first-child+p,[vp-content] h1:first-child+pre,[vp-content] h1:first-child+.custom-container,[vp-content] h2:first-child+p,[vp-content] h2:first-child+pre,[vp-content] h2:first-child+.custom-container,[vp-content] h3:first-child+p,[vp-content] h3:first-child+pre,[vp-content] h3:first-child+.custom-container,[vp-content] h4:first-child+p,[vp-content] h4:first-child+pre,[vp-content] h4:first-child+.custom-container,[vp-content] h5:first-child+p,[vp-content] h5:first-child+pre,[vp-content] h5:first-child+.custom-container,[vp-content] h6:first-child+p,[vp-content] h6:first-child+pre,[vp-content] h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 419px){[vp-content] h1{font-size:1.9rem}}[vp-content] a:not(.header-anchor){text-decoration:underline}[vp-content] img{max-width:100%}div[class*=language-]{margin:.75rem 0;transition:background-color var(--vp-t-color),color var(--vp-t-color)}@media (max-width: 419px){div[class*=language-]{--code-border-radius: 0;margin:.75rem -1.5rem}}div[class*=language-] .line.diff,div[class*=language-] .line.highlighted{transition:background-color var(--vp-t-color)}.table-of-contents .vp-badge{vertical-align:middle}.arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}[data-theme=dark] .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}[dir=rtl] .arrow.right,.arrow.left{transform:rotate(-90deg)}[dir=rtl] .arrow.left{transform:rotate(90deg)}.vp-external-link-icon:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .external-link:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon [vp-content] a[href*="://"]:not(.no-external-link-icon):after,.external-link-icon [vp-content] a[target=_blank]:not(.no-external-link-icon):after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-inline-start:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}:root{scroll-behavior:smooth}@media screen and (max-width: 719px){.vp-hide-mobile{display:none}}.vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-comment{padding:2rem}}@media (max-width: 419px){.vp-comment{padding:1.5rem}}.vp-navbar .DocSearch{transition:background-color var(--vp-t-color)}.vp-navbar .search-box{vertical-align:top;flex:0 0 auto}@media screen and (max-width: 719px){.hint-container{margin-inline:-.75rem}}.lang-modal-fade-enter-active,.lang-modal-fade-leave-active{transition:opacity .5s}.lang-modal-fade-enter,.lang-modal-fade-leave-to{opacity:0}.lang-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1499;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}@media print{.lang-modal-mask{display:none}}.lang-modal-wrapper{position:relative;z-index:1500;overflow:hidden;max-width:80vw;padding:1rem 2rem;border-radius:8px;background:var(--vp-bg);box-shadow:0 2px 6px 0 var(--card-shadow)}.lang-modal-action{display:block;width:100%;margin:1rem 0;padding:.5rem .75rem;border:none;border-radius:8px;background-color:var(--vp-bglt);color:var(--vp-c);cursor:pointer}.lang-modal-action:hover{background-color:var(--vp-bgl)}.lang-modal-action.primary{background-color:var(--vp-tc);color:var(--white)}.lang-modal-action.primary:hover{background-color:var(--vp-tcl)}.grey{color:#0006}.works-table-wrapper[data-v-765855fb]{margin:0 auto;padding:0 2rem;max-width:1224px;box-sizing:border-box}.works-table-wrapper[data-v-765855fb] table{width:100%}:root{--content-width: 960px}.vp-page .theme-default-content{padding-bottom:0!important}.vp-page-meta{display:none}
diff --git a/assets/works.html-CZFprrn5.js b/assets/works.html-AkvQjJeg.js
similarity index 99%
rename from assets/works.html-CZFprrn5.js
rename to assets/works.html-AkvQjJeg.js
index 5852874..ebd0e8e 100644
--- a/assets/works.html-CZFprrn5.js
+++ b/assets/works.html-AkvQjJeg.js
@@ -1 +1 @@
-import{_ as i,c as a,e as r,o as t}from"./app-tk-nPD_r.js";const l={};function o(s,e){return t(),a("div",null,e[0]||(e[0]=[r('<h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p>',37)]))}const d=i(l,[["render",o],["__file","works.html.vue"]]),n=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-10-15T14:10:49.000Z"}],["meta",{"property":"article:modified_time","content":"2024-10-15T14:10:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]},{"level":3,"title":"MERLION","slug":"merlion","link":"#merlion","children":[]}]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1729001449000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":9}],"changelog":[{"hash":"cda6a85b70639418db2fe08a106ec89a104c8ece","time":1729001449000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix typo"},{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","time":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","time":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"f75ed3d2f6d602399e472e3ced7dc62e0e01e5e9","time":1721915974000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add pre-commit hook"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","time":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","time":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","time":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"works.md"}');export{d as comp,n as data};
+import{_ as i,c as a,e as r,o as t}from"./app-DZpkSsji.js";const l={};function o(s,e){return t(),a("div",null,e[0]||(e[0]=[r('<h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p>',37)]))}const d=i(l,[["render",o],["__file","works.html.vue"]]),n=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-10-15T14:10:49.000Z"}],["meta",{"property":"article:modified_time","content":"2024-10-15T14:10:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]},{"level":3,"title":"MERLION","slug":"merlion","link":"#merlion","children":[]}]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1729001449000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":9}],"changelog":[{"hash":"cda6a85b70639418db2fe08a106ec89a104c8ece","time":1729001449000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"fix typo"},{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","time":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","time":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"f75ed3d2f6d602399e472e3ced7dc62e0e01e5e9","time":1721915974000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"add pre-commit hook"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","time":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","time":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","time":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"works.md"}');export{d as comp,n as data};
diff --git a/assets/works.html-mij4Hd53.js b/assets/works.html-CnSsBJaM.js
similarity index 99%
rename from assets/works.html-mij4Hd53.js
rename to assets/works.html-CnSsBJaM.js
index 4fd5762..2fdc11f 100644
--- a/assets/works.html-mij4Hd53.js
+++ b/assets/works.html-CnSsBJaM.js
@@ -1 +1 @@
-import{_ as t,c as a,e as r,o as i}from"./app-tk-nPD_r.js";const o={};function n(s,e){return i(),a("div",null,e[0]||(e[0]=[r('<h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p>',37)]))}const c=t(o,[["render",n],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]}]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":7}],"changelog":[{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","time":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","time":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","time":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","time":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","time":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"eng/works.md"}');export{c as comp,d as data};
+import{_ as t,c as a,e as r,o as i}from"./app-DZpkSsji.js";const o={};function n(s,e){return i(),a("div",null,e[0]||(e[0]=[r('<h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p>',37)]))}const c=t(o,[["render",n],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]}]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","username":"","email":"dmitriy@ideascup.me","commits":7}],"changelog":[{"hash":"2b9101cf1aef46f45c4c3fc0cc318b15954fb18d","time":1723020534000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update works"},{"hash":"98c6e787d16f10afce747b7510ff541e267ef548","time":1723016206000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"update dates"},{"hash":"7a393c6c2de9edfef0f1dafce18b0aa500f01c38","time":1721909529000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"change some information"},{"hash":"753116020a0fcedfd9b1f7823b313b61fab28b61","time":1721830505000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"refac: use vuepress"},{"hash":"14c901a8c0fb633b87a383ee7764d1fec6043125","time":1688419364000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: return highlighted content"},{"hash":"a6843b2bf6fb1577a3ddf7805f8f7bb24f92cdbd","time":1678884129000,"email":"dmitriy@pleshevski.ru","author":"Dmitriy Pleshevskiy","message":"works: move masterprogress above"},{"hash":"b3f2e41c7ddcef79633401bbb2a6b49a0f8d8629","time":1656882923000,"email":"dmitriy@ideascup.me","author":"Dmitriy Pleshevskiy","message":"add work page content"}]},"filePathRelative":"eng/works.md"}');export{c as comp,d as data};
diff --git a/eng/index.html b/eng/index.html
index 2bf459d..a91e33c 100644
--- a/eng/index.html
+++ b/eng/index.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="ru-ru" href="https://pleshevski.ru/"><meta property="og:url" content="https://pleshevski.ru/eng/"><meta property="og:site_name" content="Dmitriy Pleshevskiy"><meta property="og:title" content="Resume"><meta property="og:type" content="website"><meta property="og:locale" content="en-US"><meta property="og:locale:alternate" content="ru-RU"><meta property="og:updated_time" content="2025-03-12T12:50:22.000Z"><meta property="article:modified_time" content="2025-03-12T12:50:22.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Resume"}</script><title>Resume | Dmitriy Pleshevskiy</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-CVjY3BV_.css" as="style"><link rel="stylesheet" href="/assets/style-CVjY3BV_.css">
-    <link rel="modulepreload" href="/assets/app-tk-nPD_r.js"><link rel="modulepreload" href="/assets/index.html-Woighx2z.js">
-    <link rel="prefetch" href="/assets/index.html-UKCz4hfb.js" as="script"><link rel="prefetch" href="/assets/works.html-CZFprrn5.js" as="script"><link rel="prefetch" href="/assets/works.html-mij4Hd53.js" as="script"><link rel="prefetch" href="/assets/404.html-uFOVky09.js" as="script">
+    <link rel="preload" href="/assets/style-0okUxGr0.css" as="style"><link rel="stylesheet" href="/assets/style-0okUxGr0.css">
+    <link rel="modulepreload" href="/assets/app-DZpkSsji.js"><link rel="modulepreload" href="/assets/index.html-B992a44K.js">
+    <link rel="prefetch" href="/assets/index.html-CmmWOU6g.js" as="script"><link rel="prefetch" href="/assets/works.html-AkvQjJeg.js" as="script"><link rel="prefetch" href="/assets/works.html-CnSsBJaM.js" as="script"><link rel="prefetch" href="/assets/404.html-BlRV83Ta.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/eng/"><!----><span class="vp-site-name" aria-hidden="true">Dmitriy Pleshevskiy</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-home"><header class="vp-hero"><!----><!----><p class="vp-hero-description"> </p><!----></header><!----><div vp-content><div><p>Always up-to-date link to <a class="route-link" href="/eng/">resume</a>.</p><h2 id="overview" tabindex="-1"><a class="header-anchor" href="#overview"><span>Overview</span></a></h2><p>My name is Dmitriy Pleshevskiy.</p><p>As an open-source development enthusiast, I am always ready to collaborate and participate in exciting projects. I am inspired by the opportunity to contribute to the community and share knowledge. The core technologies I work with include <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, and <code>Docker</code>. I have a particular passion for functional programming, which enables writing clean and efficient code. As a NixOS evangelist, I not only actively use it in my projects but also promote its adoption among individuals and companies, highlighting its advantages and assisting in its implementation within their infrastructure. My extensive experience in backend and frontend development, as well as in DevOps, allows me to tackle complex challenges effectively. Additionally, I have expertise as an architect, team leader, and mentor.</p><h2 id="skills" tabindex="-1"><a class="header-anchor" href="#skills"><span>Skills</span></a></h2><h4 id="programming-languages" tabindex="-1"><a class="header-anchor" href="#programming-languages"><span>Programming Languages:</span></a></h4><ul><li>TypeScript (prefer, solid 9-year exp)</li><li>SQL (prefer, solid 8-year exp)</li><li>Rust (prefer, solid 5-year exp)</li><li>Python (solid 9-year exp)</li><li>Haskell</li><li>Bash (8-year exp)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="repositories" tabindex="-1"><a class="header-anchor" href="#repositories"><span>Repositories:</span></a></h4><ul><li>PostgreSQL (prefer, solid 8-year exp)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (prefer, solid 5-year exp)</li></ul><hr><p>I also have extensive experience in creating the following applications:</p><ul><li>Traditional (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Dynamic (SPA)</li><li>Hybrid (SSR + SPA)</li><li>Console</li><li>Cross-platform</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (prefer, solid 2-year exp)</li><li><code>async-graphql</code> (prefer, solid 2-year exp)</li><li><code>shaku</code> (prefer, solid 2-year exp)</li><li><code>bb8</code> + <code>postgres-types</code> (prefer, solid 5-year exp)</li><li><code>diesel</code> (2-year exp)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (solid 5-year exp)</li><li><code>Express</code> (solid 9-year exp)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (solid 5-year exp)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (solid 8-year exp)</li><li><code>VueJS</code> (prefer, solid 3-year exp)</li><li><code>Cypress</code> (prefer, solid 3-year exp)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (prefer, solid 5-year exp)</li><li><code>Sass</code> (prefer, solid 8-year exp)</li><li><code>Less</code> (weak 4-year exp)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (prefer, solid 3-year exp)</li><li><code>Docker Swarm</code> (solid 6-year exp)</li><li><code>Kubernetes</code> (weak 5-year exp)</li><li><code>Woodpecker CI</code> (prefer, solid 4-year exp)</li><li><code>Drone CI</code> (solid 3-year exp)</li><li><code>Gitlab CI</code> (solid 7-year exp)</li><li><code>GitHub Actions</code> (4-year exp)</li></ul><h2 id="interests" tabindex="-1"><a class="header-anchor" href="#interests"><span>Interests</span></a></h2><p>Open-source projects are my passion! I develop, maintain and improve projects in my spare time.</p><p>Besides programming, I love to cook and spend time with my beloved family!</p><h2 id="contacts" tabindex="-1"><a class="header-anchor" href="#contacts"><span>Contacts</span></a></h2><p>Simplex (Prefer): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="links" tabindex="-1"><a class="header-anchor" href="#links"><span>Links</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Suspended)</a></li></ul></div></div><!----></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-tk-nPD_r.js" defer></script>
+    <script type="module" src="/assets/app-DZpkSsji.js" defer></script>
   </body>
 </html>
diff --git a/eng/works.html b/eng/works.html
index 3682556..24ca6b9 100644
--- a/eng/works.html
+++ b/eng/works.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="ru-ru" href="https://pleshevski.ru/works.html"><meta property="og:url" content="https://pleshevski.ru/eng/works.html"><meta property="og:site_name" content="Dmitriy Pleshevskiy"><meta property="og:title" content="Works"><meta property="og:type" content="website"><meta property="og:locale" content="en-US"><meta property="og:locale:alternate" content="ru-RU"><meta property="og:updated_time" content="2024-08-07T08:48:54.000Z"><meta property="article:modified_time" content="2024-08-07T08:48:54.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Works"}</script><title>Works | Dmitriy Pleshevskiy</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-CVjY3BV_.css" as="style"><link rel="stylesheet" href="/assets/style-CVjY3BV_.css">
-    <link rel="modulepreload" href="/assets/app-tk-nPD_r.js"><link rel="modulepreload" href="/assets/works.html-mij4Hd53.js">
-    <link rel="prefetch" href="/assets/index.html-UKCz4hfb.js" as="script"><link rel="prefetch" href="/assets/works.html-CZFprrn5.js" as="script"><link rel="prefetch" href="/assets/index.html-Woighx2z.js" as="script"><link rel="prefetch" href="/assets/404.html-uFOVky09.js" as="script">
+    <link rel="preload" href="/assets/style-0okUxGr0.css" as="style"><link rel="stylesheet" href="/assets/style-0okUxGr0.css">
+    <link rel="modulepreload" href="/assets/app-DZpkSsji.js"><link rel="modulepreload" href="/assets/works.html-CnSsBJaM.js">
+    <link rel="prefetch" href="/assets/index.html-CmmWOU6g.js" as="script"><link rel="prefetch" href="/assets/works.html-AkvQjJeg.js" as="script"><link rel="prefetch" href="/assets/index.html-B992a44K.js" as="script"><link rel="prefetch" href="/assets/404.html-BlRV83Ta.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container data-v-765855fb><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/eng/"><!----><span class="vp-site-name" aria-hidden="true">Dmitriy Pleshevskiy</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/eng/" aria-label="Resume"><!--[--><!--[--><!--]--><!--]-->Resume<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="Works"><!--[--><!--[--><!--]--><!--]-->Works<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h2 id="highlighted-working-experience" tabindex="-1"><a class="header-anchor" href="#highlighted-working-experience"><span>Highlighted working experience</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Dates: August 2018 – currently</li><li>Roles: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Development of a Project Management Tool for Interior Designers</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Stack: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Migrated database triggers into business logic. Code became easier to read and maintain, and the system became more reliable.</li><li>Introduced unit testing and integration testing practices. I wrote over 70% of all tests myself.</li><li>Added GraphQL subscriptions for dynamic updates.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Stack: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Formed a UIKit and general components, optimized complex and loaded components.</li><li>Changed API work on the frontend.</li><li>Introduced integration testing practice using Cypress.</li><li>Migrated the entire project to TypeScript. Created isolated system modules.</li></ul><h5 id="leadership-of-the-team" tabindex="-1"><a class="header-anchor" href="#leadership-of-the-team"><span>Leadership of the Team</span></a></h5><ul><li>Introduced TDD (Test-Driven Development) practices.</li><li>Brought the &quot;Critical Chain Method&quot;, the &quot;Buffer Method&quot;, and the &quot;Backward Planning&quot; method into the project. Helped the team get in sync, releasing small batches every week.</li><li>Created individual development plans for team members.</li></ul><h5 id="architecture" tabindex="-1"><a class="header-anchor" href="#architecture"><span>Architecture</span></a></h5><ul><li>Broke down the entire codebase into modules by feature.</li><li>Optimized <code>PostgreSQL</code> database, splitting company data into separate schemas and applying partitioning tables.</li><li>Added query caching with Redis.</li><li>Reduced infrastructure costs by 5 times, migrating the project from Kubernetes to NixOS.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - currently</li><li>Роль: Lead Fullstack Developer</li></ul><p>Development of the Back Office for Core Spirit social platform.</p><ul><li>Integrated <code>Dependabot</code>, which helped update all outdated dependencies. Replaced webpack with <code>vite</code>.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Dates: May 2018 - currently (Passively maintained)</li><li>Role: Tech Lead</li></ul><p>Development web infrastructure of the educational center Master Progress</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">The main site</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Student&#39;s cabinet</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">A tool for rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>A complete infrastructure was created on <code>NixOS</code>. Before that, I had created an infrastructure using <code>Drone CI</code> / <code>Woodpecker CI</code> and <code>Docker swarm</code>, which has been running for over 5 years.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Dates: August 2018 - May 2020, August 2024 - currently</li><li>Role: Lead Fullstack Developer</li></ul><p>Development of Social platform focusing on human and planetary enhancement.</p><ul><li>A REST API (using <code>Node.JS</code>, <code>Express</code>, and <code>PostgreSQL</code>) for the main website and back office. I also got to work with a new version of the REST API using <code>Go</code> and <code>PostgreSQL</code>.</li><li>Auto poster to various social networks and messengers (Facebook, LinkedIn, Twitter, Telegram).</li><li>Neural network for automatic categorization of articles.</li></ul><hr><h4 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h4><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>In this company there were 6 considerable projects I have successfully completed:</p><ul><li>optimize the creation of promotional pages (PHP, JavaScript)</li><li>support main traditional site <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>development of parsing to monitor products for changes in price, quantity/availability in stock, rating and other fields based on data from 55 websites (Node.JS, Express)</li><li>work with neural networks for matching of goods</li><li>development face recognition apps for Android (Java)</li></ul><hr><h2 id="chronology" tabindex="-1"><a class="header-anchor" href="#chronology"><span>Chronology</span></a></h2><p>Public projects only.</p></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Last Updated:: </span><time class="meta-item-info" datetime="2024-08-07T08:48:54.000Z" data-allow-mismatch>8/7/24, 8:48 AM</time></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: dmitriy@ideascup.me">Dmitriy Pleshevskiy</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><div class="works-table-wrapper" data-v-765855fb><table data-v-765855fb><thead><tr><th>Name</th><th>Description</th><th>Role</th><th>Technologies</th><th>Status</th><th>Dates</th></tr></thead><tbody><!--[--><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/nixeovim">nixeovim</a></td><td>Configure and build neovim editor using nix</td><td>author</td><td>Nix</td><td>actively-developed</td><td><div><small class="">04/24/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/mindustry-tools">Mindustry tools</a></td><td>Tools for the Mindustry game</td><td>author</td><td>Nix, Godot</td><td>passively-maintained</td><td><div><small class="">01/07/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://rosmintrud.masterprogress.ru">Master Progress Rosmintrud tools</a></td><td>Internal service to prepare documents for the rosmintrud (SPA)</td><td>tech&nbsp;lead</td><td>Deno, Sqlite, TS, Vue, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">07/03/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-plpgsql">tree-sitter-plpgsql</a></td><td>plpgsql grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>passively-maintained</td><td><div><small class="">01/05/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-d2">tree-sitter-d2</a></td><td>d2 grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>actively-developed</td><td><div><small class="">12/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/mynix/nix2lua">nix2lua</a></td><td>This is a small but functional library that converts your nix configurations into lua format.</td><td>author</td><td>Nix, Lua</td><td>passively-maintained</td><td><div><small class="">11/22/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/vnetod">vnetod</a></td><td>Dotenv section switcher</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/29/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/recipes">recipes</a></td><td>Site with recipes which cares about privacy</td><td>author</td><td>TS, Deno, Rust</td><td>passively-maintained</td><td><div><small class="">05/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru">pleshevski.ru</a></td><td>Source code of my personal site</td><td>author</td><td>TS, Vue, Vuepress, Nix</td><td>passively-maintained</td><td><div><small class="">03/16/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/espruino-starter">espruino-starter</a></td><td>Quickly start creating your new project on the espruino board or a board based on it.</td><td>author</td><td>JS</td><td>as-is</td><td><div><small class="">08/23/2021</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/sonic-channel">sonic-channel</a></td><td>Rust client for sonic search backend.</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/18/2020</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/it-fsm">it-fsm</a></td><td>Simple full-featured finite state machine for your project</td><td>author</td><td>TS, NodeJS, Deno</td><td>passively-maintained</td><td><div><small class="">10/11/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://cabinet.masterprogress.ru">Cabinet Master Progress</a></td><td>Student&#39;s cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech&nbsp;lead</td><td>Python, Flask, PostgreSQL, TS, React, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">09/22/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/genrss">genrss</a></td><td>RSS generator for python</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="">07/23/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://www.binarymanagement.com">Binary Management</a></td><td>Project management tool for interior designers</td><td>developer, tech&nbsp;lead, team&nbsp;lead</td><td>TS, NodeJS, React, Antd, Docker, Drone CI, Rust, Nix</td><td>actively-developed</td><td><div><small class="">09/15/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://masterprogress.ru">Master Progress</a></td><td>Main website of the educational center Master Progress (SSR + Forms)</td><td>tech&nbsp;lead</td><td>Python, Flask, JS, Nix</td><td>passively-maintained</td><td><div><small class="">04/10/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/picsg">picsg</a></td><td>A tool for steganographing information in a picture encoded using the Vernam cipher.</td><td>author</td><td>Haskell</td><td>as-is</td><td><div><small class="grey">04/13/2024</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/yandexgpt_tg_bot">yandexgpt_tg_bot</a></td><td>The Telegram bot to describe article with link by YandexGPT.</td><td>author</td><td>JS, NodeJS, Nix</td><td>as-is</td><td><div><small class="grey">06/27/2023</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/estring">estring</a></td><td>A simple way to parse a string using type annotations.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/23/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/enve">enve</a></td><td>It helps you work with environment variables and convert it to any type using only type annotations</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/18/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/docker_stack">docker stack drone plugin</a></td><td>Deploy to production using `docker stack deploy`</td><td>author</td><td>Docker, Drone CI, Woodpecker CI</td><td>as-is</td><td><div><small class="grey">06/06/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/paren">paren</a></td><td>Library for parsing and rendering information.</td><td>author</td><td>TS, Deno</td><td>experimental</td><td><div><small class="grey">03/14/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/hwt">hwt</a></td><td>healthy workaholic timer – A tool that keeps you from breaking your health by working all day.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">02/04/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/wd2">wd2</a></td><td>A wrapper over d2 which allows to use additional configs from d2 file</td><td>author</td><td>Bash, Nix</td><td>as-is</td><td><div><small class="grey">12/12/2022</small></div><div><small>07/31/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/react-rest-request">react-rest-request</a></td><td>Minimalistic REST API client for React inspired by Apollo.</td><td>author</td><td>TS, React</td><td>deprecated</td><td><div><small class="grey">10/04/2020</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/marshmallow_pageinfo">marshmallow_pageinfo</a></td><td>Page info marshmallow schema for api</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">10/05/2019</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ictmpl">ictmpl</a></td><td>Generate projects from templates</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">06/30/2018</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/github/dexios">dexios</a></td><td>Dexios is a fast, secure, and open source command-line encryption tool.</td><td>collaborator</td><td>Rust</td><td></td><td><div><small class="grey">06/01/2022</small></div><div><small>02/28/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/itconfig">itconfig</a></td><td>Easy build a configs from environment variables and use it in globally.</td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">12/22/2019</small></div><div><small>07/24/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/migra">migra</a></td><td>Simple SQL migration manager for your project.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">01/31/2021</small></div><div><small>03/17/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ood_persistence">ood_persistence</a></td><td>Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture </td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">10/12/2021</small></div><div><small>10/21/2021</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://corespirit.com">Core Spirit</a></td><td>Social platform focusing on human and planetary enhancement</td><td>developer</td><td>TS, NodeJS, Go, Python, React, Docker, Drone CI</td><td></td><td><div><small class="grey">09/05/2018</small></div><div><small>12/31/2019</small></div></td></tr><!--]--></tbody></table></div><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-tk-nPD_r.js" defer></script>
+    <script type="module" src="/assets/app-DZpkSsji.js" defer></script>
   </body>
 </html>
diff --git a/index.html b/index.html
index 54c1b9b..91f57b8 100644
--- a/index.html
+++ b/index.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="en-us" href="https://pleshevski.ru/eng/"><meta property="og:url" content="https://pleshevski.ru/"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:title" content="Резюме"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><meta property="og:locale:alternate" content="en-US"><meta property="og:updated_time" content="2025-03-12T12:50:22.000Z"><meta property="article:modified_time" content="2025-03-12T12:50:22.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Резюме"}</script><title>Резюме | Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-CVjY3BV_.css" as="style"><link rel="stylesheet" href="/assets/style-CVjY3BV_.css">
-    <link rel="modulepreload" href="/assets/app-tk-nPD_r.js"><link rel="modulepreload" href="/assets/index.html-UKCz4hfb.js">
-    <link rel="prefetch" href="/assets/works.html-CZFprrn5.js" as="script"><link rel="prefetch" href="/assets/index.html-Woighx2z.js" as="script"><link rel="prefetch" href="/assets/works.html-mij4Hd53.js" as="script"><link rel="prefetch" href="/assets/404.html-uFOVky09.js" as="script">
+    <link rel="preload" href="/assets/style-0okUxGr0.css" as="style"><link rel="stylesheet" href="/assets/style-0okUxGr0.css">
+    <link rel="modulepreload" href="/assets/app-DZpkSsji.js"><link rel="modulepreload" href="/assets/index.html-CmmWOU6g.js">
+    <link rel="prefetch" href="/assets/works.html-AkvQjJeg.js" as="script"><link rel="prefetch" href="/assets/index.html-B992a44K.js" as="script"><link rel="prefetch" href="/assets/works.html-CnSsBJaM.js" as="script"><link rel="prefetch" href="/assets/404.html-BlRV83Ta.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><!----><span class="vp-site-name" aria-hidden="true">Дмитрий Плешевский</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-home"><header class="vp-hero"><!----><!----><p class="vp-hero-description"> </p><!----></header><!----><div vp-content><div><p>Всегда актуальная ссылка на <a class="route-link" href="/">резюме</a>.</p><h2 id="общие-сведения" tabindex="-1"><a class="header-anchor" href="#общие-сведения"><span>Общие сведения</span></a></h2><p>Меня зовут Дмитрий Плешевский.</p><p>Как энтузиаст open-source разработки, я всегда готов к сотрудничеству и участию в интересных проектах. Меня вдохновляет возможность вносить вклад в сообщество и делиться знаниями. Основные технологии, с которыми я работаю, включают <code>TypeScript</code>, <code>Rust</code>, <code>Python</code>, <code>PostgreSQL</code>, <code>Minio</code>, <code>RabbitMQ</code>, <code>React</code>, <code>VueJS</code>, <code>Docker</code>. Особенно люблю функциональное программирование, которое позволяет писать чистый и эффективный код. Как евангелист <code>NixOS</code>, я не только активно использую его в своих проектах, но и активно агитирую людей и компании переходить на эту систему, подчеркивая ее преимущества и помогая внедрять ее в их инфраструктуру. Большой опыт в разработке backend и frontend приложений, а также в DevOps, позволяет эффективно решать сложные задачи. Также имею опыт работы в качестве архитектора, руководителя команды и наставника.</p><h2 id="умения" tabindex="-1"><a class="header-anchor" href="#умения"><span>Умения</span></a></h2><h4 id="языки-программирования" tabindex="-1"><a class="header-anchor" href="#языки-программирования"><span>Языки программирования:</span></a></h4><ul><li>TypeScript (предпочитаю, твёрдый 9-летний опыт)</li><li>SQL (предпочитаю, твёрдый 8-летний опыт)</li><li>Rust (предпочитаю, 5-летний опыт)</li><li>Python (твёрдый 9-летний опыт)</li><li>Haskell</li><li>Bash (8-летний опыт)</li><li>Java</li><li>C#</li><li>C++</li></ul><h4 id="хранилища-данных" tabindex="-1"><a class="header-anchor" href="#хранилища-данных"><span>Хранилища данных:</span></a></h4><ul><li>PostgreSQL (предпочитаю, твёрдый 8-летний опыт)</li><li>MySQL</li><li>Sqlite</li><li>MsSQL</li><li>MongoDB</li><li>Redis</li><li>Minio (предпочитаю, твердый 5-летний опыт)</li></ul><hr><p>Я так же имею большой опыт в создании следующих типов приложений:</p><ul><li>Традиционные (SSR + Forms)</li><li>API (REST/GraphQL/WebSocket/EventSource)</li><li>Динамическое (SPA)</li><li>Гибридное (SSR + SPA)</li><li>Консольные</li><li>Кроссплатформенные</li></ul><h2 id="stack" tabindex="-1"><a class="header-anchor" href="#stack"><span>Stack</span></a></h2><h4 id="backend-rust" tabindex="-1"><a class="header-anchor" href="#backend-rust"><span>Backend (Rust)</span></a></h4><ul><li><code>axum</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>async-graphql</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>shaku</code> (предпочитаю, твёрдый 2-летний опыт)</li><li><code>bb8</code> + <code>postgres-types</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>diesel</code> (2-летний опыт)</li></ul><h4 id="backend-node-js" tabindex="-1"><a class="header-anchor" href="#backend-node-js"><span>Backend (Node.JS)</span></a></h4><ul><li><code>Apollo</code> (твёрдый 5-летний опыт)</li><li><code>Express</code> (твёрдый 9-летний опыт)</li><li><code>Nest.JS</code></li><li><code>Knex.js</code> / <code>Objection.js</code> (твёрдый 5-летний опыт)</li><li><code>Sequelize</code></li></ul><h4 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h4><ul><li><code>React</code> (твёрдый 8-летний опыт)</li><li><code>VueJS</code> (предпочитаю, твёрдый 4-летний опыт)</li><li><code>Cypress</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>JQuery</code></li><li><code>Antd</code> / <code>Antdv</code></li><li><code>PostCSS</code> (предпочитаю, твёрдый 5-летний опыт)</li><li><code>Sass</code> (предпочитаю, твёрдый 8-летний опыт)</li><li><code>Less</code> (слабый 4-летний опыт)</li></ul><h4 id="devops" tabindex="-1"><a class="header-anchor" href="#devops"><span>DevOps</span></a></h4><ul><li><code>NixOS</code> / <code>NixOps</code> / <code>Nix dev shell</code> (предпочитаю, твёрдый 3-летний опыт)</li><li><code>Docker Swarm</code> (твёрдый 6-летний опыт)</li><li><code>Kubernetes</code> (слабый 5-летний опыт)</li><li><code>Woodpecker CI</code> (твёрдый 4-летний опыт)</li><li><code>Drone CI</code> (твёрдый 3-летний опыт)</li><li><code>Gitlab CI</code> (твёрдый 7-летний опыт)</li><li><code>GitHub Actions</code> (4-летний опыт)</li></ul><h2 id="интересы" tabindex="-1"><a class="header-anchor" href="#интересы"><span>Интересы</span></a></h2><p>Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.</p><p>Помимо программирования я люблю готовить и проводить время со своей любимой семьей!</p><h2 id="контакты" tabindex="-1"><a class="header-anchor" href="#контакты"><span>Контакты</span></a></h2><p>Simplex (Предпочтительно): <a href="https://simplex.chat/contact#/?v=2-7&amp;smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Telegram: <a href="https://telegram.me/da_pranaya" target="_blank" rel="noopener noreferrer">Dmitriy Pleshevskiy</a></p><p>Matrix: <code>@pleshevskiy:matrix.org</code></p><p>Email: <code>dmitriy[at]pleshevski[dot]ru</code></p><h2 id="ссылки" tabindex="-1"><a class="header-anchor" href="#ссылки"><span>Ссылки</span></a></h2><ul><li><a href="https://git.pleshevski.ru/" target="_blank" rel="noopener noreferrer">Forgejo</a></li><li><a href="https://github.com/pleshevskiy" target="_blank" rel="noopener noreferrer">Github (Приостановлен)</a></li></ul></div></div><!----></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-tk-nPD_r.js" defer></script>
+    <script type="module" src="/assets/app-DZpkSsji.js" defer></script>
   </body>
 </html>
diff --git a/works.html b/works.html
index f6f76f7..0f82ee4 100644
--- a/works.html
+++ b/works.html
@@ -32,12 +32,12 @@
       }
     </script>
     <link rel="alternate" hreflang="en-us" href="https://pleshevski.ru/eng/works.html"><meta property="og:url" content="https://pleshevski.ru/works.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:title" content="Работы"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><meta property="og:locale:alternate" content="en-US"><meta property="og:updated_time" content="2024-10-15T14:10:49.000Z"><meta property="article:modified_time" content="2024-10-15T14:10:49.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Работы"}</script><title>Работы | Дмитрий Плешевский</title><meta name="description" content=" ">
-    <link rel="preload" href="/assets/style-CVjY3BV_.css" as="style"><link rel="stylesheet" href="/assets/style-CVjY3BV_.css">
-    <link rel="modulepreload" href="/assets/app-tk-nPD_r.js"><link rel="modulepreload" href="/assets/works.html-CZFprrn5.js">
-    <link rel="prefetch" href="/assets/index.html-UKCz4hfb.js" as="script"><link rel="prefetch" href="/assets/index.html-Woighx2z.js" as="script"><link rel="prefetch" href="/assets/works.html-mij4Hd53.js" as="script"><link rel="prefetch" href="/assets/404.html-uFOVky09.js" as="script">
+    <link rel="preload" href="/assets/style-0okUxGr0.css" as="style"><link rel="stylesheet" href="/assets/style-0okUxGr0.css">
+    <link rel="modulepreload" href="/assets/app-DZpkSsji.js"><link rel="modulepreload" href="/assets/works.html-AkvQjJeg.js">
+    <link rel="prefetch" href="/assets/index.html-CmmWOU6g.js" as="script"><link rel="prefetch" href="/assets/index.html-B992a44K.js" as="script"><link rel="prefetch" href="/assets/works.html-CnSsBJaM.js" as="script"><link rel="prefetch" href="/assets/404.html-BlRV83Ta.js" as="script">
   </head>
   <body>
     <div id="app"><!--[--><div class="vp-theme-container no-sidebar external-link-icon" vp-container data-v-765855fb><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><!----><span class="vp-site-name" aria-hidden="true">Дмитрий Плешевский</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="Резюме"><!--[--><!--[--><!--]--><!--]-->Резюме<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Работы"><!--[--><!--[--><!--]--><!--]-->Работы<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">Languages</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">Languages</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link route-link-active auto-link" href="/works.html" aria-label="Русский"><!--[--><!--[--><!--]--><!--]-->Русский<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/eng/works.html" aria-label="English"><!--[--><!--[--><!--]--><!--]-->English<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru" aria-label="Source" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Source<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><!----><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h2 id="выделенныи-опыт-работы" tabindex="-1"><a class="header-anchor" href="#выделенныи-опыт-работы"><span>Выделенный опыт работы</span></a></h2><h3 id="binary-management" tabindex="-1"><a class="header-anchor" href="#binary-management"><span>Binary Management</span></a></h3><ul><li>Даты: Август 2018 – по настоящее время</li><li>Роли: Lead Fullstack Developer, Team Lead, Architect</li></ul><p>Разработка инструмента управления проектами для дизайнеров интерьера.</p><h5 id="backend-graphql-api" tabindex="-1"><a class="header-anchor" href="#backend-graphql-api"><span>Backend GraphQL API</span></a></h5><p>Стек: <code>Node.JS</code>, <code>Apollo</code>, <code>PostgreSQL</code>, <code>Redis</code>, <code>BullMQ</code></p><ul><li>Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить изменение и система стала надежнее.</li><li>Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал более 70% всех тестов.</li><li>Добавил GraphQL подписки для динамичного обновления.</li></ul><h5 id="frontend" tabindex="-1"><a class="header-anchor" href="#frontend"><span>Frontend</span></a></h5><p>Стек: <code>React</code>, <code>Apollo</code>, <code>Antd</code></p><ul><li>Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные компоненты.</li><li>Изменил работу с API на фронтенде.</li><li>Внедрил практику написания интеграционных тестов с помощью cypress.</li><li>Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.</li></ul><h5 id="руководство-командои" tabindex="-1"><a class="header-anchor" href="#руководство-командои"><span>Руководство командой</span></a></h5><ul><li>Ввёл практику TDD (Test-Driven Development).</li><li>Я привнес в проект &quot;метод критической цепи&quot;, &quot;метод буфера&quot; и &quot;метод планирования с конца&quot;. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</li><li>Составлял индивидуальный план развития для членов команды.</li></ul><h5 id="архитектура" tabindex="-1"><a class="header-anchor" href="#архитектура"><span>Архитектура</span></a></h5><ul><li>Разбил всю кодовую базу на модули по фичам.</li><li>Ускорил базу данных <code>PostgreSQL</code>, разбив данные компаний по отдельным схемам и применив партиципирование таблиц.</li><li>Добавил кеширование запросов с <code>Redis</code>.</li><li>Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes на <code>NixOS</code>.</li></ul><hr><h3 id="core-spirit-back-office" tabindex="-1"><a class="header-anchor" href="#core-spirit-back-office"><span>Core Spirit (Back Office)</span></a></h3><ul><li>Даты: Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка бэк-офиса для социальной платформы Core Spirit.</p><ul><li>Интегрировал Dependabot, который помог обновить все устаревшие зависимости. Заменил webpack на vite.</li></ul><hr><h3 id="master-progress" tabindex="-1"><a class="header-anchor" href="#master-progress"><span>Master Progress</span></a></h3><ul><li>Даты: Май 2018 - по настоящее время (Пассивная поддержка)</li><li>Роль: Tech Lead</li></ul><p>Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.</p><ul><li><a href="https://masterprogress.ru" target="_blank" rel="noopener noreferrer">Главного сайта</a> (<code>Python</code>, <code>Flask</code>).</li><li><a href="https://cabinet.masterprogress.ru" target="_blank" rel="noopener noreferrer">Кабинета студента</a> (<code>Python</code>, <code>Flask</code>, <code>TypeScript</code>, <code>React</code>, <code>PostgreSQL</code>).</li><li><a href="https://rosmintrud.masterprogress.ru" target="_blank" rel="noopener noreferrer">Инструмента для работы с rosmintrud</a> (<code>Deno</code>, <code>Vue</code>, <code>Typescript</code>)</li><li>Создана полная инфраструктура на <code>NixOS</code>. До этого создал инфраструктуру используя <code>Drone CI</code> / <code>Woodpecker CI</code> и <code>Docker swarm</code>, которая проработала более 5 лет.</li></ul><hr><h3 id="core-spirit" tabindex="-1"><a class="header-anchor" href="#core-spirit"><span>Core Spirit</span></a></h3><ul><li>Даты: Август 2018 - May 2020, Август 2024 - по настоящее время</li><li>Роль: Lead Fullstack Developer</li></ul><p>Разработка социальной платформы, сфокусированной на улучшении человека и планеты.</p><ul><li>REST API (<code>Node.JS</code>, <code>Express</code>, <code>PostgreSQL</code>) для основного сайта и бэк-офиса. Успел поработать с новой версией REST API на <code>Go</code>, <code>PostgreSQL</code></li><li>Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram).</li><li>Создал нейронную сеть для автоматической категоризации статей.</li></ul><hr><h3 id="merlion" tabindex="-1"><a class="header-anchor" href="#merlion"><span>MERLION</span></a></h3><ul><li>Dates: March 2016 – May 2018</li><li>Role: Senior Fullstack developer</li></ul><p>В этой компании было 6 значительных проектов, которые я успешно завершил:</p><ul><li>Оптимизация создания рекламных страниц (PHP, JavaScript)</li><li>Поддержка основного традиционного сайта <a href="https://citilink.ru" target="_blank" rel="noopener noreferrer">https://citilink.ru</a> (PHP, JavaScript)</li><li>Разработка парсинга для мониторинга товаров на предмет изменения цены, количества/наличия на складе, рейтинга и других полей на основе данных с 55+ сайтов (Node.js, Express)</li><li>Работа с нейронными сетями для подбора товаров</li><li>Разработка приложений для распознавания лиц для Android (Java)</li></ul><hr><h2 id="хронология" tabindex="-1"><a class="header-anchor" href="#хронология"><span>Хронология</span></a></h2><p>В списке перечислены только публичные проекты.</p></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Последнее обновление:: </span><time class="meta-item-info" datetime="2024-10-15T14:10:49.000Z" data-allow-mismatch>15.10.2024, 14:10</time></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: dmitriy@ideascup.me">Dmitriy Pleshevskiy</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><div class="works-table-wrapper" data-v-765855fb><table data-v-765855fb><thead><tr><th>Название</th><th>Описание</th><th>Роль</th><th>Технологии</th><th>Статус</th><th>Даты</th></tr></thead><tbody><!--[--><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/nixeovim">nixeovim</a></td><td>Configure and build neovim editor using nix</td><td>author</td><td>Nix</td><td>actively-developed</td><td><div><small class="">04/24/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/mindustry-tools">Mindustry tools</a></td><td>Tools for the Mindustry game</td><td>author</td><td>Nix, Godot</td><td>passively-maintained</td><td><div><small class="">01/07/2024</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://rosmintrud.masterprogress.ru">Master Progress Rosmintrud tools</a></td><td>Internal service to prepare documents for the rosmintrud (SPA)</td><td>tech&nbsp;lead</td><td>Deno, Sqlite, TS, Vue, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">07/03/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-plpgsql">tree-sitter-plpgsql</a></td><td>plpgsql grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>passively-maintained</td><td><div><small class="">01/05/2023</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/tree-sitter-d2">tree-sitter-d2</a></td><td>d2 grammar for tree-sitter</td><td>author</td><td>C, JS, TreeSitter, Nix</td><td>actively-developed</td><td><div><small class="">12/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/mynix/nix2lua">nix2lua</a></td><td>This is a small but functional library that converts your nix configurations into lua format.</td><td>author</td><td>Nix, Lua</td><td>passively-maintained</td><td><div><small class="">11/22/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/vnetod">vnetod</a></td><td>Dotenv section switcher</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/29/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/recipes">recipes</a></td><td>Site with recipes which cares about privacy</td><td>author</td><td>TS, Deno, Rust</td><td>passively-maintained</td><td><div><small class="">05/04/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/pleshevski.ru">pleshevski.ru</a></td><td>Source code of my personal site</td><td>author</td><td>TS, Vue, Vuepress, Nix</td><td>passively-maintained</td><td><div><small class="">03/16/2022</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/espruino-starter">espruino-starter</a></td><td>Quickly start creating your new project on the espruino board or a board based on it.</td><td>author</td><td>JS</td><td>as-is</td><td><div><small class="">08/23/2021</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/sonic-channel">sonic-channel</a></td><td>Rust client for sonic search backend.</td><td>author</td><td>Rust</td><td>passively-maintained</td><td><div><small class="">07/18/2020</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/it-fsm">it-fsm</a></td><td>Simple full-featured finite state machine for your project</td><td>author</td><td>TS, NodeJS, Deno</td><td>passively-maintained</td><td><div><small class="">10/11/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://cabinet.masterprogress.ru">Cabinet Master Progress</a></td><td>Student&#39;s cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech&nbsp;lead</td><td>Python, Flask, PostgreSQL, TS, React, Docker, Woodpecker CI, Nix</td><td>passively-maintained</td><td><div><small class="">09/22/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/genrss">genrss</a></td><td>RSS generator for python</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="">07/23/2019</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://www.binarymanagement.com">Binary Management</a></td><td>Project management tool for interior designers</td><td>developer, tech&nbsp;lead, team&nbsp;lead</td><td>TS, NodeJS, React, Antd, Docker, Drone CI, Rust, Nix</td><td>actively-developed</td><td><div><small class="">09/15/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://masterprogress.ru">Master Progress</a></td><td>Main website of the educational center Master Progress (SSR + Forms)</td><td>tech&nbsp;lead</td><td>Python, Flask, JS, Nix</td><td>passively-maintained</td><td><div><small class="">04/10/2018</small></div><!----></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/picsg">picsg</a></td><td>A tool for steganographing information in a picture encoded using the Vernam cipher.</td><td>author</td><td>Haskell</td><td>as-is</td><td><div><small class="grey">04/13/2024</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/yandexgpt_tg_bot">yandexgpt_tg_bot</a></td><td>The Telegram bot to describe article with link by YandexGPT.</td><td>author</td><td>JS, NodeJS, Nix</td><td>as-is</td><td><div><small class="grey">06/27/2023</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/estring">estring</a></td><td>A simple way to parse a string using type annotations.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/23/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/enve">enve</a></td><td>It helps you work with environment variables and convert it to any type using only type annotations</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">07/18/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/docker_stack">docker stack drone plugin</a></td><td>Deploy to production using `docker stack deploy`</td><td>author</td><td>Docker, Drone CI, Woodpecker CI</td><td>as-is</td><td><div><small class="grey">06/06/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/paren">paren</a></td><td>Library for parsing and rendering information.</td><td>author</td><td>TS, Deno</td><td>experimental</td><td><div><small class="grey">03/14/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/hwt">hwt</a></td><td>healthy workaholic timer – A tool that keeps you from breaking your health by working all day.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">02/04/2022</small></div><div><small>07/25/2024</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/wd2">wd2</a></td><td>A wrapper over d2 which allows to use additional configs from d2 file</td><td>author</td><td>Bash, Nix</td><td>as-is</td><td><div><small class="grey">12/12/2022</small></div><div><small>07/31/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/react-rest-request">react-rest-request</a></td><td>Minimalistic REST API client for React inspired by Apollo.</td><td>author</td><td>TS, React</td><td>deprecated</td><td><div><small class="grey">10/04/2020</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/marshmallow_pageinfo">marshmallow_pageinfo</a></td><td>Page info marshmallow schema for api</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">10/05/2019</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ictmpl">ictmpl</a></td><td>Generate projects from templates</td><td>author</td><td>Python</td><td>as-is</td><td><div><small class="grey">06/30/2018</small></div><div><small>03/02/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/github/dexios">dexios</a></td><td>Dexios is a fast, secure, and open source command-line encryption tool.</td><td>collaborator</td><td>Rust</td><td></td><td><div><small class="grey">06/01/2022</small></div><div><small>02/28/2023</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/itconfig">itconfig</a></td><td>Easy build a configs from environment variables and use it in globally.</td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">12/22/2019</small></div><div><small>07/24/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/migra">migra</a></td><td>Simple SQL migration manager for your project.</td><td>author</td><td>Rust</td><td>as-is</td><td><div><small class="grey">01/31/2021</small></div><div><small>03/17/2022</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://git.pleshevski.ru/pleshevskiy/ood_persistence">ood_persistence</a></td><td>Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture </td><td>author</td><td>Rust</td><td>deprecated</td><td><div><small class="grey">10/12/2021</small></div><div><small>10/21/2021</small></div></td></tr><tr><td><a rel="nofollow noopener" href="https://corespirit.com">Core Spirit</a></td><td>Social platform focusing on human and planetary enhancement</td><td>developer</td><td>TS, NodeJS, Go, Python, React, Docker, Drone CI</td><td></td><td><div><small class="grey">09/05/2018</small></div><div><small>12/31/2019</small></div></td></tr><!--]--></tbody></table></div><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
-    <script type="module" src="/assets/app-tk-nPD_r.js" defer></script>
+    <script type="module" src="/assets/app-DZpkSsji.js" defer></script>
   </body>
 </html>