From a8c674f407b4ec09a4142e8bca011b337ba3b58b Mon Sep 17 00:00:00 2001 From: "Forgejo actions[bot]" <forgejo-actions[bot]@noreply.pleshevski.ru> Date: Fri, 4 Apr 2025 10:17:03 +0000 Subject: [PATCH] Deploy 2025-04-04 --- 404.html | 10 +++++----- assets/{404.html-BAx3uyIF.js => 404.html-zdf0TDCG.js} | 2 +- assets/{app-DtHMy4Ce.js => app-IfCpMHS0.js} | 4 ++-- .../{index.html-DRIvgEbl.js => index.html-DM7mJdBZ.js} | 2 +- .../{index.html-CiFdreAO.js => index.html-N9RC5Cwl.js} | 2 +- assets/{style-CtawcFdy.css => style-Cfus6Ei0.css} | 2 +- .../{works.html-BQJ025yI.js => works.html-Bk-zdGwE.js} | 2 +- .../{works.html-4vR_bPc-.js => works.html-CzEk3rZ7.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-BAx3uyIF.js => 404.html-zdf0TDCG.js} (91%) rename assets/{app-DtHMy4Ce.js => app-IfCpMHS0.js} (99%) rename assets/{index.html-DRIvgEbl.js => index.html-DM7mJdBZ.js} (99%) rename assets/{index.html-CiFdreAO.js => index.html-N9RC5Cwl.js} (99%) rename assets/{style-CtawcFdy.css => style-Cfus6Ei0.css} (99%) rename assets/{works.html-BQJ025yI.js => works.html-Bk-zdGwE.js} (99%) rename assets/{works.html-4vR_bPc-.js => works.html-CzEk3rZ7.js} (99%) diff --git a/404.html b/404.html index e4a970a..5499fa6 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-CtawcFdy.css" as="style"><link rel="stylesheet" href="/assets/style-CtawcFdy.css"> - <link rel="modulepreload" href="/assets/app-DtHMy4Ce.js"><link rel="modulepreload" href="/assets/404.html-BAx3uyIF.js"> - <link rel="prefetch" href="/assets/index.html-DRIvgEbl.js" as="script"><link rel="prefetch" href="/assets/works.html-4vR_bPc-.js" as="script"><link rel="prefetch" href="/assets/index.html-CiFdreAO.js" as="script"><link rel="prefetch" href="/assets/works.html-BQJ025yI.js" as="script"> + <link rel="preload" href="/assets/style-Cfus6Ei0.css" as="style"><link rel="stylesheet" href="/assets/style-Cfus6Ei0.css"> + <link rel="modulepreload" href="/assets/app-IfCpMHS0.js"><link rel="modulepreload" href="/assets/404.html-zdf0TDCG.js"> + <link rel="prefetch" href="/assets/index.html-DM7mJdBZ.js" as="script"><link rel="prefetch" href="/assets/works.html-CzEk3rZ7.js" as="script"><link rel="prefetch" href="/assets/index.html-N9RC5Cwl.js" as="script"><link rel="prefetch" href="/assets/works.html-Bk-zdGwE.js" as="script"> </head> <body> - <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-072ee752><main class="page" data-v-072ee752><div vp-content data-v-072ee752><h1 data-v-072ee752>404</h1><blockquote data-v-072ee752>Мы потеряли страницу...</blockquote><a class="route-link" href="/" data-v-072ee752>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div> - <script type="module" src="/assets/app-DtHMy4Ce.js" defer></script> + <div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-e9bc46f9><main class="page" data-v-e9bc46f9><div vp-content data-v-e9bc46f9><h1 data-v-e9bc46f9>404</h1><blockquote data-v-e9bc46f9>Мы потеряли страницу...</blockquote><a class="route-link" href="/" data-v-e9bc46f9>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div> + <script type="module" src="/assets/app-IfCpMHS0.js" defer></script> </body> </html> diff --git a/assets/404.html-BAx3uyIF.js b/assets/404.html-zdf0TDCG.js similarity index 91% rename from assets/404.html-BAx3uyIF.js rename to assets/404.html-zdf0TDCG.js index bc1e8d5..fba7cf3 100644 --- a/assets/404.html-BAx3uyIF.js +++ b/assets/404.html-zdf0TDCG.js @@ -1 +1 @@ -import{_ as e,c as o,a,o as n}from"./app-DtHMy4Ce.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-IfCpMHS0.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-DtHMy4Ce.js b/assets/app-IfCpMHS0.js similarity index 99% rename from assets/app-DtHMy4Ce.js rename to assets/app-IfCpMHS0.js index dcdd4d7..b35d756 100644 --- a/assets/app-DtHMy4Ce.js +++ b/assets/app-IfCpMHS0.js @@ -15,14 +15,14 @@ var Tc=Object.defineProperty;var kc=(e,t,n)=>t in e?Tc(e,t,{enumerable:!0,config * @vue/runtime-dom v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let qo;const di=typeof window<"u"&&window.trustedTypes;if(di)try{qo=di.createPolicy("vue",{createHTML:e=>e})}catch{}const Ta=qo?e=>qo.createHTML(e):e=>e,Af="http://www.w3.org/2000/svg",Rf="http://www.w3.org/1998/Math/MathML",Ct=typeof document<"u"?document:null,hi=Ct&&Ct.createElement("template"),Of={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"?Ct.createElementNS(Af,e):t==="mathml"?Ct.createElementNS(Rf,e):n?Ct.createElement(e,{is:n}):Ct.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.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{hi.innerHTML=Ta(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=hi.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]}},Nt="transition",Hn="animation",kn=Symbol("_vtc"),ka={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},La=Ie({},Jl,ka),Df=e=>(e.displayName="Transition",e.props=La,e),lo=Df((e,{slots:t})=>K(Eu,Aa(e),t)),Xt=(e,t=[])=>{te(e)?e.forEach(n=>n(...t)):e&&e(...t)},pi=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function Aa(e){const t={};for(const C in e)C in ka||(t[C]=e[C]);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:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,v=If(o),y=v&&v[0],E=v&&v[1],{onBeforeEnter:w,onEnter:S,onEnterCancelled:m,onLeave:_,onLeaveCancelled:M,onBeforeAppear:G=w,onAppear:D=S,onAppearCancelled:Q=m}=t,I=(C,j,ie,_e)=>{C._enterCancelled=_e,Ht(C,j?u:l),Ht(C,j?c:i),ie&&ie()},T=(C,j)=>{C._isLeaving=!1,Ht(C,f),Ht(C,p),Ht(C,h),j&&j()},L=C=>(j,ie)=>{const _e=C?D:S,J=()=>I(j,C,ie);Xt(_e,[j,J]),gi(()=>{Ht(j,C?a:s),_t(j,C?u:l),pi(_e)||mi(j,r,y,J)})};return Ie(t,{onBeforeEnter(C){Xt(w,[C]),_t(C,s),_t(C,i)},onBeforeAppear(C){Xt(G,[C]),_t(C,a),_t(C,c)},onEnter:L(!1),onAppear:L(!0),onLeave(C,j){C._isLeaving=!0;const ie=()=>T(C,j);_t(C,f),C._enterCancelled?(_t(C,h),zo()):(zo(),_t(C,h)),gi(()=>{C._isLeaving&&(Ht(C,f),_t(C,p),pi(_)||mi(C,r,E,ie))}),Xt(_,[C,ie])},onEnterCancelled(C){I(C,!1,void 0,!0),Xt(m,[C])},onAppearCancelled(C){I(C,!0,void 0,!0),Xt(Q,[C])},onLeaveCancelled(C){T(C),Xt(M,[C])}})}function If(e){if(e==null)return null;if(xe(e))return[To(e.enter),To(e.leave)];{const t=To(e);return[t,t]}}function To(e){return Mc(e)}function _t(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[kn]||(e[kn]=new Set)).add(t)}function Ht(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[kn];n&&(n.delete(t),n.size||(e[kn]=void 0))}function gi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Mf=0;function mi(e,t,n,r){const o=e._endId=++Mf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Ra(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,h),s()},h=p=>{p.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,h)}function Ra(e,t){const n=window.getComputedStyle(e),r=v=>(n[v]||"").split(", "),o=r(`${Nt}Delay`),s=r(`${Nt}Duration`),i=vi(o,s),l=r(`${Hn}Delay`),a=r(`${Hn}Duration`),c=vi(l,a);let u=null,f=0,h=0;t===Nt?i>0&&(u=Nt,f=i,h=s.length):t===Hn?c>0&&(u=Hn,f=c,h=a.length):(f=Math.max(i,c),u=f>0?i>c?Nt:Hn:null,h=u?u===Nt?s.length:a.length:0);const p=u===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:u,timeout:f,propCount:h,hasTransform:p}}function vi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>_i(n)+_i(e[r])))}function _i(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function zo(){return document.body.offsetHeight}function $f(e,t,n){const r=e[kn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const zr=Symbol("_vod"),Oa=Symbol("_vsh"),Jr={beforeMount(e,{value:t},{transition:n}){e[zr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vn(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),Vn(e,!0),r.enter(e)):r.leave(e,()=>{Vn(e,!1)}):Vn(e,t))},beforeUnmount(e,{value:t}){Vn(e,t)}};function Vn(e,t){e.style.display=t?e[zr]:"none",e[Oa]=!t}const Nf=Symbol(""),Hf=/(^|;)\s*display\s*:/;function Vf(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&&Nr(r,l,"")}else for(const i in t)n[i]==null&&Nr(r,i,"");for(const i in n)i==="display"&&(s=!0),Nr(r,i,n[i])}else if(o){if(t!==n){const i=r[Nf];i&&(n+=";"+i),r.cssText=n,s=Hf.test(n)}}else t&&e.removeAttribute("style");zr in e&&(e[zr]=s?r.display:"",e[Oa]&&(r.display="none"))}const bi=/\s*!important$/;function Nr(e,t,n){if(te(n))n.forEach(r=>Nr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Ff(e,t);bi.test(n)?e.setProperty(zt(r),n.replace(bi,""),"important"):e[r]=n}}const yi=["Webkit","Moz","ms"],ko={};function Ff(e,t){const n=ko[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return ko[t]=r;r=fr(r);for(let o=0;o<yi.length;o++){const s=yi[o]+r;if(s in e)return ko[t]=s}return t}const Si="http://www.w3.org/1999/xlink";function wi(e,t,n,r,o,s=jc(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(Si,t.slice(6,t.length)):e.setAttributeNS(Si,t,n):n==null||s&&!_l(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Ot(n)?String(n):n)}function Ei(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Ta(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=_l(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 jf(e,t,n,r){e.addEventListener(t,n,r)}function Bf(e,t,n,r){e.removeEventListener(t,n,r)}const Pi=Symbol("_vei");function Wf(e,t,n,r,o=null){const s=e[Pi]||(e[Pi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Uf(t);if(r){const c=s[t]=qf(r,o);jf(e,l,c,a)}else i&&(Bf(e,l,i,a),s[t]=void 0)}}const xi=/(?:Once|Passive|Capture)$/;function Uf(e){let t;if(xi.test(e)){t={};let r;for(;r=e.match(xi);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):zt(e.slice(2)),t]}let Lo=0;const Gf=Promise.resolve(),Kf=()=>Lo||(Gf.then(()=>Lo=0),Lo=Date.now());function qf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;ht(zf(r,n.value),t,5,[r])};return n.value=e,n.attached=Kf(),n}function zf(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 Ci=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Jf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?$f(e,r,i):t==="style"?Vf(e,n,r):ur(t)?ts(t)||Wf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yf(e,t,r,i))?(Ei(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&wi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?Ei(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),wi(e,t,r,i))};function Yf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ci(t)&&oe(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 Ci(t)&&Oe(n)?!1:t in e}const Da=new WeakMap,Ia=new WeakMap,Yr=Symbol("_moveCb"),Ti=Symbol("_enterCb"),Qf=e=>(delete e.props.mode,e),Xf=Qf({name:"TransitionGroup",props:Ie({},La,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=It(),r=zl();let o,s;return ea(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!rd(o[0].el,n.vnode.el,i))return;o.forEach(ed),o.forEach(td);const l=o.filter(nd);zo(),l.forEach(a=>{const c=a.el,u=c.style;_t(c,i),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[Yr]=h=>{h&&h.target!==c||(!h||/transform$/.test(h.propertyName))&&(c.removeEventListener("transitionend",f),c[Yr]=null,Ht(c,i))};c.addEventListener("transitionend",f)})}),()=>{const i=ue(e),l=Aa(i);let a=i.tag||ve;if(o=[],s)for(let c=0;c<s.length;c++){const u=s[c];u.el&&u.el instanceof Element&&(o.push(u),un(u,nr(u,l,r,n)),Da.set(u,u.el.getBoundingClientRect()))}s=t.default?ds(t.default()):[];for(let c=0;c<s.length;c++){const u=s[c];u.key!=null&&un(u,nr(u,l,r,n))}return re(a,null,s)}}}),Zf=Xf;function ed(e){const t=e.el;t[Yr]&&t[Yr](),t[Ti]&&t[Ti]()}function td(e){Ia.set(e,e.el.getBoundingClientRect())}function nd(e){const t=Da.get(e),n=Ia.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function rd(e,t,n){const r=e.cloneNode(),o=e[kn];o&&o.forEach(l=>{l.split(/\s+/).forEach(a=>a&&r.classList.remove(a))}),n.split(/\s+/).forEach(l=>l&&r.classList.add(l)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=Ra(r);return s.removeChild(r),i}const od={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},sd=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=zt(o.key);if(t.some(i=>i===s||od[i]===s))return e(o)})},id=Ie({patchProp:Jf},Of);let Ao,ki=!1;function ld(){return Ao=ki?Ao:rf(id),ki=!0,Ao}const ad=(...e)=>{const t=ld().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ud(r);if(o)return n(o,!0,cd(o))},t};function cd(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ud(e){return Oe(e)?document.querySelector(e):e}var mr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),fd=/.md((\?|#).*)?$/,dd=(e,t="/")=>mr(e)||e.startsWith("/")&&!e.startsWith(t)&&!fd.test(e),vr=e=>/^(https?:)?\/\//.test(e),Li=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},hd="http://.",pd=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return Li(new URL(`${n}/${e}`,hd).pathname)}return Li(e)},gd=(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"/"},md=/(#|\?)/,Ma=e=>{const[t,...n]=e.split(md);return{pathname:t,hashAndQueries:n.join("")}},vd=["link","meta","script","style","noscript","template"],_d=["title","base"],bd=([e,t,n])=>_d.includes(e)?e:vd.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,yd=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=bd(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},Sd=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,$a=e=>e.endsWith("/")?e.slice(0,-1):e,Na=e=>e.startsWith("/")?e.slice(1):e,bs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const wd="modulepreload",Ed=function(e){return"/"+e},Ai={},Fn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=Ed(s),s in Ai)return;Ai[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":wd,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})},Pd=JSON.parse("{}"),xd=Object.fromEntries([["/",{loader:()=>Fn(()=>import("./index.html-DRIvgEbl.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Fn(()=>import("./works.html-4vR_bPc-.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Fn(()=>import("./index.html-CiFdreAO.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Fn(()=>import("./works.html-BQJ025yI.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Fn(()=>import("./404.html-BAx3uyIF.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*! +**/let qo;const di=typeof window<"u"&&window.trustedTypes;if(di)try{qo=di.createPolicy("vue",{createHTML:e=>e})}catch{}const Ta=qo?e=>qo.createHTML(e):e=>e,Af="http://www.w3.org/2000/svg",Rf="http://www.w3.org/1998/Math/MathML",Ct=typeof document<"u"?document:null,hi=Ct&&Ct.createElement("template"),Of={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"?Ct.createElementNS(Af,e):t==="mathml"?Ct.createElementNS(Rf,e):n?Ct.createElement(e,{is:n}):Ct.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.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{hi.innerHTML=Ta(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=hi.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]}},Nt="transition",Hn="animation",kn=Symbol("_vtc"),ka={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},La=Ie({},Jl,ka),Df=e=>(e.displayName="Transition",e.props=La,e),lo=Df((e,{slots:t})=>K(Eu,Aa(e),t)),Xt=(e,t=[])=>{te(e)?e.forEach(n=>n(...t)):e&&e(...t)},pi=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function Aa(e){const t={};for(const C in e)C in ka||(t[C]=e[C]);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:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,v=If(o),y=v&&v[0],E=v&&v[1],{onBeforeEnter:w,onEnter:S,onEnterCancelled:m,onLeave:_,onLeaveCancelled:M,onBeforeAppear:G=w,onAppear:D=S,onAppearCancelled:Q=m}=t,I=(C,j,ie,_e)=>{C._enterCancelled=_e,Ht(C,j?u:l),Ht(C,j?c:i),ie&&ie()},T=(C,j)=>{C._isLeaving=!1,Ht(C,f),Ht(C,p),Ht(C,h),j&&j()},L=C=>(j,ie)=>{const _e=C?D:S,J=()=>I(j,C,ie);Xt(_e,[j,J]),gi(()=>{Ht(j,C?a:s),_t(j,C?u:l),pi(_e)||mi(j,r,y,J)})};return Ie(t,{onBeforeEnter(C){Xt(w,[C]),_t(C,s),_t(C,i)},onBeforeAppear(C){Xt(G,[C]),_t(C,a),_t(C,c)},onEnter:L(!1),onAppear:L(!0),onLeave(C,j){C._isLeaving=!0;const ie=()=>T(C,j);_t(C,f),C._enterCancelled?(_t(C,h),zo()):(zo(),_t(C,h)),gi(()=>{C._isLeaving&&(Ht(C,f),_t(C,p),pi(_)||mi(C,r,E,ie))}),Xt(_,[C,ie])},onEnterCancelled(C){I(C,!1,void 0,!0),Xt(m,[C])},onAppearCancelled(C){I(C,!0,void 0,!0),Xt(Q,[C])},onLeaveCancelled(C){T(C),Xt(M,[C])}})}function If(e){if(e==null)return null;if(xe(e))return[To(e.enter),To(e.leave)];{const t=To(e);return[t,t]}}function To(e){return Mc(e)}function _t(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[kn]||(e[kn]=new Set)).add(t)}function Ht(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[kn];n&&(n.delete(t),n.size||(e[kn]=void 0))}function gi(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Mf=0;function mi(e,t,n,r){const o=e._endId=++Mf,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Ra(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,h),s()},h=p=>{p.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,h)}function Ra(e,t){const n=window.getComputedStyle(e),r=v=>(n[v]||"").split(", "),o=r(`${Nt}Delay`),s=r(`${Nt}Duration`),i=vi(o,s),l=r(`${Hn}Delay`),a=r(`${Hn}Duration`),c=vi(l,a);let u=null,f=0,h=0;t===Nt?i>0&&(u=Nt,f=i,h=s.length):t===Hn?c>0&&(u=Hn,f=c,h=a.length):(f=Math.max(i,c),u=f>0?i>c?Nt:Hn:null,h=u?u===Nt?s.length:a.length:0);const p=u===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:u,timeout:f,propCount:h,hasTransform:p}}function vi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>_i(n)+_i(e[r])))}function _i(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function zo(){return document.body.offsetHeight}function $f(e,t,n){const r=e[kn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const zr=Symbol("_vod"),Oa=Symbol("_vsh"),Jr={beforeMount(e,{value:t},{transition:n}){e[zr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vn(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),Vn(e,!0),r.enter(e)):r.leave(e,()=>{Vn(e,!1)}):Vn(e,t))},beforeUnmount(e,{value:t}){Vn(e,t)}};function Vn(e,t){e.style.display=t?e[zr]:"none",e[Oa]=!t}const Nf=Symbol(""),Hf=/(^|;)\s*display\s*:/;function Vf(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&&Nr(r,l,"")}else for(const i in t)n[i]==null&&Nr(r,i,"");for(const i in n)i==="display"&&(s=!0),Nr(r,i,n[i])}else if(o){if(t!==n){const i=r[Nf];i&&(n+=";"+i),r.cssText=n,s=Hf.test(n)}}else t&&e.removeAttribute("style");zr in e&&(e[zr]=s?r.display:"",e[Oa]&&(r.display="none"))}const bi=/\s*!important$/;function Nr(e,t,n){if(te(n))n.forEach(r=>Nr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Ff(e,t);bi.test(n)?e.setProperty(zt(r),n.replace(bi,""),"important"):e[r]=n}}const yi=["Webkit","Moz","ms"],ko={};function Ff(e,t){const n=ko[t];if(n)return n;let r=Xe(t);if(r!=="filter"&&r in e)return ko[t]=r;r=fr(r);for(let o=0;o<yi.length;o++){const s=yi[o]+r;if(s in e)return ko[t]=s}return t}const Si="http://www.w3.org/1999/xlink";function wi(e,t,n,r,o,s=jc(t)){r&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(Si,t.slice(6,t.length)):e.setAttributeNS(Si,t,n):n==null||s&&!_l(n)?e.removeAttribute(t):e.setAttribute(t,s?"":Ot(n)?String(n):n)}function Ei(e,t,n,r,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Ta(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=_l(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 jf(e,t,n,r){e.addEventListener(t,n,r)}function Bf(e,t,n,r){e.removeEventListener(t,n,r)}const Pi=Symbol("_vei");function Wf(e,t,n,r,o=null){const s=e[Pi]||(e[Pi]={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Uf(t);if(r){const c=s[t]=qf(r,o);jf(e,l,c,a)}else i&&(Bf(e,l,i,a),s[t]=void 0)}}const xi=/(?:Once|Passive|Capture)$/;function Uf(e){let t;if(xi.test(e)){t={};let r;for(;r=e.match(xi);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):zt(e.slice(2)),t]}let Lo=0;const Gf=Promise.resolve(),Kf=()=>Lo||(Gf.then(()=>Lo=0),Lo=Date.now());function qf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;ht(zf(r,n.value),t,5,[r])};return n.value=e,n.attached=Kf(),n}function zf(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 Ci=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Jf=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?$f(e,r,i):t==="style"?Vf(e,n,r):ur(t)?ts(t)||Wf(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yf(e,t,r,i))?(Ei(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&wi(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Oe(r))?Ei(e,Xe(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),wi(e,t,r,i))};function Yf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ci(t)&&oe(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 Ci(t)&&Oe(n)?!1:t in e}const Da=new WeakMap,Ia=new WeakMap,Yr=Symbol("_moveCb"),Ti=Symbol("_enterCb"),Qf=e=>(delete e.props.mode,e),Xf=Qf({name:"TransitionGroup",props:Ie({},La,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=It(),r=zl();let o,s;return ea(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!rd(o[0].el,n.vnode.el,i))return;o.forEach(ed),o.forEach(td);const l=o.filter(nd);zo(),l.forEach(a=>{const c=a.el,u=c.style;_t(c,i),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[Yr]=h=>{h&&h.target!==c||(!h||/transform$/.test(h.propertyName))&&(c.removeEventListener("transitionend",f),c[Yr]=null,Ht(c,i))};c.addEventListener("transitionend",f)})}),()=>{const i=ue(e),l=Aa(i);let a=i.tag||ve;if(o=[],s)for(let c=0;c<s.length;c++){const u=s[c];u.el&&u.el instanceof Element&&(o.push(u),un(u,nr(u,l,r,n)),Da.set(u,u.el.getBoundingClientRect()))}s=t.default?ds(t.default()):[];for(let c=0;c<s.length;c++){const u=s[c];u.key!=null&&un(u,nr(u,l,r,n))}return re(a,null,s)}}}),Zf=Xf;function ed(e){const t=e.el;t[Yr]&&t[Yr](),t[Ti]&&t[Ti]()}function td(e){Ia.set(e,e.el.getBoundingClientRect())}function nd(e){const t=Da.get(e),n=Ia.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function rd(e,t,n){const r=e.cloneNode(),o=e[kn];o&&o.forEach(l=>{l.split(/\s+/).forEach(a=>a&&r.classList.remove(a))}),n.split(/\s+/).forEach(l=>l&&r.classList.add(l)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=Ra(r);return s.removeChild(r),i}const od={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},sd=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=zt(o.key);if(t.some(i=>i===s||od[i]===s))return e(o)})},id=Ie({patchProp:Jf},Of);let Ao,ki=!1;function ld(){return Ao=ki?Ao:rf(id),ki=!0,Ao}const ad=(...e)=>{const t=ld().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ud(r);if(o)return n(o,!0,cd(o))},t};function cd(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ud(e){return Oe(e)?document.querySelector(e):e}var mr=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),fd=/.md((\?|#).*)?$/,dd=(e,t="/")=>mr(e)||e.startsWith("/")&&!e.startsWith(t)&&!fd.test(e),vr=e=>/^(https?:)?\/\//.test(e),Li=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},hd="http://.",pd=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return Li(new URL(`${n}/${e}`,hd).pathname)}return Li(e)},gd=(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"/"},md=/(#|\?)/,Ma=e=>{const[t,...n]=e.split(md);return{pathname:t,hashAndQueries:n.join("")}},vd=["link","meta","script","style","noscript","template"],_d=["title","base"],bd=([e,t,n])=>_d.includes(e)?e:vd.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,yd=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=bd(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},Sd=e=>e.endsWith("/")||e.endsWith(".html")?e:`${e}/`,$a=e=>e.endsWith("/")?e.slice(0,-1):e,Na=e=>e.startsWith("/")?e.slice(1):e,bs=e=>Object.prototype.toString.call(e)==="[object Object]",dt=e=>typeof e=="string";const wd="modulepreload",Ed=function(e){return"/"+e},Ai={},Fn=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=Ed(s),s in Ai)return;Ai[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":wd,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})},Pd=JSON.parse("{}"),xd=Object.fromEntries([["/",{loader:()=>Fn(()=>import("./index.html-DM7mJdBZ.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>Fn(()=>import("./works.html-CzEk3rZ7.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>Fn(()=>import("./index.html-N9RC5Cwl.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>Fn(()=>import("./works.html-Bk-zdGwE.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>Fn(()=>import("./404.html-zdf0TDCG.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*! * vue-router v4.5.0 * (c) 2024 Eduardo San Martin Morote * @license MIT */const _n=typeof document<"u";function Ha(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Cd(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Ha(e.default)}const pe=Object.assign;function Ro(e,t){const n={};for(const r in t){const o=t[r];n[r]=pt(o)?o.map(e):e(o)}return n}const Qn=()=>{},pt=Array.isArray,Va=/#/g,Td=/&/g,kd=/\//g,Ld=/=/g,Ad=/\?/g,Fa=/\+/g,Rd=/%5B/g,Od=/%5D/g,ja=/%5E/g,Dd=/%60/g,Ba=/%7B/g,Id=/%7C/g,Wa=/%7D/g,Md=/%20/g;function ys(e){return encodeURI(""+e).replace(Id,"|").replace(Rd,"[").replace(Od,"]")}function $d(e){return ys(e).replace(Ba,"{").replace(Wa,"}").replace(ja,"^")}function Jo(e){return ys(e).replace(Fa,"%2B").replace(Md,"+").replace(Va,"%23").replace(Td,"%26").replace(Dd,"`").replace(Ba,"{").replace(Wa,"}").replace(ja,"^")}function Nd(e){return Jo(e).replace(Ld,"%3D")}function Hd(e){return ys(e).replace(Va,"%23").replace(Ad,"%3F")}function Vd(e){return e==null?"":Hd(e).replace(kd,"%2F")}function ir(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const Fd=/\/$/,jd=e=>e.replace(Fd,"");function Oo(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=Gd(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:ir(i)}}function Bd(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Ri(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Wd(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&Ln(t.matched[r],n.matched[o])&&Ua(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Ln(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ua(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Ud(e[n],t[n]))return!1;return!0}function Ud(e,t){return pt(e)?Oi(e,t):pt(t)?Oi(t,e):e===t}function Oi(e,t){return pt(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function Gd(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 xt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var lr;(function(e){e.pop="pop",e.push="push"})(lr||(lr={}));var Xn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Xn||(Xn={}));function Kd(e){if(!e)if(_n){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),jd(e)}const qd=/^[^#]+#/;function zd(e,t){return e.replace(qd,"#")+t}function Jd(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 ao=()=>({left:window.scrollX,top:window.scrollY});function Yd(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=Jd(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 Di(e,t){return(history.state?history.state.position-t:-1)+e}const Yo=new Map;function Qd(e,t){Yo.set(e,t)}function Xd(e){const t=Yo.get(e);return Yo.delete(e),t}let Zd=()=>location.protocol+"//"+location.host;function Ga(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),Ri(a,"")}return Ri(n,e)+r+o}function eh(e,t,n,r){let o=[],s=[],i=null;const l=({state:h})=>{const p=Ga(e,location),v=n.value,y=t.value;let E=0;if(h){if(n.value=p,t.value=h,i&&i===v){i=null;return}E=y?h.position-y.position:0}else r(p);o.forEach(w=>{w(n.value,v,{delta:E,type:lr.pop,direction:E?E>0?Xn.forward:Xn.back:Xn.unknown})})};function a(){i=n.value}function c(h){o.push(h);const p=()=>{const v=o.indexOf(h);v>-1&&o.splice(v,1)};return s.push(p),p}function u(){const{history:h}=window;h.state&&h.replaceState(pe({},h.state,{scroll:ao()}),"")}function f(){for(const h of s)h();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 Ii(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?ao():null}}function th(e){const{history:t,location:n}=window,r={value:Ga(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("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Zd()+e+a;try{t[u?"replaceState":"pushState"](c,"",h),o.value=c}catch(p){console.error(p),n[u?"replace":"assign"](h)}}function i(a,c){const u=pe({},t.state,Ii(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=pe({},o.value,t.state,{forward:a,scroll:ao()});s(u.current,u,!0);const f=pe({},Ii(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 nh(e){e=Kd(e);const t=th(e),n=eh(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=pe({location:"",base:e,go:r,createHref:zd.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 rh(e){return typeof e=="string"||e&&typeof e=="object"}function Ka(e){return typeof e=="string"||typeof e=="symbol"}const qa=Symbol("");var Mi;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Mi||(Mi={}));function An(e,t){return pe(new Error,{type:e,[qa]:!0},t)}function Et(e,t){return e instanceof Error&&qa in e&&(t==null||!!(e.type&t))}const $i="[^/]+?",oh={sensitive:!1,strict:!1,start:!0,end:!0},sh=/[.+*?^${}()[\]/\\]/g;function ih(e,t){const n=pe({},oh,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 h=c[f];let p=40+(n.sensitive?.25:0);if(h.type===0)f||(o+="/"),o+=h.value.replace(sh,"\\$&"),p+=40;else if(h.type===1){const{value:v,repeatable:y,optional:E,regexp:w}=h;s.push({name:v,repeatable:y,optional:E});const S=w||$i;if(S!==$i){p+=10;try{new RegExp(`(${S})`)}catch(_){throw new Error(`Invalid custom RegExp for param "${v}" (${S}): `+_.message)}}let m=y?`((?:${S})(?:/(?:${S}))*)`:`(${S})`;f||(m=E&&c.length<2?`(?:/${m})`:"/"+m),E&&(m+="?"),o+=m,p+=20,E&&(p+=-8),y&&(p+=-20),S===".*"&&(p+=-50)}u.push(p)}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 h=1;h<u.length;h++){const p=u[h]||"",v=s[h-1];f[v.name]=p&&v.repeatable?p.split("/"):p}return f}function a(c){let u="",f=!1;for(const h of e){(!f||!u.endsWith("/"))&&(u+="/"),f=!1;for(const p of h)if(p.type===0)u+=p.value;else if(p.type===1){const{value:v,repeatable:y,optional:E}=p,w=v in c?c[v]:"";if(pt(w)&&!y)throw new Error(`Provided param "${v}" is an array but it is not repeatable (* or + modifiers)`);const S=pt(w)?w.join("/"):w;if(!S)if(E)h.length<2&&(u.endsWith("/")?u=u.slice(0,-1):f=!0);else throw new Error(`Missing required param "${v}"`);u+=S}}return u||"/"}return{re:i,score:r,keys:s,parse:l,stringify:a}}function lh(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 za(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const s=lh(r[n],o[n]);if(s)return s;n++}if(Math.abs(o.length-r.length)===1){if(Ni(r))return 1;if(Ni(o))return-1}return o.length-r.length}function Ni(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const ah={type:0,value:""},ch=/[a-zA-Z0-9_]/;function uh(e){if(!e)return[[]];if(e==="/")return[[ah]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${n})/"${c}": ${p}`)}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 h(){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):h();break;case 4:h(),n=r;break;case 1:a==="("?n=2:ch.test(a)?h():(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 fh(e,t,n){const r=ih(uh(e.path),n),o=pe(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function dh(e,t){const n=[],r=new Map;t=ji({strict:!1,end:!0,sensitive:!1},t);function o(f){return r.get(f)}function s(f,h,p){const v=!p,y=Vi(f);y.aliasOf=p&&p.record;const E=ji(t,f),w=[y];if("alias"in f){const _=typeof f.alias=="string"?[f.alias]:f.alias;for(const M of _)w.push(Vi(pe({},y,{components:p?p.record.components:y.components,path:M,aliasOf:p?p.record:y})))}let S,m;for(const _ of w){const{path:M}=_;if(h&&M[0]!=="/"){const G=h.record.path,D=G[G.length-1]==="/"?"":"/";_.path=h.record.path+(M&&D+M)}if(S=fh(_,h,E),p?p.alias.push(S):(m=m||S,m!==S&&m.alias.push(S),v&&f.name&&!Fi(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,p&&p.children[D])}p=p||S}return m?()=>{i(m)}:Qn}function i(f){if(Ka(f)){const h=r.get(f);h&&(r.delete(f),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(f);h>-1&&(n.splice(h,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 h=gh(f,n);n.splice(h,0,f),f.record.name&&!Fi(f)&&r.set(f.record.name,f)}function c(f,h){let p,v={},y,E;if("name"in f&&f.name){if(p=r.get(f.name),!p)throw An(1,{location:f});E=p.record.name,v=pe(Hi(h.params,p.keys.filter(m=>!m.optional).concat(p.parent?p.parent.keys.filter(m=>m.optional):[]).map(m=>m.name)),f.params&&Hi(f.params,p.keys.map(m=>m.name))),y=p.stringify(v)}else if(f.path!=null)y=f.path,p=n.find(m=>m.re.test(y)),p&&(v=p.parse(y),E=p.record.name);else{if(p=h.name?r.get(h.name):n.find(m=>m.re.test(h.path)),!p)throw An(1,{location:f,currentLocation:h});E=p.record.name,v=pe({},h.params,f.params),y=p.stringify(v)}const w=[];let S=p;for(;S;)w.unshift(S.record),S=S.parent;return{name:E,path:y,params:v,matched:w,meta:ph(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 Hi(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Vi(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:hh(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 hh(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 Fi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function ph(e){return e.reduce((t,n)=>pe(t,n.meta),{})}function ji(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function gh(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;za(e,t[s])<0?r=s:n=s+1}const o=mh(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function mh(e){let t=e;for(;t=t.parent;)if(Ja(t)&&za(e,t)===0)return t}function Ja({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function vh(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(Fa," "),i=s.indexOf("="),l=ir(i<0?s:s.slice(0,i)),a=i<0?null:ir(s.slice(i+1));if(l in t){let c=t[l];pt(c)||(c=t[l]=[c]),c.push(a)}else t[l]=a}return t}function Bi(e){let t="";for(let n in e){const r=e[n];if(n=Nd(n),r==null){r!==void 0&&(t+=(t.length?"&":"")+n);continue}(pt(r)?r.map(s=>s&&Jo(s)):[r&&Jo(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function _h(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=pt(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const bh=Symbol(""),Wi=Symbol(""),co=Symbol(""),Ss=Symbol(""),Qo=Symbol("");function jn(){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 Bt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const c=h=>{h===!1?a(An(4,{from:n,to:t})):h instanceof Error?a(h):rh(h)?a(An(2,{from:t,to:h})):(i&&r.enterCallbacks[o]===i&&typeof h=="function"&&i.push(h),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(h=>a(h))})}function Do(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(Ha(a)){const u=(a.__vccOpts||a)[t];u&&s.push(Bt(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=Cd(u)?u.default:u;i.mods[l]=u,i.components[l]=f;const p=(f.__vccOpts||f)[t];return p&&Bt(p,n,r,i,l,o)()}))}}return s}function Ui(e){const t=qe(co),n=qe(Ss),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 h=f.findIndex(Ln.bind(null,u));if(h>-1)return h;const p=Gi(a[c-2]);return c>1&&Gi(u)===p&&f[f.length-1].path!==p?f.findIndex(Ln.bind(null,a[c-2])):h}),s=R(()=>o.value>-1&&Ph(n.params,r.value.params)),i=R(()=>o.value>-1&&o.value===n.matched.length-1&&Ua(n.params,r.value.params));function l(a={}){if(Eh(a)){const c=t[Lt(e.replace)?"replace":"push"](Lt(e.to)).catch(Qn);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 yh(e){return e.length===1?e[0]:e}const Sh=le({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:Ui,setup(e,{slots:t}){const n=an(Ui(e)),{options:r}=qe(co),o=R(()=>({[Ki(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Ki(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&yh(t.default(n));return e.custom?s:K("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),wh=Sh;function Eh(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 Ph(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(!pt(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Gi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ki=(e,t,n)=>e??t??n,xh=le({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=qe(Qo),o=R(()=>e.route||r.value),s=qe(Wi,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]);Gt(Wi,R(()=>i.value+1)),Gt(bh,l),Gt(Qo,o);const a=Ve();return Fe(()=>[a.value,l.value,e.name],([c,u,f],[h,p,v])=>{u&&(u.instances[f]=c,p&&p!==u&&c&&c===h&&(u.leaveGuards.size||(u.leaveGuards=p.leaveGuards),u.updateGuards.size||(u.updateGuards=p.updateGuards))),c&&u&&(!p||!Ln(u,p)||!h)&&(u.enterCallbacks[f]||[]).forEach(y=>y(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,f=l.value,h=f&&f.components[u];if(!h)return qi(n.default,{Component:h,route:c});const p=f.props[u],v=p?p===!0?c.params:typeof p=="function"?p(c):p:null,E=K(h,pe({},v,t,{onVnodeUnmounted:w=>{w.component.isUnmounted&&(f.instances[u]=null)},ref:a}));return qi(n.default,{Component:E,route:c})||E}}});function qi(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Ch=xh;function Th(e){const t=dh(e.routes,e),n=e.parseQuery||vh,r=e.stringifyQuery||Bi,o=e.history,s=jn(),i=jn(),l=jn(),a=ye(xt);let c=xt;_n&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=Ro.bind(null,x=>""+x),f=Ro.bind(null,Vd),h=Ro.bind(null,ir);function p(x,U){let B,Y;return Ka(x)?(B=t.getRecordMatcher(x),Y=U):Y=x,t.addRoute(Y,B)}function v(x){const U=t.getRecordMatcher(x);U&&t.removeRoute(U)}function y(){return t.getRoutes().map(x=>x.record)}function E(x){return!!t.getRecordMatcher(x)}function w(x,U){if(U=pe({},U||a.value),typeof x=="string"){const g=Oo(n,x,U.path),b=t.resolve({path:g.path},U),k=o.createHref(g.fullPath);return pe(g,b,{params:h(b.params),hash:ir(g.hash),redirectedFrom:void 0,href:k})}let B;if(x.path!=null)B=pe({},x,{path:Oo(n,x.path,U.path).path});else{const g=pe({},x.params);for(const b in g)g[b]==null&&delete g[b];B=pe({},x,{params:f(g)}),U.params=f(U.params)}const Y=t.resolve(B,U),he=x.hash||"";Y.params=u(h(Y.params));const Te=Bd(r,pe({},x,{hash:$d(he),path:Y.path})),d=o.createHref(Te);return pe({fullPath:Te,hash:he,query:r===Bi?_h(x.query):x.query||{}},Y,{redirectedFrom:void 0,href:d})}function S(x){return typeof x=="string"?Oo(n,x,a.value.path):pe({},x)}function m(x,U){if(c!==x)return An(8,{from:U,to:x})}function _(x){return D(x)}function M(x){return _(pe(S(x),{replace:!0}))}function G(x){const U=x.matched[x.matched.length-1];if(U&&U.redirect){const{redirect:B}=U;let Y=typeof B=="function"?B(x):B;return typeof Y=="string"&&(Y=Y.includes("?")||Y.includes("#")?Y=S(Y):{path:Y},Y.params={}),pe({query:x.query,hash:x.hash,params:Y.path!=null?{}:x.params},Y)}}function D(x,U){const B=c=w(x),Y=a.value,he=x.state,Te=x.force,d=x.replace===!0,g=G(B);if(g)return D(pe(S(g),{state:typeof g=="object"?pe({},he,g.state):he,force:Te,replace:d}),U||B);const b=B;b.redirectedFrom=U;let k;return!Te&&Wd(r,Y,B)&&(k=An(16,{to:b,from:Y}),mt(Y,Y,!0,!1)),(k?Promise.resolve(k):T(b,Y)).catch(P=>Et(P)?Et(P,2)?P:$t(P):z(P,b,Y)).then(P=>{if(P){if(Et(P,2))return D(pe({replace:d},S(P.to),{state:typeof P.to=="object"?pe({},he,P.to.state):he,force:Te}),U||b)}else P=C(b,Y,!0,d,he);return L(b,Y,P),P})}function Q(x,U){const B=m(x,U);return B?Promise.reject(B):Promise.resolve()}function I(x){const U=pn.values().next().value;return U&&typeof U.runWithContext=="function"?U.runWithContext(x):x()}function T(x,U){let B;const[Y,he,Te]=kh(x,U);B=Do(Y.reverse(),"beforeRouteLeave",x,U);for(const g of Y)g.leaveGuards.forEach(b=>{B.push(Bt(b,x,U))});const d=Q.bind(null,x,U);return B.push(d),st(B).then(()=>{B=[];for(const g of s.list())B.push(Bt(g,x,U));return B.push(d),st(B)}).then(()=>{B=Do(he,"beforeRouteUpdate",x,U);for(const g of he)g.updateGuards.forEach(b=>{B.push(Bt(b,x,U))});return B.push(d),st(B)}).then(()=>{B=[];for(const g of Te)if(g.beforeEnter)if(pt(g.beforeEnter))for(const b of g.beforeEnter)B.push(Bt(b,x,U));else B.push(Bt(g.beforeEnter,x,U));return B.push(d),st(B)}).then(()=>(x.matched.forEach(g=>g.enterCallbacks={}),B=Do(Te,"beforeRouteEnter",x,U,I),B.push(d),st(B))).then(()=>{B=[];for(const g of i.list())B.push(Bt(g,x,U));return B.push(d),st(B)}).catch(g=>Et(g,8)?g:Promise.reject(g))}function L(x,U,B){l.list().forEach(Y=>I(()=>Y(x,U,B)))}function C(x,U,B,Y,he){const Te=m(x,U);if(Te)return Te;const d=U===xt,g=_n?history.state:{};B&&(Y||d?o.replace(x.fullPath,pe({scroll:d&&g&&g.scroll},he)):o.push(x.fullPath,he)),a.value=x,mt(x,U,B,d),$t()}let j;function ie(){j||(j=o.listen((x,U,B)=>{if(!yr.listening)return;const Y=w(x),he=G(Y);if(he){D(pe(he,{replace:!0,force:!0}),Y).catch(Qn);return}c=Y;const Te=a.value;_n&&Qd(Di(Te.fullPath,B.delta),ao()),T(Y,Te).catch(d=>Et(d,12)?d:Et(d,2)?(D(pe(S(d.to),{force:!0}),Y).then(g=>{Et(g,20)&&!B.delta&&B.type===lr.pop&&o.go(-1,!1)}).catch(Qn),Promise.reject()):(B.delta&&o.go(-B.delta,!1),z(d,Y,Te))).then(d=>{d=d||C(Y,Te,!1),d&&(B.delta&&!Et(d,8)?o.go(-B.delta,!1):B.type===lr.pop&&Et(d,20)&&o.go(-1,!1)),L(Y,Te,d)}).catch(Qn)}))}let _e=jn(),J=jn(),ne;function z(x,U,B){$t(x);const Y=J.list();return Y.length?Y.forEach(he=>he(x,U,B)):console.error(x),Promise.reject(x)}function Ae(){return ne&&a.value!==xt?Promise.resolve():new Promise((x,U)=>{_e.add([x,U])})}function $t(x){return ne||(ne=!x,ie(),_e.list().forEach(([U,B])=>x?B(x):U()),_e.reset()),x}function mt(x,U,B,Y){const{scrollBehavior:he}=e;if(!_n||!he)return Promise.resolve();const Te=!B&&Xd(Di(x.fullPath,0))||(Y||!B)&&history.state&&history.state.scroll||null;return dn().then(()=>he(x,U,Te)).then(d=>d&&Yd(d)).catch(d=>z(d,x,U))}const Qe=x=>o.go(x);let hn;const pn=new Set,yr={currentRoute:a,listening:!0,addRoute:p,removeRoute:v,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(x){const U=this;x.component("RouterLink",wh),x.component("RouterView",Ch),x.config.globalProperties.$router=U,Object.defineProperty(x.config.globalProperties,"$route",{enumerable:!0,get:()=>Lt(a)}),_n&&!hn&&a.value===xt&&(hn=!0,_(o.location).catch(he=>{}));const B={};for(const he in xt)Object.defineProperty(B,he,{get:()=>a.value[he],enumerable:!0});x.provide(co,U),x.provide(Ss,$l(B)),x.provide(Qo,a);const Y=x.unmount;pn.add(x),x.unmount=function(){pn.delete(x),pn.size<1&&(c=xt,j&&j(),j=null,a.value=xt,hn=!1,ne=!1),Y()}}};function st(x){return x.reduce((U,B)=>U.then(()=>I(B)),Promise.resolve())}return yr}function kh(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=>Ln(c,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>Ln(c,a))||o.push(a))}return[n,r,o]}function _r(){return qe(co)}function In(e){return qe(Ss)}var ws=Symbol(""),gt=()=>{const e=qe(ws);if(!e)throw new Error("useClientData() is called without provider.");return e},Lh=()=>gt().pageComponent,Es=()=>gt().pageData,br=()=>gt().pageFrontmatter,Ah=()=>gt().pageHead,Ps=()=>gt().pageLang,Rh=()=>gt().pageLayout,Oh=()=>gt().routeLocale,Ya=()=>gt().routePath,Dh=()=>gt().routes,Ih=()=>gt().siteData,Hr=ye([]),uo=e=>{Hr.value.push(e),oo(()=>{Hr.value=Hr.value.filter(t=>t!==e)})},Mh=Symbol(""),Xo=ye(Pd),Pn=ye(xd),Qa=(e,t)=>{const n=pd(e,t);if(Pn.value[n])return n;const r=encodeURI(n);if(Pn.value[r])return r;const o=Xo.value[n]||Xo.value[r];return o||n},ar=(e,t)=>{const{pathname:n,hashAndQueries:r}=Ma(e),o=Qa(n,t),s=o+r;return Pn.value[o]?{...Pn.value[o],path:s,notFound:!1}:{...Pn.value["/404.html"],path:s,notFound:!0}},$h=(e,t)=>{const{pathname:n,hashAndQueries:r}=Ma(e);return Qa(n,t)+r},Nh=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}},fo=le({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=_r(),r=In(),o=R(()=>e.to.startsWith("#")||e.to.startsWith("?")?e.to:`/${$h(e.to,r.path).substring(1)}`);return()=>K("a",{class:["route-link",{[e.activeClass]:e.active}],href:o.value,onClick:(s={})=>{Nh(s)&&n.push(e.to).catch()}},t.default())}}),Hh=le({name:"AutoLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=jl(e,"config"),r=In(),o=Ih(),s=R(()=>mr(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 p=Object.keys(o.value.locales);return p.length?p.every(v=>v!==n.value.link):n.value.link!=="/"}),h=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:p,after:v,default:y}=t,E=(y==null?void 0:y(n.value))??[p==null?void 0:p(n.value),n.value.text,v==null?void 0:v(n.value)];return a.value?K(fo,{class:"auto-link",to:n.value.link,active:h.value,"aria-label":u.value},()=>E):K("a",{class:"auto-link external-link",href:n.value.link,"aria-label":u.value,rel:c.value,target:i.value},E)}}}),xs=le({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}}}),Tr=e=>{Hr.value.forEach(t=>t(e))},Cs=le({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=Lh(),n=R(()=>{if(!e.path)return t.value;const o=ar(e.path);return Lu(async()=>o.loader().then(({comp:s})=>s))}),r=br();return Fe(r,()=>{Tr("updated")},{deep:!0,flush:"post"}),()=>K(n.value,{onVnodeMounted:()=>{Tr("mounted")},onVnodeUpdated:()=>{Tr("updated")},onVnodeBeforeUnmount:()=>{Tr("beforeUnmount")}})}}),Vh="Layout",Fh="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 yd(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||Fh,resolvePageLayout:(e,t)=>{const n=dt(e.frontmatter.layout)?e.frontmatter.layout:Vh;if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>gd(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]}}}),Mt=(e={})=>e,Ts=e=>vr(e)?e:`/${Na(e)}`,jh=Object.defineProperty,Bh=(e,t)=>{for(var n in t)jh(e,n,{get:t[n],enumerable:!0})},Wh={};Bh(Wh,{COMPONENT_STATE_TYPE:()=>Uh,INSPECTOR_ID:()=>Gh,INSPECTOR_LABEL:()=>Kh,INSPECTOR_NODES:()=>qh,INSPECTOR_STATE_SECTION_NAME:()=>zh,PLUGIN_ID:()=>Xa,PLUGIN_LABEL:()=>ks});var Xa="org.vuejs.vuepress",ks="VuePress",Uh=ks,Gh=Xa,Kh=ks,zi={id:"INTERNAL",label:"Internal",keys:["layouts","routes","redirects"]},Ji={id:"SITE",label:"Site",keys:["siteData","siteLocaleData"]},Yi={id:"ROUTE",label:"Route",keys:["routePath","routeLocale"]},Qi={id:"PAGE",label:"Page",keys:["pageData","pageFrontmatter","pageLang","pageHead","pageHeadTitle","pageLayout","pageComponent"]},qh={[zi.id]:zi,[Ji.id]:Ji,[Yi.id]:Yi,[Qi.id]:Qi},zh="State";function Ls(e){return os()?(Sl(e),!0):!1}const xn=new WeakMap,Za=(...e)=>{var t;const n=e[0],r=(t=It())==null?void 0:t.proxy;if(r==null&&!sa())throw new Error("injectLocal must be called in setup");return r&&xn.has(r)&&n in xn.get(r)?xn.get(r)[n]:qe(...e)},Jh=(e,t)=>{var n;const r=(n=It())==null?void 0:n.proxy;if(r==null)throw new Error("provideLocal must be called in setup");xn.has(r)||xn.set(r,Object.create(null));const o=xn.get(r);o[e]=t,Gt(e,t)},As=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Yh=Object.prototype.toString,Qh=e=>Yh.call(e)==="[object Object]",fn=()=>{};function Xh(...e){if(e.length!==1)return jl(...e);const t=e[0];return typeof t=="function"?Dn(Vl(()=>({get:t,set:fn}))):Ve(t)}function Rs(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 ec=e=>e();function Zh(e,t={}){let n,r,o=fn;const s=a=>{clearTimeout(a),o(),o=fn};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,h)=>{o=t.rejectOnCancel?h: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 ep(...e){let t=0,n,r=!0,o=fn,s,i,l,a,c;!Me(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=fn)};return h=>{const p=Pe(i),v=Date.now()-t,y=()=>s=h();return u(),p<=0?(t=Date.now(),y()):(v>p&&(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,p-v))})),!a&&!n&&(n=setTimeout(()=>r=!0,p)),r=!1,s)}}function tp(e=ec,t={}){const{initialState:n="active"}=t,r=Xh(n==="active");function o(){r.value=!1}function s(){r.value=!0}const i=(...l)=>{r.value&&e(...l)};return{isActive:Dn(r),pause:o,resume:s,eventFilter:i}}function np(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 Xi(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Vr(e){return Array.isArray(e)?e:[e]}function rp(e){return It()}function tc(e,t=200,n={}){return Rs(Zh(t,n),e)}function op(e,t=200,n=!1,r=!0,o=!1){return Rs(ep(t,n,r,o),e)}function sp(e,t,n={}){const{eventFilter:r=ec,...o}=n;return Fe(e,Rs(r,t),o)}function ip(e,t,n={}){const{eventFilter:r,initialState:o="active",...s}=n,{eventFilter:i,pause:l,resume:a,isActive:c}=tp(r,{initialState:o});return{stop:sp(e,t,{...s,eventFilter:i}),pause:l,resume:a,isActive:c}}function ho(e,t=!0,n){rp()?Ze(e,n):t?e():dn(e)}function lp(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,As&&c()),Ls(a),{isPending:Dn(s),start:c,stop:a}}function Os(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=Me(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 Ds(e,t,n){return Fe(e,t,{...n,immediate:!0})}const Rt=As?window:void 0,nc=As?window.navigator:void 0;function Wt(e){var t;const n=Pe(e);return(t=n==null?void 0:n.$el)!=null?t:n}function je(...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=Vr(Pe(e[0])).filter(a=>a!=null);return l.every(a=>typeof a!="string")?l:void 0}),s=Ds(()=>{var l,a;return[(a=(l=o.value)==null?void 0:l.map(c=>Wt(c)))!=null?a:[Rt].filter(c=>c!=null),Vr(Pe(o.value?e[1]:e[0])),Vr(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=Qh(u)?{...u}:u;t.push(...l.flatMap(h=>a.flatMap(p=>c.map(v=>r(h,p,v,f)))))},{flush:"post"}),i=()=>{s(),n()};return Ls(n),i}function ap(){const e=ye(!1),t=It();return t&&Ze(()=>{e.value=!0},t),e}function po(e){const t=ap();return R(()=>(t.value,!!e()))}const cp=Symbol("vueuse-ssr-width");function up(){const e=sa()?Za(cp,null):null;return typeof e=="number"?e:void 0}function Is(e,t={}){const{window:n=Rt,ssrWidth:r=up()}=t,o=po(()=>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 cf(()=>{if(s.value){s.value=!o.value;const c=Pe(e).split(",");l.value=c.some(u=>{const f=u.includes("not all"),h=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),p=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let v=!!(h||p);return h&&v&&(v=r>=Xi(h[1])),p&&v&&(v=r<=Xi(p[1])),f?!v:v});return}o.value&&(i.value=n.matchMedia(Pe(e)),l.value=i.value.matches)}),je(i,"change",a,{passive:!0}),R(()=>l.value)}function Zi(e,t={}){const{controls:n=!1,navigator:r=nc}=t,o=po(()=>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"};je(s,"change",a,{passive:!0});const c=np(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 ue(s.value)}});return c(),n?{state:l,isSupported:o,query:c}:l}function fp(e={}){const{navigator:t=nc,read:n=!1,source:r,copiedDuring:o=1500,legacy:s=!1}=e,i=po(()=>t&&"clipboard"in t),l=Zi("clipboard-read"),a=Zi("clipboard-write"),c=R(()=>i.value||s),u=ye(""),f=ye(!1),h=lp(()=>f.value=!1,o,{immediate:!1});async function p(){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&&je(["copy","cut"],p,{passive:!0});async function v(S=Pe(r)){if(c.value&&S!=null){let m=!(i.value&&w(a.value));if(!m)try{await t.clipboard.writeText(S)}catch{m=!0}m&&y(S),u.value=S,f.value=!0,h.start()}}function y(S){const m=document.createElement("textarea");m.value=S??"",m.style.position="absolute",m.style.opacity="0",document.body.appendChild(m),m.select(),document.execCommand("copy"),m.remove()}function E(){var S,m,_;return(_=(m=(S=document==null?void 0:document.getSelection)==null?void 0:S.call(document))==null?void 0:m.toString())!=null?_:""}function w(S){return S==="granted"||S==="prompt"}return{isSupported:c,text:u,copied:f,copy:v}}const kr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Lr="__vueuse_ssr_handlers__",dp=hp();function hp(){return Lr in kr||(kr[Lr]=kr[Lr]||{}),kr[Lr]}function pp(e,t){return dp[e]||t}function gp(e){return Is("(prefers-color-scheme: dark)",e)}function mp(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 vp={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()}},el="vueuse-storage";function Ms(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:h,onError:p=L=>{console.error(L)},initOnMounted:v}=r,y=(u?ye:Ve)(typeof t=="function"?t():t),E=R(()=>Pe(e));if(!n)try{n=pp("getDefaultStorage",()=>{var L;return(L=Rt)==null?void 0:L.localStorage})()}catch(L){p(L)}if(!n)return y;const w=Pe(t),S=mp(w),m=(o=r.serializer)!=null?o:vp[S],{pause:_,resume:M}=ip(y,()=>D(y.value),{flush:s,deep:i,eventFilter:h});Fe(E,()=>I(),{flush:s}),f&&l&&ho(()=>{n instanceof Storage?je(f,"storage",I,{passive:!0}):je(f,el,T),v&&I()}),v||I();function G(L,C){if(f){const j={key:E.value,oldValue:L,newValue:C,storageArea:n};f.dispatchEvent(n instanceof Storage?new StorageEvent("storage",j):new CustomEvent(el,{detail:j}))}}function D(L){try{const C=n.getItem(E.value);if(L==null)G(C,null),n.removeItem(E.value);else{const j=m.write(L);C!==j&&(n.setItem(E.value,j),G(C,j))}}catch(C){p(C)}}function Q(L){const C=L?L.newValue:n.getItem(E.value);if(C==null)return a&&w!=null&&n.setItem(E.value,m.write(w)),w;if(!L&&c){const j=m.read(C);return typeof c=="function"?c(j,w):S==="object"&&!Array.isArray(j)?{...w,...j}:j}else return typeof C!="string"?C:m.read(C)}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)!==m.write(y.value)&&(y.value=Q(L))}catch(C){p(C)}finally{L?dn(M):M()}}}}function T(L){I(L.detail)}return y}function _p(e,t,n={}){const{window:r=Rt,...o}=n;let s;const i=po(()=>r&&"ResizeObserver"in r),l=()=>{s&&(s.disconnect(),s=void 0)},a=R(()=>{const f=Pe(e);return Array.isArray(f)?f.map(h=>Wt(h)):[Wt(f)]}),c=Fe(a,f=>{if(l(),i.value&&r){s=new ResizeObserver(t);for(const h of f)h&&s.observe(h,o)}},{immediate:!0,flush:"post"}),u=()=>{l(),c()};return Ls(u),{isSupported:i,stop:u}}function bp(e,t={width:0,height:0},n={}){const{window:r=Rt,box:o="content-box"}=n,s=R(()=>{var f,h;return(h=(f=Wt(e))==null?void 0:f.namespaceURI)==null?void 0:h.includes("svg")}),i=ye(t.width),l=ye(t.height),{stop:a}=_p(e,([f])=>{const h=o==="border-box"?f.borderBoxSize:o==="content-box"?f.contentBoxSize:f.devicePixelContentBoxSize;if(r&&s.value){const p=Wt(e);if(p){const v=p.getBoundingClientRect();i.value=v.width,l.value=v.height}}else if(h){const p=Vr(h);i.value=p.reduce((v,{inlineSize:y})=>v+y,0),l.value=p.reduce((v,{blockSize:y})=>v+y,0)}else i.value=f.contentRect.width,l.value=f.contentRect.height},n);ho(()=>{const f=Wt(e);f&&(i.value="offsetWidth"in f?f.offsetWidth:t.width,l.value="offsetHeight"in f?f.offsetHeight:t.height)});const c=Fe(()=>Wt(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 tl=1;function yp(e,t={}){const{throttle:n=0,idle:r=200,onStop:o=fn,onScroll:s=fn,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),h=ye(0),p=R({get(){return f.value},set(D){y(D,void 0)}}),v=R({get(){return h.value},set(D){y(void 0,D)}});function y(D,Q){var I,T,L,C;if(!c)return;const j=Pe(e);if(!j)return;(L=j instanceof Document?c.document.body:j)==null||L.scrollTo({top:(I=Pe(Q))!=null?I:v.value,left:(T=Pe(D))!=null?T:p.value,behavior:Pe(a)});const ie=((C=j==null?void 0:j.document)==null?void 0:C.documentElement)||(j==null?void 0:j.documentElement)||j;p!=null&&(f.value=ie.scrollLeft),v!=null&&(h.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}),m=D=>{E.value&&(E.value=!1,S.left=!1,S.right=!1,S.top=!1,S.bottom=!1,o(D))},_=tc(m,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)||Wt(D),{display:T,flexDirection:L,direction:C}=getComputedStyle(I),j=C==="rtl"?-1:1,ie=I.scrollLeft;S.left=ie<f.value,S.right=ie>f.value;const _e=Math.abs(ie*j)<=(i.left||0),J=Math.abs(ie*j)+I.clientWidth>=I.scrollWidth-(i.right||0)-tl;T==="flex"&&L==="row-reverse"?(w.left=J,w.right=_e):(w.left=_e,w.right=J),f.value=ie;let ne=I.scrollTop;D===c.document&&!ne&&(ne=c.document.body.scrollTop),S.top=ne<h.value,S.bottom=ne>h.value;const z=Math.abs(ne)<=(i.top||0),Ae=Math.abs(ne)+I.clientHeight>=I.scrollHeight-(i.bottom||0)-tl;T==="flex"&&L==="column-reverse"?(w.top=Ae,w.bottom=z):(w.top=z,w.bottom=Ae),h.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 je(e,"scroll",n?op(G,n,!0,!1):G,l),ho(()=>{try{const D=Pe(e);if(!D)return;M(D)}catch(D){u(D)}}),je(e,"scrollend",m,l),{x:p,y:v,isScrolling:E,arrivedState:w,directions:S,measure(){const D=Pe(e);c&&D&&M(D)}}}function Sp(e={}){const{window:t=Rt,...n}=e;return yp(t,n)}function wp(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:h,scale:p}=t.visualViewport;l.value=Math.round(f*p),a.value=Math.round(h*p)}else s?(l.value=t.innerWidth,a.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,a.value=t.document.documentElement.clientHeight)};c(),ho(c);const u={passive:!0};if(je("resize",c,u),t&&i==="visual"&&t.visualViewport&&je(t.visualViewport,"resize",c,u),o){const f=Is("(orientation: portrait)");Fe(f,()=>c())}return{width:l,height:a}}const nl=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},Ep=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=_r();je("scroll",tc(()=>{var v,y;const i=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(i-0)<r){nl(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)),p=Array.from(document.querySelectorAll(t)).filter(E=>f.some(w=>w.hash===E.hash));for(let E=0;E<p.length;E++){const w=p[E],S=p[E+1],m=i>=(((v=w.parentElement)==null?void 0:v.offsetTop)??0)-r,_=!S||i<(((y=S.parentElement)==null?void 0:y.offsetTop)??0)-r;if(!(m&&_))continue;const G=decodeURIComponent(o.currentRoute.value.hash),D=decodeURIComponent(w.hash);if(G===D)return;if(u){for(let Q=E+1;Q<p.length;Q++)if(G===decodeURIComponent(p[Q].hash))return}nl(o,D);return}},n))},Pp="a.vp-sidebar-item",xp=".header-anchor",Cp=300,Tp=5,kp=Mt({setup(){Ep({headerLinkSelector:Pp,headerAnchorSelector:xp,delay:Cp,offset:Tp})}}),Lp=Object.freeze(Object.defineProperty({__proto__:null,default:kp},Symbol.toStringTag,{value:"Module"})),Ap=le({name:"FadeInExpandTransition",props:{group:Boolean,appear:Boolean,width:Boolean,mode:String,onLeave:Function,onAfterLeave:Function,onAfterEnter:Function},setup(e,{slots:t}){const n=l=>{e.width?l.style.maxWidth=`${l.offsetWidth}px`:l.style.maxHeight=`${l.offsetHeight}px`,l.offsetWidth},r=l=>{var a;e.width?l.style.maxWidth="0":l.style.maxHeight="0",l.offsetWidth,(a=e.onLeave)==null||a.call(e)},o=l=>{var a;e.width?l.style.maxWidth="":l.style.maxHeight="",(a=e.onAfterLeave)==null||a.call(e)},s=l=>{if(l.style.transition="none",e.width){const a=l.offsetWidth;l.style.maxWidth="0",l.offsetWidth,l.style.transition="",l.style.maxWidth=`${a}px`}else{const a=l.offsetHeight;l.style.maxHeight="0",l.offsetWidth,l.style.transition="",l.style.maxHeight=`${a}px`}l.offsetWidth},i=l=>{var a;e.width?l.style.maxWidth="":l.style.maxHeight="",(a=e.onAfterEnter)==null||a.call(e)};return()=>K(e.group?Zf:lo,{name:e.width?"fade-in-width-expand":"fade-in-height-expand",appear:e.appear,onEnter:s,onAfterEnter:i,onBeforeLeave:n,onLeave:r,onAfterLeave:o,...e.group?void 0:{mode:e.mode}},t)}}),rc=[...new Array(6)].map((e,t)=>`[vp-content] h${t+1}`).join(","),Rp=(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},Op=(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()},Dp=(e=rc,t=[])=>Array.from(document.querySelectorAll(e)).filter(n=>n.id&&n.hasChildNodes()).map(n=>({element:n,title:Op(n,t),link:`#${n.id}`,slug:n.id,level:Number(n.tagName[1]),children:[]})),Ip=({selector:e=rc,levels:t=2,ignore:n=[]}={})=>Rp(Dp(e,n),t),oc=(e,t)=>{var r;const n=(r=It())==null?void 0:r.appContext.components;return n?e in n||Xe(e)in n||fr(Xe(e))in n:!1},Mp=e=>typeof e<"u",sc=(e,t)=>dt(e)&&e.startsWith(t),{keys:ic}=Object,lc=e=>sc(e,"/")&&e[1]!=="/",ac=e=>!dd(e)&&!mr(e),Io="message-container";class $s{constructor(){Gs(this,"elements");this.elements={}}static get containerElement(){let t=document.getElementById(Io);return t||(t=document.createElement("div"),t.id=Io,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,$s.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 ic(this.elements).forEach(n=>{this.close(Number(n))})}destroy(){const t=document.getElementById(Io);t&&document.body.removeChild(t),this.elements={}}}const Ns=e=>{const t=Oh();return R(()=>Pe(e)[t.value]??{})},$p=()=>{const e=Dh();return R(()=>Object.keys(e.value))};var Np={"/":{backToTop:"Вернуться к началу"},"/eng/":{backToTop:"Back to top"}};const Hp=le({name:"BackToTop",setup(){const e=br(),t=Ns(Np),n=ye(),{height:r}=bp(n),{height:o}=wp(),{y:s}=Sp(),i=R(()=>(e.value.backToTop??!0)&&s.value>100),l=R(()=>s.value/(r.value-o.value)*100);return Ze(()=>{n.value=document.body}),()=>K(lo,{name:"fade-in"},()=>i.value?K("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[K("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":l.value},K("svg",K("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}`}))),K("div",{class:"back-to-top-icon"})]):null)}}),Vp=Mt({rootComponents:[Hp]}),Fp=Object.freeze(Object.defineProperty({__proto__:null,default:Vp},Symbol.toStringTag,{value:"Module"})),jp='<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>',Bp=/language-(shellscript|shell|bash|sh|zsh)/,Wp=({selector:e,ignoreSelector:t,inlineSelector:n,duration:r=2e3,locales:o,showInMobile:s,transform:i})=>{const l=Is("(max-width: 419px)"),a=R(()=>!l.value||s),c=Ns(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)};Ds(a,f,{flush:"post"}),uo(E=>{E!=="beforeUnmount"&&f()});const{copy:h}=fp({legacy:!0}),p=new WeakMap;let v=null;const y=async(E,w,S)=>{const m=w.cloneNode(!0);t&&m.querySelectorAll(t).forEach(G=>{G.remove()}),i&&i(m);let _=m.textContent||"";if(Bp.test(E.className)&&(_=_.replace(/^ *(\$|>) /gm,"")),await h(_),r<=0)return;S.classList.add("copied"),clearTimeout(p.get(S));const M=setTimeout(()=>{S.classList.remove("copied"),S.blur(),p.delete(S)},r);p.set(S,M)};je("click",E=>{const w=E.target;if(a.value&&w.matches('div[class*="language-"] > button.vp-copy-code-button')){const S=w.parentElement,m=w.nextElementSibling;if(!S||!m)return;y(S,m,w)}},{passive:!0}),n&&je("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(),h(w.textContent||""),(v??(v=new $s)).pop(`${jp}<span>${c.value.copied} </span>`,r)}},{passive:!0})};var Up={"/":{copy:"Скопировать код",copied:"Скопировано"},"/eng/":{copy:"Copy code",copied:"Copied"}};const Gp=Mt({setup:()=>{Wp({selector:'[vp-content] div[class*="language-"] pre',ignoreSelector:"",inlineSelector:"",locales:Up,duration:2e3,showInMobile:!1})}}),Kp=Object.freeze(Object.defineProperty({__proto__:null,default:Gp},Symbol.toStringTag,{value:"Module"})),qp=Mt({setup(){je("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})},{passive:!0})}}),zp=Object.freeze(Object.defineProperty({__proto__:null,default:qp},Symbol.toStringTag,{value:"Module"}));var rl={provider:null,pattern:{},repo:"https://git.pleshevski.ru/pleshevskiy/pleshevski.ru"};const ol=typeof rl>"u"?{}:rl,Jp=(e,t)=>!e||vr(e)?e:t==="github"?`https://github.com/${e}`:t==="gitee"?`https://gitee.com/${e}`:e,Yp=/#(\d+)/g,Qp=(e=!0)=>{const t=br(),n=Ps(),r=Es(),{pattern:o={},provider:s}=ol,i=Jp(ol.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(Yp,(f,h)=>`<a href="${o.issue.replace(":issue",h).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})})},cc=(e=!0)=>{const t=br(),n=Es();return R(()=>{var r;return t.value.contributors===!1||!Pe(e)?[]:((r=n.value.git)==null?void 0:r.contributors)??[]})};var sl={"/":{contributors:"Участники",changelog:"История изменений",timeOn:"в",viewChangelog:"Показать всю историю изменений",latestUpdateAt:"Последнее обновление:"},"/eng/":{contributors:"Contributors",changelog:"Changelog",timeOn:"on",viewChangelog:"View All Changelog",latestUpdateAt:"Last Updated:"}};const Xp=typeof sl>"u"?{}:sl,Hs=()=>Ns(Xp),uc=(e=!0)=>{const t=Ps(),n=Hs(),r=Es();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}})},fc=({level:e=2,text:t,anchor:n})=>K(`h${e||2}`,{id:n,tabindex:"-1"},K("a",{href:`#${n}`,class:"header-anchor"},K("span",t))),Zp=({name:e,url:t,avatar:n})=>K(t?"a":"span",{href:t,target:"_blank",rel:"noreferrer",class:"vp-contributor"},[n?K("img",{src:n,alt:"",class:"vp-contributor-avatar"}):null,K("span",{class:"vp-contributor-name"},e)]),eg=le({name:"GitContributors",props:{title:String,headerLevel:{type:Number,default:2}},setup(e){const t=cc(),n=Hs();return()=>t.value.length?[K(fc,{level:e.headerLevel,anchor:"doc-contributors",text:e.title||n.value.contributors}),K("div",{class:"vp-contributors"},t.value.map(r=>K(Zp,r)))]:null}}),tg=le({name:"GitChangelog",props:{title:String,headerLevel:{type:Number,default:2}},setup(e){const t=Qp(),n=Hs(),r=uc(),[o,s]=Os(),i=()=>K("div",{class:"vp-changelog-header",onClick:()=>s()},[K("div",{class:"vp-latest-updated"},[K("span",{class:"vp-changelog-icon"}),K("span",{"data-allow-mismatch":""},r.value.text)]),K("div",[K("span",{class:"vp-changelog-menu-icon"}),K("span",n.value.viewChangelog)])]),l=({item:c})=>K("li",{class:"vp-changelog-item-tag"},K("div",[K("a",{class:"vp-changelog-tag"},K("code",c.tag)),K("span",{class:"vp-changelog-date","data-allow-mismatch":""},[n.value.timeOn," ",K("time",{datetime:new Date(c.time).toISOString()},c.date)])])),a=({item:c})=>K("li",{class:"vp-changelog-item-commit"},[K(c.commitUrl?"a":"span",{class:"vp-changelog-hash",href:c.commitUrl,target:"_blank",rel:"noreferrer"},[K("code",c.hash.slice(0,5))]),K("span",{class:"vp-changelog-divider"},"-"),K("span",{class:"vp-changelog-message",innerHTML:c.message}),K("span",{class:"vp-changelog-date","data-allow-mismatch":""},[n.value.timeOn||"on"," ",K("time",{datetime:new Date(c.time).toISOString()},c.date)])]);return()=>t.value.length?[K(fc,{level:e.headerLevel,anchor:"doc-changelog",text:e.title||n.value.changelog}),K("div",{class:["vp-changelog-wrapper",{active:o.value}]},[K(i),K("ul",{class:"vp-changelog-list"},[t.value.map(c=>c.tag?K(l,{item:c,key:c.tag}):K(a,{item:c,key:c.hash}))])])]:null}}),ng={enhance:({app:e})=>{e.component("GitContributors",eg),e.component("GitChangelog",tg)}},rg=Object.freeze(Object.defineProperty({__proto__:null,default:ng},Symbol.toStringTag,{value:"Module"}));/** * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT - */const il=(e,t)=>{e.classList.add(t)},ll=(e,t)=>{e.classList.remove(t)},og=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Mo=(e,t,n)=>e<t?t:e>n?n:e,al=e=>(-1+e)*100,sg=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),ig=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Ar=(()=>{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=ig(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)&&Mp(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=Mo(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,sg(l=>{Ar(i,{transform:`translate3d(${al(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Ar(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Ar(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=Mo(t+(typeof e=="number"?e:(1-t)*Mo(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");il(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":al(Re.percent??0);return Ar(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&il(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{ll(document.documentElement,"nprogress-busy"),ll(document.querySelector(Pt.parent),"nprogress-custom-parent"),og(document.getElementById("nprogress"))}},lg=()=>{Ze(()=>{const e=_r(),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()})})},ag=Mt({setup(){lg()}}),cg=Object.freeze(Object.defineProperty({__proto__:null,default:ag},Symbol.toStringTag,{value:"Module"})),ug=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{je("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})},fg={setup(){ug()}},dg=Object.freeze(Object.defineProperty({__proto__:null,default:fg},Symbol.toStringTag,{value:"Module"})),hg="VUEPRESS_CODE_TAB_STORE",Rr=Ms(hg,{}),pg=le({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&&(Rr.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&&(Rr.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Rr.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),Fe(()=>e.tabId&&Rr.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:h})=>h===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?K("div",{class:"vp-code-tabs"},[K("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return K("button",{type:"button",ref:h=>{h&&(r.value[u]=h)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:h=>{l(h,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return K("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[K("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),gg="VUEPRESS_TAB_STORE",$o=Ms(gg,{}),mg=le({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&&($o.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})=>$o.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),Fe(()=>e.tabId&&$o.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:h})=>h===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?K("div",{class:"vp-tabs"},[K("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return K("button",{type:"button",ref:h=>{h&&(r.value[u]=h)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:h=>{l(h,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return K("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[K("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),vg={enhance:({app:e})=>{e.component("CodeTabs",pg),e.component("Tabs",mg)}},_g=Object.freeze(Object.defineProperty({__proto__:null,default:vg},Symbol.toStringTag,{value:"Module"})),bg=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"}`),yg=Ve(bg),dc=()=>yg,hc=Symbol(""),Sg=()=>{const e=qe(hc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},wg=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Eg=Mt({enhance({app:e}){const t=dc(),n=e._context.provides[ws],r=R(()=>wg(t.value,n.routeLocale.value));e.provide(hc,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),Pg=Object.freeze(Object.defineProperty({__proto__:null,default:Eg},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:dc(),themeLocale:Sg()}},pc=Symbol(""),xg=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{Ds(e,t)}),oo(()=>{t()})},Vs=()=>{const e=qe(pc);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Cg=()=>{const{themeLocale:e}=He(),t=gp(),n=Ms("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"}});Gt(pc,r),xg(r)},gc=Symbol("headers"),Tg=()=>{const e=Za(gc);if(!e)throw new Error("useHeaders() is called without provider.");return e},kg=()=>{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=Ip({levels:[2,r.value+1],ignore:[".vp-badge"]})};Jh(gc,n),uo(s=>{s==="beforeUnmount"?n.value=[]:o()})};let No=null,Bn=null;const Lg={wait:()=>No,pending:()=>{No=new Promise(e=>{Bn=e})},resolve:()=>{Bn==null||Bn(),No=null,Bn=null}},mc=()=>Lg,Rn=(e,t)=>{const{notFound:n,meta:r,path:o}=ar(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},Cn=(e="",t="")=>lc(t)||mr(t)?t:`${Sd(e)}${t}`,Ag=e=>({text:e.title,link:e.link,children:Fs(e.children)}),Fs=e=>e?e.map(t=>Ag(t)):[],vc=(e,t)=>[{text:e.title,children:Fs(t)}],_c=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Rn(Cn(i,s)):dt(s.link)?{...s,link:ac(s.link)?Rn(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:Fs(c)}}return l};return e.map(s=>o(s,r))},Rg=(e,t,n,r)=>{const o=ic(e).sort((s,i)=>i.length-s.length);for(const s of o)if(sc(decodeURI(r),s)){const i=e[s];return i?i==="heading"?vc(t,n):_c(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},bc=Symbol("sidebarItems"),js=()=>{const e=qe(bc);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Og=(e,t,n,r,o)=>e===!1?[]:e==="heading"?vc(t,o):Array.isArray(e)?_c(e,o,n,r):bs(e)?Rg(e,t,o,n):[],Dg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=He(),o=Tg(),s=Ya(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>Og(i.value,t.value,s.value,n.value,o.value));Gt(bc,l)},Ig=le({__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 Mg(e,t,n,r,o,s){return V(),Z("span",{class:Ke(["vp-badge",n.type]),style:On({verticalAlign:n.vertical})},[Ce(e.$slots,"default",{},()=>[qt(fe(n.text),1)])],6)}const $g=Se(Ig,[["render",Mg],["__file","Badge.vue"]]),Ng=le({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Hg(e,t,n,r,o,s){return V(),Le(lo,{name:"fade-in-down",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:ke(()=>[Ce(e.$slots,"default")]),_:3})}const Vg=Se(Ng,[["render",Hg],["__file","VPFadeSlideYTransition.vue"]]),Fg=le({__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}}),jg={key:0,class:"vp-features"};function Bg(e,t,n,r,o,s){return r.features.length?(V(),Z("div",jg,[(V(!0),Z(ve,null,At(r.features,i=>(V(),Z("div",{key:i.title,class:"vp-feature"},[q("h2",null,fe(i.title),1),q("p",null,fe(i.details),1)]))),128))])):De("",!0)}const Wg=Se(Fg,[["render",Bg],["__file","VPHomeFeatures.vue"]]),Ug=le({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=br(),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}}),Gg=["innerHTML"],Kg=["textContent"];function qg(e,t,n,r,o,s){return r.footer?(V(),Z(ve,{key:0},[r.footerHtml?(V(),Z("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,Gg)):(V(),Z("div",{key:1,class:"vp-footer","vp-footer":"",textContent:fe(r.footer)},null,8,Kg))],64)):De("",!0)}const zg=Se(Ug,[["render",qg],["__file","VPHomeFooter.vue"]]),Jg=le({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return Hh}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Yg(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},Bu({before:ke(()=>[Ce(e.$slots,"before",vo($r(n.config)))]),after:ke(()=>[Ce(e.$slots,"after",vo($r(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:ke(()=>[Ce(e.$slots,"default",vo($r(n.config)))]),key:"0"}:void 0]),1032,["config"])}const Mn=Se(Jg,[["render",Yg],["__file","VPAutoLink.vue"]]),Qg=le({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=He(),o=Vs(),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:p="primary",...v})=>({type:p,...v})):[]),h={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 p=K("img",{class:"vp-hero-image",src:Ts(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?p:K(xs,()=>p)},VPAutoLink:Mn};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),Xg={class:"vp-hero"},Zg={key:0,id:"main-title"},em={key:1,class:"vp-hero-description"},tm={key:2,class:"vp-hero-actions"};function nm(e,t,n,r,o,s){return V(),Z("header",Xg,[re(r.HomeHeroImage),r.heroText?(V(),Z("h1",Zg,fe(r.heroText),1)):De("",!0),r.tagline?(V(),Z("p",em,fe(r.tagline),1)):De("",!0),r.actions.length?(V(),Z("p",tm,[(V(!0),Z(ve,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 rm=Se(Qg,[["render",nm],["__file","VPHomeHero.vue"]]),om=le({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:Wg,VPHomeFooter:zg,VPHomeHero:rm,get Content(){return Cs}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),sm={class:"vp-home"},im={"vp-content":""};function lm(e,t,n,r,o,s){return V(),Z("main",sm,[re(r.VPHomeHero),re(r.VPHomeFeatures),q("div",im,[re(r.Content)]),re(r.VPHomeFooter)])}const am=Se(om,[["render",lm],["__file","VPHome.vue"]]),cm=le({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=He(),s=Vs(),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()),h={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 p=K("img",{class:"vp-site-logo",src:Ts(a.value),alt:c.value});return o.value.logoDark===void 0?p:K(xs,()=>p)},get RouteLink(){return fo}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),um=["aria-hidden"];function fm(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:ke(()=>[re(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),Z("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},fe(r.navbarBrandTitle),11,um)):De("",!0)]),_:1},8,["to"])}const dm=Se(cm,[["render",fm],["__file","VPNavbarBrand.vue"]]),hm=le({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Fl(n),[o,s]=Os(),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};uo(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:Mn,get FadeInExpandTransition(){return Ap}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),pm=["aria-label"],gm={class:"title"},mm=["aria-label"],vm={class:"title"},_m={class:"vp-navbar-dropdown"},bm={class:"vp-navbar-dropdown-subtitle"},ym={key:1},Sm={class:"vp-navbar-dropdown-subitem-wrapper"};function wm(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[q("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[q("span",gm,fe(r.config.text),1),t[1]||(t[1]=q("span",{class:"arrow down"},null,-1))],8,pm),q("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[q("span",vm,fe(r.config.text),1),q("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,mm),re(r.FadeInExpandTransition,null,{default:ke(()=>[Gr(q("ul",_m,[(V(!0),Z(ve,null,At(r.config.children,i=>(V(),Z("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),Z(ve,{key:0},[q("h4",bm,[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",ym,fe(i.text),1))]),q("ul",Sm,[(V(!0),Z(ve,null,At(i.children,l=>(V(),Z("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[re(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),[[Jr,r.open]])]),_:1})],2)}const Em=Se(hm,[["render",wm],["__file","VPNavbarDropdown.vue"]]),yc=(e,t="")=>dt(e)?Rn(Cn(t,e)):"children"in e?{...e,children:e.children.map(n=>yc(n,Cn(t,e.prefix)))}:{...e,link:ac(e.link)?Rn(Cn(t,e.link)).link:e.link},Pm=()=>{const{themeLocale:e}=He();return R(()=>(e.value.navbar||[]).map(t=>yc(t)))},Sc=e=>!vr(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,xm=()=>{const{themeLocale:e}=He(),t=R(()=>e.value.repo),n=R(()=>t.value?Sc(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}])},Cm=()=>{const e=In(),t=$p(),{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 h=((w=r.value.locales)==null?void 0:w[f])??{},p=((S=s.value.locales)==null?void 0:S[f])??{},v=`${h.lang}`,y=p.selectLanguageName??v;if(v===o.value.lang)return{text:y,activeMatch:".",link:e.fullPath};const E=a.replace(n.value,f);return{text:y,link:t.value.some(m=>m===E)?c.replace(a,E):p.home??f}})}]})},Tm="719px",km={mobile:Tm};var cr;(function(e){e.Mobile="mobile"})(cr||(cr={}));const Lm={[cr.Mobile]:Number.parseInt(km.mobile.replace("px",""),10)},wc=(e,t)=>{const n=Lm[e];Number.isInteger(n)&&(je("orientationchange",()=>{t(n)}),je("resize",()=>{t(n)}),Ze(()=>{t(n)}))},Am=le({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Pm(),o=Cm(),s=xm(),i=Ve(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);wc(cr.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:Mn,VPNavbarDropdown:Em};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Rm=["aria-label"];function Om(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(ve,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,Rm)):De("",!0)}const Ec=Se(Am,[["render",Om],["__file","VPNavbarItems.vue"]]),Dm={},Im={class:"dark-icon",viewBox:"0 0 32 32"};function Mm(e,t){return V(),Z("svg",Im,t[0]||(t[0]=[q("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 $m=Se(Dm,[["render",Mm],["__file","VPDarkIcon.vue"]]),Nm={},Hm={class:"light-icon",viewBox:"0 0 32 32"};function Vm(e,t){return V(),Z("svg",Hm,t[0]||(t[0]=[_f('<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 Fm=Se(Nm,[["render",Vm],["__file","VPLightIcon.vue"]]),jm=le({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Vs(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:$m,VPLightIcon:Fm};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Bm=["title"];function Wm(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},[Gr(re(r.VPLightIcon,null,null,512),[[Jr,!r.isDarkMode]]),Gr(re(r.VPDarkIcon,null,null,512),[[Jr,r.isDarkMode]])],8,Bm)}const Um=Se(jm,[["render",Wm],["__file","VPToggleColorModeButton.vue"]]),Gm=le({__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}}),Km=["title"];function qm(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]=[q("div",{class:"icon","aria-hidden":"true"},[q("span"),q("span"),q("span")],-1)]),8,Km)}const zm=Se(Gm,[["render",qm],["__file","VPToggleSidebarButton.vue"]]),Jm=le({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=oc("SearchBox")?ta("SearchBox"):()=>null,{themeLocale:r}=He(),o=Qs("navbar"),s=Qs("navbar-brand"),i=Ve(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var v;const h=(v=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:v.getComputedStyle(u,null)[f],p=Number.parseInt(h,10);return Number.isNaN(p)?0:p};wc(cr.Mobile,u=>{var h;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((h=s.value)==null?void 0:h.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:dm,VPNavbarItems:Ec,VPToggleColorModeButton:Um,VPToggleSidebarButton:zm};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Ym={ref:"navbar",class:"vp-navbar","vp-navbar":""},Qm={ref:"navbar-brand"};function Xm(e,t,n,r,o,s){return V(),Z("header",Ym,[re(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),q("span",Qm,[re(r.VPNavbarBrand)],512),q("div",{class:"vp-navbar-items-wrapper",style:On(r.linksWrapperStyle)},[Ce(e.$slots,"before"),re(r.VPNavbarItems,{class:"vp-hide-mobile"}),Ce(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):De("",!0),re(r.SearchBox)],4)],512)}const Zm=Se(Jm,[["render",Xm],["__file","VPNavbar.vue"]]),ev={},tv={class:"edit-icon",viewBox:"0 0 1024 1024"};function nv(e,t){return V(),Z("svg",tv,t[0]||(t[0]=[q("g",{fill:"currentColor"},[q("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"}),q("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 rv=Se(ev,[["render",nv],["__file","VPEditIcon.vue"]]),ov={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"},sv=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=Sc(e);return n!==null?ov[n]:null},iv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=sv({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,vr(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,Na(`${$a(n)}/${r}`)):null},lv=()=>{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=iv({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})},av=le({__name:"VPPageMeta",setup(e,{expose:t}){t();const{frontmatter:n,themeLocale:r}=He(),o=cc(()=>n.value.contributors??r.value.contributors??!0),s=lv(),i=uc(()=>n.value.lastUpdated??r.value.lastUpdated??!0),l={frontmatter:n,themeLocale:r,contributors:o,editLink:s,lastUpdated:i,VPAutoLink:Mn,VPEditIcon:rv};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),cv={class:"vp-page-meta"},uv={key:0,class:"vp-meta-item edit-link"},fv={class:"vp-meta-item git-info"},dv={key:0,class:"vp-meta-item last-updated"},hv={class:"meta-item-label"},pv=["datetime"],gv={key:1,class:"vp-meta-item contributors"},mv={class:"meta-item-label"},vv={class:"meta-item-info"},_v=["title"];function bv(e,t,n,r,o,s){return V(),Z("footer",cv,[r.editLink?(V(),Z("div",uv,[re(r.VPAutoLink,{class:"label",config:r.editLink},{before:ke(()=>[re(r.VPEditIcon)]),_:1},8,["config"])])):De("",!0),q("div",fv,[r.lastUpdated?(V(),Z("div",dv,[q("span",hv,fe(r.themeLocale.lastUpdatedText??r.lastUpdated.locale)+": ",1),q("time",{class:"meta-item-info",datetime:r.lastUpdated.iso,"data-allow-mismatch":""},fe(r.lastUpdated.text),9,pv)])):De("",!0),r.contributors.length?(V(),Z("div",gv,[q("span",mv,fe(r.themeLocale.contributorsText)+": ",1),q("span",vv,[(V(!0),Z(ve,null,At(r.contributors,(i,l)=>(V(),Z(ve,{key:l},[q("span",{class:"contributor",title:`email: ${i.email}`},fe(i.name),9,_v),l!==r.contributors.length-1?(V(),Z(ve,{key:0},[qt(", ")],64)):De("",!0)],64))),128))])])):De("",!0)])])}const yv=Se(av,[["render",bv],["__file","VPPageMeta.vue"]]),Sv=()=>{const e=_r(),t=In();return n=>{n&&(lc(n)?t.fullPath!==n&&e.push(n):mr(n)?window.open(n):e.push(encodeURI(n)))}},cl=(e,t)=>e===!1?!1:dt(e)?Rn(e,t):bs(e)?{...e,link:Rn(e.link,t).link}:null,Zo=(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&&!ar(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Zo(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&&!ar(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},wv=()=>{const{frontmatter:e,themeLocale:t}=He(),n=js(),r=Ya(),o=R(()=>{const i=cl(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Zo(n.value,r.value,-1))}),s=R(()=>{const i=cl(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Zo(n.value,r.value,1))});return{prevLink:o,nextLink:s}},Ev=le({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Sv(),{prevLink:o,nextLink:s}=wv(),i=R(()=>n.value.pageNavbarLabel??"page navigation");je("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:Mn};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),Pv=["aria-label"],xv={class:"hint"},Cv={class:"link"},Tv={class:"external-link"},kv={class:"hint"},Lv={class:"link"},Av={class:"external-link"};function Rv(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(()=>[q("div",xv,[t[0]||(t[0]=q("span",{class:"arrow left"},null,-1)),qt(" "+fe(r.themeLocale.prev??"Prev"),1)]),q("div",Cv,[q("span",Tv,fe(r.prevLink.text),1)])]),_:1},8,["config"])):De("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:ke(()=>[q("div",kv,[qt(fe(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=q("span",{class:"arrow right"},null,-1))]),q("div",Lv,[q("span",Av,fe(r.nextLink.text),1)])]),_:1},8,["config"])):De("",!0)],8,Pv)):De("",!0)}const Ov=Se(Ev,[["render",Rv],["__file","VPPageNav.vue"]]),Dv=le({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:yv,VPPageNav:Ov,get Content(){return Cs}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Iv={class:"vp-page"},Mv={"vp-content":""};function $v(e,t,n,r,o,s){return V(),Z("main",Iv,[Ce(e.$slots,"top"),q("div",Mv,[Ce(e.$slots,"content-top"),re(r.Content),Ce(e.$slots,"content-bottom")]),re(r.VPPageMeta),re(r.VPPageNav),Ce(e.$slots,"bottom")])}const Nv=Se(Dv,[["render",$v],["__file","VPPage.vue"]]),Hv=le({__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 Vv(e,t,n,r,o,s){return V(),Le(lo,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:ke(()=>[Ce(e.$slots,"default")]),_:3})}const Fv=Se(Hv,[["render",Vv],["__file","VPDropdownTransition.vue"]]),ul=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),jv=(e,t)=>{if(t.hash===e)return!0;const n=ul(t.path),r=ul(e);return n===r},Pc=(e,t)=>e.link&&jv(e.link,t)?!0:"children"in e?e.children.some(n=>Pc(n,t)):!1,Bv=le({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Fl(n),s=In(),i=_r(),l=R(()=>r.value.collapsible),a=R(()=>Pc(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,h]=Os(u.value),p=E=>{l.value&&(E.preventDefault(),h())},v=i.afterEach(()=>{dn(()=>{f.value=u.value})});ps(()=>{v()});const y={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:h,onClick:p,unregisterRouterHook:v,VPAutoLink:Mn,VPDropdownTransition:Fv};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}}),Wv={class:"vp-sidebar-children"};function Uv(e,t,n,r,o,s){const i=ta("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:sd(r.onClick,["enter"])},[qt(fe(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(()=>[Gr(q("ul",Wv,[(V(!0),Z(ve,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),[[Jr,r.isOpen]])]),_:1})):De("",!0)])}const Gv=Se(Bv,[["render",Uv],["__file","VPSidebarItem.vue"]]),Kv=le({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=In(),r=js();Ze(()=>{Fe(()=>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:Gv};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),qv={key:0,class:"vp-sidebar-items"};function zv(e,t,n,r,o,s){return r.sidebarItems.length?(V(),Z("ul",qv,[(V(!0),Z(ve,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):De("",!0)}const Jv=Se(Kv,[["render",zv],["__file","VPSidebarItems.vue"]]),Yv=le({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:Ec,VPSidebarItems:Jv};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Qv={class:"vp-sidebar","vp-sidebar":""};function Xv(e,t,n,r,o,s){return V(),Z("aside",Qv,[re(r.VPNavbarItems),Ce(e.$slots,"top"),re(r.VPSidebarItems),Ce(e.$slots,"bottom")])}const Zv=Se(Yv,[["render",Xv],["__file","VPSidebar.vue"]]),e_=le({__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=js(),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 m=S.changedTouches[0].clientX-c.x,_=S.changedTouches[0].clientY-c.y;Math.abs(m)>Math.abs(_)&&Math.abs(m)>40&&(m>0&&c.x<=80?a(!0):a(!1))},h=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),p=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":h.value},n.value.pageClass]);uo(()=>{a(!1)});const v=mc(),y=v.resolve,E=v.pending,w={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:h,containerClass:p,scrollPromise:v,onBeforeEnter:y,onBeforeLeave:E,VPFadeSlideYTransition:Vg,VPHome:am,VPNavbar:Zm,VPPage:Nv,VPSidebar:Zv};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}});function t_(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},[Ce(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:ke(()=>[Ce(e.$slots,"navbar-before")]),after:ke(()=>[Ce(e.$slots,"navbar-after")]),_:3})):De("",!0)]),q("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),Ce(e.$slots,"sidebar",{},()=>[re(r.VPSidebar,null,{top:ke(()=>[Ce(e.$slots,"sidebar-top")]),bottom:ke(()=>[Ce(e.$slots,"sidebar-bottom")]),_:3})]),Ce(e.$slots,"page",{},()=>[re(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(()=>[Ce(e.$slots,"page-top")]),"content-top":ke(()=>[Ce(e.$slots,"page-content-top")]),"content-bottom":ke(()=>[Ce(e.$slots,"page-content-bottom")]),bottom:ke(()=>[Ce(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const xc=Se(e_,[["render",t_],["__file","Layout.vue"]]),n_=le({__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 fo}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),r_={class:"vp-theme-container","vp-container":""},o_={class:"page"},s_={"vp-content":""};function i_(e,t,n,r,o,s){return V(),Z("div",r_,[q("main",o_,[q("div",s_,[t[0]||(t[0]=q("h1",null,"404",-1)),q("blockquote",null,fe(r.getMsg()),1),re(r.RouteLink,{to:r.homeLink},{default:ke(()=>[qt(fe(r.homeText),1)]),_:1},8,["to"])])])])}const l_=Se(n_,[["render",i_],["__scopeId","data-v-072ee752"],["__file","NotFound.vue"]]),a_=Mt({enhance({app:e,router:t}){oc("Badge")||e.component("Badge",$g);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await mc().wait(),n(...r))},setup(){Cg(),kg(),Dg()},layouts:{Layout:xc,NotFound:l_}}),c_=Object.freeze(Object.defineProperty({__proto__:null,default:a_},Symbol.toStringTag,{value:"Module"}));function u_(e){return os()?(Sl(e),!0):!1}function Bs(e){return typeof e=="function"?e():Lt(e)}const f_=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const d_=Object.prototype.toString,h_=e=>d_.call(e)==="[object Object]",p_=()=>{};function g_(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 Cc=e=>e();function m_(e=Cc){const t=Ve(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Dn(t),pause:n,resume:r,eventFilter:o}}function v_(e){return It()}function __(e,t,n={}){const{eventFilter:r=Cc,...o}=n;return Fe(e,g_(r,t),o)}function b_(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=m_(r);return{stop:__(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function y_(e,t=!0,n){v_()?Ze(e,n):t?e():dn(e)}function S_(e){var t;const n=Bs(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Qr=f_?window:void 0;function fl(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=Qr):[t,n,r,o]=e,!t)return p_;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,h,p)=>(u.addEventListener(f,h,p),()=>u.removeEventListener(f,h,p)),a=Fe(()=>[S_(t),Bs(o)],([u,f])=>{if(i(),!u)return;const h=h_(f)?{...f}:f;s.push(...n.flatMap(p=>r.map(v=>l(u,p,v,h))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return u_(c),c}const Or=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Dr="__vueuse_ssr_handlers__",w_=E_();function E_(){return Dr in Or||(Or[Dr]=Or[Dr]||{}),Or[Dr]}function P_(e,t){return w_[e]||t}function x_(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 C_={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()}},dl="vueuse-storage";function T_(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=Qr,eventFilter:h,onError:p=T=>{console.error(T)},initOnMounted:v}=r,y=(u?ye:Ve)(typeof t=="function"?t():t);if(!n)try{n=P_("getDefaultStorage",()=>{var T;return(T=Qr)==null?void 0:T.localStorage})()}catch(T){p(T)}if(!n)return y;const E=Bs(t),w=x_(E),S=(o=r.serializer)!=null?o:C_[w],{pause:m,resume:_}=b_(y,()=>G(y.value),{flush:s,deep:i,eventFilter:h});f&&l&&y_(()=>{fl(f,"storage",Q),fl(f,dl,I),v&&Q()}),v||Q();function M(T,L){f&&f.dispatchEvent(new CustomEvent(dl,{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 C=S.write(T);L!==C&&(n.setItem(e,C),M(L,C))}}catch(L){p(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 C=S.read(L);return typeof c=="function"?c(C,E):w==="object"&&!Array.isArray(C)?{...E,...C}:C}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)){m();try{(T==null?void 0:T.newValue)!==S.write(y.value)&&(y.value=D(T))}catch(L){p(L)}finally{T?dn(_):_()}}}}function I(T){Q(T.detail)}return y}function k_(e,t,n={}){const{window:r=Qr}=n;return T_(e,t,r==null?void 0:r.sessionStorage,n)}const L_=Object.entries;var A_={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const R_=A_;L_(R_.localeConfig);k_("VUEPRESS_REDIRECT_LOCALES",{});const O_=Mt({setup(){},rootComponents:[]}),D_=Object.freeze(Object.defineProperty({__proto__:null,default:O_},Symbol.toStringTag,{value:"Module"}));var ae=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech lead",e.TeamLead="team lead",e.Developer="developer",e))(ae||{}),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 I_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.Author],technologies:[$.Nix,$.Lua],startDate:new Date("2022-11-22"),status:de.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.Developer,ae.TechLead,ae.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:[ae.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:[ae.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:[ae.Author],technologies:[$.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:de.AsIs}];function M_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const $_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),N_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:$_},Symbol.toStringTag,{value:"Module"}));function Wn(e){return(e==null?void 0:e.valueOf())??1/0}const H_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},V_=le({...H_,setup(e,{expose:t}){t();const n=R(()=>I_.concat().sort((o,s)=>Wn(s.endDate)-Wn(o.endDate)||Wn(s.startDate)-Wn(o.startDate))),r={date2num:Wn,works:n,get renderDate(){return M_},get w(){return N_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),F_=["href"],j_=["innerHTML"],B_={key:0};function W_(e,t,n,r,o,s){return V(),Z("table",null,[q("thead",null,[q("tr",null,[q("th",null,fe(s.tableTheme.name),1),q("th",null,fe(s.tableTheme.description),1),q("th",null,fe(s.tableTheme.role),1),q("th",null,fe(s.tableTheme.technologies),1),q("th",null,fe(s.tableTheme.status),1),q("th",null,fe(s.tableTheme.dates),1)])]),q("tbody",null,[(V(!0),Z(ve,null,At(r.works,i=>(V(),Z("tr",null,[q("td",null,[q("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},fe(i.name),9,F_)]),q("td",null,fe(i.description),1),q("td",{innerHTML:i.roles.join(", ")},null,8,j_),q("td",null,fe(i.technologies.join(", ")),1),q("td",null,fe(i.status),1),q("td",null,[q("div",null,[q("small",{class:Ke({grey:i.endDate})},fe(r.renderDate(i.startDate)),3)]),i.endDate?(V(),Z("div",B_,[q("small",null,fe(r.renderDate(i.endDate)),1)])):De("",!0)])]))),256))])])}const U_=Se(V_,[["render",W_],["__file","ChronologicalWorksTable.vue"]]),G_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:xc,get ChronologicalWorksTable(){return U_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},K_={class:"works-table-wrapper"};function q_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":ke(()=>[q("div",K_,[re(r.ChronologicalWorksTable)])]),_:1})}const z_=Se(G_,[["render",q_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),J_=Mt({layouts:{WorksPage:z_}}),Y_=Object.freeze(Object.defineProperty({__proto__:null,default:J_},Symbol.toStringTag,{value:"Module"})),Ir=[Lp,Fp,Kp,zp,rg,cg,dg,_g,Pg,c_,D_,Y_].map(e=>e.default).filter(Boolean),Q_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Gn=ye(Q_),X_=nh,Z_=()=>{const e=Th({history:X_($a("/")),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===xt){const r=ar(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},eb=e=>{e.component("ClientOnly",xs),e.component("Content",Cs),e.component("RouteLink",fo)},tb=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=Vl((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(Gn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Gn.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)),h=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),p=R(()=>Zt.resolvePageLang(c.value,l.value)),v=R(()=>Zt.resolvePageLayout(c.value,s.value)),y={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:h,pageHeadTitle:f,pageLang:p,pageLayout:v,redirects:Xo,routeLocale:i,routePath:r,routes:Pn,siteData:Gn,siteLocaleData:l};return e.provide(ws,y),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>h.value},$headTitle:{get:()=>f.value},$lang:{get:()=>p.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Gn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>Ts}}),y},nb=([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},rb=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return bs(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},ob=()=>{const e=Ah(),t=Ps();let n=[];const r=()=>{e.value.forEach(i=>{const l=nb(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=rb(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]};Gt(Mh,s),Ze(()=>{r(),Fe(e,s,{immediate:!1})})},sb=ad,ib=async()=>{var n;const e=sb({name:"Vuepress",setup(){var s;ob();for(const i of Ir)(s=i.setup)==null||s.call(i);const r=Ir.flatMap(({rootComponents:i=[]})=>i.map(l=>K(l))),o=Rh();return()=>[K(o.value),r]}}),t=Z_();eb(e),tb(e,t,Ir);for(const r of Ir)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Gn}));return e.use(t),{app:e,router:t}};ib().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Se as _,q as a,qt as b,Z as c,ib as createVueApp,re as d,_f as e,V as o,ta as r,ke as w}; + */const il=(e,t)=>{e.classList.add(t)},ll=(e,t)=>{e.classList.remove(t)},og=e=>{var t;(t=e==null?void 0:e.parentNode)==null||t.removeChild(e)},Mo=(e,t,n)=>e<t?t:e>n?n:e,al=e=>(-1+e)*100,sg=(()=>{const e=[],t=()=>{const n=e.shift();n&&n(t)};return n=>{e.push(n),e.length===1&&t()}})(),ig=e=>e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(t,n)=>n.toUpperCase()),Ar=(()=>{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=ig(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)&&Mp(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=Mo(e,Pt.minimum,1);Re.percent=o===1?null:o;const s=Re.render(!r),i=s.querySelector(Pt.barSelector);return s.offsetWidth,sg(l=>{Ar(i,{transform:`translate3d(${al(o)}%,0,0)`,transition:`all ${t}ms ${n}`}),o===1?(Ar(s,{transition:"none",opacity:"1"}),s.offsetWidth,setTimeout(()=>{Ar(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=Mo(t+(typeof e=="number"?e:(1-t)*Mo(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");il(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":al(Re.percent??0);return Ar(n,{transition:"all 0 linear",transform:`translate3d(${o}%,0,0)`}),r&&(r!==document.body&&il(r,"nprogress-custom-parent"),r.appendChild(t)),t},remove:()=>{ll(document.documentElement,"nprogress-busy"),ll(document.querySelector(Pt.parent),"nprogress-custom-parent"),og(document.getElementById("nprogress"))}},lg=()=>{Ze(()=>{const e=_r(),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()})})},ag=Mt({setup(){lg()}}),cg=Object.freeze(Object.defineProperty({__proto__:null,default:ag},Symbol.toStringTag,{value:"Module"})),ug=({selector:e='div[class*="language-"].has-collapsed-lines > .collapsed-lines'}={})=>{je("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})},fg={setup(){ug()}},dg=Object.freeze(Object.defineProperty({__proto__:null,default:fg},Symbol.toStringTag,{value:"Module"})),hg="VUEPRESS_CODE_TAB_STORE",Rr=Ms(hg,{}),pg=le({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&&(Rr.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&&(Rr.value[e.tabId]=e.data[n.value].id)},a=()=>{if(e.tabId){const c=e.data.findIndex(({id:u})=>Rr.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),Fe(()=>e.tabId&&Rr.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:h})=>h===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?K("div",{class:"vp-code-tabs"},[K("div",{class:"vp-code-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return K("button",{type:"button",ref:h=>{h&&(r.value[u]=h)},class:["vp-code-tab-nav",{active:f}],role:"tab","aria-controls":`codetab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:h=>{l(h,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return K("div",{class:["vp-code-tab",{active:f}],id:`codetab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[K("div",{class:"vp-code-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),gg="VUEPRESS_TAB_STORE",$o=Ms(gg,{}),mg=le({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&&($o.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})=>$o.value[e.tabId]===u);if(c!==-1)return c}return e.active};return Ze(()=>{n.value=a(),Fe(()=>e.tabId&&$o.value[e.tabId],(c,u)=>{if(e.tabId&&c!==u){const f=e.data.findIndex(({id:h})=>h===c);f!==-1&&(n.value=f)}})}),()=>e.data.length?K("div",{class:"vp-tabs"},[K("div",{class:"vp-tabs-nav",role:"tablist"},e.data.map(({id:c},u)=>{const f=u===n.value;return K("button",{type:"button",ref:h=>{h&&(r.value[u]=h)},class:["vp-tab-nav",{active:f}],role:"tab","aria-controls":`tab-${e.id}-${u}`,"aria-selected":f,onClick:()=>{n.value=u,o()},onKeydown:h=>{l(h,u)}},t[`title${u}`]({value:c,isActive:f}))})),e.data.map(({id:c},u)=>{const f=u===n.value;return K("div",{class:["vp-tab",{active:f}],id:`tab-${e.id}-${u}`,role:"tabpanel","aria-expanded":f},[K("div",{class:"vp-tab-title"},t[`title${u}`]({value:c,isActive:f})),t[`tab${u}`]({value:c,isActive:f})])})]):null}}),vg={enhance:({app:e})=>{e.component("CodeTabs",pg),e.component("Tabs",mg)}},_g=Object.freeze(Object.defineProperty({__proto__:null,default:vg},Symbol.toStringTag,{value:"Module"})),bg=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"}`),yg=Ve(bg),dc=()=>yg,hc=Symbol(""),Sg=()=>{const e=qe(hc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},wg=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Eg=Mt({enhance({app:e}){const t=dc(),n=e._context.provides[ws],r=R(()=>wg(t.value,n.routeLocale.value));e.provide(hc,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),Pg=Object.freeze(Object.defineProperty({__proto__:null,default:Eg},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:dc(),themeLocale:Sg()}},pc=Symbol(""),xg=e=>{const t=(n=e.value)=>{const r=window.document.documentElement;r.dataset.theme=n?"dark":"light"};Ze(()=>{Ds(e,t)}),oo(()=>{t()})},Vs=()=>{const e=qe(pc);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Cg=()=>{const{themeLocale:e}=He(),t=gp(),n=Ms("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"}});Gt(pc,r),xg(r)},gc=Symbol("headers"),Tg=()=>{const e=Za(gc);if(!e)throw new Error("useHeaders() is called without provider.");return e},kg=()=>{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=Ip({levels:[2,r.value+1],ignore:[".vp-badge"]})};Jh(gc,n),uo(s=>{s==="beforeUnmount"?n.value=[]:o()})};let No=null,Bn=null;const Lg={wait:()=>No,pending:()=>{No=new Promise(e=>{Bn=e})},resolve:()=>{Bn==null||Bn(),No=null,Bn=null}},mc=()=>Lg,Rn=(e,t)=>{const{notFound:n,meta:r,path:o}=ar(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}},Cn=(e="",t="")=>lc(t)||mr(t)?t:`${Sd(e)}${t}`,Ag=e=>({text:e.title,link:e.link,children:Fs(e.children)}),Fs=e=>e?e.map(t=>Ag(t)):[],vc=(e,t)=>[{text:e.title,children:Fs(t)}],_c=(e,t,n,r="")=>{const o=(s,i)=>{var a;const l=dt(s)?Rn(Cn(i,s)):dt(s.link)?{...s,link:ac(s.link)?Rn(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:Fs(c)}}return l};return e.map(s=>o(s,r))},Rg=(e,t,n,r)=>{const o=ic(e).sort((s,i)=>i.length-s.length);for(const s of o)if(sc(decodeURI(r),s)){const i=e[s];return i?i==="heading"?vc(t,n):_c(i,n,r,s):[]}return console.warn(`${decodeURI(r)} is missing sidebar config.`),[]},bc=Symbol("sidebarItems"),js=()=>{const e=qe(bc);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Og=(e,t,n,r,o)=>e===!1?[]:e==="heading"?vc(t,o):Array.isArray(e)?_c(e,o,n,r):bs(e)?Rg(e,t,o,n):[],Dg=()=>{const{frontmatter:e,page:t,routeLocale:n,themeLocale:r}=He(),o=Tg(),s=Ya(),i=R(()=>e.value.home?!1:e.value.sidebar??r.value.sidebar??"heading"),l=R(()=>Og(i.value,t.value,s.value,n.value,o.value));Gt(bc,l)},Ig=le({__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 Mg(e,t,n,r,o,s){return V(),Z("span",{class:Ke(["vp-badge",n.type]),style:On({verticalAlign:n.vertical})},[Ce(e.$slots,"default",{},()=>[qt(fe(n.text),1)])],6)}const $g=Se(Ig,[["render",Mg],["__file","Badge.vue"]]),Ng=le({__name:"VPFadeSlideYTransition",emits:["beforeEnter","beforeLeave"],setup(e,{expose:t}){t();const n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Hg(e,t,n,r,o,s){return V(),Le(lo,{name:"fade-in-down",mode:"out-in",onBeforeEnter:t[0]||(t[0]=i=>e.$emit("beforeEnter")),onBeforeLeave:t[1]||(t[1]=i=>e.$emit("beforeLeave"))},{default:ke(()=>[Ce(e.$slots,"default")]),_:3})}const Vg=Se(Ng,[["render",Hg],["__file","VPFadeSlideYTransition.vue"]]),Fg=le({__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}}),jg={key:0,class:"vp-features"};function Bg(e,t,n,r,o,s){return r.features.length?(V(),Z("div",jg,[(V(!0),Z(ve,null,At(r.features,i=>(V(),Z("div",{key:i.title,class:"vp-feature"},[q("h2",null,fe(i.title),1),q("p",null,fe(i.details),1)]))),128))])):De("",!0)}const Wg=Se(Fg,[["render",Bg],["__file","VPHomeFeatures.vue"]]),Ug=le({__name:"VPHomeFooter",setup(e,{expose:t}){t();const n=br(),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}}),Gg=["innerHTML"],Kg=["textContent"];function qg(e,t,n,r,o,s){return r.footer?(V(),Z(ve,{key:0},[r.footerHtml?(V(),Z("div",{key:0,class:"vp-footer","vp-footer":"",innerHTML:r.footer},null,8,Gg)):(V(),Z("div",{key:1,class:"vp-footer","vp-footer":"",textContent:fe(r.footer)},null,8,Kg))],64)):De("",!0)}const zg=Se(Ug,[["render",qg],["__file","VPHomeFooter.vue"]]),Jg=le({__name:"VPAutoLink",props:{config:{}},setup(e,{expose:t}){t();const n={get AutoLink(){return Hh}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function Yg(e,t,n,r,o,s){return V(),Le(r.AutoLink,{config:n.config},Bu({before:ke(()=>[Ce(e.$slots,"before",vo($r(n.config)))]),after:ke(()=>[Ce(e.$slots,"after",vo($r(n.config)))]),_:2},[e.$slots.default?{name:"default",fn:ke(()=>[Ce(e.$slots,"default",vo($r(n.config)))]),key:"0"}:void 0]),1032,["config"])}const Mn=Se(Jg,[["render",Yg],["__file","VPAutoLink.vue"]]),Qg=le({__name:"VPHomeHero",setup(e,{expose:t}){t();const{frontmatter:n,siteLocale:r}=He(),o=Vs(),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:p="primary",...v})=>({type:p,...v})):[]),h={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 p=K("img",{class:"vp-hero-image",src:Ts(l.value),alt:a.value,height:c.value});return n.value.heroImageDark===void 0?p:K(xs,()=>p)},VPAutoLink:Mn};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),Xg={class:"vp-hero"},Zg={key:0,id:"main-title"},em={key:1,class:"vp-hero-description"},tm={key:2,class:"vp-hero-actions"};function nm(e,t,n,r,o,s){return V(),Z("header",Xg,[re(r.HomeHeroImage),r.heroText?(V(),Z("h1",Zg,fe(r.heroText),1)):De("",!0),r.tagline?(V(),Z("p",em,fe(r.tagline),1)):De("",!0),r.actions.length?(V(),Z("p",tm,[(V(!0),Z(ve,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 rm=Se(Qg,[["render",nm],["__file","VPHomeHero.vue"]]),om=le({__name:"VPHome",setup(e,{expose:t}){t();const n={VPHomeFeatures:Wg,VPHomeFooter:zg,VPHomeHero:rm,get Content(){return Cs}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),sm={class:"vp-home"},im={"vp-content":""};function lm(e,t,n,r,o,s){return V(),Z("main",sm,[re(r.VPHomeHero),re(r.VPHomeFeatures),q("div",im,[re(r.Content)]),re(r.VPHomeFooter)])}const am=Se(om,[["render",lm],["__file","VPHome.vue"]]),cm=le({__name:"VPNavbarBrand",setup(e,{expose:t}){t();const{routeLocale:n,siteLocale:r,themeLocale:o}=He(),s=Vs(),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()),h={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 p=K("img",{class:"vp-site-logo",src:Ts(a.value),alt:c.value});return o.value.logoDark===void 0?p:K(xs,()=>p)},get RouteLink(){return fo}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),um=["aria-hidden"];function fm(e,t,n,r,o,s){return V(),Le(r.RouteLink,{to:r.navbarBrandLink},{default:ke(()=>[re(r.NavbarBrandLogo),r.navbarBrandTitle?(V(),Z("span",{key:0,class:Ke(["vp-site-name",{"vp-hide-mobile":r.navbarBrandLogo}]),"aria-hidden":r.navBarLogoAltMatchesTitle},fe(r.navbarBrandTitle),11,um)):De("",!0)]),_:1},8,["to"])}const dm=Se(cm,[["render",fm],["__file","VPNavbarBrand.vue"]]),hm=le({__name:"VPNavbarDropdown",props:{config:{}},setup(e,{expose:t}){t();const n=e,{config:r}=Fl(n),[o,s]=Os(),i=R(()=>r.value.ariaLabel||r.value.text),l=(u,f)=>f[f.length-1]===u,a=u=>{u.detail===0?s():s(!1)};uo(()=>{s(!1)});const c={props:n,config:r,open:o,toggleOpen:s,dropdownAriaLabel:i,isLastItemOfArray:l,handleDropdown:a,VPAutoLink:Mn,get FadeInExpandTransition(){return Ap}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),pm=["aria-label"],gm={class:"title"},mm=["aria-label"],vm={class:"title"},_m={class:"vp-navbar-dropdown"},bm={class:"vp-navbar-dropdown-subtitle"},ym={key:1},Sm={class:"vp-navbar-dropdown-subitem-wrapper"};function wm(e,t,n,r,o,s){return V(),Z("div",{class:Ke(["vp-navbar-dropdown-wrapper",{open:r.open}])},[q("button",{class:"vp-navbar-dropdown-title",type:"button","aria-label":r.dropdownAriaLabel,onClick:r.handleDropdown},[q("span",gm,fe(r.config.text),1),t[1]||(t[1]=q("span",{class:"arrow down"},null,-1))],8,pm),q("button",{class:"vp-navbar-dropdown-title-mobile",type:"button","aria-label":r.dropdownAriaLabel,onClick:t[0]||(t[0]=()=>r.toggleOpen())},[q("span",vm,fe(r.config.text),1),q("span",{class:Ke(["arrow",r.open?"down":"right"])},null,2)],8,mm),re(r.FadeInExpandTransition,null,{default:ke(()=>[Gr(q("ul",_m,[(V(!0),Z(ve,null,At(r.config.children,i=>(V(),Z("li",{key:i.text,class:"vp-navbar-dropdown-item"},["children"in i?(V(),Z(ve,{key:0},[q("h4",bm,[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",ym,fe(i.text),1))]),q("ul",Sm,[(V(!0),Z(ve,null,At(i.children,l=>(V(),Z("li",{key:l.link,class:"vp-navbar-dropdown-subitem"},[re(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),[[Jr,r.open]])]),_:1})],2)}const Em=Se(hm,[["render",wm],["__file","VPNavbarDropdown.vue"]]),yc=(e,t="")=>dt(e)?Rn(Cn(t,e)):"children"in e?{...e,children:e.children.map(n=>yc(n,Cn(t,e.prefix)))}:{...e,link:ac(e.link)?Rn(Cn(t,e.link)).link:e.link},Pm=()=>{const{themeLocale:e}=He();return R(()=>(e.value.navbar||[]).map(t=>yc(t)))},Sc=e=>!vr(e)||e.includes("github.com")?"GitHub":e.includes("bitbucket.org")?"Bitbucket":e.includes("gitlab.com")?"GitLab":e.includes("gitee.com")?"Gitee":null,xm=()=>{const{themeLocale:e}=He(),t=R(()=>e.value.repo),n=R(()=>t.value?Sc(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}])},Cm=()=>{const e=In(),t=$p(),{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 h=((w=r.value.locales)==null?void 0:w[f])??{},p=((S=s.value.locales)==null?void 0:S[f])??{},v=`${h.lang}`,y=p.selectLanguageName??v;if(v===o.value.lang)return{text:y,activeMatch:".",link:e.fullPath};const E=a.replace(n.value,f);return{text:y,link:t.value.some(m=>m===E)?c.replace(a,E):p.home??f}})}]})},Tm="719px",km={mobile:Tm};var cr;(function(e){e.Mobile="mobile"})(cr||(cr={}));const Lm={[cr.Mobile]:Number.parseInt(km.mobile.replace("px",""),10)},wc=(e,t)=>{const n=Lm[e];Number.isInteger(n)&&(je("orientationchange",()=>{t(n)}),je("resize",()=>{t(n)}),Ze(()=>{t(n)}))},Am=le({__name:"VPNavbarItems",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Pm(),o=Cm(),s=xm(),i=Ve(!1),l=R(()=>n.value.navbarLabel??"site navigation"),a=R(()=>[...r.value,...o.value,...s.value]);wc(cr.Mobile,u=>{i.value=window.innerWidth<u});const c={themeLocale:n,navbarConfig:r,navbarSelectLanguage:o,navbarRepo:s,isMobile:i,navbarLabel:l,navbarLinks:a,VPAutoLink:Mn,VPNavbarDropdown:Em};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Rm=["aria-label"];function Om(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(ve,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,Rm)):De("",!0)}const Ec=Se(Am,[["render",Om],["__file","VPNavbarItems.vue"]]),Dm={},Im={class:"dark-icon",viewBox:"0 0 32 32"};function Mm(e,t){return V(),Z("svg",Im,t[0]||(t[0]=[q("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 $m=Se(Dm,[["render",Mm],["__file","VPDarkIcon.vue"]]),Nm={},Hm={class:"light-icon",viewBox:"0 0 32 32"};function Vm(e,t){return V(),Z("svg",Hm,t[0]||(t[0]=[_f('<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 Fm=Se(Nm,[["render",Vm],["__file","VPLightIcon.vue"]]),jm=le({__name:"VPToggleColorModeButton",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Vs(),s={themeLocale:n,isDarkMode:r,toggleColorMode:()=>{r.value=!r.value},VPDarkIcon:$m,VPLightIcon:Fm};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),Bm=["title"];function Wm(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},[Gr(re(r.VPLightIcon,null,null,512),[[Jr,!r.isDarkMode]]),Gr(re(r.VPDarkIcon,null,null,512),[[Jr,r.isDarkMode]])],8,Bm)}const Um=Se(jm,[["render",Wm],["__file","VPToggleColorModeButton.vue"]]),Gm=le({__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}}),Km=["title"];function qm(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]=[q("div",{class:"icon","aria-hidden":"true"},[q("span"),q("span"),q("span")],-1)]),8,Km)}const zm=Se(Gm,[["render",qm],["__file","VPToggleSidebarButton.vue"]]),Jm=le({__name:"VPNavbar",emits:["toggleSidebar"],setup(e,{expose:t}){t();const n=oc("SearchBox")?ta("SearchBox"):()=>null,{themeLocale:r}=He(),o=Qs("navbar"),s=Qs("navbar-brand"),i=Ve(0),l=R(()=>i.value?{maxWidth:`${i.value}px`}:{}),a=(u,f)=>{var v;const h=(v=u==null?void 0:u.ownerDocument.defaultView)==null?void 0:v.getComputedStyle(u,null)[f],p=Number.parseInt(h,10);return Number.isNaN(p)?0:p};wc(cr.Mobile,u=>{var h;const f=a(o.value,"paddingLeft")+a(o.value,"paddingRight");window.innerWidth<u?i.value=0:i.value=o.value.offsetWidth-f-(((h=s.value)==null?void 0:h.offsetWidth)??0)});const c={SearchBox:n,themeLocale:r,navbar:o,navbarBrand:s,linksWrapperMaxWidth:i,linksWrapperStyle:l,getCssValue:a,VPNavbarBrand:dm,VPNavbarItems:Ec,VPToggleColorModeButton:Um,VPToggleSidebarButton:zm};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),Ym={ref:"navbar",class:"vp-navbar","vp-navbar":""},Qm={ref:"navbar-brand"};function Xm(e,t,n,r,o,s){return V(),Z("header",Ym,[re(r.VPToggleSidebarButton,{onToggle:t[0]||(t[0]=i=>e.$emit("toggleSidebar"))}),q("span",Qm,[re(r.VPNavbarBrand)],512),q("div",{class:"vp-navbar-items-wrapper",style:On(r.linksWrapperStyle)},[Ce(e.$slots,"before"),re(r.VPNavbarItems,{class:"vp-hide-mobile"}),Ce(e.$slots,"after"),r.themeLocale.colorModeSwitch?(V(),Le(r.VPToggleColorModeButton,{key:0})):De("",!0),re(r.SearchBox)],4)],512)}const Zm=Se(Jm,[["render",Xm],["__file","VPNavbar.vue"]]),ev={},tv={class:"edit-icon",viewBox:"0 0 1024 1024"};function nv(e,t){return V(),Z("svg",tv,t[0]||(t[0]=[q("g",{fill:"currentColor"},[q("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"}),q("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 rv=Se(ev,[["render",nv],["__file","VPEditIcon.vue"]]),ov={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"},sv=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=Sc(e);return n!==null?ov[n]:null},iv=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=sv({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,vr(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,Na(`${$a(n)}/${r}`)):null},lv=()=>{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=iv({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})},av=le({__name:"VPPageMeta",setup(e,{expose:t}){t();const{frontmatter:n,themeLocale:r}=He(),o=cc(()=>n.value.contributors??r.value.contributors??!0),s=lv(),i=uc(()=>n.value.lastUpdated??r.value.lastUpdated??!0),l={frontmatter:n,themeLocale:r,contributors:o,editLink:s,lastUpdated:i,VPAutoLink:Mn,VPEditIcon:rv};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),cv={class:"vp-page-meta"},uv={key:0,class:"vp-meta-item edit-link"},fv={class:"vp-meta-item git-info"},dv={key:0,class:"vp-meta-item last-updated"},hv={class:"meta-item-label"},pv=["datetime"],gv={key:1,class:"vp-meta-item contributors"},mv={class:"meta-item-label"},vv={class:"meta-item-info"},_v=["title"];function bv(e,t,n,r,o,s){return V(),Z("footer",cv,[r.editLink?(V(),Z("div",uv,[re(r.VPAutoLink,{class:"label",config:r.editLink},{before:ke(()=>[re(r.VPEditIcon)]),_:1},8,["config"])])):De("",!0),q("div",fv,[r.lastUpdated?(V(),Z("div",dv,[q("span",hv,fe(r.themeLocale.lastUpdatedText??r.lastUpdated.locale)+": ",1),q("time",{class:"meta-item-info",datetime:r.lastUpdated.iso,"data-allow-mismatch":""},fe(r.lastUpdated.text),9,pv)])):De("",!0),r.contributors.length?(V(),Z("div",gv,[q("span",mv,fe(r.themeLocale.contributorsText)+": ",1),q("span",vv,[(V(!0),Z(ve,null,At(r.contributors,(i,l)=>(V(),Z(ve,{key:l},[q("span",{class:"contributor",title:`email: ${i.email}`},fe(i.name),9,_v),l!==r.contributors.length-1?(V(),Z(ve,{key:0},[qt(", ")],64)):De("",!0)],64))),128))])])):De("",!0)])])}const yv=Se(av,[["render",bv],["__file","VPPageMeta.vue"]]),Sv=()=>{const e=_r(),t=In();return n=>{n&&(lc(n)?t.fullPath!==n&&e.push(n):mr(n)?window.open(n):e.push(encodeURI(n)))}},cl=(e,t)=>e===!1?!1:dt(e)?Rn(e,t):bs(e)?{...e,link:Rn(e.link,t).link}:null,Zo=(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&&!ar(s.prefix).notFound?{...s,link:s.prefix}:null:null}for(const s of e)if("children"in s){const i=Zo(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&&!ar(s.prefix).notFound?{...s,link:s.prefix}:null:null}return null},wv=()=>{const{frontmatter:e,themeLocale:t}=He(),n=js(),r=Ya(),o=R(()=>{const i=cl(e.value.prev,r.value);return i===!1?null:i??(t.value.prev===!1?null:Zo(n.value,r.value,-1))}),s=R(()=>{const i=cl(e.value.next,r.value);return i===!1?null:i??(t.value.next===!1?null:Zo(n.value,r.value,1))});return{prevLink:o,nextLink:s}},Ev=le({__name:"VPPageNav",setup(e,{expose:t}){t();const{themeLocale:n}=He(),r=Sv(),{prevLink:o,nextLink:s}=wv(),i=R(()=>n.value.pageNavbarLabel??"page navigation");je("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:Mn};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),Pv=["aria-label"],xv={class:"hint"},Cv={class:"link"},Tv={class:"external-link"},kv={class:"hint"},Lv={class:"link"},Av={class:"external-link"};function Rv(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(()=>[q("div",xv,[t[0]||(t[0]=q("span",{class:"arrow left"},null,-1)),qt(" "+fe(r.themeLocale.prev??"Prev"),1)]),q("div",Cv,[q("span",Tv,fe(r.prevLink.text),1)])]),_:1},8,["config"])):De("",!0),r.nextLink?(V(),Le(r.VPAutoLink,{key:1,class:"next",config:r.nextLink},{default:ke(()=>[q("div",kv,[qt(fe(r.themeLocale.next??"Next")+" ",1),t[1]||(t[1]=q("span",{class:"arrow right"},null,-1))]),q("div",Lv,[q("span",Av,fe(r.nextLink.text),1)])]),_:1},8,["config"])):De("",!0)],8,Pv)):De("",!0)}const Ov=Se(Ev,[["render",Rv],["__file","VPPageNav.vue"]]),Dv=le({__name:"VPPage",setup(e,{expose:t}){t();const n={VPPageMeta:yv,VPPageNav:Ov,get Content(){return Cs}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Iv={class:"vp-page"},Mv={"vp-content":""};function $v(e,t,n,r,o,s){return V(),Z("main",Iv,[Ce(e.$slots,"top"),q("div",Mv,[Ce(e.$slots,"content-top"),re(r.Content),Ce(e.$slots,"content-bottom")]),re(r.VPPageMeta),re(r.VPPageNav),Ce(e.$slots,"bottom")])}const Nv=Se(Dv,[["render",$v],["__file","VPPage.vue"]]),Hv=le({__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 Vv(e,t,n,r,o,s){return V(),Le(lo,{name:"vp-dropdown",onEnter:r.setHeight,onAfterEnter:r.unsetHeight,onBeforeLeave:r.setHeight},{default:ke(()=>[Ce(e.$slots,"default")]),_:3})}const Fv=Se(Hv,[["render",Vv],["__file","VPDropdownTransition.vue"]]),ul=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),jv=(e,t)=>{if(t.hash===e)return!0;const n=ul(t.path),r=ul(e);return n===r},Pc=(e,t)=>e.link&&jv(e.link,t)?!0:"children"in e?e.children.some(n=>Pc(n,t)):!1,Bv=le({__name:"VPSidebarItem",props:{item:{},depth:{default:0}},setup(e,{expose:t}){t();const n=e,{item:r,depth:o}=Fl(n),s=In(),i=_r(),l=R(()=>r.value.collapsible),a=R(()=>Pc(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,h]=Os(u.value),p=E=>{l.value&&(E.preventDefault(),h())},v=i.afterEach(()=>{dn(()=>{f.value=u.value})});ps(()=>{v()});const y={props:n,item:r,depth:o,route:s,router:i,collapsible:l,isActive:a,itemClass:c,isOpenDefault:u,isOpen:f,toggleIsOpen:h,onClick:p,unregisterRouterHook:v,VPAutoLink:Mn,VPDropdownTransition:Fv};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}}),Wv={class:"vp-sidebar-children"};function Uv(e,t,n,r,o,s){const i=ta("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:sd(r.onClick,["enter"])},[qt(fe(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(()=>[Gr(q("ul",Wv,[(V(!0),Z(ve,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),[[Jr,r.isOpen]])]),_:1})):De("",!0)])}const Gv=Se(Bv,[["render",Uv],["__file","VPSidebarItem.vue"]]),Kv=le({__name:"VPSidebarItems",setup(e,{expose:t}){t();const n=In(),r=js();Ze(()=>{Fe(()=>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:Gv};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),qv={key:0,class:"vp-sidebar-items"};function zv(e,t,n,r,o,s){return r.sidebarItems.length?(V(),Z("ul",qv,[(V(!0),Z(ve,null,At(r.sidebarItems,i=>(V(),Le(r.VPSidebarItem,{key:`${i.text}${i.link}`,item:i},null,8,["item"]))),128))])):De("",!0)}const Jv=Se(Kv,[["render",zv],["__file","VPSidebarItems.vue"]]),Yv=le({__name:"VPSidebar",setup(e,{expose:t}){t();const n={VPNavbarItems:Ec,VPSidebarItems:Jv};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Qv={class:"vp-sidebar","vp-sidebar":""};function Xv(e,t,n,r,o,s){return V(),Z("aside",Qv,[re(r.VPNavbarItems),Ce(e.$slots,"top"),re(r.VPSidebarItems),Ce(e.$slots,"bottom")])}const Zv=Se(Yv,[["render",Xv],["__file","VPSidebar.vue"]]),e_=le({__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=js(),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 m=S.changedTouches[0].clientX-c.x,_=S.changedTouches[0].clientY-c.y;Math.abs(m)>Math.abs(_)&&Math.abs(m)>40&&(m>0&&c.x<=80?a(!0):a(!1))},h=R(()=>n.value.externalLinkIcon??o.value.externalLinkIcon??!0),p=R(()=>[{"no-navbar":!s.value,"no-sidebar":!i.value.length,"sidebar-open":l.value,"external-link-icon":h.value},n.value.pageClass]);uo(()=>{a(!1)});const v=mc(),y=v.resolve,E=v.pending,w={frontmatter:n,page:r,themeLocale:o,shouldShowNavbar:s,sidebarItems:i,isSidebarOpen:l,toggleSidebar:a,touchStart:c,onTouchStart:u,onTouchEnd:f,enableExternalLinkIcon:h,containerClass:p,scrollPromise:v,onBeforeEnter:y,onBeforeLeave:E,VPFadeSlideYTransition:Vg,VPHome:am,VPNavbar:Zm,VPPage:Nv,VPSidebar:Zv};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}});function t_(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},[Ce(e.$slots,"navbar",{},()=>[r.shouldShowNavbar?(V(),Le(r.VPNavbar,{key:0,onToggleSidebar:r.toggleSidebar},{before:ke(()=>[Ce(e.$slots,"navbar-before")]),after:ke(()=>[Ce(e.$slots,"navbar-after")]),_:3})):De("",!0)]),q("div",{class:"vp-sidebar-mask",onClick:t[0]||(t[0]=i=>r.toggleSidebar(!1))}),Ce(e.$slots,"sidebar",{},()=>[re(r.VPSidebar,null,{top:ke(()=>[Ce(e.$slots,"sidebar-top")]),bottom:ke(()=>[Ce(e.$slots,"sidebar-bottom")]),_:3})]),Ce(e.$slots,"page",{},()=>[re(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(()=>[Ce(e.$slots,"page-top")]),"content-top":ke(()=>[Ce(e.$slots,"page-content-top")]),"content-bottom":ke(()=>[Ce(e.$slots,"page-content-bottom")]),bottom:ke(()=>[Ce(e.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"])])],34)}const xc=Se(e_,[["render",t_],["__file","Layout.vue"]]),n_=le({__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 fo}};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),r_={class:"vp-theme-container","vp-container":""},o_={class:"page"},s_={"vp-content":""};function i_(e,t,n,r,o,s){return V(),Z("div",r_,[q("main",o_,[q("div",s_,[t[0]||(t[0]=q("h1",null,"404",-1)),q("blockquote",null,fe(r.getMsg()),1),re(r.RouteLink,{to:r.homeLink},{default:ke(()=>[qt(fe(r.homeText),1)]),_:1},8,["to"])])])])}const l_=Se(n_,[["render",i_],["__scopeId","data-v-e9bc46f9"],["__file","NotFound.vue"]]),a_=Mt({enhance({app:e,router:t}){oc("Badge")||e.component("Badge",$g);const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await mc().wait(),n(...r))},setup(){Cg(),kg(),Dg()},layouts:{Layout:xc,NotFound:l_}}),c_=Object.freeze(Object.defineProperty({__proto__:null,default:a_},Symbol.toStringTag,{value:"Module"}));function u_(e){return os()?(Sl(e),!0):!1}function Bs(e){return typeof e=="function"?e():Lt(e)}const f_=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const d_=Object.prototype.toString,h_=e=>d_.call(e)==="[object Object]",p_=()=>{};function g_(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 Cc=e=>e();function m_(e=Cc){const t=Ve(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:Dn(t),pause:n,resume:r,eventFilter:o}}function v_(e){return It()}function __(e,t,n={}){const{eventFilter:r=Cc,...o}=n;return Fe(e,g_(r,t),o)}function b_(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:l,isActive:a}=m_(r);return{stop:__(e,t,{...o,eventFilter:s}),pause:i,resume:l,isActive:a}}function y_(e,t=!0,n){v_()?Ze(e,n):t?e():dn(e)}function S_(e){var t;const n=Bs(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Qr=f_?window:void 0;function fl(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=Qr):[t,n,r,o]=e,!t)return p_;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},l=(u,f,h,p)=>(u.addEventListener(f,h,p),()=>u.removeEventListener(f,h,p)),a=Fe(()=>[S_(t),Bs(o)],([u,f])=>{if(i(),!u)return;const h=h_(f)?{...f}:f;s.push(...n.flatMap(p=>r.map(v=>l(u,p,v,h))))},{immediate:!0,flush:"post"}),c=()=>{a(),i()};return u_(c),c}const Or=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Dr="__vueuse_ssr_handlers__",w_=E_();function E_(){return Dr in Or||(Or[Dr]=Or[Dr]||{}),Or[Dr]}function P_(e,t){return w_[e]||t}function x_(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 C_={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()}},dl="vueuse-storage";function T_(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=Qr,eventFilter:h,onError:p=T=>{console.error(T)},initOnMounted:v}=r,y=(u?ye:Ve)(typeof t=="function"?t():t);if(!n)try{n=P_("getDefaultStorage",()=>{var T;return(T=Qr)==null?void 0:T.localStorage})()}catch(T){p(T)}if(!n)return y;const E=Bs(t),w=x_(E),S=(o=r.serializer)!=null?o:C_[w],{pause:m,resume:_}=b_(y,()=>G(y.value),{flush:s,deep:i,eventFilter:h});f&&l&&y_(()=>{fl(f,"storage",Q),fl(f,dl,I),v&&Q()}),v||Q();function M(T,L){f&&f.dispatchEvent(new CustomEvent(dl,{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 C=S.write(T);L!==C&&(n.setItem(e,C),M(L,C))}}catch(L){p(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 C=S.read(L);return typeof c=="function"?c(C,E):w==="object"&&!Array.isArray(C)?{...E,...C}:C}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)){m();try{(T==null?void 0:T.newValue)!==S.write(y.value)&&(y.value=D(T))}catch(L){p(L)}finally{T?dn(_):_()}}}}function I(T){Q(T.detail)}return y}function k_(e,t,n={}){const{window:r=Qr}=n;return T_(e,t,r==null?void 0:r.sessionStorage,n)}const L_=Object.entries;var A_={autoLocale:!1,switchLocale:!1,localeConfig:{"/eng/":["en-US"]},defaultLocale:"/eng/",localeFallback:!0,defaultBehavior:"defaultLocale"};const R_=A_;L_(R_.localeConfig);k_("VUEPRESS_REDIRECT_LOCALES",{});const O_=Mt({setup(){},rootComponents:[]}),D_=Object.freeze(Object.defineProperty({__proto__:null,default:O_},Symbol.toStringTag,{value:"Module"}));var ae=(e=>(e.Collaborator="collaborator",e.Author="author",e.TechLead="tech lead",e.TeamLead="team lead",e.Developer="developer",e))(ae||{}),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 I_=[{name:"nixeovim",url:"/pleshevskiy/nixeovim",description:"Configure and build neovim editor using nix",roles:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.Author],technologies:[$.Nix,$.Lua],startDate:new Date("2022-11-22"),status:de.PassivelyMaintained},{name:"vnetod",url:"/pleshevskiy/vnetod",description:"Dotenv section switcher",roles:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.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:[ae.Developer,ae.TechLead,ae.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:[ae.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:[ae.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:[ae.Author],technologies:[$.Python],startDate:new Date("2018-06-30"),endDate:new Date("2023-03-02"),status:de.AsIs}];function M_(e){return e.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})}const $_=e=>e.url.startsWith("https://")?e.url:new URL(e.url,"https://git.pleshevski.ru").toString(),N_=Object.freeze(Object.defineProperty({__proto__:null,getExternalLink:$_},Symbol.toStringTag,{value:"Module"}));function Wn(e){return(e==null?void 0:e.valueOf())??1/0}const H_={name:"WorksPage",computed:{tableTheme(){return this.$themeLocale.worksTable??{}}}},V_=le({...H_,setup(e,{expose:t}){t();const n=R(()=>I_.concat().sort((o,s)=>Wn(s.endDate)-Wn(o.endDate)||Wn(s.startDate)-Wn(o.startDate))),r={date2num:Wn,works:n,get renderDate(){return M_},get w(){return N_}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),F_=["href"],j_=["innerHTML"],B_={key:0};function W_(e,t,n,r,o,s){return V(),Z("table",null,[q("thead",null,[q("tr",null,[q("th",null,fe(s.tableTheme.name),1),q("th",null,fe(s.tableTheme.description),1),q("th",null,fe(s.tableTheme.role),1),q("th",null,fe(s.tableTheme.technologies),1),q("th",null,fe(s.tableTheme.status),1),q("th",null,fe(s.tableTheme.dates),1)])]),q("tbody",null,[(V(!0),Z(ve,null,At(r.works,i=>(V(),Z("tr",null,[q("td",null,[q("a",{rel:"nofollow noopener",href:r.w.getExternalLink(i)},fe(i.name),9,F_)]),q("td",null,fe(i.description),1),q("td",{innerHTML:i.roles.join(", ")},null,8,j_),q("td",null,fe(i.technologies.join(", ")),1),q("td",null,fe(i.status),1),q("td",null,[q("div",null,[q("small",{class:Ke({grey:i.endDate})},fe(r.renderDate(i.startDate)),3)]),i.endDate?(V(),Z("div",B_,[q("small",null,fe(r.renderDate(i.endDate)),1)])):De("",!0)])]))),256))])])}const U_=Se(V_,[["render",W_],["__file","ChronologicalWorksTable.vue"]]),G_={__name:"WorksPage",setup(e,{expose:t}){t();const n={ParentLayout:xc,get ChronologicalWorksTable(){return U_}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},K_={class:"works-table-wrapper"};function q_(e,t,n,r,o,s){return V(),Le(r.ParentLayout,null,{"page-bottom":ke(()=>[q("div",K_,[re(r.ChronologicalWorksTable)])]),_:1})}const z_=Se(G_,[["render",q_],["__scopeId","data-v-765855fb"],["__file","WorksPage.vue"]]),J_=Mt({layouts:{WorksPage:z_}}),Y_=Object.freeze(Object.defineProperty({__proto__:null,default:J_},Symbol.toStringTag,{value:"Module"})),Ir=[Lp,Fp,Kp,zp,rg,cg,dg,_g,Pg,c_,D_,Y_].map(e=>e.default).filter(Boolean),Q_=JSON.parse('{"base":"/","lang":"ru-RU","title":"Дмитрий Плешевский","description":" ","head":[],"locales":{"/":{"lang":"ru-RU","title":"Дмитрий Плешевский"},"/eng/":{"lang":"en-US","title":"Dmitriy Pleshevskiy"}}}');var Gn=ye(Q_),X_=nh,Z_=()=>{const e=Th({history:X_($a("/")),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===xt){const r=ar(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},eb=e=>{e.component("ClientOnly",xs),e.component("Content",Cs),e.component("RouteLink",fo)},tb=(e,t,n)=>{const r=R(()=>t.currentRoute.value.path),o=Vl((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(Gn.value.locales,r.value)),l=R(()=>Zt.resolveSiteLocaleData(Gn.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)),h=R(()=>Zt.resolvePageHead(f.value,u.value,l.value)),p=R(()=>Zt.resolvePageLang(c.value,l.value)),v=R(()=>Zt.resolvePageLayout(c.value,s.value)),y={layouts:s,pageData:c,pageComponent:a,pageFrontmatter:u,pageHead:h,pageHeadTitle:f,pageLang:p,pageLayout:v,redirects:Xo,routeLocale:i,routePath:r,routes:Pn,siteData:Gn,siteLocaleData:l};return e.provide(ws,y),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>u.value},$head:{get:()=>h.value},$headTitle:{get:()=>f.value},$lang:{get:()=>p.value},$page:{get:()=>c.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Gn.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>Ts}}),y},nb=([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},rb=([e,t,n])=>{if(!dt(e))return null;const r=document.createElement(e);return bs(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},ob=()=>{const e=Ah(),t=Ps();let n=[];const r=()=>{e.value.forEach(i=>{const l=nb(i);l&&n.push(l)})},o=()=>{const i=[];return e.value.forEach(l=>{const a=rb(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]};Gt(Mh,s),Ze(()=>{r(),Fe(e,s,{immediate:!1})})},sb=ad,ib=async()=>{var n;const e=sb({name:"Vuepress",setup(){var s;ob();for(const i of Ir)(s=i.setup)==null||s.call(i);const r=Ir.flatMap(({rootComponents:i=[]})=>i.map(l=>K(l))),o=Rh();return()=>[K(o.value),r]}}),t=Z_();eb(e),tb(e,t,Ir);for(const r of Ir)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Gn}));return e.use(t),{app:e,router:t}};ib().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Se as _,q as a,qt as b,Z as c,ib as createVueApp,re as d,_f as e,V as o,ta as r,ke as w}; function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { __vite__mapDeps.viteFileDeps = [] diff --git a/assets/index.html-DRIvgEbl.js b/assets/index.html-DM7mJdBZ.js similarity index 99% rename from assets/index.html-DRIvgEbl.js rename to assets/index.html-DM7mJdBZ.js index b1a7b88..5ace5a3 100644 --- a/assets/index.html-DRIvgEbl.js +++ b/assets/index.html-DM7mJdBZ.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-DtHMy4Ce.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&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-IfCpMHS0.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&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/index.html-CiFdreAO.js b/assets/index.html-N9RC5Cwl.js similarity index 99% rename from assets/index.html-CiFdreAO.js rename to assets/index.html-N9RC5Cwl.js index 82a455c..30b11db 100644 --- a/assets/index.html-CiFdreAO.js +++ b/assets/index.html-N9RC5Cwl.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-DtHMy4Ce.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&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-IfCpMHS0.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&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/style-CtawcFdy.css b/assets/style-Cfus6Ei0.css similarity index 99% rename from assets/style-CtawcFdy.css rename to assets/style-Cfus6Ei0.css index 553a09b..1fd7475 100644 --- a/assets/style-CtawcFdy.css +++ b/assets/style-Cfus6Ei0.css @@ -1 +1 @@ -.fade-in-enter-active,.fade-in-leave-active{transition:all var(--transition-duration) var(--transition-ease-in-out)!important}.fade-in-enter-from,.fade-in-leave-to{opacity:0}.fade-in-leave-from,.fade-in-enter-to{opacity: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%}: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)}:root{--transition-fade-in-down-offset: -10px}.fade-in-down-enter-from,.fade-in-down-leave-to{opacity:0;transform:translateY(var(--transition-fade-in-down-offset))}.fade-in-down-enter-to,.fade-in-down-leave-from{opacity:1;transform:translateY(0)}.fade-in-down-leave-active{transition:opacity var(--transition-leave-duration) var(--transition-ease-in-out),transform var(--transition-leave-duration) var(--transition-ease-in-out)!important}.fade-in-down-enter-active{transition:opacity var(--transition-enter-duration) var(--transition-ease-in-out),transform var(--transition-enter-duration) var(--transition-ease-in-out)!important}.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}}:root{--transition-ease-in-out: cubic-bezier(.4, 0, .2, 1);--transition-ease-out: cubic-bezier(0, 0, .2, 1);--transition-ease-in: cubic-bezier(.4, 0, 1, 1);--transition-duration: .2s;--transition-slow-duration: .3s;--transition-enter-duration: var(--transition-duration);--transition-leave-duration: var(--transition-duration);--transition-delay: .1s}.fade-in-height-expand-leave-from,.fade-in-height-expand-enter-to{opacity:1}.fade-in-height-expand-leave-to,.fade-in-height-expand-enter-from{margin-top:0!important;margin-bottom:0!important;padding-top:0!important;padding-bottom:0!important;opacity:0!important}.fade-in-height-expand-leave-active{overflow:hidden;transition:max-height var(--transition-slow-duration) var(--transition-ease-in-out),opacity var(--transition-leave-duration) var(--transition-ease-out),margin-top var(--transition-slow-duration) var(--transition-ease-in-out),margin-bottom var(--transition-slow-duration) var(--transition-ease-in-out),padding-top var(--transition-slow-duration) var(--transition-ease-in-out),padding-bottom var(--transition-slow-duration) var(--transition-ease-in-out)!important}.fade-in-height-expand-enter-active{overflow:hidden;transition:max-height var(--transition-slow-duration) var(--transition-ease-in-out),opacity var(--transition-enter-duration) var(--transition-ease-in),margin-top var(--transition-slow-duration) var(--transition-ease-in-out),margin-bottom var(--transition-slow-duration) var(--transition-ease-in-out),padding-top var(--transition-slow-duration) var(--transition-ease-in-out),padding-bottom var(--transition-slow-duration) var(--transition-ease-in-out)!important}.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-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-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-072ee752]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-072ee752]{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} +.fade-in-enter-active,.fade-in-leave-active{transition:all var(--transition-duration) var(--transition-ease-in-out)!important}.fade-in-enter-from,.fade-in-leave-to{opacity:0}.fade-in-leave-from,.fade-in-enter-to{opacity: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%}: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)}:root{--transition-fade-in-down-offset: -10px}.fade-in-down-enter-from,.fade-in-down-leave-to{opacity:0;transform:translateY(var(--transition-fade-in-down-offset))}.fade-in-down-enter-to,.fade-in-down-leave-from{opacity:1;transform:translateY(0)}.fade-in-down-leave-active{transition:opacity var(--transition-leave-duration) var(--transition-ease-in-out),transform var(--transition-leave-duration) var(--transition-ease-in-out)!important}.fade-in-down-enter-active{transition:opacity var(--transition-enter-duration) var(--transition-ease-in-out),transform var(--transition-enter-duration) var(--transition-ease-in-out)!important}.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}}:root{--transition-ease-in-out: cubic-bezier(.4, 0, .2, 1);--transition-ease-out: cubic-bezier(0, 0, .2, 1);--transition-ease-in: cubic-bezier(.4, 0, 1, 1);--transition-duration: .2s;--transition-slow-duration: .3s;--transition-enter-duration: var(--transition-duration);--transition-leave-duration: var(--transition-duration);--transition-delay: .1s}.fade-in-height-expand-leave-from,.fade-in-height-expand-enter-to{opacity:1}.fade-in-height-expand-leave-to,.fade-in-height-expand-enter-from{margin-top:0!important;margin-bottom:0!important;padding-top:0!important;padding-bottom:0!important;opacity:0!important}.fade-in-height-expand-leave-active{overflow:hidden;transition:max-height var(--transition-slow-duration) var(--transition-ease-in-out),opacity var(--transition-leave-duration) var(--transition-ease-out),margin-top var(--transition-slow-duration) var(--transition-ease-in-out),margin-bottom var(--transition-slow-duration) var(--transition-ease-in-out),padding-top var(--transition-slow-duration) var(--transition-ease-in-out),padding-bottom var(--transition-slow-duration) var(--transition-ease-in-out)!important}.fade-in-height-expand-enter-active{overflow:hidden;transition:max-height var(--transition-slow-duration) var(--transition-ease-in-out),opacity var(--transition-enter-duration) var(--transition-ease-in),margin-top var(--transition-slow-duration) var(--transition-ease-in-out),margin-bottom var(--transition-slow-duration) var(--transition-ease-in-out),padding-top var(--transition-slow-duration) var(--transition-ease-in-out),padding-bottom var(--transition-slow-duration) var(--transition-ease-in-out)!important}.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-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-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-e9bc46f9]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-e9bc46f9]{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-BQJ025yI.js b/assets/works.html-Bk-zdGwE.js similarity index 99% rename from assets/works.html-BQJ025yI.js rename to assets/works.html-Bk-zdGwE.js index db545e2..51a3f37 100644 --- a/assets/works.html-BQJ025yI.js +++ b/assets/works.html-Bk-zdGwE.js @@ -1 +1 @@ -import{_ as t,c as a,e as r,o as i}from"./app-DtHMy4Ce.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 "Critical Chain Method", the "Buffer Method", and the "Backward Planning" 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'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-IfCpMHS0.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 "Critical Chain Method", the "Buffer Method", and the "Backward Planning" 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'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/assets/works.html-4vR_bPc-.js b/assets/works.html-CzEk3rZ7.js similarity index 99% rename from assets/works.html-4vR_bPc-.js rename to assets/works.html-CzEk3rZ7.js index f8a4c9d..3329f77 100644 --- a/assets/works.html-4vR_bPc-.js +++ b/assets/works.html-CzEk3rZ7.js @@ -1 +1 @@ -import{_ as i,c as a,e as r,o as t}from"./app-DtHMy4Ce.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>Я привнес в проект "метод критической цепи", "метод буфера" и "метод планирования с конца". Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</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-IfCpMHS0.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>Я привнес в проект "метод критической цепи", "метод буфера" и "метод планирования с конца". Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</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/eng/index.html b/eng/index.html index 466ee35..9c84d59 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-CtawcFdy.css" as="style"><link rel="stylesheet" href="/assets/style-CtawcFdy.css"> - <link rel="modulepreload" href="/assets/app-DtHMy4Ce.js"><link rel="modulepreload" href="/assets/index.html-CiFdreAO.js"> - <link rel="prefetch" href="/assets/index.html-DRIvgEbl.js" as="script"><link rel="prefetch" href="/assets/works.html-4vR_bPc-.js" as="script"><link rel="prefetch" href="/assets/works.html-BQJ025yI.js" as="script"><link rel="prefetch" href="/assets/404.html-BAx3uyIF.js" as="script"> + <link rel="preload" href="/assets/style-Cfus6Ei0.css" as="style"><link rel="stylesheet" href="/assets/style-Cfus6Ei0.css"> + <link rel="modulepreload" href="/assets/app-IfCpMHS0.js"><link rel="modulepreload" href="/assets/index.html-N9RC5Cwl.js"> + <link rel="prefetch" href="/assets/index.html-DM7mJdBZ.js" as="script"><link rel="prefetch" href="/assets/works.html-CzEk3rZ7.js" as="script"><link rel="prefetch" href="/assets/works.html-Bk-zdGwE.js" as="script"><link rel="prefetch" href="/assets/404.html-zdf0TDCG.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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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&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-DtHMy4Ce.js" defer></script> + <script type="module" src="/assets/app-IfCpMHS0.js" defer></script> </body> </html> diff --git a/eng/works.html b/eng/works.html index c90ed2a..249c03d 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-CtawcFdy.css" as="style"><link rel="stylesheet" href="/assets/style-CtawcFdy.css"> - <link rel="modulepreload" href="/assets/app-DtHMy4Ce.js"><link rel="modulepreload" href="/assets/works.html-BQJ025yI.js"> - <link rel="prefetch" href="/assets/index.html-DRIvgEbl.js" as="script"><link rel="prefetch" href="/assets/works.html-4vR_bPc-.js" as="script"><link rel="prefetch" href="/assets/index.html-CiFdreAO.js" as="script"><link rel="prefetch" href="/assets/404.html-BAx3uyIF.js" as="script"> + <link rel="preload" href="/assets/style-Cfus6Ei0.css" as="style"><link rel="stylesheet" href="/assets/style-Cfus6Ei0.css"> + <link rel="modulepreload" href="/assets/app-IfCpMHS0.js"><link rel="modulepreload" href="/assets/works.html-Bk-zdGwE.js"> + <link rel="prefetch" href="/assets/index.html-DM7mJdBZ.js" as="script"><link rel="prefetch" href="/assets/works.html-CzEk3rZ7.js" as="script"><link rel="prefetch" href="/assets/index.html-N9RC5Cwl.js" as="script"><link rel="prefetch" href="/assets/404.html-zdf0TDCG.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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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 "Critical Chain Method", the "Buffer Method", and the "Backward Planning" 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'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 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's cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech 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 lead, team 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 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-DtHMy4Ce.js" defer></script> + <script type="module" src="/assets/app-IfCpMHS0.js" defer></script> </body> </html> diff --git a/index.html b/index.html index f8f4a44..9fe00d0 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-CtawcFdy.css" as="style"><link rel="stylesheet" href="/assets/style-CtawcFdy.css"> - <link rel="modulepreload" href="/assets/app-DtHMy4Ce.js"><link rel="modulepreload" href="/assets/index.html-DRIvgEbl.js"> - <link rel="prefetch" href="/assets/works.html-4vR_bPc-.js" as="script"><link rel="prefetch" href="/assets/index.html-CiFdreAO.js" as="script"><link rel="prefetch" href="/assets/works.html-BQJ025yI.js" as="script"><link rel="prefetch" href="/assets/404.html-BAx3uyIF.js" as="script"> + <link rel="preload" href="/assets/style-Cfus6Ei0.css" as="style"><link rel="stylesheet" href="/assets/style-Cfus6Ei0.css"> + <link rel="modulepreload" href="/assets/app-IfCpMHS0.js"><link rel="modulepreload" href="/assets/index.html-DM7mJdBZ.js"> + <link rel="prefetch" href="/assets/works.html-CzEk3rZ7.js" as="script"><link rel="prefetch" href="/assets/index.html-N9RC5Cwl.js" as="script"><link rel="prefetch" href="/assets/works.html-Bk-zdGwE.js" as="script"><link rel="prefetch" href="/assets/404.html-zdf0TDCG.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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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&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-DtHMy4Ce.js" defer></script> + <script type="module" src="/assets/app-IfCpMHS0.js" defer></script> </body> </html> diff --git a/works.html b/works.html index 6eaf031..5fc50df 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-CtawcFdy.css" as="style"><link rel="stylesheet" href="/assets/style-CtawcFdy.css"> - <link rel="modulepreload" href="/assets/app-DtHMy4Ce.js"><link rel="modulepreload" href="/assets/works.html-4vR_bPc-.js"> - <link rel="prefetch" href="/assets/index.html-DRIvgEbl.js" as="script"><link rel="prefetch" href="/assets/index.html-CiFdreAO.js" as="script"><link rel="prefetch" href="/assets/works.html-BQJ025yI.js" as="script"><link rel="prefetch" href="/assets/404.html-BAx3uyIF.js" as="script"> + <link rel="preload" href="/assets/style-Cfus6Ei0.css" as="style"><link rel="stylesheet" href="/assets/style-Cfus6Ei0.css"> + <link rel="modulepreload" href="/assets/app-IfCpMHS0.js"><link rel="modulepreload" href="/assets/works.html-CzEk3rZ7.js"> + <link rel="prefetch" href="/assets/index.html-DM7mJdBZ.js" as="script"><link rel="prefetch" href="/assets/index.html-N9RC5Cwl.js" as="script"><link rel="prefetch" href="/assets/works.html-Bk-zdGwE.js" as="script"><link rel="prefetch" href="/assets/404.html-zdf0TDCG.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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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 class="vp-navbar-dropdown" style="display:none;"><!--[--><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>Я привнес в проект "метод критической цепи", "метод буфера" и "метод планирования с конца". Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями.</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 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's cabinet of the educational center Master Progress (SSR + SPA)</td><td>tech 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 lead, team 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 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-DtHMy4Ce.js" defer></script> + <script type="module" src="/assets/app-IfCpMHS0.js" defer></script> </body> </html>