From b44fc65a87848b2c297fa7865623bfa3cafbf8ff Mon Sep 17 00:00:00 2001 From: joanlopez <5459617+joanlopez@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:49:37 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20friendso?= =?UTF-8?q?fgo/killgrave@9282f7becabc37fd37c1459919a2ad732adf3bd3=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 34 +++ assets/404.html-6Yl8cQE3.js | 1 + assets/404.html-SFz3f4i6.js | 1 + assets/advanced.html-QltpobXN.js | 1 + assets/advanced.html-avBEJl4A.js | 1 + assets/app-GKjJbFgT.js | 16 ++ assets/concepts.html-bXMIjlTf.js | 1 + assets/concepts.html-g1xN_7-T.js | 1 + assets/getting-started.html-9uYXJoA8.js | 3 + assets/getting-started.html-rmTUm9IU.js | 1 + assets/ht-delays.html-5ziKQeRG.js | 1 + assets/ht-delays.html-LuxVH0ER.js | 20 ++ assets/ht-dynamic.html-1SuRYzk0.js | 1 + assets/ht-dynamic.html-JSz71AUZ.js | 32 +++ assets/ht-json.html-91jTj4Ja.js | 71 ++++++ assets/ht-json.html-INXtboAi.js | 1 + assets/ht-regex.html-NdAzqI34.js | 52 ++++ assets/ht-regex.html-btTFIkhL.js | 1 + assets/index.html-9fYTIma7.js | 1 + assets/index.html-CLGSAmWB.js | 236 +++++++++++++++++ assets/index.html-IYIbccC0.js | 1 + assets/index.html-P364yGk2.js | 25 ++ assets/index.html-_BzUMnyZ.js | 1 + assets/index.html-jIgMvDZ4.js | 1 + assets/index.html-mIPCr_qu.js | 1 + assets/index.html-tQcrVKVd.js | 1 + assets/installation.html-13nM83rt.js | 1 + assets/installation.html-_D7ND1iN.js | 4 + assets/style-ysdZ3Cf_.css | 1 + assets/your-first-imposter.html-C8xizH02.js | 16 ++ assets/your-first-imposter.html-t5dvpvCj.js | 1 + cli/index.html | 58 +++++ config/index.html | 269 ++++++++++++++++++++ guide/advanced.html | 34 +++ guide/concepts.html | 34 +++ guide/getting-started.html | 36 +++ guide/ht-delays.html | 53 ++++ guide/ht-dynamic.html | 65 +++++ guide/ht-json.html | 104 ++++++++ guide/ht-regex.html | 85 +++++++ guide/index.html | 34 +++ guide/installation.html | 37 +++ guide/your-first-imposter.html | 49 ++++ img/killgrave.png | Bin 0 -> 45764 bytes index.html | 34 +++ 45 files changed, 1421 insertions(+) create mode 100644 404.html create mode 100644 assets/404.html-6Yl8cQE3.js create mode 100644 assets/404.html-SFz3f4i6.js create mode 100644 assets/advanced.html-QltpobXN.js create mode 100644 assets/advanced.html-avBEJl4A.js create mode 100644 assets/app-GKjJbFgT.js create mode 100644 assets/concepts.html-bXMIjlTf.js create mode 100644 assets/concepts.html-g1xN_7-T.js create mode 100644 assets/getting-started.html-9uYXJoA8.js create mode 100644 assets/getting-started.html-rmTUm9IU.js create mode 100644 assets/ht-delays.html-5ziKQeRG.js create mode 100644 assets/ht-delays.html-LuxVH0ER.js create mode 100644 assets/ht-dynamic.html-1SuRYzk0.js create mode 100644 assets/ht-dynamic.html-JSz71AUZ.js create mode 100644 assets/ht-json.html-91jTj4Ja.js create mode 100644 assets/ht-json.html-INXtboAi.js create mode 100644 assets/ht-regex.html-NdAzqI34.js create mode 100644 assets/ht-regex.html-btTFIkhL.js create mode 100644 assets/index.html-9fYTIma7.js create mode 100644 assets/index.html-CLGSAmWB.js create mode 100644 assets/index.html-IYIbccC0.js create mode 100644 assets/index.html-P364yGk2.js create mode 100644 assets/index.html-_BzUMnyZ.js create mode 100644 assets/index.html-jIgMvDZ4.js create mode 100644 assets/index.html-mIPCr_qu.js create mode 100644 assets/index.html-tQcrVKVd.js create mode 100644 assets/installation.html-13nM83rt.js create mode 100644 assets/installation.html-_D7ND1iN.js create mode 100644 assets/style-ysdZ3Cf_.css create mode 100644 assets/your-first-imposter.html-C8xizH02.js create mode 100644 assets/your-first-imposter.html-t5dvpvCj.js create mode 100644 cli/index.html create mode 100644 config/index.html create mode 100644 guide/advanced.html create mode 100644 guide/concepts.html create mode 100644 guide/getting-started.html create mode 100644 guide/ht-delays.html create mode 100644 guide/ht-dynamic.html create mode 100644 guide/ht-json.html create mode 100644 guide/ht-regex.html create mode 100644 guide/index.html create mode 100644 guide/installation.html create mode 100644 guide/your-first-imposter.html create mode 100644 img/killgrave.png create mode 100644 index.html diff --git a/404.html b/404.html new file mode 100644 index 0000000..debeb29 --- /dev/null +++ b/404.html @@ -0,0 +1,34 @@ + + + + + + + + + Killgrave + + + + + +

404

There's nothing here.
Take me home
+ + + diff --git a/assets/404.html-6Yl8cQE3.js b/assets/404.html-6Yl8cQE3.js new file mode 100644 index 0000000..7a25b17 --- /dev/null +++ b/assets/404.html-6Yl8cQE3.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null}');export{t as data}; diff --git a/assets/404.html-SFz3f4i6.js b/assets/404.html-SFz3f4i6.js new file mode 100644 index 0000000..0d3e1d3 --- /dev/null +++ b/assets/404.html-SFz3f4i6.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as t}from"./app-GKjJbFgT.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; diff --git a/assets/advanced.html-QltpobXN.js b/assets/advanced.html-QltpobXN.js new file mode 100644 index 0000000..15e08a7 --- /dev/null +++ b/assets/advanced.html-QltpobXN.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-607376ea","path":"/guide/advanced.html","title":"Advanced features","lang":"en-US","frontmatter":{"prev":"./your-first-imposter","next":"./ht-regex"},"headers":[{"level":2,"title":"CORS","slug":"cors","link":"#cors","children":[]},{"level":2,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":2,"title":"Secure (HTTP over TLS)","slug":"secure-http-over-tls","link":"#secure-http-over-tls","children":[]},{"level":2,"title":"Watcher","slug":"watcher","link":"#watcher","children":[]},{"level":2,"title":"Debugger","slug":"debugger","link":"#debugger","children":[]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/advanced.md"}');export{e as data}; diff --git a/assets/advanced.html-avBEJl4A.js b/assets/advanced.html-avBEJl4A.js new file mode 100644 index 0000000..51acdbb --- /dev/null +++ b/assets/advanced.html-avBEJl4A.js @@ -0,0 +1 @@ +import{_ as i,r as a,o as d,c as l,a as o,b as e,d as r,w as s,e as n}from"./app-GKjJbFgT.js";const h={},u=o("h1",{id:"advanced-features",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#advanced-features","aria-hidden":"true"},"#"),e(" Advanced features")],-1),p=o("p",null,"Killgrave has some advanced features:",-1),g=o("h2",{id:"cors",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#cors","aria-hidden":"true"},"#"),e(" CORS")],-1),f={href:"https://developer.mozilla.org/docs/Web/HTTP/CORS",target:"_blank",rel:"noopener noreferrer"},m=n("",1),v=n('

Proxy

You can use Killgrave in proxy mode using the flags proxy-mode and proxy-url or their equivalent fields in the configuration file. The following three proxy modes are available:

The proxy-url must be the root path of the proxy server. For instance, if we have an API running on http://example.com/things, the configured proxy-url should be http://example.com.

Secure (HTTP over TLS)

Killgrave has a secure mode that lets you expose your mock servers over secure connections by using HTTP over TLS/SSL (HTTPS).

You can use the secure setting to enable the secure mode. Disabled by default.

If enabled, the mock server will use TLS options with a dummy certificate, to make it work with the HTTPS protocol.

Watcher

Killgrave has a file watcher that lets you hot reload your mock servers on every imposters change.

You can use the watcher setting to enable the secure mode. Disabled by default.

If enabled, the file watcher will be watching changes on the imposters directory so the mock server will be restarted on every imposters change.

Debugger

Killgrave has an interactive mode that lets you debug the behavior of your mock server.

You can use the debugger settings to enable the interactive mode. Disabled by default.

You can find further details here.

',16);function b(_,y){const c=a("ExternalLinkIcon"),t=a("RouterLink");return d(),l("div",null,[u,p,g,o("p",null,[e("If you want to use Killgrave from a frontend application, you should consider configuring "),o("a",f,[e("cross-origin resource sharing (CORS)"),r(c)]),e(".")]),o("p",null,[e("In the "),r(t,{to:"/config/#cors"},{default:s(()=>[e("CORS")]),_:1}),e(" section of the file you can find the following options:")]),m,o("p",null,[e("You can find further details "),r(t,{to:"/config/#cors"},{default:s(()=>[e("here")]),_:1}),e(".")]),v])}const w=i(h,[["render",b],["__file","advanced.html.vue"]]);export{w as default}; diff --git a/assets/app-GKjJbFgT.js b/assets/app-GKjJbFgT.js new file mode 100644 index 0000000..2990707 --- /dev/null +++ b/assets/app-GKjJbFgT.js @@ -0,0 +1,16 @@ +function vo(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const we={},on=[],ut=()=>{},Gl=()=>!1,Jl=/^on[^a-z]/,Fn=e=>Jl.test(e),_o=e=>e.startsWith("onUpdate:"),Pe=Object.assign,yo=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ql=Object.prototype.hasOwnProperty,fe=(e,t)=>Ql.call(e,t),Z=Array.isArray,sn=e=>Sr(e)==="[object Map]",pi=e=>Sr(e)==="[object Set]",oe=e=>typeof e=="function",pe=e=>typeof e=="string",Lr=e=>typeof e=="symbol",xe=e=>e!==null&&typeof e=="object",mi=e=>(xe(e)||oe(e))&&oe(e.then)&&oe(e.catch),gi=Object.prototype.toString,Sr=e=>gi.call(e),Zl=e=>Sr(e).slice(8,-1),vi=e=>Sr(e)==="[object Object]",bo=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Sn=vo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),kr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Xl=/-(\w)/g,ft=kr(e=>e.replace(Xl,(t,n)=>n?n.toUpperCase():"")),ea=/\B([A-Z])/g,Jt=kr(e=>e.replace(ea,"-$1").toLowerCase()),Tr=kr(e=>e.charAt(0).toUpperCase()+e.slice(1)),Fr=kr(e=>e?`on${Tr(e)}`:""),Gt=(e,t)=>!Object.is(e,t),Br=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ta=e=>{const t=parseFloat(e);return isNaN(t)?e:t},na=e=>{const t=pe(e)?Number(e):NaN;return isNaN(t)?e:t};let Xo;const eo=()=>Xo||(Xo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Bn(e){if(Z(e)){const t={};for(let n=0;n{if(n){const r=n.split(oa);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function We(e){let t="";if(pe(e))t=e;else if(Z(e))for(let n=0;npe(e)?e:e==null?"":Z(e)||xe(e)&&(e.toString===gi||!oe(e.toString))?JSON.stringify(e,yi,2):String(e),yi=(e,t)=>t&&t.__v_isRef?yi(e,t.value):sn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:pi(t)?{[`Set(${t.size})`]:[...t.values()]}:xe(t)&&!Z(t)&&!vi(t)?String(t):t;let Ge;class ca{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ge,!t&&Ge&&(this.index=(Ge.scopes||(Ge.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ge;try{return Ge=this,t()}finally{Ge=n}}}on(){Ge=this}off(){Ge=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Ei=e=>(e.w&Ot)>0,wi=e=>(e.n&Ot)>0,da=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(u==="length"||!Lr(u)&&u>=l)&&a.push(c)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":Z(e)?bo(n)&&a.push(i.get("length")):(a.push(i.get(Vt)),sn(e)&&a.push(i.get(no)));break;case"delete":Z(e)||(a.push(i.get(Vt)),sn(e)&&a.push(i.get(no)));break;case"set":sn(e)&&a.push(i.get(Vt));break}if(a.length===1)a[0]&&ro(a[0]);else{const l=[];for(const c of a)c&&l.push(...c);ro(Eo(l))}}function ro(e,t){const n=Z(e)?e:[...e];for(const r of n)r.computed&&ts(r);for(const r of n)r.computed||ts(r)}function ts(e,t){(e!==rt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function pa(e,t){var n;return(n=hr.get(e))==null?void 0:n.get(t)}const ma=vo("__proto__,__v_isRef,__isVue"),Li=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Lr)),ns=ga();function ga(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=he(this);for(let s=0,i=this.length;s{e[t]=function(...n){vn();const r=he(this)[t].apply(this,n);return _n(),r}}),e}function va(e){const t=he(this);return qe(t,"has",e),t.hasOwnProperty(e)}class Si{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const o=this._isReadonly,s=this._shallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw"&&r===(o?s?Aa:Ai:s?Ri:Ti).get(t))return t;const i=Z(t);if(!o){if(i&&fe(ns,n))return Reflect.get(ns,n,r);if(n==="hasOwnProperty")return va}const a=Reflect.get(t,n,r);return(Lr(n)?Li.has(n):ma(n))||(o||qe(t,"get",n),s)?a:$e(a)?i&&bo(n)?a:a.value:xe(a)?o?jn(a):zn(a):a}}class ki extends Si{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(un(s)&&$e(s)&&!$e(r))return!1;if(!this._shallow&&(!pr(r)&&!un(r)&&(s=he(s),r=he(r)),!Z(t)&&$e(s)&&!$e(r)))return s.value=r,!0;const i=Z(t)&&bo(n)?Number(n)e,Rr=e=>Reflect.getPrototypeOf(e);function Jn(e,t,n=!1,r=!1){e=e.__v_raw;const o=he(e),s=he(t);n||(Gt(t,s)&&qe(o,"get",t),qe(o,"get",s));const{has:i}=Rr(o),a=r?xo:n?So:On;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Qn(e,t=!1){const n=this.__v_raw,r=he(n),o=he(e);return t||(Gt(e,o)&&qe(r,"has",e),qe(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Zn(e,t=!1){return e=e.__v_raw,!t&&qe(he(e),"iterate",Vt),Reflect.get(e,"size",e)}function rs(e){e=he(e);const t=he(this);return Rr(t).has.call(t,e)||(t.add(e),gt(t,"add",e,e)),this}function os(e,t){t=he(t);const n=he(this),{has:r,get:o}=Rr(n);let s=r.call(n,e);s||(e=he(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?Gt(t,i)&>(n,"set",e,t):gt(n,"add",e,t),this}function ss(e){const t=he(this),{has:n,get:r}=Rr(t);let o=n.call(t,e);o||(e=he(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&>(t,"delete",e,void 0),s}function is(){const e=he(this),t=e.size!==0,n=e.clear();return t&>(e,"clear",void 0,void 0),n}function Xn(e,t){return function(r,o){const s=this,i=s.__v_raw,a=he(i),l=t?xo:e?So:On;return!e&&qe(a,"iterate",Vt),i.forEach((c,u)=>r.call(o,l(c),l(u),s))}}function er(e,t,n){return function(...r){const o=this.__v_raw,s=he(o),i=sn(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,c=o[e](...r),u=n?xo:t?So:On;return!t&&qe(s,"iterate",l?no:Vt),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:a?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function xt(e){return function(...t){return e==="delete"?!1:this}}function wa(){const e={get(s){return Jn(this,s)},get size(){return Zn(this)},has:Qn,add:rs,set:os,delete:ss,clear:is,forEach:Xn(!1,!1)},t={get(s){return Jn(this,s,!1,!0)},get size(){return Zn(this)},has:Qn,add:rs,set:os,delete:ss,clear:is,forEach:Xn(!1,!0)},n={get(s){return Jn(this,s,!0)},get size(){return Zn(this,!0)},has(s){return Qn.call(this,s,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Xn(!0,!1)},r={get(s){return Jn(this,s,!0,!0)},get size(){return Zn(this,!0)},has(s){return Qn.call(this,s,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Xn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=er(s,!1,!1),n[s]=er(s,!0,!1),t[s]=er(s,!1,!0),r[s]=er(s,!0,!0)}),[e,n,t,r]}const[xa,Ca,La,Sa]=wa();function Co(e,t){const n=t?e?Sa:La:e?Ca:xa;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(fe(n,o)&&o in r?n:r,o,s)}const ka={get:Co(!1,!1)},Ta={get:Co(!1,!0)},Ra={get:Co(!0,!1)},Ti=new WeakMap,Ri=new WeakMap,Ai=new WeakMap,Aa=new WeakMap;function Pa(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Oa(e){return e.__v_skip||!Object.isExtensible(e)?0:Pa(Zl(e))}function zn(e){return un(e)?e:Lo(e,!1,ya,ka,Ti)}function Pi(e){return Lo(e,!1,Ea,Ta,Ri)}function jn(e){return Lo(e,!0,ba,Ra,Ai)}function Lo(e,t,n,r,o){if(!xe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=Oa(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function ln(e){return un(e)?ln(e.__v_raw):!!(e&&e.__v_isReactive)}function un(e){return!!(e&&e.__v_isReadonly)}function pr(e){return!!(e&&e.__v_isShallow)}function Oi(e){return ln(e)||un(e)}function he(e){const t=e&&e.__v_raw;return t?he(t):e}function Ii(e){return dr(e,"__v_skip",!0),e}const On=e=>xe(e)?zn(e):e,So=e=>xe(e)?jn(e):e;function ko(e){At&&rt&&(e=he(e),Ci(e.dep||(e.dep=Eo())))}function To(e,t){e=he(e);const n=e.dep;n&&ro(n)}function $e(e){return!!(e&&e.__v_isRef===!0)}function ge(e){return $i(e,!1)}function Ro(e){return $i(e,!0)}function $i(e,t){return $e(e)?e:new Ia(e,t)}class Ia{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:he(t),this._value=n?t:On(t)}get value(){return ko(this),this._value}set value(t){const n=this.__v_isShallow||pr(t)||un(t);t=n?t:he(t),Gt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:On(t),To(this))}}function ee(e){return $e(e)?e.value:e}const $a={get:(e,t,n)=>ee(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return $e(o)&&!$e(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Mi(e){return ln(e)?e:new Proxy(e,$a)}class Ma{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>ko(this),()=>To(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Na(e){return new Ma(e)}function Ar(e){const t=Z(e)?new Array(e.length):{};for(const n in e)t[n]=Da(e,n);return t}class Ha{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return pa(he(this._object),this._key)}}function Da(e,t,n){const r=e[t];return $e(r)?r:new Ha(e,t,n)}class Fa{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new wo(t,()=>{this._dirty||(this._dirty=!0,To(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=he(this);return ko(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Ba(e,t,n=!1){let r,o;const s=oe(e);return s?(r=e,o=ut):(r=e.get,o=e.set),new Fa(r,o,s||!o,n)}function Pt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){Un(s,t,n)}return o}function et(e,t,n,r){if(oe(e)){const s=Pt(e,t,n,r);return s&&mi(s)&&s.catch(i=>{Un(i,t,n)}),s}const o=[];for(let s=0;s>>1,o=Fe[r],s=$n(o);sct&&Fe.splice(t,1)}function Ka(e){Z(e)?an.push(...e):(!mt||!mt.includes(e,e.allowRecurse?zt+1:zt))&&an.push(e),Hi()}function ls(e,t=In?ct+1:0){for(;t$n(n)-$n(r)),zt=0;zte.id==null?1/0:e.id,Va=(e,t)=>{const n=$n(e)-$n(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Di(e){oo=!1,In=!0,Fe.sort(Va);try{for(ct=0;ctpe(m)?m.trim():m)),f&&(o=n.map(ta))}let a,l=r[a=Fr(t)]||r[a=Fr(ft(t))];!l&&s&&(l=r[a=Fr(Jt(t))]),l&&et(l,e,6,o);const c=r[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,et(c,e,6,o)}}function Fi(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!oe(e)){const l=c=>{const u=Fi(c,t,!0);u&&(a=!0,Pe(i,u))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(xe(e)&&r.set(e,null),null):(Z(s)?s.forEach(l=>i[l]=null):Pe(i,s),xe(e)&&r.set(e,i),i)}function Or(e,t){return!e||!Fn(t)?!1:(t=t.slice(2).replace(/Once$/,""),fe(e,t[0].toLowerCase()+t.slice(1))||fe(e,Jt(t))||fe(e,t))}let He=null,Bi=null;function gr(e){const t=He;return He=e,Bi=e&&e.type.__scopeId||null,t}function Ne(e,t=He,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&ys(-1);const s=gr(t);let i;try{i=e(...o)}finally{gr(s),r._d&&ys(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function zr(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:a,attrs:l,emit:c,render:u,renderCache:f,data:d,setupState:m,ctx:b,inheritAttrs:w}=e;let L,k;const T=gr(e);try{if(n.shapeFlag&4){const y=o||r;L=nt(u.call(y,y,f,s,m,d,b)),k=l}else{const y=t;L=nt(y.length>1?y(s,{attrs:l,slots:a,emit:c}):y(s,null)),k=t.props?l:qa(l)}}catch(y){Rn.length=0,Un(y,e,1),L=ne(Qe)}let v=L;if(k&&w!==!1){const y=Object.keys(k),{shapeFlag:F}=v;y.length&&F&7&&(i&&y.some(_o)&&(k=Ya(k,i)),v=$t(v,k))}return n.dirs&&(v=$t(v),v.dirs=v.dirs?v.dirs.concat(n.dirs):n.dirs),n.transition&&(v.transition=n.transition),L=v,gr(T),L}const qa=e=>{let t;for(const n in e)(n==="class"||n==="style"||Fn(n))&&((t||(t={}))[n]=e[n]);return t},Ya=(e,t)=>{const n={};for(const r in e)(!_o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ga(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?as(r,i,c):!!i;if(l&8){const u=t.dynamicProps;for(let f=0;fe.__isSuspense;function ji(e,t){t&&t.pendingBranch?Z(e)?t.effects.push(...e):t.effects.push(e):Ka(e)}function Ui(e,t){return Po(e,null,t)}const tr={};function Je(e,t,n){return Po(e,t,n)}function Po(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:i}=we){var a;const l=bi()===((a=Re)==null?void 0:a.scope)?Re:null;let c,u=!1,f=!1;if($e(e)?(c=()=>e.value,u=pr(e)):ln(e)?(c=()=>e,r=!0):Z(e)?(f=!0,u=e.some(y=>ln(y)||pr(y)),c=()=>e.map(y=>{if($e(y))return y.value;if(ln(y))return Kt(y);if(oe(y))return Pt(y,l,2)})):oe(e)?t?c=()=>Pt(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return d&&d(),et(e,l,3,[m])}:c=ut,t&&r){const y=c;c=()=>Kt(y())}let d,m=y=>{d=T.onStop=()=>{Pt(y,l,4)}},b;if(hn)if(m=ut,t?n&&et(t,l,3,[c(),f?[]:void 0,m]):c(),o==="sync"){const y=Wc();b=y.__watcherHandles||(y.__watcherHandles=[])}else return ut;let w=f?new Array(e.length).fill(tr):tr;const L=()=>{if(T.active)if(t){const y=T.run();(r||u||(f?y.some((F,q)=>Gt(F,w[q])):Gt(y,w)))&&(d&&d(),et(t,l,3,[y,w===tr?void 0:f&&w[0]===tr?[]:w,m]),w=y)}else T.run()};L.allowRecurse=!!t;let k;o==="sync"?k=L:o==="post"?k=()=>Ve(L,l&&l.suspense):(L.pre=!0,l&&(L.id=l.uid),k=()=>Pr(L));const T=new wo(c,k);t?n?L():w=T.run():o==="post"?Ve(T.run.bind(T),l&&l.suspense):T.run();const v=()=>{T.stop(),l&&l.scope&&yo(l.scope.effects,T)};return b&&b.push(v),v}function ec(e,t,n){const r=this.proxy,o=pe(e)?e.includes(".")?Ki(r,e):()=>r[e]:e.bind(r,r);let s;oe(t)?s=t:(s=t.handler,n=t);const i=Re;dn(this);const a=Po(o,s.bind(r),n);return i?dn(i):qt(),a}function Ki(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Kt(n,t)});else if(vi(e))for(const n in e)Kt(e[n],t);return e}function vr(e,t){const n=He;if(n===null)return e;const r=Nr(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),Wn(()=>{e.isUnmounting=!0}),e}const Ze=[Function,Array],Vi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ze,onEnter:Ze,onAfterEnter:Ze,onEnterCancelled:Ze,onBeforeLeave:Ze,onLeave:Ze,onAfterLeave:Ze,onLeaveCancelled:Ze,onBeforeAppear:Ze,onAppear:Ze,onAfterAppear:Ze,onAppearCancelled:Ze},nc={name:"BaseTransition",props:Vi,setup(e,{slots:t}){const n=Mo(),r=tc();let o;return()=>{const s=t.default&&qi(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const w of s)if(w.type!==Qe){i=w;break}}const a=he(e),{mode:l}=a;if(r.isLeaving)return jr(i);const c=us(i);if(!c)return jr(i);const u=so(c,a,r,n);io(c,u);const f=n.subTree,d=f&&us(f);let m=!1;const{getTransitionKey:b}=c.type;if(b){const w=b();o===void 0?o=w:w!==o&&(o=w,m=!0)}if(d&&d.type!==Qe&&(!jt(c,d)||m)){const w=so(d,a,r,n);if(io(d,w),l==="out-in")return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},jr(i);l==="in-out"&&c.type!==Qe&&(w.delayLeave=(L,k,T)=>{const v=Wi(r,d);v[String(d.key)]=d,L[kt]=()=>{k(),L[kt]=void 0,delete u.delayedLeave},u.delayedLeave=T})}return i}}},rc=nc;function Wi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function so(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:f,onLeave:d,onAfterLeave:m,onLeaveCancelled:b,onBeforeAppear:w,onAppear:L,onAfterAppear:k,onAppearCancelled:T}=t,v=String(e.key),y=Wi(n,e),F=(_,I)=>{_&&et(_,r,9,I)},q=(_,I)=>{const A=I[1];F(_,I),Z(_)?_.every(V=>V.length<=1)&&A():_.length<=1&&A()},N={mode:s,persisted:i,beforeEnter(_){let I=a;if(!n.isMounted)if(o)I=w||a;else return;_[kt]&&_[kt](!0);const A=y[v];A&&jt(e,A)&&A.el[kt]&&A.el[kt](),F(I,[_])},enter(_){let I=l,A=c,V=u;if(!n.isMounted)if(o)I=L||l,A=k||c,V=T||u;else return;let x=!1;const $=_[nr]=te=>{x||(x=!0,te?F(V,[_]):F(A,[_]),N.delayedLeave&&N.delayedLeave(),_[nr]=void 0)};I?q(I,[_,$]):$()},leave(_,I){const A=String(e.key);if(_[nr]&&_[nr](!0),n.isUnmounting)return I();F(f,[_]);let V=!1;const x=_[kt]=$=>{V||(V=!0,I(),$?F(b,[_]):F(m,[_]),_[kt]=void 0,y[A]===e&&delete y[A])};y[A]=e,d?q(d,[_,x]):x()},clone(_){return so(_,t,n,r)}};return N}function jr(e){if(Vn(e))return e=$t(e),e.children=null,e}function us(e){return Vn(e)?e.children?e.children[0]:void 0:e}function io(e,t){e.shapeFlag&6&&e.component?io(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function qi(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Ke(e){oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,c,u=0;const f=()=>(u++,l=null,d()),d=()=>{let m;return l||(m=l=t().catch(b=>{if(b=b instanceof Error?b:new Error(String(b)),a)return new Promise((w,L)=>{a(b,()=>w(f()),()=>L(b),u+1)});throw b}).then(b=>m!==l&&l?l:(b&&(b.__esModule||b[Symbol.toStringTag]==="Module")&&(b=b.default),c=b,b)))};return ce({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return c},setup(){const m=Re;if(c)return()=>Ur(c,m);const b=T=>{l=null,Un(T,m,13,!r)};if(i&&m.suspense||hn)return d().then(T=>()=>Ur(T,m)).catch(T=>(b(T),()=>r?ne(r,{error:T}):null));const w=ge(!1),L=ge(),k=ge(!!o);return o&&setTimeout(()=>{k.value=!1},o),s!=null&&setTimeout(()=>{if(!w.value&&!L.value){const T=new Error(`Async component timed out after ${s}ms.`);b(T),L.value=T}},s),d().then(()=>{w.value=!0,m.parent&&Vn(m.parent.vnode)&&Pr(m.parent.update)}).catch(T=>{b(T),L.value=T}),()=>{if(w.value&&c)return Ur(c,m);if(L.value&&r)return ne(r,{error:L.value});if(n&&!k.value)return ne(n)}}})}function Ur(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=ne(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Vn=e=>e.type.__isKeepAlive;function oc(e,t){Yi(e,"a",t)}function sc(e,t){Yi(e,"da",t)}function Yi(e,t,n=Re){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ir(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Vn(o.parent.vnode)&&ic(r,t,n,o),o=o.parent}}function ic(e,t,n,r){const o=Ir(t,e,r,!0);$r(()=>{yo(r[t],o)},n)}function Ir(e,t,n=Re,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;vn(),dn(n);const a=et(t,n,e,i);return qt(),_n(),a});return r?o.unshift(s):o.push(s),s}}const bt=e=>(t,n=Re)=>(!hn||e==="sp")&&Ir(e,(...r)=>t(...r),n),lc=bt("bm"),je=bt("m"),ac=bt("bu"),cc=bt("u"),Wn=bt("bum"),$r=bt("um"),uc=bt("sp"),fc=bt("rtg"),dc=bt("rtc");function hc(e,t=Re){Ir("ec",e,t)}function It(e,t,n,r){let o;const s=n&&n[r];if(Z(e)||pe(e)){o=new Array(e.length);for(let i=0,a=e.length;it(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;aEr(t)?!(t.type===Qe||t.type===Ee&&!Gi(t.children)):!0)?e:null}const lo=e=>e?ll(e)?Nr(e)||e.proxy:lo(e.parent):null,kn=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>lo(e.parent),$root:e=>lo(e.root),$emit:e=>e.emit,$options:e=>Oo(e),$forceUpdate:e=>e.f||(e.f=()=>Pr(e.update)),$nextTick:e=>e.n||(e.n=Kn.bind(e.proxy)),$watch:e=>ec.bind(e)}),Kr=(e,t)=>e!==we&&!e.__isScriptSetup&&fe(e,t),pc={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let c;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Kr(r,t))return i[t]=1,r[t];if(o!==we&&fe(o,t))return i[t]=2,o[t];if((c=e.propsOptions[0])&&fe(c,t))return i[t]=3,s[t];if(n!==we&&fe(n,t))return i[t]=4,n[t];ao&&(i[t]=0)}}const u=kn[t];let f,d;if(u)return t==="$attrs"&&qe(e,"get",t),u(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(n!==we&&fe(n,t))return i[t]=4,n[t];if(d=l.config.globalProperties,fe(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return Kr(o,t)?(o[t]=n,!0):r!==we&&fe(r,t)?(r[t]=n,!0):fe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let a;return!!n[i]||e!==we&&fe(e,i)||Kr(t,i)||(a=s[0])&&fe(a,i)||fe(r,i)||fe(kn,i)||fe(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:fe(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function fs(e){return Z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ao=!0;function mc(e){const t=Oo(e),n=e.proxy,r=e.ctx;ao=!1,t.beforeCreate&&ds(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:m,updated:b,activated:w,deactivated:L,beforeDestroy:k,beforeUnmount:T,destroyed:v,unmounted:y,render:F,renderTracked:q,renderTriggered:N,errorCaptured:_,serverPrefetch:I,expose:A,inheritAttrs:V,components:x,directives:$,filters:te}=t;if(c&&gc(c,r,null),i)for(const G in i){const K=i[G];oe(K)&&(r[G]=K.bind(n))}if(o){const G=o.call(n,n);xe(G)&&(e.data=zn(G))}if(ao=!0,s)for(const G in s){const K=s[G],Oe=oe(K)?K.bind(n,n):oe(K.get)?K.get.bind(n,n):ut,Me=!oe(K)&&oe(K.set)?K.set.bind(n):ut,Ue=z({get:Oe,set:Me});Object.defineProperty(r,G,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:De=>Ue.value=De})}if(a)for(const G in a)Ji(a[G],r,n,G);if(l){const G=oe(l)?l.call(n):l;Reflect.ownKeys(G).forEach(K=>{Wt(K,G[K])})}u&&ds(u,e,"c");function O(G,K){Z(K)?K.forEach(Oe=>G(Oe.bind(n))):K&&G(K.bind(n))}if(O(lc,f),O(je,d),O(ac,m),O(cc,b),O(oc,w),O(sc,L),O(hc,_),O(dc,q),O(fc,N),O(Wn,T),O($r,y),O(uc,I),Z(A))if(A.length){const G=e.exposed||(e.exposed={});A.forEach(K=>{Object.defineProperty(G,K,{get:()=>n[K],set:Oe=>n[K]=Oe})})}else e.exposed||(e.exposed={});F&&e.render===ut&&(e.render=F),V!=null&&(e.inheritAttrs=V),x&&(e.components=x),$&&(e.directives=$)}function gc(e,t,n=ut){Z(e)&&(e=co(e));for(const r in e){const o=e[r];let s;xe(o)?"default"in o?s=Se(o.from||r,o.default,!0):s=Se(o.from||r):s=Se(o),$e(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function ds(e,t,n){et(Z(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,r){const o=r.includes(".")?Ki(n,r):()=>n[r];if(pe(e)){const s=t[e];oe(s)&&Je(o,s)}else if(oe(e))Je(o,e.bind(n));else if(xe(e))if(Z(e))e.forEach(s=>Ji(s,t,n,r));else{const s=oe(e.handler)?e.handler.bind(n):t[e.handler];oe(s)&&Je(o,s,e)}}function Oo(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(c=>_r(l,c,i,!0)),_r(l,t,i)),xe(t)&&s.set(t,l),l}function _r(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&_r(e,s,n,!0),o&&o.forEach(i=>_r(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=vc[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const vc={data:hs,props:ps,emits:ps,methods:Ln,computed:Ln,beforeCreate:Be,created:Be,beforeMount:Be,mounted:Be,beforeUpdate:Be,updated:Be,beforeDestroy:Be,beforeUnmount:Be,destroyed:Be,unmounted:Be,activated:Be,deactivated:Be,errorCaptured:Be,serverPrefetch:Be,components:Ln,directives:Ln,watch:yc,provide:hs,inject:_c};function hs(e,t){return t?e?function(){return Pe(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function _c(e,t){return Ln(co(e),co(t))}function co(e){if(Z(e)){const t={};for(let n=0;n1)return n&&oe(t)?t.call(r&&r.proxy):t}}function wc(e,t,n,r=!1){const o={},s={};dr(s,Mr,1),e.propsDefaults=Object.create(null),Zi(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:Pi(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function xc(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=he(o),[l]=e.propsOptions;let c=!1;if((r||i>0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[d,m]=Xi(f,t,!0);Pe(i,d),m&&a.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!l)return xe(e)&&r.set(e,on),on;if(Z(s))for(let u=0;u-1,m[1]=w<0||b-1||fe(m,"default"))&&a.push(f)}}}const c=[i,a];return xe(e)&&r.set(e,c),c}function ms(e){return e[0]!=="$"}function gs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function vs(e,t){return gs(e)===gs(t)}function _s(e,t){return Z(t)?t.findIndex(n=>vs(n,e)):oe(t)&&vs(t,e)?0:-1}const el=e=>e[0]==="_"||e==="$stable",Io=e=>Z(e)?e.map(nt):[nt(e)],Cc=(e,t,n)=>{if(t._n)return t;const r=Ne((...o)=>Io(t(...o)),n);return r._c=!1,r},tl=(e,t,n)=>{const r=e._ctx;for(const o in e){if(el(o))continue;const s=e[o];if(oe(s))t[o]=Cc(o,s,r);else if(s!=null){const i=Io(s);t[o]=()=>i}}},nl=(e,t)=>{const n=Io(t);e.slots.default=()=>n},Lc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=he(t),dr(t,"_",n)):tl(t,e.slots={})}else e.slots={},t&&nl(e,t);dr(e.slots,Mr,1)},Sc=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=we;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:(Pe(o,t),!n&&a===1&&delete o._):(s=!t.$stable,tl(t,o)),i=t}else t&&(nl(e,t),i={default:1});if(s)for(const a in o)!el(a)&&i[a]==null&&delete o[a]};function br(e,t,n,r,o=!1){if(Z(e)){e.forEach((d,m)=>br(d,t&&(Z(t)?t[m]:t),n,r,o));return}if(cn(r)&&!o)return;const s=r.shapeFlag&4?Nr(r.component)||r.component.proxy:r.el,i=o?null:s,{i:a,r:l}=e,c=t&&t.r,u=a.refs===we?a.refs={}:a.refs,f=a.setupState;if(c!=null&&c!==l&&(pe(c)?(u[c]=null,fe(f,c)&&(f[c]=null)):$e(c)&&(c.value=null)),oe(l))Pt(l,a,12,[i,u]);else{const d=pe(l),m=$e(l);if(d||m){const b=()=>{if(e.f){const w=d?fe(f,l)?f[l]:u[l]:l.value;o?Z(w)&&yo(w,s):Z(w)?w.includes(s)||w.push(s):d?(u[l]=[s],fe(f,l)&&(f[l]=u[l])):(l.value=[s],e.k&&(u[e.k]=l.value))}else d?(u[l]=i,fe(f,l)&&(f[l]=i)):m&&(l.value=i,e.k&&(u[e.k]=i))};i?(b.id=-1,Ve(b,n)):b()}}}let Ct=!1;const rr=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",or=e=>e.nodeType===8;function kc(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:c}}=e,u=(v,y)=>{if(!y.hasChildNodes()){n(null,v,y),mr(),y._vnode=v;return}Ct=!1,f(y.firstChild,v,null,null,null),mr(),y._vnode=v,Ct&&console.error("Hydration completed but contains mismatches.")},f=(v,y,F,q,N,_=!1)=>{const I=or(v)&&v.data==="[",A=()=>w(v,y,F,q,N,I),{type:V,ref:x,shapeFlag:$,patchFlag:te}=y;let se=v.nodeType;y.el=v,te===-2&&(_=!1,y.dynamicChildren=null);let O=null;switch(V){case fn:se!==3?y.children===""?(l(y.el=o(""),i(v),v),O=v):O=A():(v.data!==y.children&&(Ct=!0,v.data=y.children),O=s(v));break;case Qe:T(v)?(O=s(v),k(y.el=v.content.firstChild,v,F)):se!==8||I?O=A():O=s(v);break;case Tn:if(I&&(v=s(v),se=v.nodeType),se===1||se===3){O=v;const G=!y.children.length;for(let K=0;K{_=_||!!y.dynamicChildren;const{type:I,props:A,patchFlag:V,shapeFlag:x,dirs:$,transition:te}=y,se=I==="input"&&$||I==="option";if(se||V!==-1){if($&&at(y,null,F,"created"),A)if(se||!_||V&48)for(const K in A)(se&&K.endsWith("value")||Fn(K)&&!Sn(K))&&r(v,K,null,A[K],!1,void 0,F);else A.onClick&&r(v,"onClick",null,A.onClick,!1,void 0,F);let O;(O=A&&A.onVnodeBeforeMount)&&Xe(O,F,y);let G=!1;if(T(v)){G=rl(q,te)&&F&&F.vnode.props&&F.vnode.props.appear;const K=v.content.firstChild;G&&te.beforeEnter(K),k(K,v,F),y.el=v=K}if($&&at(y,null,F,"beforeMount"),((O=A&&A.onVnodeMounted)||$||G)&&ji(()=>{O&&Xe(O,F,y),G&&te.enter(v),$&&at(y,null,F,"mounted")},q),x&16&&!(A&&(A.innerHTML||A.textContent))){let K=m(v.firstChild,y,v,F,q,N,_);for(;K;){Ct=!0;const Oe=K;K=K.nextSibling,a(Oe)}}else x&8&&v.textContent!==y.children&&(Ct=!0,v.textContent=y.children)}return v.nextSibling},m=(v,y,F,q,N,_,I)=>{I=I||!!y.dynamicChildren;const A=y.children,V=A.length;for(let x=0;x{const{slotScopeIds:I}=y;I&&(N=N?N.concat(I):I);const A=i(v),V=m(s(v),y,A,F,q,N,_);return V&&or(V)&&V.data==="]"?s(y.anchor=V):(Ct=!0,l(y.anchor=c("]"),A,V),V)},w=(v,y,F,q,N,_)=>{if(Ct=!0,y.el=null,_){const V=L(v);for(;;){const x=s(v);if(x&&x!==V)a(x);else break}}const I=s(v),A=i(v);return a(v),n(null,y,A,I,F,q,rr(A),N),I},L=(v,y="[",F="]")=>{let q=0;for(;v;)if(v=s(v),v&&or(v)&&(v.data===y&&q++,v.data===F)){if(q===0)return s(v);q--}return v},k=(v,y,F)=>{const q=y.parentNode;q&&q.replaceChild(v,y);let N=F;for(;N;)N.vnode.el===y&&(N.vnode.el=N.subTree.el=v),N=N.parent},T=v=>v.nodeType===1&&v.tagName.toLowerCase()==="template";return[u,f]}const Ve=ji;function Tc(e){return Rc(e,kc)}function Rc(e,t){const n=eo();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:m=ut,insertStaticContent:b}=e,w=(h,p,g,E=null,S=null,R=null,B=!1,M=null,D=!!p.dynamicChildren)=>{if(h===p)return;h&&!jt(h,p)&&(E=C(h),De(h,S,R,!0),h=null),p.patchFlag===-2&&(D=!1,p.dynamicChildren=null);const{type:P,ref:J,shapeFlag:W}=p;switch(P){case fn:L(h,p,g,E);break;case Qe:k(h,p,g,E);break;case Tn:h==null&&T(p,g,E,B);break;case Ee:x(h,p,g,E,S,R,B,M,D);break;default:W&1?F(h,p,g,E,S,R,B,M,D):W&6?$(h,p,g,E,S,R,B,M,D):(W&64||W&128)&&P.process(h,p,g,E,S,R,B,M,D,H)}J!=null&&S&&br(J,h&&h.ref,R,p||h,!p)},L=(h,p,g,E)=>{if(h==null)r(p.el=a(p.children),g,E);else{const S=p.el=h.el;p.children!==h.children&&c(S,p.children)}},k=(h,p,g,E)=>{h==null?r(p.el=l(p.children||""),g,E):p.el=h.el},T=(h,p,g,E)=>{[h.el,h.anchor]=b(h.children,p,g,E,h.el,h.anchor)},v=({el:h,anchor:p},g,E)=>{let S;for(;h&&h!==p;)S=d(h),r(h,g,E),h=S;r(p,g,E)},y=({el:h,anchor:p})=>{let g;for(;h&&h!==p;)g=d(h),o(h),h=g;o(p)},F=(h,p,g,E,S,R,B,M,D)=>{B=B||p.type==="svg",h==null?q(p,g,E,S,R,B,M,D):I(h,p,S,R,B,M,D)},q=(h,p,g,E,S,R,B,M)=>{let D,P;const{type:J,props:W,shapeFlag:Q,transition:re,dirs:ie}=h;if(D=h.el=i(h.type,R,W&&W.is,W),Q&8?u(D,h.children):Q&16&&_(h.children,D,null,E,S,R&&J!=="foreignObject",B,M),ie&&at(h,null,E,"created"),N(D,h,h.scopeId,B,E),W){for(const ve in W)ve!=="value"&&!Sn(ve)&&s(D,ve,null,W[ve],R,h.children,E,S,Ie);"value"in W&&s(D,"value",null,W.value),(P=W.onVnodeBeforeMount)&&Xe(P,E,h)}ie&&at(h,null,E,"beforeMount");const ye=rl(S,re);ye&&re.beforeEnter(D),r(D,p,g),((P=W&&W.onVnodeMounted)||ye||ie)&&Ve(()=>{P&&Xe(P,E,h),ye&&re.enter(D),ie&&at(h,null,E,"mounted")},S)},N=(h,p,g,E,S)=>{if(g&&m(h,g),E)for(let R=0;R{for(let P=D;P{const M=p.el=h.el;let{patchFlag:D,dynamicChildren:P,dirs:J}=p;D|=h.patchFlag&16;const W=h.props||we,Q=p.props||we;let re;g&&Ht(g,!1),(re=Q.onVnodeBeforeUpdate)&&Xe(re,g,p,h),J&&at(p,h,g,"beforeUpdate"),g&&Ht(g,!0);const ie=S&&p.type!=="foreignObject";if(P?A(h.dynamicChildren,P,M,g,E,ie,R):B||K(h,p,M,null,g,E,ie,R,!1),D>0){if(D&16)V(M,p,W,Q,g,E,S);else if(D&2&&W.class!==Q.class&&s(M,"class",null,Q.class,S),D&4&&s(M,"style",W.style,Q.style,S),D&8){const ye=p.dynamicProps;for(let ve=0;ve{re&&Xe(re,g,p,h),J&&at(p,h,g,"updated")},E)},A=(h,p,g,E,S,R,B)=>{for(let M=0;M{if(g!==E){if(g!==we)for(const M in g)!Sn(M)&&!(M in E)&&s(h,M,g[M],null,B,p.children,S,R,Ie);for(const M in E){if(Sn(M))continue;const D=E[M],P=g[M];D!==P&&M!=="value"&&s(h,M,P,D,B,p.children,S,R,Ie)}"value"in E&&s(h,"value",g.value,E.value)}},x=(h,p,g,E,S,R,B,M,D)=>{const P=p.el=h?h.el:a(""),J=p.anchor=h?h.anchor:a("");let{patchFlag:W,dynamicChildren:Q,slotScopeIds:re}=p;re&&(M=M?M.concat(re):re),h==null?(r(P,g,E),r(J,g,E),_(p.children,g,J,S,R,B,M,D)):W>0&&W&64&&Q&&h.dynamicChildren?(A(h.dynamicChildren,Q,g,S,R,B,M),(p.key!=null||S&&p===S.subTree)&&ol(h,p,!0)):K(h,p,g,J,S,R,B,M,D)},$=(h,p,g,E,S,R,B,M,D)=>{p.slotScopeIds=M,h==null?p.shapeFlag&512?S.ctx.activate(p,g,E,B,D):te(p,g,E,S,R,B,D):se(h,p,D)},te=(h,p,g,E,S,R,B)=>{const M=h.component=Dc(h,E,S);if(Vn(h)&&(M.ctx.renderer=H),Fc(M),M.asyncDep){if(S&&S.registerDep(M,O),!h.el){const D=M.subTree=ne(Qe);k(null,D,p,g)}return}O(M,h,p,g,S,R,B)},se=(h,p,g)=>{const E=p.component=h.component;if(Ga(h,p,g))if(E.asyncDep&&!E.asyncResolved){G(E,p,g);return}else E.next=p,Ua(E.update),E.update();else p.el=h.el,E.vnode=p},O=(h,p,g,E,S,R,B)=>{const M=()=>{if(h.isMounted){let{next:J,bu:W,u:Q,parent:re,vnode:ie}=h,ye=J,ve;Ht(h,!1),J?(J.el=ie.el,G(h,J,B)):J=ie,W&&Br(W),(ve=J.props&&J.props.onVnodeBeforeUpdate)&&Xe(ve,re,J,ie),Ht(h,!0);const ke=zr(h),tt=h.subTree;h.subTree=ke,w(tt,ke,f(tt.el),C(tt),h,S,R),J.el=ke.el,ye===null&&Ja(h,ke.el),Q&&Ve(Q,S),(ve=J.props&&J.props.onVnodeUpdated)&&Ve(()=>Xe(ve,re,J,ie),S)}else{let J;const{el:W,props:Q}=p,{bm:re,m:ie,parent:ye}=h,ve=cn(p);if(Ht(h,!1),re&&Br(re),!ve&&(J=Q&&Q.onVnodeBeforeMount)&&Xe(J,ye,p),Ht(h,!0),W&&ae){const ke=()=>{h.subTree=zr(h),ae(W,h.subTree,h,S,null)};ve?p.type.__asyncLoader().then(()=>!h.isUnmounted&&ke()):ke()}else{const ke=h.subTree=zr(h);w(null,ke,g,E,h,S,R),p.el=ke.el}if(ie&&Ve(ie,S),!ve&&(J=Q&&Q.onVnodeMounted)){const ke=p;Ve(()=>Xe(J,ye,ke),S)}(p.shapeFlag&256||ye&&cn(ye.vnode)&&ye.vnode.shapeFlag&256)&&h.a&&Ve(h.a,S),h.isMounted=!0,p=g=E=null}},D=h.effect=new wo(M,()=>Pr(P),h.scope),P=h.update=()=>D.run();P.id=h.uid,Ht(h,!0),P()},G=(h,p,g)=>{p.component=h;const E=h.vnode.props;h.vnode=p,h.next=null,xc(h,p.props,E,g),Sc(h,p.children,g),vn(),ls(),_n()},K=(h,p,g,E,S,R,B,M,D=!1)=>{const P=h&&h.children,J=h?h.shapeFlag:0,W=p.children,{patchFlag:Q,shapeFlag:re}=p;if(Q>0){if(Q&128){Me(P,W,g,E,S,R,B,M,D);return}else if(Q&256){Oe(P,W,g,E,S,R,B,M,D);return}}re&8?(J&16&&Ie(P,S,R),W!==P&&u(g,W)):J&16?re&16?Me(P,W,g,E,S,R,B,M,D):Ie(P,S,R,!0):(J&8&&u(g,""),re&16&&_(W,g,E,S,R,B,M,D))},Oe=(h,p,g,E,S,R,B,M,D)=>{h=h||on,p=p||on;const P=h.length,J=p.length,W=Math.min(P,J);let Q;for(Q=0;QJ?Ie(h,S,R,!0,!1,W):_(p,g,E,S,R,B,M,D,W)},Me=(h,p,g,E,S,R,B,M,D)=>{let P=0;const J=p.length;let W=h.length-1,Q=J-1;for(;P<=W&&P<=Q;){const re=h[P],ie=p[P]=D?Tt(p[P]):nt(p[P]);if(jt(re,ie))w(re,ie,g,null,S,R,B,M,D);else break;P++}for(;P<=W&&P<=Q;){const re=h[W],ie=p[Q]=D?Tt(p[Q]):nt(p[Q]);if(jt(re,ie))w(re,ie,g,null,S,R,B,M,D);else break;W--,Q--}if(P>W){if(P<=Q){const re=Q+1,ie=reQ)for(;P<=W;)De(h[P],S,R,!0),P++;else{const re=P,ie=P,ye=new Map;for(P=ie;P<=Q;P++){const Ye=p[P]=D?Tt(p[P]):nt(p[P]);Ye.key!=null&&ye.set(Ye.key,P)}let ve,ke=0;const tt=Q-ie+1;let Xt=!1,Jo=0;const yn=new Array(tt);for(P=0;P=tt){De(Ye,S,R,!0);continue}let lt;if(Ye.key!=null)lt=ye.get(Ye.key);else for(ve=ie;ve<=Q;ve++)if(yn[ve-ie]===0&&jt(Ye,p[ve])){lt=ve;break}lt===void 0?De(Ye,S,R,!0):(yn[lt-ie]=P+1,lt>=Jo?Jo=lt:Xt=!0,w(Ye,p[lt],g,null,S,R,B,M,D),ke++)}const Qo=Xt?Ac(yn):on;for(ve=Qo.length-1,P=tt-1;P>=0;P--){const Ye=ie+P,lt=p[Ye],Zo=Ye+1{const{el:R,type:B,transition:M,children:D,shapeFlag:P}=h;if(P&6){Ue(h.component.subTree,p,g,E);return}if(P&128){h.suspense.move(p,g,E);return}if(P&64){B.move(h,p,g,H);return}if(B===Ee){r(R,p,g);for(let W=0;WM.enter(R),S);else{const{leave:W,delayLeave:Q,afterLeave:re}=M,ie=()=>r(R,p,g),ye=()=>{W(R,()=>{ie(),re&&re()})};Q?Q(R,ie,ye):ye()}else r(R,p,g)},De=(h,p,g,E=!1,S=!1)=>{const{type:R,props:B,ref:M,children:D,dynamicChildren:P,shapeFlag:J,patchFlag:W,dirs:Q}=h;if(M!=null&&br(M,null,g,h,!0),J&256){p.ctx.deactivate(h);return}const re=J&1&&Q,ie=!cn(h);let ye;if(ie&&(ye=B&&B.onVnodeBeforeUnmount)&&Xe(ye,p,h),J&6)it(h.component,g,E);else{if(J&128){h.suspense.unmount(g,E);return}re&&at(h,null,p,"beforeUnmount"),J&64?h.type.remove(h,p,g,S,H,E):P&&(R!==Ee||W>0&&W&64)?Ie(P,p,g,!1,!0):(R===Ee&&W&384||!S&&J&16)&&Ie(D,p,g),E&&Et(h)}(ie&&(ye=B&&B.onVnodeUnmounted)||re)&&Ve(()=>{ye&&Xe(ye,p,h),re&&at(h,null,p,"unmounted")},g)},Et=h=>{const{type:p,el:g,anchor:E,transition:S}=h;if(p===Ee){wt(g,E);return}if(p===Tn){y(h);return}const R=()=>{o(g),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(h.shapeFlag&1&&S&&!S.persisted){const{leave:B,delayLeave:M}=S,D=()=>B(g,R);M?M(h.el,R,D):D()}else R()},wt=(h,p)=>{let g;for(;h!==p;)g=d(h),o(h),h=g;o(p)},it=(h,p,g)=>{const{bum:E,scope:S,update:R,subTree:B,um:M}=h;E&&Br(E),S.stop(),R&&(R.active=!1,De(B,h,p,g)),M&&Ve(M,p),Ve(()=>{h.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},Ie=(h,p,g,E=!1,S=!1,R=0)=>{for(let B=R;Bh.shapeFlag&6?C(h.component.subTree):h.shapeFlag&128?h.suspense.next():d(h.anchor||h.el),U=(h,p,g)=>{h==null?p._vnode&&De(p._vnode,null,null,!0):w(p._vnode||null,h,p,null,null,null,g),ls(),mr(),p._vnode=h},H={p:w,um:De,m:Ue,r:Et,mt:te,mc:_,pc:K,pbc:A,n:C,o:e};let Y,ae;return t&&([Y,ae]=t(H)),{render:U,hydrate:Y,createApp:Ec(U,Y)}}function Ht({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function rl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ol(e,t,n=!1){const r=e.children,o=t.children;if(Z(r)&&Z(o))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}const Pc=e=>e.__isTeleport,Ee=Symbol.for("v-fgt"),fn=Symbol.for("v-txt"),Qe=Symbol.for("v-cmt"),Tn=Symbol.for("v-stc"),Rn=[];let ot=null;function j(e=!1){Rn.push(ot=e?null:[])}function Oc(){Rn.pop(),ot=Rn[Rn.length-1]||null}let Mn=1;function ys(e){Mn+=e}function sl(e){return e.dynamicChildren=Mn>0?ot||on:null,Oc(),Mn>0&&ot&&ot.push(e),e}function X(e,t,n,r,o,s){return sl(de(e,t,n,r,o,s,!0))}function Te(e,t,n,r,o){return sl(ne(e,t,n,r,o,!0))}function Er(e){return e?e.__v_isVNode===!0:!1}function jt(e,t){return e.type===t.type&&e.key===t.key}const Mr="__vInternal",il=({key:e})=>e??null,ur=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?pe(e)||$e(e)||oe(e)?{i:He,r:e,k:t,f:!!n}:e:null);function de(e,t=null,n=null,r=0,o=null,s=e===Ee?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&il(t),ref:t&&ur(t),scopeId:Bi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:He};return a?($o(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=pe(n)?8:16),Mn>0&&!i&&ot&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&ot.push(l),l}const ne=Ic;function Ic(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Qa)&&(e=Qe),Er(e)){const a=$t(e,t,!0);return n&&$o(a,n),Mn>0&&!s&&ot&&(a.shapeFlag&6?ot[ot.indexOf(e)]=a:ot.push(a)),a.patchFlag|=-2,a}if(Kc(e)&&(e=e.__vccOpts),t){t=$c(t);let{class:a,style:l}=t;a&&!pe(a)&&(t.class=We(a)),xe(l)&&(Oi(l)&&!Z(l)&&(l=Pe({},l)),t.style=Bn(l))}const i=pe(e)?1:Xa(e)?128:Pc(e)?64:xe(e)?4:oe(e)?2:0;return de(e,t,n,r,o,i,s,!0)}function $c(e){return e?Oi(e)||Mr in e?Pe({},e):e:null}function $t(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,a=t?fo(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&il(a),ref:t&&t.ref?n&&o?Z(o)?o.concat(ur(t)):[o,ur(t)]:ur(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ee?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&$t(e.ssContent),ssFallback:e.ssFallback&&$t(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Mt(e=" ",t=0){return ne(fn,null,e,t)}function Mc(e,t){const n=ne(Tn,null,e);return n.staticCount=t,n}function Le(e="",t=!1){return t?(j(),Te(Qe,null,e)):ne(Qe,null,e)}function nt(e){return e==null||typeof e=="boolean"?ne(Qe):Z(e)?ne(Ee,null,e.slice()):typeof e=="object"?Tt(e):ne(fn,null,String(e))}function Tt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:$t(e)}function $o(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Z(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),$o(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Mr in t)?t._ctx=He:o===3&&He&&(He.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else oe(t)?(t={default:t,_ctx:He},n=32):(t=String(t),r&64?(n=16,t=[Mt(t)]):n=8);e.children=t,e.shapeFlag|=n}function fo(...e){const t={};for(let n=0;nRe||He;let No,en,bs="__VUE_INSTANCE_SETTERS__";(en=eo()[bs])||(en=eo()[bs]=[]),en.push(e=>Re=e),No=e=>{en.length>1?en.forEach(t=>t(e)):en[0](e)};const dn=e=>{No(e),e.scope.on()},qt=()=>{Re&&Re.scope.off(),No(null)};function ll(e){return e.vnode.shapeFlag&4}let hn=!1;function Fc(e,t=!1){hn=t;const{props:n,children:r}=e.vnode,o=ll(e);wc(e,n,o,t),Lc(e,r);const s=o?Bc(e,t):void 0;return hn=!1,s}function Bc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ii(new Proxy(e.ctx,pc));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?jc(e):null;dn(e),vn();const s=Pt(r,e,0,[e.props,o]);if(_n(),qt(),mi(s)){if(s.then(qt,qt),t)return s.then(i=>{Es(e,i,t)}).catch(i=>{Un(i,e,0)});e.asyncDep=s}else Es(e,s,t)}else al(e,t)}function Es(e,t,n){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:xe(t)&&(e.setupState=Mi(t)),al(e,n)}let ws;function al(e,t,n){const r=e.type;if(!e.render){if(!t&&ws&&!r.render){const o=r.template||Oo(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=Pe(Pe({isCustomElement:s,delimiters:a},i),l);r.render=ws(o,c)}}e.render=r.render||ut}{dn(e),vn();try{mc(e)}finally{_n(),qt()}}}function zc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return qe(e,"get","$attrs"),t[n]}}))}function jc(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return zc(e)},slots:e.slots,emit:e.emit,expose:t}}function Nr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Mi(Ii(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in kn)return kn[n](e)},has(t,n){return n in t||n in kn}}))}function Uc(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Kc(e){return oe(e)&&"__vccOpts"in e}const z=(e,t)=>Ba(e,t,hn);function le(e,t,n){const r=arguments.length;return r===2?xe(t)&&!Z(t)?Er(t)?ne(e,null,[t]):ne(e,t):ne(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Er(n)&&(n=[n]),ne(e,t,n))}const Vc=Symbol.for("v-scx"),Wc=()=>Se(Vc),qc="3.3.8",Yc="http://www.w3.org/2000/svg",Ut=typeof document<"u"?document:null,xs=Ut&&Ut.createElement("template"),Gc={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?Ut.createElementNS(Yc,e):Ut.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ut.createTextNode(e),createComment:e=>Ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ut.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{xs.innerHTML=r?`${e}`:e;const a=xs.content;if(r){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Lt="transition",bn="animation",Nn=Symbol("_vtc"),qn=(e,{slots:t})=>le(rc,Jc(e),t);qn.displayName="Transition";const cl={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};qn.props=Pe({},Vi,cl);const Dt=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Cs=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Jc(e){const t={};for(const x in e)x in cl||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=i,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,b=Qc(o),w=b&&b[0],L=b&&b[1],{onBeforeEnter:k,onEnter:T,onEnterCancelled:v,onLeave:y,onLeaveCancelled:F,onBeforeAppear:q=k,onAppear:N=T,onAppearCancelled:_=v}=t,I=(x,$,te)=>{Ft(x,$?u:a),Ft(x,$?c:i),te&&te()},A=(x,$)=>{x._isLeaving=!1,Ft(x,f),Ft(x,m),Ft(x,d),$&&$()},V=x=>($,te)=>{const se=x?N:T,O=()=>I($,x,te);Dt(se,[$,O]),Ls(()=>{Ft($,x?l:s),St($,x?u:a),Cs(se)||Ss($,r,w,O)})};return Pe(t,{onBeforeEnter(x){Dt(k,[x]),St(x,s),St(x,i)},onBeforeAppear(x){Dt(q,[x]),St(x,l),St(x,c)},onEnter:V(!1),onAppear:V(!0),onLeave(x,$){x._isLeaving=!0;const te=()=>A(x,$);St(x,f),eu(),St(x,d),Ls(()=>{x._isLeaving&&(Ft(x,f),St(x,m),Cs(y)||Ss(x,r,L,te))}),Dt(y,[x,te])},onEnterCancelled(x){I(x,!1),Dt(v,[x])},onAppearCancelled(x){I(x,!0),Dt(_,[x])},onLeaveCancelled(x){A(x),Dt(F,[x])}})}function Qc(e){if(e==null)return null;if(xe(e))return[Vr(e.enter),Vr(e.leave)];{const t=Vr(e);return[t,t]}}function Vr(e){return na(e)}function St(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Nn]||(e[Nn]=new Set)).add(t)}function Ft(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Nn];n&&(n.delete(t),n.size||(e[Nn]=void 0))}function Ls(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Zc=0;function Ss(e,t,n,r){const o=e._endId=++Zc,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=Xc(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=m=>{m.target===e&&++u>=l&&f()};setTimeout(()=>{u(n[b]||"").split(", "),o=r(`${Lt}Delay`),s=r(`${Lt}Duration`),i=ks(o,s),a=r(`${bn}Delay`),l=r(`${bn}Duration`),c=ks(a,l);let u=null,f=0,d=0;t===Lt?i>0&&(u=Lt,f=i,d=s.length):t===bn?c>0&&(u=bn,f=c,d=l.length):(f=Math.max(i,c),u=f>0?i>c?Lt:bn:null,d=u?u===Lt?s.length:l.length:0);const m=u===Lt&&/\b(transform|all)(,|$)/.test(r(`${Lt}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function ks(e,t){for(;e.lengthTs(n)+Ts(e[r])))}function Ts(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function eu(){return document.body.offsetHeight}function tu(e,t,n){const r=e[Nn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ho=Symbol("_vod"),wr={beforeMount(e,{value:t},{transition:n}){e[Ho]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):En(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),En(e,!0),r.enter(e)):r.leave(e,()=>{En(e,!1)}):En(e,t))},beforeUnmount(e,{value:t}){En(e,t)}};function En(e,t){e.style.display=t?e[Ho]:"none"}function nu(e,t,n){const r=e.style,o=pe(n);if(n&&!o){if(t&&!pe(t))for(const s in t)n[s]==null&&ho(r,s,"");for(const s in n)ho(r,s,n[s])}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),Ho in e&&(r.display=s)}}const Rs=/\s*!important$/;function ho(e,t,n){if(Z(n))n.forEach(r=>ho(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=ru(e,t);Rs.test(n)?e.setProperty(Jt(r),n.replace(Rs,""),"important"):e[r]=n}}const As=["Webkit","Moz","ms"],Wr={};function ru(e,t){const n=Wr[t];if(n)return n;let r=ft(t);if(r!=="filter"&&r in e)return Wr[t]=r;r=Tr(r);for(let o=0;oqr||(uu.then(()=>qr=0),qr=Date.now());function du(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;et(hu(r,n.value),t,5,[r])};return n.value=e,n.attached=fu(),n}function hu(e,t){if(Z(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 $s=/^on[a-z]/,pu=(e,t,n,r,o=!1,s,i,a,l)=>{t==="class"?tu(e,r,o):t==="style"?nu(e,n,r):Fn(t)?_o(t)||au(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):mu(e,t,r,o))?su(e,t,r,s,i,a,l):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),ou(e,t,r,o))};function mu(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&$s.test(t)&&oe(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||$s.test(t)&&pe(n)?!1:t in e}const gu={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},vu=(e,t)=>n=>{if(!("key"in n))return;const r=Jt(n.key);if(t.some(o=>o===r||gu[o]===r))return e(n)},_u=Pe({patchProp:pu},Gc);let Yr,Ms=!1;function yu(){return Yr=Ms?Yr:Tc(_u),Ms=!0,Yr}const bu=(...e)=>{const t=yu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Eu(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function Eu(e){return pe(e)?document.querySelector(e):e}const wu="modulepreload",xu=function(e){return"/"+e},Ns={},_e=function(t,n,r){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(s=>{if(s=xu(s),s in Ns)return;Ns[s]=!0;const i=s.endsWith(".css"),a=i?'[rel="stylesheet"]':"";if(!!r)for(let u=o.length-1;u>=0;u--){const f=o[u];if(f.href===s&&(!i||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${a}`))return;const c=document.createElement("link");if(c.rel=i?"stylesheet":wu,i||(c.as="script",c.crossOrigin=""),c.href=s,document.head.appendChild(c),i)return new Promise((u,f)=>{c.addEventListener("load",u),c.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},Cu={"v-8daa1a0e":()=>_e(()=>import("./index.html-tQcrVKVd.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-74457188":()=>_e(()=>import("./index.html-9fYTIma7.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-ba934fd8":()=>_e(()=>import("./index.html-_BzUMnyZ.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-fffb8e28":()=>_e(()=>import("./index.html-mIPCr_qu.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-607376ea":()=>_e(()=>import("./advanced.html-QltpobXN.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-f40d797c":()=>_e(()=>import("./concepts.html-bXMIjlTf.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-fb0f0066":()=>_e(()=>import("./getting-started.html-rmTUm9IU.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-d5fc1798":()=>_e(()=>import("./ht-delays.html-5ziKQeRG.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-0549a6a2":()=>_e(()=>import("./ht-dynamic.html-1SuRYzk0.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5cac6c5c":()=>_e(()=>import("./ht-json.html-INXtboAi.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-1f5d0ae7":()=>_e(()=>import("./ht-regex.html-btTFIkhL.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-d7be191a":()=>_e(()=>import("./installation.html-13nM83rt.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-56beebfd":()=>_e(()=>import("./your-first-imposter.html-t5dvpvCj.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3706649a":()=>_e(()=>import("./404.html-6Yl8cQE3.js"),__vite__mapDeps([])).then(({data:e})=>e)},Lu=JSON.parse('{"base":"/","lang":"en-US","title":"Killgrave","description":"The simplest way to generate your mock servers","head":[["link",{"rel":"icon","href":"img/killgrave.png"}]],"locales":{}}');var Su=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),ku=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=Su(r);t.has(o)||(t.add(o),n.push(r))}),n},Yn=e=>/^(https?:)?\/\//.test(e),Tu=e=>/^[a-z][a-z0-9+.-]*:/.test(e),Do=e=>Object.prototype.toString.call(e)==="[object Object]",ul=e=>e[e.length-1]==="/"?e.slice(0,-1):e,fl=e=>e[0]==="/"?e.slice(1):e,dl=(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"/"};const hl={"v-8daa1a0e":Ke(()=>_e(()=>import("./index.html-jIgMvDZ4.js"),__vite__mapDeps([]))),"v-74457188":Ke(()=>_e(()=>import("./index.html-P364yGk2.js"),__vite__mapDeps([]))),"v-ba934fd8":Ke(()=>_e(()=>import("./index.html-CLGSAmWB.js"),__vite__mapDeps([]))),"v-fffb8e28":Ke(()=>_e(()=>import("./index.html-IYIbccC0.js"),__vite__mapDeps([]))),"v-607376ea":Ke(()=>_e(()=>import("./advanced.html-avBEJl4A.js"),__vite__mapDeps([]))),"v-f40d797c":Ke(()=>_e(()=>import("./concepts.html-g1xN_7-T.js"),__vite__mapDeps([]))),"v-fb0f0066":Ke(()=>_e(()=>import("./getting-started.html-9uYXJoA8.js"),__vite__mapDeps([]))),"v-d5fc1798":Ke(()=>_e(()=>import("./ht-delays.html-LuxVH0ER.js"),__vite__mapDeps([]))),"v-0549a6a2":Ke(()=>_e(()=>import("./ht-dynamic.html-JSz71AUZ.js"),__vite__mapDeps([]))),"v-5cac6c5c":Ke(()=>_e(()=>import("./ht-json.html-91jTj4Ja.js"),__vite__mapDeps([]))),"v-1f5d0ae7":Ke(()=>_e(()=>import("./ht-regex.html-NdAzqI34.js"),__vite__mapDeps([]))),"v-d7be191a":Ke(()=>_e(()=>import("./installation.html-_D7ND1iN.js"),__vite__mapDeps([]))),"v-56beebfd":Ke(()=>_e(()=>import("./your-first-imposter.html-C8xizH02.js"),__vite__mapDeps([]))),"v-3706649a":Ke(()=>_e(()=>import("./404.html-SFz3f4i6.js"),__vite__mapDeps([])))};var Ru=Symbol(""),pl=Symbol(""),Au=jn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),Yt=()=>{const e=Se(pl);if(!e)throw new Error("pageData() is called without provider.");return e},ml=Symbol(""),vt=()=>{const e=Se(ml);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},gl=Symbol(""),Pu=()=>{const e=Se(gl);if(!e)throw new Error("usePageHead() is called without provider.");return e},Ou=Symbol(""),vl=Symbol(""),Iu=()=>{const e=Se(vl);if(!e)throw new Error("usePageLang() is called without provider.");return e},_l=Symbol(""),$u=()=>{const e=Se(_l);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Mu=ge(Cu),Fo=Symbol(""),Gn=()=>{const e=Se(Fo);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},rn=ge(Lu),yl=()=>rn,bl=Symbol(""),Bo=()=>{const e=Se(bl);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Nu=Symbol(""),Hu="Layout",Du="NotFound",ht=zn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Mu.value[e];return await(t==null?void 0:t())??Au},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=pe(t.description)?t.description:n.description,o=[...Z(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return ku(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;pe(r)?n=r:n=Hu}else n=Du;return t[n]},resolveRouteLocale:(e,t)=>dl(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),zo=ce({name:"ClientOnly",setup(e,t){const n=ge(!1);return je(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),Fu=ce({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=Yt(),n=z(()=>hl[e.pageKey||t.value.key]);return()=>n.value?le(n.value):le("div","404 Not Found")}}),Nt=(e={})=>e,jo=e=>Yn(e)?e:`/${fl(e)}`;function El(e,t,n){var r,o,s;t===void 0&&(t=50),n===void 0&&(n={});var i=(r=n.isImmediate)!=null&&r,a=(o=n.callback)!=null&&o,l=n.maxWait,c=Date.now(),u=[];function f(){if(l!==void 0){var m=Date.now()-c;if(m+t>=l)return l-m}return t}var d=function(){var m=[].slice.call(arguments),b=this;return new Promise(function(w,L){var k=i&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,c=Date.now(),!i){var v=e.apply(b,m);a&&a(v),u.forEach(function(y){return(0,y.resolve)(v)}),u=[]}},f()),k){var T=e.apply(b,m);return a&&a(T),w(T)}u.push({resolve:w,reject:L})})};return d.cancel=function(m){s!==void 0&&clearTimeout(s),u.forEach(function(b){return(0,b.reject)(m)}),u=[]},d}/*! + * vue-router v4.2.5 + * (c) 2023 Eduardo San Martin Morote + * @license MIT + */const nn=typeof window<"u";function Bu(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const me=Object.assign;function Gr(e,t){const n={};for(const r in t){const o=t[r];n[r]=st(o)?o.map(e):e(o)}return n}const An=()=>{},st=Array.isArray,zu=/\/$/,ju=e=>e.replace(zu,"");function Jr(e,t,n="/"){let r,o={},s="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,a>-1?a:t.length),o=e(s)),a>-1&&(r=r||t.slice(0,a),i=t.slice(a,t.length)),r=Wu(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:i}}function Uu(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Hs(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Ku(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&pn(t.matched[r],n.matched[o])&&wl(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function pn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function wl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Vu(e[n],t[n]))return!1;return!0}function Vu(e,t){return st(e)?Ds(e,t):st(t)?Ds(t,e):e===t}function Ds(e,t){return st(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function Wu(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,a;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i-(i===r.length?1:0)).join("/")}var Hn;(function(e){e.pop="pop",e.push="push"})(Hn||(Hn={}));var Pn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Pn||(Pn={}));function qu(e){if(!e)if(nn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ju(e)}const Yu=/^[^#]+#/;function Gu(e,t){return e.replace(Yu,"#")+t}function Ju(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 Hr=()=>({left:window.pageXOffset,top:window.pageYOffset});function Qu(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=Ju(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function Fs(e,t){return(history.state?history.state.position-t:-1)+e}const po=new Map;function Zu(e,t){po.set(e,t)}function Xu(e){const t=po.get(e);return po.delete(e),t}let ef=()=>location.protocol+"//"+location.host;function xl(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let a=o.includes(e.slice(s))?e.slice(s).length:1,l=o.slice(a);return l[0]!=="/"&&(l="/"+l),Hs(l,"")}return Hs(n,e)+r+o}function tf(e,t,n,r){let o=[],s=[],i=null;const a=({state:d})=>{const m=xl(e,location),b=n.value,w=t.value;let L=0;if(d){if(n.value=m,t.value=d,i&&i===b){i=null;return}L=w?d.position-w.position:0}else r(m);o.forEach(k=>{k(n.value,b,{delta:L,type:Hn.pop,direction:L?L>0?Pn.forward:Pn.back:Pn.unknown})})};function l(){i=n.value}function c(d){o.push(d);const m=()=>{const b=o.indexOf(d);b>-1&&o.splice(b,1)};return s.push(m),m}function u(){const{history:d}=window;d.state&&d.replaceState(me({},d.state,{scroll:Hr()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:l,listen:c,destroy:f}}function Bs(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Hr():null}}function nf(e){const{history:t,location:n}=window,r={value:xl(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(l,c,u){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:ef()+e+l;try{t[u?"replaceState":"pushState"](c,"",d),o.value=c}catch(m){console.error(m),n[u?"replace":"assign"](d)}}function i(l,c){const u=me({},t.state,Bs(o.value.back,l,o.value.forward,!0),c,{position:o.value.position});s(l,u,!0),r.value=l}function a(l,c){const u=me({},o.value,t.state,{forward:l,scroll:Hr()});s(u.current,u,!0);const f=me({},Bs(r.value,l,null),{position:u.position+1},c);s(l,f,!1),r.value=l}return{location:r,state:o,push:a,replace:i}}function rf(e){e=qu(e);const t=nf(e),n=tf(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=me({location:"",base:e,go:r,createHref:Gu.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 of(e){return typeof e=="string"||e&&typeof e=="object"}function Cl(e){return typeof e=="string"||typeof e=="symbol"}const pt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Ll=Symbol("");var zs;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(zs||(zs={}));function mn(e,t){return me(new Error,{type:e,[Ll]:!0},t)}function dt(e,t){return e instanceof Error&&Ll in e&&(t==null||!!(e.type&t))}const js="[^/]+?",sf={sensitive:!1,strict:!1,start:!0,end:!0},lf=/[.+*?^${}()[\]/\\]/g;function af(e,t){const n=me({},sf,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;ft.length?t.length===1&&t[0]===80?1:-1:0}function uf(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const ff={type:0,value:""},df=/[a-zA-Z0-9_]/;function hf(e){if(!e)return[[]];if(e==="/")return[[ff]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${c}": ${m}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let a=0,l,c="",u="";function f(){c&&(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),c="")}function d(){c+=l}for(;a{i(T)}:An}function i(u){if(Cl(u)){const f=r.get(u);f&&(r.delete(u),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(u);f>-1&&(n.splice(f,1),u.record.name&&r.delete(u.record.name),u.children.forEach(i),u.alias.forEach(i))}}function a(){return n}function l(u){let f=0;for(;f=0&&(u.record.path!==n[f].record.path||!Sl(u,n[f]));)f++;n.splice(f,0,u),u.record.name&&!Vs(u)&&r.set(u.record.name,u)}function c(u,f){let d,m={},b,w;if("name"in u&&u.name){if(d=r.get(u.name),!d)throw mn(1,{location:u});w=d.record.name,m=me(Ks(f.params,d.keys.filter(T=>!T.optional).map(T=>T.name)),u.params&&Ks(u.params,d.keys.map(T=>T.name))),b=d.stringify(m)}else if("path"in u)b=u.path,d=n.find(T=>T.re.test(b)),d&&(m=d.parse(b),w=d.record.name);else{if(d=f.name?r.get(f.name):n.find(T=>T.re.test(f.path)),!d)throw mn(1,{location:u,currentLocation:f});w=d.record.name,m=me({},f.params,u.params),b=d.stringify(m)}const L=[];let k=d;for(;k;)L.unshift(k.record),k=k.parent;return{name:w,path:b,params:m,matched:L,meta:_f(L)}}return e.forEach(u=>s(u)),{addRoute:s,resolve:c,removeRoute:i,getRoutes:a,getRecordMatcher:o}}function Ks(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function gf(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:vf(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function vf(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 Vs(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function _f(e){return e.reduce((t,n)=>me(t,n.meta),{})}function Ws(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Sl(e,t){return t.children.some(n=>n===e||Sl(e,n))}const kl=/#/g,yf=/&/g,bf=/\//g,Ef=/=/g,wf=/\?/g,Tl=/\+/g,xf=/%5B/g,Cf=/%5D/g,Rl=/%5E/g,Lf=/%60/g,Al=/%7B/g,Sf=/%7C/g,Pl=/%7D/g,kf=/%20/g;function Uo(e){return encodeURI(""+e).replace(Sf,"|").replace(xf,"[").replace(Cf,"]")}function Tf(e){return Uo(e).replace(Al,"{").replace(Pl,"}").replace(Rl,"^")}function mo(e){return Uo(e).replace(Tl,"%2B").replace(kf,"+").replace(kl,"%23").replace(yf,"%26").replace(Lf,"`").replace(Al,"{").replace(Pl,"}").replace(Rl,"^")}function Rf(e){return mo(e).replace(Ef,"%3D")}function Af(e){return Uo(e).replace(kl,"%23").replace(wf,"%3F")}function Pf(e){return e==null?"":Af(e).replace(bf,"%2F")}function xr(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Of(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&mo(s)):[r&&mo(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function If(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=st(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const $f=Symbol(""),Ys=Symbol(""),Dr=Symbol(""),Ko=Symbol(""),go=Symbol("");function wn(){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 Rt(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,a)=>{const l=f=>{f===!1?a(mn(4,{from:n,to:t})):f instanceof Error?a(f):of(f)?a(mn(2,{from:t,to:f})):(s&&r.enterCallbacks[o]===s&&typeof f=="function"&&s.push(f),i())},c=e.call(r&&r.instances[o],t,n,l);let u=Promise.resolve(c);e.length<3&&(u=u.then(l)),u.catch(f=>a(f))})}function Qr(e,t,n,r){const o=[];for(const s of e)for(const i in s.components){let a=s.components[i];if(!(t!=="beforeRouteEnter"&&!s.instances[i]))if(Mf(a)){const c=(a.__vccOpts||a)[t];c&&o.push(Rt(c,n,r,s,i))}else{let l=a();o.push(()=>l.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${i}" at "${s.path}"`));const u=Bu(c)?c.default:c;s.components[i]=u;const d=(u.__vccOpts||u)[t];return d&&Rt(d,n,r,s,i)()}))}}return o}function Mf(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Gs(e){const t=Se(Dr),n=Se(Ko),r=z(()=>t.resolve(ee(e.to))),o=z(()=>{const{matched:l}=r.value,{length:c}=l,u=l[c-1],f=n.matched;if(!u||!f.length)return-1;const d=f.findIndex(pn.bind(null,u));if(d>-1)return d;const m=Js(l[c-2]);return c>1&&Js(u)===m&&f[f.length-1].path!==m?f.findIndex(pn.bind(null,l[c-2])):d}),s=z(()=>o.value>-1&&Ff(n.params,r.value.params)),i=z(()=>o.value>-1&&o.value===n.matched.length-1&&wl(n.params,r.value.params));function a(l={}){return Df(l)?t[ee(e.replace)?"replace":"push"](ee(e.to)).catch(An):Promise.resolve()}return{route:r,href:z(()=>r.value.href),isActive:s,isExactActive:i,navigate:a}}const Nf=ce({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:Gs,setup(e,{slots:t}){const n=zn(Gs(e)),{options:r}=Se(Dr),o=z(()=>({[Qs(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Qs(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:le("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Hf=Nf;function Df(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 Ff(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(!st(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Js(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Qs=(e,t,n)=>e??t??n,Bf=ce({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Se(go),o=z(()=>e.route||r.value),s=Se(Ys,0),i=z(()=>{let c=ee(s);const{matched:u}=o.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),a=z(()=>o.value.matched[i.value]);Wt(Ys,z(()=>i.value+1)),Wt($f,a),Wt(go,o);const l=ge();return Je(()=>[l.value,a.value,e.name],([c,u,f],[d,m,b])=>{u&&(u.instances[f]=c,m&&m!==u&&c&&c===d&&(u.leaveGuards.size||(u.leaveGuards=m.leaveGuards),u.updateGuards.size||(u.updateGuards=m.updateGuards))),c&&u&&(!m||!pn(u,m)||!d)&&(u.enterCallbacks[f]||[]).forEach(w=>w(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,f=a.value,d=f&&f.components[u];if(!d)return Zs(n.default,{Component:d,route:c});const m=f.props[u],b=m?m===!0?c.params:typeof m=="function"?m(c):m:null,L=le(d,me({},b,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(f.instances[u]=null)},ref:l}));return Zs(n.default,{Component:L,route:c})||L}}});function Zs(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Ol=Bf;function zf(e){const t=mf(e.routes,e),n=e.parseQuery||Of,r=e.stringifyQuery||qs,o=e.history,s=wn(),i=wn(),a=wn(),l=Ro(pt);let c=pt;nn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=Gr.bind(null,C=>""+C),f=Gr.bind(null,Pf),d=Gr.bind(null,xr);function m(C,U){let H,Y;return Cl(C)?(H=t.getRecordMatcher(C),Y=U):Y=C,t.addRoute(Y,H)}function b(C){const U=t.getRecordMatcher(C);U&&t.removeRoute(U)}function w(){return t.getRoutes().map(C=>C.record)}function L(C){return!!t.getRecordMatcher(C)}function k(C,U){if(U=me({},U||l.value),typeof C=="string"){const g=Jr(n,C,U.path),E=t.resolve({path:g.path},U),S=o.createHref(g.fullPath);return me(g,E,{params:d(E.params),hash:xr(g.hash),redirectedFrom:void 0,href:S})}let H;if("path"in C)H=me({},C,{path:Jr(n,C.path,U.path).path});else{const g=me({},C.params);for(const E in g)g[E]==null&&delete g[E];H=me({},C,{params:f(g)}),U.params=f(U.params)}const Y=t.resolve(H,U),ae=C.hash||"";Y.params=u(d(Y.params));const h=Uu(r,me({},C,{hash:Tf(ae),path:Y.path})),p=o.createHref(h);return me({fullPath:h,hash:ae,query:r===qs?If(C.query):C.query||{}},Y,{redirectedFrom:void 0,href:p})}function T(C){return typeof C=="string"?Jr(n,C,l.value.path):me({},C)}function v(C,U){if(c!==C)return mn(8,{from:U,to:C})}function y(C){return N(C)}function F(C){return y(me(T(C),{replace:!0}))}function q(C){const U=C.matched[C.matched.length-1];if(U&&U.redirect){const{redirect:H}=U;let Y=typeof H=="function"?H(C):H;return typeof Y=="string"&&(Y=Y.includes("?")||Y.includes("#")?Y=T(Y):{path:Y},Y.params={}),me({query:C.query,hash:C.hash,params:"path"in Y?{}:C.params},Y)}}function N(C,U){const H=c=k(C),Y=l.value,ae=C.state,h=C.force,p=C.replace===!0,g=q(H);if(g)return N(me(T(g),{state:typeof g=="object"?me({},ae,g.state):ae,force:h,replace:p}),U||H);const E=H;E.redirectedFrom=U;let S;return!h&&Ku(r,Y,H)&&(S=mn(16,{to:E,from:Y}),Ue(Y,Y,!0,!1)),(S?Promise.resolve(S):A(E,Y)).catch(R=>dt(R)?dt(R,2)?R:Me(R):K(R,E,Y)).then(R=>{if(R){if(dt(R,2))return N(me({replace:p},T(R.to),{state:typeof R.to=="object"?me({},ae,R.to.state):ae,force:h}),U||E)}else R=x(E,Y,!0,p,ae);return V(E,Y,R),R})}function _(C,U){const H=v(C,U);return H?Promise.reject(H):Promise.resolve()}function I(C){const U=wt.values().next().value;return U&&typeof U.runWithContext=="function"?U.runWithContext(C):C()}function A(C,U){let H;const[Y,ae,h]=jf(C,U);H=Qr(Y.reverse(),"beforeRouteLeave",C,U);for(const g of Y)g.leaveGuards.forEach(E=>{H.push(Rt(E,C,U))});const p=_.bind(null,C,U);return H.push(p),Ie(H).then(()=>{H=[];for(const g of s.list())H.push(Rt(g,C,U));return H.push(p),Ie(H)}).then(()=>{H=Qr(ae,"beforeRouteUpdate",C,U);for(const g of ae)g.updateGuards.forEach(E=>{H.push(Rt(E,C,U))});return H.push(p),Ie(H)}).then(()=>{H=[];for(const g of h)if(g.beforeEnter)if(st(g.beforeEnter))for(const E of g.beforeEnter)H.push(Rt(E,C,U));else H.push(Rt(g.beforeEnter,C,U));return H.push(p),Ie(H)}).then(()=>(C.matched.forEach(g=>g.enterCallbacks={}),H=Qr(h,"beforeRouteEnter",C,U),H.push(p),Ie(H))).then(()=>{H=[];for(const g of i.list())H.push(Rt(g,C,U));return H.push(p),Ie(H)}).catch(g=>dt(g,8)?g:Promise.reject(g))}function V(C,U,H){a.list().forEach(Y=>I(()=>Y(C,U,H)))}function x(C,U,H,Y,ae){const h=v(C,U);if(h)return h;const p=U===pt,g=nn?history.state:{};H&&(Y||p?o.replace(C.fullPath,me({scroll:p&&g&&g.scroll},ae)):o.push(C.fullPath,ae)),l.value=C,Ue(C,U,H,p),Me()}let $;function te(){$||($=o.listen((C,U,H)=>{if(!it.listening)return;const Y=k(C),ae=q(Y);if(ae){N(me(ae,{replace:!0}),Y).catch(An);return}c=Y;const h=l.value;nn&&Zu(Fs(h.fullPath,H.delta),Hr()),A(Y,h).catch(p=>dt(p,12)?p:dt(p,2)?(N(p.to,Y).then(g=>{dt(g,20)&&!H.delta&&H.type===Hn.pop&&o.go(-1,!1)}).catch(An),Promise.reject()):(H.delta&&o.go(-H.delta,!1),K(p,Y,h))).then(p=>{p=p||x(Y,h,!1),p&&(H.delta&&!dt(p,8)?o.go(-H.delta,!1):H.type===Hn.pop&&dt(p,20)&&o.go(-1,!1)),V(Y,h,p)}).catch(An)}))}let se=wn(),O=wn(),G;function K(C,U,H){Me(C);const Y=O.list();return Y.length?Y.forEach(ae=>ae(C,U,H)):console.error(C),Promise.reject(C)}function Oe(){return G&&l.value!==pt?Promise.resolve():new Promise((C,U)=>{se.add([C,U])})}function Me(C){return G||(G=!C,te(),se.list().forEach(([U,H])=>C?H(C):U()),se.reset()),C}function Ue(C,U,H,Y){const{scrollBehavior:ae}=e;if(!nn||!ae)return Promise.resolve();const h=!H&&Xu(Fs(C.fullPath,0))||(Y||!H)&&history.state&&history.state.scroll||null;return Kn().then(()=>ae(C,U,h)).then(p=>p&&Qu(p)).catch(p=>K(p,C,U))}const De=C=>o.go(C);let Et;const wt=new Set,it={currentRoute:l,listening:!0,addRoute:m,removeRoute:b,hasRoute:L,getRoutes:w,resolve:k,options:e,push:y,replace:F,go:De,back:()=>De(-1),forward:()=>De(1),beforeEach:s.add,beforeResolve:i.add,afterEach:a.add,onError:O.add,isReady:Oe,install(C){const U=this;C.component("RouterLink",Hf),C.component("RouterView",Ol),C.config.globalProperties.$router=U,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>ee(l)}),nn&&!Et&&l.value===pt&&(Et=!0,y(o.location).catch(ae=>{}));const H={};for(const ae in pt)Object.defineProperty(H,ae,{get:()=>l.value[ae],enumerable:!0});C.provide(Dr,U),C.provide(Ko,Pi(H)),C.provide(go,l);const Y=C.unmount;wt.add(C),C.unmount=function(){wt.delete(C),wt.size<1&&(c=pt,$&&$(),$=null,l.value=pt,Et=!1,G=!1),Y()}}};function Ie(C){return C.reduce((U,H)=>U.then(()=>I(H)),Promise.resolve())}return it}function jf(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;ipn(c,a))?r.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(c=>pn(c,l))||o.push(l))}return[n,r,o]}function Qt(){return Se(Dr)}function Zt(){return Se(Ko)}const Uf=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=Qt(),i=El(()=>{var w,L;const a=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(a-0)d.some(T=>T.hash===k.hash));for(let k=0;k=(((w=T.parentElement)==null?void 0:w.offsetTop)??0)-r,F=!v||a<(((L=v.parentElement)==null?void 0:L.offsetTop)??0)-r;if(!(y&&F))continue;const N=decodeURIComponent(o.currentRoute.value.hash),_=decodeURIComponent(T.hash);if(N===_)return;if(f){for(let I=k+1;I{window.addEventListener("scroll",i)}),Wn(()=>{window.removeEventListener("scroll",i)})},Xs=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t}).finally(()=>e.options.scrollBehavior=n)},Kf="a.sidebar-item",Vf=".header-anchor",Wf=300,qf=5,Yf=Nt({setup(){Uf({headerLinkSelector:Kf,headerAnchorSelector:Vf,delay:Wf,offset:qf})}}),ei=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Gf=()=>window.scrollTo({top:0,behavior:"smooth"}),Jf=ce({name:"BackToTop",setup(){const e=ge(0),t=z(()=>e.value>300),n=El(()=>{e.value=ei()},100);je(()=>{e.value=ei(),window.addEventListener("scroll",()=>n())});const r=le("div",{class:"back-to-top",onClick:Gf});return()=>le(qn,{name:"back-to-top"},()=>t.value?r:null)}}),Qf=Nt({rootComponents:[Jf]}),Zf=le("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[le("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),le("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Xf=ce({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Gn(),n=z(()=>e.locales[t.value]??{openInNewWindow:"open in new window"});return()=>le("span",[Zf,le("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}});var ed={"/":{openInNewWindow:"open in new window"}};const td=ed,nd=Nt({enhance({app:e}){e.component("ExternalLinkIcon",le(Xf,{locales:td}))}});/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var Bt=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(x){function $(){}x($,$)},o=function(x){var $=x.target;if($===I){b();return}v.indexOf($)!==-1&&w({target:$})},s=function(){if(!(F||!_.original)){var x=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(q-x)>N.scrollOffset&&setTimeout(b,150)}},i=function(x){var $=x.key||x.keyCode;($==="Escape"||$==="Esc"||$===27)&&b()},a=function(){var x=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},$=x;if(x.background&&(I.style.background=x.background),x.container&&x.container instanceof Object&&($.container=Bt({},N.container,x.container)),x.template){var te=fr(x.template)?x.template:document.querySelector(x.template);$.template=te}return N=Bt({},N,$),v.forEach(function(se){se.dispatchEvent(tn("medium-zoom:update",{detail:{zoom:A}}))}),A},l=function(){var x=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Bt({},N,x))},c=function(){for(var x=arguments.length,$=Array(x),te=0;te0?$.reduce(function(O,G){return[].concat(O,ni(G))},[]):v;return se.forEach(function(O){O.classList.remove("medium-zoom-image"),O.dispatchEvent(tn("medium-zoom:detach",{detail:{zoom:A}}))}),v=v.filter(function(O){return se.indexOf(O)===-1}),A},f=function(x,$){var te=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return v.forEach(function(se){se.addEventListener("medium-zoom:"+x,$,te)}),y.push({type:"medium-zoom:"+x,listener:$,options:te}),A},d=function(x,$){var te=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return v.forEach(function(se){se.removeEventListener("medium-zoom:"+x,$,te)}),y=y.filter(function(se){return!(se.type==="medium-zoom:"+x&&se.listener.toString()===$.toString())}),A},m=function(){var x=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},$=x.target,te=function(){var O={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},G=void 0,K=void 0;if(N.container)if(N.container instanceof Object)O=Bt({},O,N.container),G=O.width-O.left-O.right-N.margin*2,K=O.height-O.top-O.bottom-N.margin*2;else{var Oe=fr(N.container)?N.container:document.querySelector(N.container),Me=Oe.getBoundingClientRect(),Ue=Me.width,De=Me.height,Et=Me.left,wt=Me.top;O=Bt({},O,{width:Ue,height:De,left:Et,top:wt})}G=G||O.width-N.margin*2,K=K||O.height-N.margin*2;var it=_.zoomedHd||_.original,Ie=ti(it)?G:it.naturalWidth||G,C=ti(it)?K:it.naturalHeight||K,U=it.getBoundingClientRect(),H=U.top,Y=U.left,ae=U.width,h=U.height,p=Math.min(Math.max(ae,Ie),G)/ae,g=Math.min(Math.max(h,C),K)/h,E=Math.min(p,g),S=(-Y+(G-ae)/2+N.margin+O.left)/E,R=(-H+(K-h)/2+N.margin+O.top)/E,B="scale("+E+") translate3d("+S+"px, "+R+"px, 0)";_.zoomed.style.transform=B,_.zoomedHd&&(_.zoomedHd.style.transform=B)};return new r(function(se){if($&&v.indexOf($)===-1){se(A);return}var O=function Ue(){F=!1,_.zoomed.removeEventListener("transitionend",Ue),_.original.dispatchEvent(tn("medium-zoom:opened",{detail:{zoom:A}})),se(A)};if(_.zoomed){se(A);return}if($)_.original=$;else if(v.length>0){var G=v;_.original=G[0]}else{se(A);return}if(_.original.dispatchEvent(tn("medium-zoom:open",{detail:{zoom:A}})),q=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,F=!0,_.zoomed=sd(_.original),document.body.appendChild(I),N.template){var K=fr(N.template)?N.template:document.querySelector(N.template);_.template=document.createElement("div"),_.template.appendChild(K.content.cloneNode(!0)),document.body.appendChild(_.template)}if(_.original.parentElement&&_.original.parentElement.tagName==="PICTURE"&&_.original.currentSrc&&(_.zoomed.src=_.original.currentSrc),document.body.appendChild(_.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),_.original.classList.add("medium-zoom-image--hidden"),_.zoomed.classList.add("medium-zoom-image--opened"),_.zoomed.addEventListener("click",b),_.zoomed.addEventListener("transitionend",O),_.original.getAttribute("data-zoom-src")){_.zoomedHd=_.zoomed.cloneNode(),_.zoomedHd.removeAttribute("srcset"),_.zoomedHd.removeAttribute("sizes"),_.zoomedHd.removeAttribute("loading"),_.zoomedHd.src=_.zoomed.getAttribute("data-zoom-src"),_.zoomedHd.onerror=function(){clearInterval(Oe),console.warn("Unable to reach the zoom image target "+_.zoomedHd.src),_.zoomedHd=null,te()};var Oe=setInterval(function(){_.zoomedHd.complete&&(clearInterval(Oe),_.zoomedHd.classList.add("medium-zoom-image--opened"),_.zoomedHd.addEventListener("click",b),document.body.appendChild(_.zoomedHd),te())},10)}else if(_.original.hasAttribute("srcset")){_.zoomedHd=_.zoomed.cloneNode(),_.zoomedHd.removeAttribute("sizes"),_.zoomedHd.removeAttribute("loading");var Me=_.zoomedHd.addEventListener("load",function(){_.zoomedHd.removeEventListener("load",Me),_.zoomedHd.classList.add("medium-zoom-image--opened"),_.zoomedHd.addEventListener("click",b),document.body.appendChild(_.zoomedHd),te()})}else te()})},b=function(){return new r(function(x){if(F||!_.original){x(A);return}var $=function te(){_.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(_.zoomed),_.zoomedHd&&document.body.removeChild(_.zoomedHd),document.body.removeChild(I),_.zoomed.classList.remove("medium-zoom-image--opened"),_.template&&document.body.removeChild(_.template),F=!1,_.zoomed.removeEventListener("transitionend",te),_.original.dispatchEvent(tn("medium-zoom:closed",{detail:{zoom:A}})),_.original=null,_.zoomed=null,_.zoomedHd=null,_.template=null,x(A)};F=!0,document.body.classList.remove("medium-zoom--opened"),_.zoomed.style.transform="",_.zoomedHd&&(_.zoomedHd.style.transform=""),_.template&&(_.template.style.transition="opacity 150ms",_.template.style.opacity=0),_.original.dispatchEvent(tn("medium-zoom:close",{detail:{zoom:A}})),_.zoomed.addEventListener("transitionend",$)})},w=function(){var x=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},$=x.target;return _.original?b():m({target:$})},L=function(){return N},k=function(){return v},T=function(){return _.original},v=[],y=[],F=!1,q=0,N=n,_={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?N=t:(t||typeof t=="string")&&c(t),N=Bt({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},N);var I=od(N.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",s),window.addEventListener("resize",b);var A={open:m,close:b,toggle:w,update:a,clone:l,attach:c,detach:u,on:f,off:d,getOptions:L,getImages:k,getZoomedImage:T};return A};function ld(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var ad=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";ld(ad);const cd=id,ud=Symbol("mediumZoom");var fd={};const dd=".theme-default-content > img, .theme-default-content :not(a) > img",hd=fd,pd=300,md=Nt({enhance({app:e,router:t}){const n=cd(hd);n.refresh=(r=dd)=>{n.detach(),n.attach(r)},e.provide(ud,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),pd)})}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const ue={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=ue.isStarted();e=Zr(e,ue.settings.minimum,1),ue.status=e===1?null:e;const n=ue.render(!t),r=n.querySelector(ue.settings.barSelector),o=ue.settings.speed,s=ue.settings.easing;return n.offsetWidth,gd(i=>{ir(r,{transform:"translate3d("+ri(e)+"%,0,0)",transition:"all "+o+"ms "+s}),e===1?(ir(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){ir(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){ue.remove(),i()},o)},o)):setTimeout(()=>i(),o)}),ue},isStarted:()=>typeof ue.status=="number",start:()=>{ue.status||ue.set(0);const e=()=>{setTimeout(()=>{ue.status&&(ue.trickle(),e())},ue.settings.trickleSpeed)};return ue.settings.trickle&&e(),ue},done:e=>!e&&!ue.status?ue:ue.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ue.status;return t?(typeof e!="number"&&(e=(1-t)*Zr(Math.random()*t,.1,.95)),t=Zr(t+e,0,.994),ue.set(t)):ue.start()},trickle:()=>ue.inc(Math.random()*ue.settings.trickleRate),render:e=>{if(ue.isRendered())return document.getElementById("nprogress");oi(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ue.settings.template;const n=t.querySelector(ue.settings.barSelector),r=e?"-100":ri(ue.status||0),o=document.querySelector(ue.settings.parent);return ir(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&oi(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{si(document.documentElement,"nprogress-busy"),si(document.querySelector(ue.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&vd(e)},isRendered:()=>!!document.getElementById("nprogress")},Zr=(e,t,n)=>en?n:e,ri=e=>(-1+e)*100,gd=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),ir=function(){const e=["Webkit","O","Moz","ms"],t={};function n(i){return i.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(a,l){return l.toUpperCase()})}function r(i){const a=document.body.style;if(i in a)return i;let l=e.length;const c=i.charAt(0).toUpperCase()+i.slice(1);let u;for(;l--;)if(u=e[l]+c,u in a)return u;return i}function o(i){return i=n(i),t[i]??(t[i]=r(i))}function s(i,a,l){a=o(a),i.style[a]=l}return function(i,a){for(const l in a){const c=a[l];c!==void 0&&Object.prototype.hasOwnProperty.call(a,l)&&s(i,l,c)}}}(),Il=(e,t)=>(typeof e=="string"?e:Vo(e)).indexOf(" "+t+" ")>=0,oi=(e,t)=>{const n=Vo(e),r=n+t;Il(n,t)||(e.className=r.substring(1))},si=(e,t)=>{const n=Vo(e);if(!Il(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},Vo=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),vd=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},_d=()=>{je(()=>{const e=Qt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ue.start()}),e.afterEach(n=>{t.add(n.path),ue.done()})})},yd=Nt({setup(){_d()}}),bd=JSON.parse(`{"logo":"img/killgrave.png","repo":"friendsofgo/killgrave","docsBranch":"main","docsDir":"docs","editLinkPattern":":repo/edit/:branch/:path","navbar":[{"text":"Get started","link":"/guide/"},{"text":"CLI","link":"/cli/"},{"text":"Config Reference","link":"/config/"}],"sidebar":{"/guide/":[{"text":"Introduction","link":"/guide/","children":["/guide/concepts.md","/guide/installation.md"]},{"text":"Using Killgrave","link":"/guide/getting-started.md","children":["/guide/getting-started.md","/guide/your-first-imposter.md","/guide/advanced.md"]},{"text":"How to...?","link":"/guide/ht-regex.md","children":["/guide/ht-regex.md","/guide/ht-json.md","/guide/ht-delays.md","/guide/ht-dynamic.md"]}]},"locales":{"/":{"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","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"}`),Ed=ge(bd),$l=()=>Ed,Ml=Symbol(""),wd=()=>{const e=Se(Ml);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},xd=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Cd=Nt({enhance({app:e}){const t=$l(),n=e._context.provides[Fo],r=z(()=>xd(t.value,n.value));e.provide(Ml,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),Ld=ce({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(j(),X("span",{class:We(["badge",e.type]),style:Bn({verticalAlign:e.vertical})},[be(t.$slots,"default",{},()=>[Mt(Ae(e.text),1)])],6))}}),Ce=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},Sd=Ce(Ld,[["__file","Badge.vue"]]);function ii(e,t){var n;const r=Ro();return Ui(()=>{r.value=e()},{...t,flush:(n=t==null?void 0:t.flush)!=null?n:"sync"}),jn(r)}function kd(e,t){let n,r,o;const s=ge(!0),i=()=>{s.value=!0,o()};Je(e,i,{flush:"sync"});const a=typeof t=="function"?t:t.get,l=typeof t=="function"?void 0:t.set,c=Na((u,f)=>(r=u,o=f,{get(){return s.value&&(n=a(),s.value=!1),r(),n},set(d){l==null||l(d)}}));return Object.isExtensible(c)&&(c.trigger=i),c}function Nl(e){return bi()?(fa(e),!0):!1}function gn(e){return typeof e=="function"?e():ee(e)}const Td=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Rd=Object.prototype.toString,Ad=e=>Rd.call(e)==="[object Object]",Pd=()=>{};function Od(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 Hl=e=>e();function Id(e=Hl){const t=ge(!0);function n(){t.value=!1}function r(){t.value=!0}const o=(...s)=>{t.value&&e(...s)};return{isActive:jn(t),pause:n,resume:r,eventFilter:o}}function $d(e,t,n={}){const{eventFilter:r=Hl,...o}=n;return Je(e,Od(r,t),o)}function Md(e,t,n={}){const{eventFilter:r,...o}=n,{eventFilter:s,pause:i,resume:a,isActive:l}=Id(r);return{stop:$d(e,t,{...o,eventFilter:s}),pause:i,resume:a,isActive:l}}function Nd(e,t=!0){Mo()?je(e):t?e():Kn(e)}function Hd(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=$e(e),s=ge(e);function i(a){if(arguments.length)return s.value=a,s.value;{const l=gn(n);return s.value=s.value===l?gn(r):l,s.value}}return o?i:[s,i]}function Dd(e){var t;const n=gn(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Cr=Td?window:void 0;function li(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=Cr):[t,n,r,o]=e,!t)return Pd;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(u=>u()),s.length=0},a=(u,f,d,m)=>(u.addEventListener(f,d,m),()=>u.removeEventListener(f,d,m)),l=Je(()=>[Dd(t),gn(o)],([u,f])=>{if(i(),!u)return;const d=Ad(f)?{...f}:f;s.push(...n.flatMap(m=>r.map(b=>a(u,m,b,d))))},{immediate:!0,flush:"post"}),c=()=>{l(),i()};return Nl(c),c}function Fd(){const e=ge(!1);return Mo()&&je(()=>{e.value=!0}),e}function Bd(e){const t=Fd();return z(()=>(t.value,!!e()))}function zd(e,t={}){const{window:n=Cr}=t,r=Bd(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const s=ge(!1),i=c=>{s.value=c.matches},a=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",i):o.removeListener(i))},l=Ui(()=>{r.value&&(a(),o=n.matchMedia(gn(e)),"addEventListener"in o?o.addEventListener("change",i):o.addListener(i),s.value=o.matches)});return Nl(()=>{l(),a(),o=void 0}),s}const lr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ar="__vueuse_ssr_handlers__",jd=Ud();function Ud(){return ar in lr||(lr[ar]=lr[ar]||{}),lr[ar]}function Kd(e,t){return jd[e]||t}function Vd(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 Wd={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()}},ai="vueuse-storage";function Dl(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:a=!0,writeDefaults:l=!0,mergeDefaults:c=!1,shallow:u,window:f=Cr,eventFilter:d,onError:m=I=>{console.error(I)},initOnMounted:b}=r,w=(u?Ro:ge)(typeof t=="function"?t():t);if(!n)try{n=Kd("getDefaultStorage",()=>{var I;return(I=Cr)==null?void 0:I.localStorage})()}catch(I){m(I)}if(!n)return w;const L=gn(t),k=Vd(L),T=(o=r.serializer)!=null?o:Wd[k],{pause:v,resume:y}=Md(w,()=>F(w.value),{flush:s,deep:i,eventFilter:d});return f&&a&&Nd(()=>{li(f,"storage",_),li(f,ai,N),b&&_()}),b||_(),w;function F(I){try{if(I==null)n.removeItem(e);else{const A=T.write(I),V=n.getItem(e);V!==A&&(n.setItem(e,A),f&&f.dispatchEvent(new CustomEvent(ai,{detail:{key:e,oldValue:V,newValue:A,storageArea:n}})))}}catch(A){m(A)}}function q(I){const A=I?I.newValue:n.getItem(e);if(A==null)return l&&L!==null&&n.setItem(e,T.write(L)),L;if(!I&&c){const V=T.read(A);return typeof c=="function"?c(V,L):k==="object"&&!Array.isArray(V)?{...L,...V}:V}else return typeof A!="string"?A:T.read(A)}function N(I){_(I.detail)}function _(I){if(!(I&&I.storageArea!==n)){if(I&&I.key==null){w.value=L;return}if(!(I&&I.key!==e)){v();try{(I==null?void 0:I.newValue)!==T.write(w.value)&&(w.value=q(I))}catch(A){m(A)}finally{I?Kn(y):y()}}}}}function qd(e){return zd("(prefers-color-scheme: dark)",e)}const Yd=ce({name:"CodeGroup",slots:Object,setup(e,{slots:t}){const n=ge([]),r=ge(-1),o=Dl("vuepress-code-group",{}),s=z(()=>n.value.map(c=>c.innerText).join(","));je(()=>{Je(()=>o.value[s.value],(c=-1)=>{r.value!==c&&(r.value=c)},{immediate:!0}),Je(r,c=>{o.value[s.value]!==c&&(o.value[s.value]=c)})});const i=(c=r.value)=>{c{c>0?r.value=c-1:r.value=n.value.length-1,n.value[r.value].focus()},l=(c,u)=>{c.key===" "||c.key==="Enter"?(c.preventDefault(),r.value=u):c.key==="ArrowRight"?(c.preventDefault(),i(u)):c.key==="ArrowLeft"&&(c.preventDefault(),a(u))};return()=>{var u;const c=(((u=t.default)==null?void 0:u.call(t))||[]).filter(f=>f.type.name==="CodeGroupItem").map(f=>(f.props===null&&(f.props={}),f));return c.length===0?null:(r.value<0||r.value>c.length-1?(r.value=c.findIndex(f=>f.props.active===""||f.props.active===!0),r.value===-1&&(r.value=0)):c.forEach((f,d)=>{f.props.active=d===r.value}),le("div",{class:"code-group"},[le("div",{class:"code-group__nav"},le("ul",{class:"code-group__ul"},c.map((f,d)=>{const m=d===r.value;return le("li",{class:"code-group__li"},le("button",{ref:b=>{b&&(n.value[d]=b)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":m},ariaPressed:m,ariaExpanded:m,onClick:()=>r.value=d,onKeydown:b=>l(b,d)},f.props.title))}))),c]))}}}),Gd=["aria-selected"],Jd=ce({name:"CodeGroupItem"}),Qd=ce({...Jd,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(j(),X("div",{class:We(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[be(t.$slots,"default")],10,Gd))}}),Zd=Ce(Qd,[["__file","CodeGroupItem.vue"]]),Xd=()=>$l(),ze=()=>wd(),Fl=Symbol(""),Wo=()=>{const e=Se(Fl);if(!e)throw new Error("useDarkMode() is called without provider.");return e},eh=()=>{const e=ze(),t=qd(),n=Dl("vuepress-color-scheme",e.value.colorMode),r=z({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Wt(Fl,r),th(r)},th=e=>{const t=(n=e.value)=>{const r=window==null?void 0:window.document.querySelector("html");r==null||r.classList.toggle("dark",n)};je(()=>{Je(e,t,{immediate:!0})}),$r(()=>t())},Bl=(...e)=>{const n=Qt().resolve(...e),r=n.matched[n.matched.length-1];if(!(r!=null&&r.redirect))return n;const{redirect:o}=r,s=oe(o)?o(n):o,i=pe(s)?{path:s}:s;return Bl({hash:n.hash,query:n.query,params:n.params,...i})},qo=e=>{const t=Bl(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Xr=null,xn=null;const nh={wait:()=>Xr,pending:()=>{Xr=new Promise(e=>xn=e)},resolve:()=>{xn==null||xn(),Xr=null,xn=null}},zl=()=>nh,jl=Symbol("sidebarItems"),Yo=()=>{const e=Se(jl);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},rh=()=>{const e=ze(),t=vt(),n=z(()=>oh(t.value,e.value));Wt(jl,n)},oh=(e,t)=>{const n=e.sidebar??t.sidebar??"auto",r=e.sidebarDepth??t.sidebarDepth??2;return e.home||n===!1?[]:n==="auto"?ih(r):Z(n)?Ul(n,r):Do(n)?lh(n,r):[]},sh=(e,t)=>({text:e.title,link:e.link,children:Go(e.children,t)}),Go=(e,t)=>t>0?e.map(n=>sh(n,t-1)):[],ih=e=>{const t=Yt();return[{text:t.value.title,children:Go(t.value.headers,e)}]},Ul=(e,t)=>{const n=Zt(),r=Yt(),o=s=>{var a;let i;if(pe(s)?i=qo(s):i=s,i.children)return{...i,children:i.children.map(l=>o(l))};if(i.link===n.path){const l=((a=r.value.headers[0])==null?void 0:a.level)===1?r.value.headers[0].children:r.value.headers;return{...i,children:Go(l,t)}}return i};return e.map(s=>o(s))},lh=(e,t)=>{const n=Zt(),r=dl(e,n.path),o=e[r]??[];return Ul(o,t)},ah="719px",ch={mobile:ah};var Dn;(function(e){e.MOBILE="mobile"})(Dn||(Dn={}));var hi;const uh={[Dn.MOBILE]:Number.parseInt((hi=ch.mobile)==null?void 0:hi.replace("px",""),10)},Kl=(e,t)=>{const n=uh[e];Number.isInteger(n)&&je(()=>{t(n),window.addEventListener("resize",()=>t(n),!1),window.addEventListener("orientationchange",()=>t(n),!1)})},fh={},dh={class:"theme-default-content"};function hh(e,t){const n=yt("Content");return j(),X("div",dh,[ne(n)])}const ph=Ce(fh,[["render",hh],["__file","HomeContent.vue"]]),mh={key:0,class:"features"},gh=ce({__name:"HomeFeatures",setup(e){const t=vt(),n=z(()=>Z(t.value.features)?t.value.features:[]);return(r,o)=>n.value.length?(j(),X("div",mh,[(j(!0),X(Ee,null,It(n.value,s=>(j(),X("div",{key:s.title,class:"feature"},[de("h2",null,Ae(s.title),1),de("p",null,Ae(s.details),1)]))),128))])):Le("v-if",!0)}}),vh=Ce(gh,[["__file","HomeFeatures.vue"]]),_h=["innerHTML"],yh=["textContent"],bh=ce({__name:"HomeFooter",setup(e){const t=vt(),n=z(()=>t.value.footer),r=z(()=>t.value.footerHtml);return(o,s)=>n.value?(j(),X(Ee,{key:0},[Le(" eslint-disable-next-line vue/no-v-html "),r.value?(j(),X("div",{key:0,class:"footer",innerHTML:n.value},null,8,_h)):(j(),X("div",{key:1,class:"footer",textContent:Ae(n.value)},null,8,yh))],64)):Le("v-if",!0)}}),Eh=Ce(bh,[["__file","HomeFooter.vue"]]),wh=["href","rel","target","aria-label"],xh=ce({inheritAttrs:!1}),Ch=ce({...xh,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,n=Zt(),r=yl(),{item:o}=Ar(t),s=z(()=>Yn(o.value.link)),i=z(()=>!s.value&&Tu(o.value.link)),a=z(()=>{if(!i.value){if(o.value.target)return o.value.target;if(s.value)return"_blank"}}),l=z(()=>a.value==="_blank"),c=z(()=>!s.value&&!i.value&&!l.value),u=z(()=>{if(!i.value){if(o.value.rel)return o.value.rel;if(l.value)return"noopener noreferrer"}}),f=z(()=>o.value.ariaLabel||o.value.text),d=z(()=>{const w=Object.keys(r.value.locales);return w.length?!w.some(L=>L===o.value.link):o.value.link!=="/"}),m=z(()=>d.value?n.path.startsWith(o.value.link):!1),b=z(()=>c.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(n.path):m.value:!1);return(w,L)=>{const k=yt("RouterLink"),T=yt("AutoLinkExternalIcon");return c.value?(j(),Te(k,fo({key:0,class:{"router-link-active":b.value},to:ee(o).link,"aria-label":f.value},w.$attrs),{default:Ne(()=>[be(w.$slots,"before"),Mt(" "+Ae(ee(o).text)+" ",1),be(w.$slots,"after")]),_:3},16,["class","to","aria-label"])):(j(),X("a",fo({key:1,class:"external-link",href:ee(o).link,rel:u.value,target:a.value,"aria-label":f.value},w.$attrs),[be(w.$slots,"before"),Mt(" "+Ae(ee(o).text)+" ",1),l.value?(j(),Te(T,{key:0})):Le("v-if",!0),be(w.$slots,"after")],16,wh))}}}),_t=Ce(Ch,[["__file","AutoLink.vue"]]),Lh={class:"hero"},Sh={key:0,id:"main-title"},kh={key:1,class:"description"},Th={key:2,class:"actions"},Rh=ce({__name:"HomeHero",setup(e){const t=vt(),n=Bo(),r=Wo(),o=z(()=>r.value&&t.value.heroImageDark!==void 0?t.value.heroImageDark:t.value.heroImage),s=z(()=>t.value.heroAlt||a.value||"hero"),i=z(()=>t.value.heroHeight||280),a=z(()=>t.value.heroText===null?null:t.value.heroText||n.value.title||"Hello"),l=z(()=>t.value.tagline===null?null:t.value.tagline||n.value.description||"Welcome to your VuePress site"),c=z(()=>Z(t.value.actions)?t.value.actions.map(({text:f,link:d,type:m="primary"})=>({text:f,link:d,type:m})):[]),u=()=>{if(!o.value)return null;const f=le("img",{src:jo(o.value),alt:s.value,height:i.value});return t.value.heroImageDark===void 0?f:le(zo,()=>f)};return(f,d)=>(j(),X("header",Lh,[ne(u),a.value?(j(),X("h1",Sh,Ae(a.value),1)):Le("v-if",!0),l.value?(j(),X("p",kh,Ae(l.value),1)):Le("v-if",!0),c.value.length?(j(),X("p",Th,[(j(!0),X(Ee,null,It(c.value,m=>(j(),Te(_t,{key:m.text,class:We(["action-button",[m.type]]),item:m},null,8,["class","item"]))),128))])):Le("v-if",!0)]))}}),Ah=Ce(Rh,[["__file","HomeHero.vue"]]),Ph={class:"home"},Oh=ce({__name:"Home",setup(e){return(t,n)=>(j(),X("main",Ph,[ne(Ah),ne(vh),ne(ph),ne(Eh)]))}}),Ih=Ce(Oh,[["__file","Home.vue"]]),$h=ce({__name:"NavbarBrand",setup(e){const t=Gn(),n=Bo(),r=ze(),o=Wo(),s=z(()=>r.value.home||t.value),i=z(()=>n.value.title),a=z(()=>o.value&&r.value.logoDark!==void 0?r.value.logoDark:r.value.logo),l=()=>{if(!a.value)return null;const c=le("img",{class:"logo",src:jo(a.value),alt:i.value});return r.value.logoDark===void 0?c:le(zo,()=>c)};return(c,u)=>{const f=yt("RouterLink");return j(),Te(f,{to:s.value},{default:Ne(()=>[ne(l),i.value?(j(),X("span",{key:0,class:We(["site-name",{"can-hide":a.value}])},Ae(i.value),3)):Le("v-if",!0)]),_:1},8,["to"])}}}),Mh=Ce($h,[["__file","NavbarBrand.vue"]]),Nh=ce({__name:"DropdownTransition",setup(e){const t=r=>{r.style.height=r.scrollHeight+"px"},n=r=>{r.style.height=""};return(r,o)=>(j(),Te(qn,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:Ne(()=>[be(r.$slots,"default")]),_:3}))}}),Vl=Ce(Nh,[["__file","DropdownTransition.vue"]]),Hh=["aria-label"],Dh={class:"title"},Fh=de("span",{class:"arrow down"},null,-1),Bh=["aria-label"],zh={class:"title"},jh={class:"navbar-dropdown"},Uh={class:"navbar-dropdown-subtitle"},Kh={key:1},Vh={class:"navbar-dropdown-subitem-wrapper"},Wh=ce({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:n}=Ar(t),r=z(()=>n.value.ariaLabel||n.value.text),o=ge(!1),s=Zt();Je(()=>s.path,()=>{o.value=!1});const i=l=>{l.detail===0?o.value=!o.value:o.value=!1},a=(l,c)=>c[c.length-1]===l;return(l,c)=>(j(),X("div",{class:We(["navbar-dropdown-wrapper",{open:o.value}])},[de("button",{class:"navbar-dropdown-title",type:"button","aria-label":r.value,onClick:i},[de("span",Dh,Ae(ee(n).text),1),Fh],8,Hh),de("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":r.value,onClick:c[0]||(c[0]=u=>o.value=!o.value)},[de("span",zh,Ae(ee(n).text),1),de("span",{class:We(["arrow",o.value?"down":"right"])},null,2)],8,Bh),ne(Vl,null,{default:Ne(()=>[vr(de("ul",jh,[(j(!0),X(Ee,null,It(ee(n).children,u=>(j(),X("li",{key:u.text,class:"navbar-dropdown-item"},[u.children?(j(),X(Ee,{key:0},[de("h4",Uh,[u.link?(j(),Te(_t,{key:0,item:u,onFocusout:f=>a(u,ee(n).children)&&u.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(j(),X("span",Kh,Ae(u.text),1))]),de("ul",Vh,[(j(!0),X(Ee,null,It(u.children,f=>(j(),X("li",{key:f.link,class:"navbar-dropdown-subitem"},[ne(_t,{item:f,onFocusout:d=>a(f,u.children)&&a(u,ee(n).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(j(),Te(_t,{key:1,item:u,onFocusout:f=>a(u,ee(n).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[wr,o.value]])]),_:1})],2))}}),qh=Ce(Wh,[["__file","NavbarDropdown.vue"]]),ci=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Yh=(e,t)=>{if(t.hash===e)return!0;const n=ci(t.path),r=ci(e);return n===r},Wl=(e,t)=>e.link&&Yh(e.link,t)?!0:e.children?e.children.some(n=>Wl(n,t)):!1,ql=e=>!Yn(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,Gh={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"},Jh=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=ql(e);return n!==null?Gh[n]:null},Qh=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=Jh({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,Yn(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,fl(`${ul(n)}/${r}`)):null},Zh={key:0,class:"navbar-items"},Xh=ce({__name:"NavbarItems",setup(e){const t=()=>{const u=Qt(),f=Gn(),d=yl(),m=Bo(),b=Xd(),w=ze();return z(()=>{const L=Object.keys(d.value.locales);if(L.length<2)return[];const k=u.currentRoute.value.path,T=u.currentRoute.value.fullPath;return[{text:`${w.value.selectLanguageText}`,ariaLabel:`${w.value.selectLanguageAriaLabel??w.value.selectLanguageText}`,children:L.map(y=>{var A,V;const F=((A=d.value.locales)==null?void 0:A[y])??{},q=((V=b.value.locales)==null?void 0:V[y])??{},N=`${F.lang}`,_=q.selectLanguageName??N;let I;if(N===m.value.lang)I=T;else{const x=k.replace(f.value,y);u.getRoutes().some($=>$.path===x)?I=T.replace(k,x):I=q.home??y}return{text:_,link:I}})}]})},n=()=>{const u=ze(),f=z(()=>u.value.repo),d=z(()=>f.value?ql(f.value):null),m=z(()=>f.value&&!Yn(f.value)?`https://github.com/${f.value}`:f.value),b=z(()=>m.value?u.value.repoLabel?u.value.repoLabel:d.value===null?"Source":d.value:null);return z(()=>!m.value||!b.value?[]:[{text:b.value,link:m.value}])},r=u=>pe(u)?qo(u):u.children?{...u,children:u.children.map(r)}:u,o=()=>{const u=ze();return z(()=>(u.value.navbar||[]).map(r))},s=ge(!1),i=o(),a=t(),l=n(),c=z(()=>[...i.value,...a.value,...l.value]);return Kl(Dn.MOBILE,u=>{window.innerWidthc.value.length?(j(),X("nav",Zh,[(j(!0),X(Ee,null,It(c.value,d=>(j(),X("div",{key:d.text,class:"navbar-item"},[d.children?(j(),Te(qh,{key:0,item:d,class:We(s.value?"mobile":"")},null,8,["item","class"])):(j(),Te(_t,{key:1,item:d},null,8,["item"]))]))),128))])):Le("v-if",!0)}}),Yl=Ce(Xh,[["__file","NavbarItems.vue"]]),ep=["title"],tp={class:"icon",focusable:"false",viewBox:"0 0 32 32"},np=Mc('',9),rp=[np],op={class:"icon",focusable:"false",viewBox:"0 0 32 32"},sp=de("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),ip=[sp],lp=ce({__name:"ToggleColorModeButton",setup(e){const t=ze(),n=Wo(),r=()=>{n.value=!n.value};return(o,s)=>(j(),X("button",{class:"toggle-color-mode-button",title:ee(t).toggleColorMode,onClick:r},[vr((j(),X("svg",tp,rp,512)),[[wr,!ee(n)]]),vr((j(),X("svg",op,ip,512)),[[wr,ee(n)]])],8,ep))}}),ap=Ce(lp,[["__file","ToggleColorModeButton.vue"]]),cp=["title"],up=de("div",{class:"icon","aria-hidden":"true"},[de("span"),de("span"),de("span")],-1),fp=[up],dp=ce({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=ze();return(n,r)=>(j(),X("div",{class:"toggle-sidebar-button",title:ee(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:r[0]||(r[0]=o=>n.$emit("toggle"))},fp,8,cp))}}),hp=Ce(dp,[["__file","ToggleSidebarButton.vue"]]),pp=ce({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=ze(),n=ge(null),r=ge(null),o=ge(0),s=z(()=>o.value?{maxWidth:o.value+"px"}:{});Kl(Dn.MOBILE,a=>{var c;const l=i(n.value,"paddingLeft")+i(n.value,"paddingRight");window.innerWidth{const c=yt("NavbarSearch");return j(),X("header",{ref_key:"navbar",ref:n,class:"navbar"},[ne(hp,{onToggle:l[0]||(l[0]=u=>a.$emit("toggle-sidebar"))}),de("span",{ref_key:"navbarBrand",ref:r},[ne(Mh)],512),de("div",{class:"navbar-items-wrapper",style:Bn(s.value)},[be(a.$slots,"before"),ne(Yl,{class:"can-hide"}),be(a.$slots,"after"),ee(t).colorModeSwitch?(j(),Te(ap,{key:0})):Le("v-if",!0),ne(c)],4)],512)}}}),mp=Ce(pp,[["__file","Navbar.vue"]]),gp={class:"page-meta"},vp={key:0,class:"meta-item edit-link"},_p={key:1,class:"meta-item last-updated"},yp={class:"meta-item-label"},bp={class:"meta-item-info"},Ep={key:2,class:"meta-item contributors"},wp={class:"meta-item-label"},xp={class:"meta-item-info"},Cp=["title"],Lp=ce({__name:"PageMeta",setup(e){const t=()=>{const l=ze(),c=Yt(),u=vt();return z(()=>{if(!(u.value.editLink??l.value.editLink??!0))return null;const{repo:d,docsRepo:m=d,docsBranch:b="main",docsDir:w="",editLinkText:L}=l.value;if(!m)return null;const k=Qh({docsRepo:m,docsBranch:b,docsDir:w,filePathRelative:c.value.filePathRelative,editLinkPattern:u.value.editLinkPattern??l.value.editLinkPattern});return k?{text:L??"Edit this page",link:k}:null})},n=()=>{const l=ze(),c=Yt(),u=vt();return z(()=>{var m,b;return!(u.value.lastUpdated??l.value.lastUpdated??!0)||!((m=c.value.git)!=null&&m.updatedTime)?null:new Date((b=c.value.git)==null?void 0:b.updatedTime).toLocaleString()})},r=()=>{const l=ze(),c=Yt(),u=vt();return z(()=>{var d;return u.value.contributors??l.value.contributors??!0?((d=c.value.git)==null?void 0:d.contributors)??null:null})},o=ze(),s=t(),i=n(),a=r();return(l,c)=>{const u=yt("ClientOnly");return j(),X("footer",gp,[ee(s)?(j(),X("div",vp,[ne(_t,{class:"meta-item-label",item:ee(s)},null,8,["item"])])):Le("v-if",!0),ee(i)?(j(),X("div",_p,[de("span",yp,Ae(ee(o).lastUpdatedText)+": ",1),ne(u,null,{default:Ne(()=>[de("span",bp,Ae(ee(i)),1)]),_:1})])):Le("v-if",!0),ee(a)&&ee(a).length?(j(),X("div",Ep,[de("span",wp,Ae(ee(o).contributorsText)+": ",1),de("span",xp,[(j(!0),X(Ee,null,It(ee(a),(f,d)=>(j(),X(Ee,{key:d},[de("span",{class:"contributor",title:`email: ${f.email}`},Ae(f.name),9,Cp),d!==ee(a).length-1?(j(),X(Ee,{key:0},[Mt(", ")],64)):Le("v-if",!0)],64))),128))])])):Le("v-if",!0)])}}}),Sp=Ce(Lp,[["__file","PageMeta.vue"]]),kp={key:0,class:"page-nav"},Tp={class:"inner"},Rp={key:0,class:"prev"},Ap={key:1,class:"next"},Pp=ce({__name:"PageNav",setup(e){const t=l=>l===!1?null:pe(l)?qo(l):Do(l)?l:!1,n=(l,c,u)=>{const f=l.findIndex(d=>d.link===c);if(f!==-1){const d=l[f+u];return d!=null&&d.link?d:null}for(const d of l)if(d.children){const m=n(d.children,c,u);if(m)return m}return null},r=vt(),o=Yo(),s=Zt(),i=z(()=>{const l=t(r.value.prev);return l!==!1?l:n(o.value,s.path,-1)}),a=z(()=>{const l=t(r.value.next);return l!==!1?l:n(o.value,s.path,1)});return(l,c)=>i.value||a.value?(j(),X("nav",kp,[de("p",Tp,[i.value?(j(),X("span",Rp,[ne(_t,{item:i.value},null,8,["item"])])):Le("v-if",!0),a.value?(j(),X("span",Ap,[ne(_t,{item:a.value},null,8,["item"])])):Le("v-if",!0)])])):Le("v-if",!0)}}),Op=Ce(Pp,[["__file","PageNav.vue"]]),Ip={class:"page"},$p={class:"theme-default-content"},Mp=ce({__name:"Page",setup(e){return(t,n)=>{const r=yt("Content");return j(),X("main",Ip,[be(t.$slots,"top"),de("div",$p,[be(t.$slots,"content-top"),ne(r),be(t.$slots,"content-bottom")]),ne(Sp),ne(Op),be(t.$slots,"bottom")])}}}),Np=Ce(Mp,[["__file","Page.vue"]]),Hp=["onKeydown"],Dp={class:"sidebar-item-children"},Fp=ce({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:n,depth:r}=Ar(t),o=Zt(),s=Qt(),i=z(()=>Wl(n.value,o)),a=z(()=>({"sidebar-item":!0,"sidebar-heading":r.value===0,active:i.value,collapsible:n.value.collapsible})),l=z(()=>n.value.collapsible?i.value:!0),[c,u]=Hd(l.value),f=m=>{n.value.collapsible&&(m.preventDefault(),u())},d=s.afterEach(m=>{Kn(()=>{c.value=l.value})});return Wn(()=>{d()}),(m,b)=>{var L;const w=yt("SidebarItem",!0);return j(),X("li",null,[ee(n).link?(j(),Te(_t,{key:0,class:We(a.value),item:ee(n)},null,8,["class","item"])):(j(),X("p",{key:1,tabindex:"0",class:We(a.value),onClick:f,onKeydown:vu(f,["enter"])},[Mt(Ae(ee(n).text)+" ",1),ee(n).collapsible?(j(),X("span",{key:0,class:We(["arrow",ee(c)?"down":"right"])},null,2)):Le("v-if",!0)],42,Hp)),(L=ee(n).children)!=null&&L.length?(j(),Te(Vl,{key:2},{default:Ne(()=>[vr(de("ul",Dp,[(j(!0),X(Ee,null,It(ee(n).children,k=>(j(),Te(w,{key:`${ee(r)}${k.text}${k.link}`,item:k,depth:ee(r)+1},null,8,["item","depth"]))),128))],512),[[wr,ee(c)]])]),_:1})):Le("v-if",!0)])}}}),Bp=Ce(Fp,[["__file","SidebarItem.vue"]]),zp={key:0,class:"sidebar-items"},jp=ce({__name:"SidebarItems",setup(e){const t=Zt(),n=Yo();return je(()=>{Je(()=>t.hash,r=>{const o=document.querySelector(".sidebar");if(!o)return;const s=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${r}"]`);if(!s)return;const{top:i,height:a}=o.getBoundingClientRect(),{top:l,height:c}=s.getBoundingClientRect();li+a&&s.scrollIntoView(!1)})}),(r,o)=>ee(n).length?(j(),X("ul",zp,[(j(!0),X(Ee,null,It(ee(n),s=>(j(),Te(Bp,{key:`${s.text}${s.link}`,item:s},null,8,["item"]))),128))])):Le("v-if",!0)}}),Up=Ce(jp,[["__file","SidebarItems.vue"]]),Kp={class:"sidebar"},Vp=ce({__name:"Sidebar",setup(e){return(t,n)=>(j(),X("aside",Kp,[ne(Yl),be(t.$slots,"top"),ne(Up),be(t.$slots,"bottom")]))}}),Wp=Ce(Vp,[["__file","Sidebar.vue"]]),qp=ce({__name:"Layout",setup(e){const t=Yt(),n=vt(),r=ze(),o=z(()=>n.value.navbar!==!1&&r.value.navbar!==!1),s=Yo(),i=ge(!1),a=L=>{i.value=typeof L=="boolean"?L:!i.value},l={x:0,y:0},c=L=>{l.x=L.changedTouches[0].clientX,l.y=L.changedTouches[0].clientY},u=L=>{const k=L.changedTouches[0].clientX-l.x,T=L.changedTouches[0].clientY-l.y;Math.abs(k)>Math.abs(T)&&Math.abs(k)>40&&(k>0&&l.x<=80?a(!0):a(!1))},f=z(()=>[{"no-navbar":!o.value,"no-sidebar":!s.value.length,"sidebar-open":i.value},n.value.pageClass]);let d;je(()=>{d=Qt().afterEach(()=>{a(!1)})}),$r(()=>{d()});const m=zl(),b=m.resolve,w=m.pending;return(L,k)=>(j(),X("div",{class:We(["theme-container",f.value]),onTouchstart:c,onTouchend:u},[be(L.$slots,"navbar",{},()=>[o.value?(j(),Te(mp,{key:0,onToggleSidebar:a},{before:Ne(()=>[be(L.$slots,"navbar-before")]),after:Ne(()=>[be(L.$slots,"navbar-after")]),_:3})):Le("v-if",!0)]),de("div",{class:"sidebar-mask",onClick:k[0]||(k[0]=T=>a(!1))}),be(L.$slots,"sidebar",{},()=>[ne(Wp,null,{top:Ne(()=>[be(L.$slots,"sidebar-top")]),bottom:Ne(()=>[be(L.$slots,"sidebar-bottom")]),_:3})]),be(L.$slots,"page",{},()=>[ee(n).home?(j(),Te(Ih,{key:0})):(j(),Te(qn,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:ee(b),onBeforeLeave:ee(w)},{default:Ne(()=>[(j(),Te(Np,{key:ee(t).path},{top:Ne(()=>[be(L.$slots,"page-top")]),"content-top":Ne(()=>[be(L.$slots,"page-content-top")]),"content-bottom":Ne(()=>[be(L.$slots,"page-content-bottom")]),bottom:Ne(()=>[be(L.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),Yp=Ce(qp,[["__file","Layout.vue"]]),Gp={class:"theme-container"},Jp={class:"page"},Qp={class:"theme-default-content"},Zp=de("h1",null,"404",-1),Xp=ce({__name:"NotFound",setup(e){const t=Gn(),n=ze(),r=n.value.notFound??["Not Found"],o=()=>r[Math.floor(Math.random()*r.length)],s=n.value.home??t.value,i=n.value.backToHome??"Back to home";return(a,l)=>{const c=yt("RouterLink");return j(),X("div",Gp,[de("main",Jp,[de("div",Qp,[Zp,de("blockquote",null,Ae(o()),1),ne(c,{to:ee(s)},{default:Ne(()=>[Mt(Ae(ee(i)),1)]),_:1},8,["to"])])])])}}}),em=Ce(Xp,[["__file","NotFound.vue"]]),tm=Nt({enhance({app:e,router:t}){e.component("Badge",Sd),e.component("CodeGroup",Yd),e.component("CodeGroupItem",Zd),e.component("AutoLinkExternalIcon",()=>{const r=e.component("ExternalLinkIcon");return r?le(r):null}),e.component("NavbarSearch",()=>{const r=e.component("Docsearch")||e.component("SearchBox");return r?le(r):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await zl().wait(),n(...r))},setup(){eh(),rh()},layouts:{Layout:Yp,NotFound:em}}),nm=e=>e instanceof Element?document.activeElement===e&&(["TEXTAREA","SELECT","INPUT"].includes(e.tagName)||e.hasAttribute("contenteditable")):!1,rm=(e,t)=>t.some(n=>{if(pe(n))return n===e.key;const{key:r,ctrl:o=!1,shift:s=!1,alt:i=!1}=n;return r===e.key&&o===e.ctrlKey&&s===e.shiftKey&&i===e.altKey}),om=/[^\x00-\x7F]/,sm=e=>e.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t),ui=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),fi=(e,t)=>{const n=t.join(" "),r=sm(e);if(om.test(e))return r.some(i=>n.toLowerCase().indexOf(i)>-1);const o=e.endsWith(" ");return new RegExp(r.map((i,a)=>r.length===a+1&&!o?`(?=.*\\b${ui(i)})`:`(?=.*\\b${ui(i)}\\b)`).join("")+".+","gi").test(n)},im=({input:e,hotKeys:t})=>{if(t.value.length===0)return;const n=r=>{e.value&&rm(r,t.value)&&!nm(r.target)&&(r.preventDefault(),e.value.focus())};je(()=>{document.addEventListener("keydown",n)}),Wn(()=>{document.removeEventListener("keydown",n)})},lm=[{title:"",headers:[],path:"/",pathLocale:"/",extraFields:[]},{title:"Command-line interface (CLI)",headers:[{level:2,title:"Killgrave",slug:"killgrave",link:"#killgrave",children:[{level:3,title:"Available flags",slug:"available-flags",link:"#available-flags",children:[]}]}],path:"/cli/",pathLocale:"/",extraFields:[]},{title:"Config Reference",headers:[{level:2,title:"Killgrave",slug:"killgrave",link:"#killgrave",children:[{level:3,title:"Basic",slug:"basic",link:"#basic",children:[]},{level:3,title:"Proxy",slug:"proxy",link:"#proxy",children:[]},{level:3,title:"CORS",slug:"cors",link:"#cors",children:[]},{level:3,title:"Security",slug:"security",link:"#security",children:[]},{level:3,title:"Hot reloads",slug:"hot-reloads",link:"#hot-reloads",children:[]},{level:3,title:"Full example",slug:"full-example",link:"#full-example",children:[]}]},{level:2,title:"Imposters",slug:"imposters",link:"#imposters",children:[{level:3,title:"Request",slug:"request",link:"#request",children:[]},{level:3,title:"Response",slug:"response",link:"#response",children:[]},{level:3,title:"Full examples",slug:"full-examples",link:"#full-examples",children:[]}]}],path:"/config/",pathLocale:"/",extraFields:[]},{title:"Killgrave",headers:[],path:"/guide/",pathLocale:"/",extraFields:[]},{title:"Advanced features",headers:[{level:2,title:"CORS",slug:"cors",link:"#cors",children:[]},{level:2,title:"Proxy",slug:"proxy",link:"#proxy",children:[]},{level:2,title:"Secure (HTTP over TLS)",slug:"secure-http-over-tls",link:"#secure-http-over-tls",children:[]},{level:2,title:"Watcher",slug:"watcher",link:"#watcher",children:[]},{level:2,title:"Debugger",slug:"debugger",link:"#debugger",children:[]}],path:"/guide/advanced.html",pathLocale:"/",extraFields:[]},{title:"Concepts",headers:[{level:2,title:"Imposters",slug:"imposters",link:"#imposters",children:[{level:3,title:"Imposters Structure",slug:"imposters-structure",link:"#imposters-structure",children:[]}]}],path:"/guide/concepts.html",pathLocale:"/",extraFields:[]},{title:"Getting started",headers:[{level:2,title:"Command-line interface",slug:"command-line-interface",link:"#command-line-interface",children:[]},{level:2,title:"Configuration file",slug:"configuration-file",link:"#configuration-file",children:[]}],path:"/guide/getting-started.html",pathLocale:"/",extraFields:[]},{title:"Use delayed responses",headers:[],path:"/guide/ht-delays.html",pathLocale:"/",extraFields:[]},{title:"Use dynamic responses",headers:[],path:"/guide/ht-dynamic.html",pathLocale:"/",extraFields:[]},{title:"Use JSON Schema",headers:[],path:"/guide/ht-json.html",pathLocale:"/",extraFields:[]},{title:"Use regular expressions (regex)",headers:[{level:2,title:"Regex in the endpoint",slug:"regex-in-the-endpoint",link:"#regex-in-the-endpoint",children:[]},{level:2,title:"Regex in the query parameters",slug:"regex-in-the-query-parameters",link:"#regex-in-the-query-parameters",children:[]},{level:2,title:"Regex in the headers:",slug:"regex-in-the-headers",link:"#regex-in-the-headers",children:[]}],path:"/guide/ht-regex.html",pathLocale:"/",extraFields:[]},{title:"Installation",headers:[{level:2,title:"Go Toolchain",slug:"go-toolchain",link:"#go-toolchain",children:[]},{level:2,title:"Homebrew",slug:"homebrew",link:"#homebrew",children:[]},{level:2,title:"Docker",slug:"docker",link:"#docker",children:[]},{level:2,title:"Other",slug:"other",link:"#other",children:[]}],path:"/guide/installation.html",pathLocale:"/",extraFields:[]},{title:"Your first imposter",headers:[],path:"/guide/your-first-imposter.html",pathLocale:"/",extraFields:[]},{title:"",headers:[],path:"/404.html",pathLocale:"/",extraFields:[]}],am=ge(lm),cm=()=>am,um=({searchIndex:e,routeLocale:t,query:n,maxSuggestions:r})=>{const o=z(()=>e.value.filter(s=>s.pathLocale===t.value));return z(()=>{const s=n.value.trim().toLowerCase();if(!s)return[];const i=[],a=(l,c)=>{fi(s,[c.title])&&i.push({link:`${l.path}#${c.slug}`,title:l.title,header:c.title});for(const u of c.children){if(i.length>=r.value)return;a(l,u)}};for(const l of o.value){if(i.length>=r.value)break;if(fi(s,[l.title,...l.extraFields])){i.push({link:l.path,title:l.title});continue}for(const c of l.headers){if(i.length>=r.value)break;a(l,c)}}return i})},fm=e=>{const t=ge(0);return{focusIndex:t,focusNext:()=>{t.value{t.value>0?t.value-=1:t.value=e.value.length-1}}},dm=ce({name:"SearchBox",props:{locales:{type:Object,required:!1,default:()=>({})},hotKeys:{type:Array,required:!1,default:()=>[]},maxSuggestions:{type:Number,required:!1,default:5}},setup(e){const{locales:t,hotKeys:n,maxSuggestions:r}=Ar(e),o=Qt(),s=Gn(),i=cm(),a=ge(null),l=ge(!1),c=ge(""),u=z(()=>t.value[s.value]??{}),f=um({searchIndex:i,routeLocale:s,query:c,maxSuggestions:r}),{focusIndex:d,focusNext:m,focusPrev:b}=fm(f);im({input:a,hotKeys:n});const w=z(()=>l.value&&!!f.value.length),L=()=>{w.value&&b()},k=()=>{w.value&&m()},T=v=>{if(!w.value)return;const y=f.value[v];y&&o.push(y.link).then(()=>{c.value="",d.value=0})};return()=>le("form",{class:"search-box",role:"search"},[le("input",{ref:a,type:"search",placeholder:u.value.placeholder,autocomplete:"off",spellcheck:!1,value:c.value,onFocus:()=>l.value=!0,onBlur:()=>l.value=!1,onInput:v=>c.value=v.target.value,onKeydown:v=>{switch(v.key){case"ArrowUp":{L();break}case"ArrowDown":{k();break}case"Enter":{v.preventDefault(),T(d.value);break}}}}),w.value&&le("ul",{class:"suggestions",onMouseleave:()=>d.value=-1},f.value.map(({link:v,title:y,header:F},q)=>le("li",{class:["suggestion",{focus:d.value===q}],onMouseenter:()=>d.value=q,onMousedown:()=>T(q)},le("a",{href:v,onClick:N=>N.preventDefault()},[le("span",{class:"page-title"},y),F&&le("span",{class:"page-header"},`> ${F}`)]))))])}});var hm=["s","/"],pm={};const mm=pm,gm=hm,vm=5,_m=Nt({enhance({app:e}){e.component("SearchBox",t=>le(dm,{locales:mm,hotKeys:gm,maxSuggestions:vm,...t}))}}),cr=[Yf,Qf,nd,md,yd,Cd,tm,_m],ym=[["v-8daa1a0e","/",{title:""},["/index.md"]],["v-74457188","/cli/",{title:"Command-line interface (CLI)"},["/cli/README.md"]],["v-ba934fd8","/config/",{title:"Config Reference"},["/config/README.md"]],["v-fffb8e28","/guide/",{title:"Killgrave"},["/guide/README.md"]],["v-607376ea","/guide/advanced.html",{title:"Advanced features"},[":md"]],["v-f40d797c","/guide/concepts.html",{title:"Concepts"},[":md"]],["v-fb0f0066","/guide/getting-started.html",{title:"Getting started"},[":md"]],["v-d5fc1798","/guide/ht-delays.html",{title:"Use delayed responses"},[":md"]],["v-0549a6a2","/guide/ht-dynamic.html",{title:"Use dynamic responses"},[":md"]],["v-5cac6c5c","/guide/ht-json.html",{title:"Use JSON Schema"},[":md"]],["v-1f5d0ae7","/guide/ht-regex.html",{title:"Use regular expressions (regex)"},[":md"]],["v-d7be191a","/guide/installation.html",{title:"Installation"},[":md"]],["v-56beebfd","/guide/your-first-imposter.html",{title:"Your first imposter"},[":md"]],["v-3706649a","/404.html",{title:""},[]]];var di=ce({name:"Vuepress",setup(){const e=$u();return()=>le(e.value)}}),bm=()=>ym.reduce((e,[t,n,r,o])=>(e.push({name:t,path:n,component:di,meta:r},{path:n.endsWith("/")?n+"index.html":n.substring(0,n.length-5),redirect:n},...o.map(s=>({path:s===":md"?n.substring(0,n.length-5)+".md":s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:di}]),Em=rf,wm=()=>{const e=zf({history:Em(ul("/")),routes:bm(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===pt)&&([t.meta._data]=await Promise.all([ht.resolvePageData(t.name),(r=hl[t.name])==null?void 0:r.__asyncLoader()]))}),e},xm=e=>{e.component("ClientOnly",zo),e.component("Content",Fu)},Cm=(e,t,n)=>{const r=ii(()=>t.currentRoute.value.path),o=ii(()=>ht.resolveRouteLocale(rn.value.locales,r.value)),s=kd(r,()=>t.currentRoute.value.meta._data),i=z(()=>ht.resolveLayouts(n)),a=z(()=>ht.resolveSiteLocaleData(rn.value,o.value)),l=z(()=>ht.resolvePageFrontmatter(s.value)),c=z(()=>ht.resolvePageHeadTitle(s.value,a.value)),u=z(()=>ht.resolvePageHead(c.value,l.value,a.value)),f=z(()=>ht.resolvePageLang(s.value,a.value)),d=z(()=>ht.resolvePageLayout(s.value,i.value));return e.provide(Ru,i),e.provide(pl,s),e.provide(ml,l),e.provide(Ou,c),e.provide(gl,u),e.provide(vl,f),e.provide(_l,d),e.provide(Fo,o),e.provide(bl,a),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>l.value},$head:{get:()=>u.value},$headTitle:{get:()=>c.value},$lang:{get:()=>f.value},$page:{get:()=>s.value},$routeLocale:{get:()=>o.value},$site:{get:()=>rn.value},$siteLocale:{get:()=>a.value},$withBase:{get:()=>jo}}),{layouts:i,pageData:s,pageFrontmatter:l,pageHead:u,pageHeadTitle:c,pageLang:f,pageLayout:d,routeLocale:o,siteData:rn,siteLocaleData:a}},Lm=()=>{const e=Pu(),t=Iu(),n=ge([]),r=()=>{e.value.forEach(s=>{const i=Sm(s);i&&n.value.push(i)})},o=()=>{document.documentElement.lang=t.value,n.value.forEach(s=>{s.parentNode===document.head&&document.head.removeChild(s)}),n.value.splice(0,n.value.length),e.value.forEach(s=>{const i=km(s);i!==null&&(document.head.appendChild(i),n.value.push(i))})};Wt(Nu,o),je(()=>{r(),o(),Je(()=>e.value,o)})},Sm=([e,t,n=""])=>{const r=Object.entries(t).map(([a,l])=>pe(l)?`[${a}=${JSON.stringify(l)}]`:l===!0?`[${a}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(a=>a.innerText===n)||null},km=([e,t,n])=>{if(!pe(e))return null;const r=document.createElement(e);return Do(t)&&Object.entries(t).forEach(([o,s])=>{pe(s)?r.setAttribute(o,s):s===!0&&r.setAttribute(o,"")}),pe(n)&&r.appendChild(document.createTextNode(n)),r},Tm=bu,Rm=async()=>{var n;const e=Tm({name:"VuepressApp",setup(){var r;Lm();for(const o of cr)(r=o.setup)==null||r.call(o);return()=>[le(Ol),...cr.flatMap(({rootComponents:o=[]})=>o.map(s=>le(s)))]}}),t=wm();xm(e),Cm(e,t,cr);for(const r of cr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:rn}));return e.use(t),{app:e,router:t}};Rm().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Ce as _,de as a,Mt as b,X as c,Rm as createVueApp,ne as d,Mc as e,j as o,yt as r,Ne as w}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} \ No newline at end of file diff --git a/assets/concepts.html-bXMIjlTf.js b/assets/concepts.html-bXMIjlTf.js new file mode 100644 index 0000000..2cbb689 --- /dev/null +++ b/assets/concepts.html-bXMIjlTf.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-f40d797c","path":"/guide/concepts.html","title":"Concepts","lang":"en-US","frontmatter":{"prev":"./","next":"./installation"},"headers":[{"level":2,"title":"Imposters","slug":"imposters","link":"#imposters","children":[{"level":3,"title":"Imposters Structure","slug":"imposters-structure","link":"#imposters-structure","children":[]}]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/concepts.md"}');export{e as data}; diff --git a/assets/concepts.html-g1xN_7-T.js b/assets/concepts.html-g1xN_7-T.js new file mode 100644 index 0000000..12a1615 --- /dev/null +++ b/assets/concepts.html-g1xN_7-T.js @@ -0,0 +1 @@ +import{_ as n,r as s,o as d,c,a as e,b as o,d as r,w as l,e as t}from"./app-GKjJbFgT.js";const h={},p=t('

Concepts

Imposters

Imposters are the most important concept in the Killgrave's world.

They conform the rules that determine how the mock server should respond to a request.

You can identify a Killgrave imposter file by its extension: .imp.json, .imp.yml or .imp.yaml.

',5),u=t('

Imposters Structure

The imposter object can be divided in two parts:

Request

This part defines how Killgrave should determine whether an incoming request matches the imposter or not.

The request object has the following properties:

  • method (mandatory): The HTTP method of the incoming request.
  • endpoint (mandatory): Path of the endpoint relative to the base. Supports regular expressions.
  • schemaFile: A JSON schema to validate the incoming request against.
  • params: Restrict incoming requests by query parameters. Supports regular expressions.
  • headers: Restrict incoming requests by HTTP header.

Response

This part defines how Killgrave should, in case of match, respond to the incoming request.

The response object has the following properties:

',10),m=t("
  • status (mandatory): Integer defining the HTTP status code to return.
  • body or bodyFile: The response body. Either a literal string (body) or a path to a file (bodyFile). bodyFile is especially useful in the case of large outputs. This property is optional: if not response body should be returned it should be removed or left empty.
  • headers: HTTP headers to return in the response.
  • ",3),f=e("code",null,"delay",-1),_={href:"https://pkg.go.dev/time#ParseDuration",target:"_blank",rel:"noopener noreferrer"},b=e("code",null,"time.ParseDuration",-1),y=e("code",null,":",-1),g=e("code",null,'"0s"',-1);function T(v,x){const i=s("RouterLink"),a=s("ExternalLinkIcon");return d(),c("div",null,[p,e("blockquote",null,[e("p",null,[e("em",null,[o("You can learn more about how to configure imposters in the "),r(i,{to:"/config/#imposters"},{default:l(()=>[o("Imposter Configuration Section")]),_:1}),o(".")])])]),u,e("ul",null,[m,e("li",null,[f,o(": Time the server waits before responding. This can help simulate network issues, or high server load. Uses the Go "),e("a",_,[b,r(a)]),o(" format. Also, you can specify minimum and maximum delays separated by "),y,o(". The response delay will be chosen randomly between these values. Default value is "),g,o(" (no delay).")])])])}const w=n(h,[["render",T],["__file","concepts.html.vue"]]);export{w as default}; diff --git a/assets/getting-started.html-9uYXJoA8.js b/assets/getting-started.html-9uYXJoA8.js new file mode 100644 index 0000000..f9455fd --- /dev/null +++ b/assets/getting-started.html-9uYXJoA8.js @@ -0,0 +1,3 @@ +import{_ as e,o,c as i,e as t}from"./app-GKjJbFgT.js";const a={},n=t(`

    Getting started

    To start Killgrave, you can simply do it by running:

    $ killgrave
    +

    While you are welcome to provide your own configuration, Killgrave will default to the following configuration:

    • imposters path: imposters
    • host: localhost
    • port: 3000
    • CORS: []
    • proxy: none
    • watcher: false
    • debugger:
      • enabled: false
      • address: localhost:3030

    Command-line interface

    Killgrave is almost fully configurable through the command line, except for CORS, which can only be configured using the config file.

    You can find the list with all the available flags at CLI section or by running:

    $ killgrave -h
    +

    Configuration file

    In case you are looking for a predictable and reproducible configuration, you can use the -config command-line flag to specify the location of a configuration file, which can be written either in JSON or YAML.

    You can find the list with all the available settings at Config Reference section.

    As you can see, you can configure all the options in a very easy way.

    Historically, the options imposters_path, port and host were mandatory when using a configuration file. However, since the last version (v0.4.1), they are no longer needed, so you can simply override those options if you actually want to. Furthermore, in previous versions (prior to v0.4.1), the imposters_path option was used to refer to the path to the working directory where Killgrave was executed from, but since the last version (v0.4.1) this is relative to the location of the config file.

    `,14),r=[n];function l(s,c){return o(),i("div",null,r)}const h=e(a,[["render",l],["__file","getting-started.html.vue"]]);export{h as default}; diff --git a/assets/getting-started.html-rmTUm9IU.js b/assets/getting-started.html-rmTUm9IU.js new file mode 100644 index 0000000..11aa0f1 --- /dev/null +++ b/assets/getting-started.html-rmTUm9IU.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-fb0f0066","path":"/guide/getting-started.html","title":"Getting started","lang":"en-US","frontmatter":{"prev":"./installation","next":"./your-first-imposter"},"headers":[{"level":2,"title":"Command-line interface","slug":"command-line-interface","link":"#command-line-interface","children":[]},{"level":2,"title":"Configuration file","slug":"configuration-file","link":"#configuration-file","children":[]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/getting-started.md"}');export{e as data}; diff --git a/assets/ht-delays.html-5ziKQeRG.js b/assets/ht-delays.html-5ziKQeRG.js new file mode 100644 index 0000000..8285a2c --- /dev/null +++ b/assets/ht-delays.html-5ziKQeRG.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-d5fc1798","path":"/guide/ht-delays.html","title":"Use delayed responses","lang":"en-US","frontmatter":{"prev":"./ht-json","next":"./ht-dynamic"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/ht-delays.md"}');export{e as data}; diff --git a/assets/ht-delays.html-LuxVH0ER.js b/assets/ht-delays.html-LuxVH0ER.js new file mode 100644 index 0000000..855f199 --- /dev/null +++ b/assets/ht-delays.html-LuxVH0ER.js @@ -0,0 +1,20 @@ +import{_ as a,r as t,o,c as p,a as s,b as n,d as r,e as l}from"./app-GKjJbFgT.js";const c={},i=s("h1",{id:"use-delayed-responses",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#use-delayed-responses","aria-hidden":"true"},"#"),n(" Use delayed responses")],-1),u=s("p",null,[n("If you want to simulate a problem with the network, or create a more realistic response, you can use the "),s("code",null,"delay"),n(" property.")],-1),d=s("code",null,"delay",-1),k={href:"https://golang.org/pkg/time/#ParseDuration",target:"_blank",rel:"noopener noreferrer"},v=l(`

    Alternatively, the delay property can take a range of two durations, separated by :. In this case, the server will respond with a random delay within this range.

    With the example below, the response would be delayed between 1 and 5 seconds:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        },
    +        "delay": "1s:5s"
    +    }
    +  }
    +]
    +
    `,3);function h(m,q){const e=t("ExternalLinkIcon");return o(),p("div",null,[i,u,s("p",null,[n("The "),d,n(" property can take duration in the "),s("a",k,[n("Go ParseDuration format"),r(e)]),n(". The server response will be delayed by the specified duration.")]),v])}const b=a(c,[["render",h],["__file","ht-delays.html.vue"]]);export{b as default}; diff --git a/assets/ht-dynamic.html-1SuRYzk0.js b/assets/ht-dynamic.html-1SuRYzk0.js new file mode 100644 index 0000000..0776841 --- /dev/null +++ b/assets/ht-dynamic.html-1SuRYzk0.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-0549a6a2","path":"/guide/ht-dynamic.html","title":"Use dynamic responses","lang":"en-US","frontmatter":{"prev":"./your-first-imposter","next":"./debug-intro"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/ht-dynamic.md"}');export{e as data}; diff --git a/assets/ht-dynamic.html-JSz71AUZ.js b/assets/ht-dynamic.html-JSz71AUZ.js new file mode 100644 index 0000000..d3c527b --- /dev/null +++ b/assets/ht-dynamic.html-JSz71AUZ.js @@ -0,0 +1,32 @@ +import{_ as s,o as n,c as a,e}from"./app-GKjJbFgT.js";const t={},o=e(`

    Use dynamic responses

    Killgrave allows dynamic responses. Using this feature, Killgrave can return different responses on the same endpoint.

    To do this, all imposters need to be sorted from most restrictive to least. Killgrave tries to match the request with each of the imposters in sequence, stopping at the first imposter that matches the request.

    In the following example, there are defined multiple imposters for the POST /gophers endpoint:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    }
    +  },
    +  {
    +      "request": {
    +          "method": "POST",
    +          "endpoint": "/gophers"
    +      },
    +      "response": {
    +          "status": 400,
    +          "headers": {
    +              "Content-Type": "application/json"
    +          },
    +          "body": "{\\"errors\\":\\"bad request\\"}"
    +      }
    +  }
    +]
    +

    Now,

    1. Let's say an incoming request does not match the JSON schema specified in the first imposter's schemaFile.
    2. Therefore, Killgrave skips this imposter and tries to match the request against the next configured imposter.
    3. The next configured imposter is much less restrictive, so the request matches and the associated response is returned.
    `,7),p=[o];function i(r,c){return n(),a("div",null,p)}const u=s(t,[["render",i],["__file","ht-dynamic.html.vue"]]);export{u as default}; diff --git a/assets/ht-json.html-91jTj4Ja.js b/assets/ht-json.html-91jTj4Ja.js new file mode 100644 index 0000000..e0a79ef --- /dev/null +++ b/assets/ht-json.html-91jTj4Ja.js @@ -0,0 +1,71 @@ +import{_ as t,r as e,o,c as p,a as s,b as n,d as c,e as i}from"./app-GKjJbFgT.js";const u={},l=s("h1",{id:"use-json-schema",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#use-json-schema","aria-hidden":"true"},"#"),n(" Use JSON Schema")],-1),r={href:"https://json-schema.org/",target:"_blank",rel:"noopener noreferrer"},d=i(`

    To do that you will need to define our json schema first:

    e.g. imposters/schemas/create_gopher_request.json

    {
    +    "type": "object",
    +    "properties": {
    +        "data": {
    +            "type": "object",
    +            "properties": {
    +                "type": {
    +                    "type": "string",
    +                    "enum": [
    +                        "gophers"
    +                    ]
    +                },
    +                "attributes": {
    +                    "type": "object",
    +                    "properties": {
    +                        "name": {
    +                            "type": "string"
    +                        },
    +                        "color": {
    +                            "type": "string"
    +                        },
    +                        "age": {
    +                            "type": "integer"
    +                        }
    +                    },
    +                    "required": [
    +                        "name",
    +                        "color",
    +                        "age"
    +                    ]
    +                }
    +            },
    +            "required": [
    +                "type",
    +                "attributes"
    +            ]
    +        }
    +    },
    +    "required": [
    +        "data"
    +    ]
    +}
    +

    With this json schema, we expect a request like this:

    {
    +    "data": {
    +        "type": "gophers",
    +        "attributes": {
    +            "name": "Zebediah",
    +            "color": "Purples",
    +            "age": 55
    +        }
    +    }
    +}
    +

    Then the imposter could be configured as follows:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    }
    +  }
    +]
    +

    The path where the schema is located is relative to where the imposters are.

    `,8);function k(v,q){const a=e("ExternalLinkIcon");return o(),p("div",null,[l,s("p",null,[n("Sometimes you may need to validate requests more thoroughly. In such case, you can create an imposter that only matches with a valid "),s("a",r,[n("json schema"),c(a)]),n(".")]),d])}const b=t(u,[["render",k],["__file","ht-json.html.vue"]]);export{b as default}; diff --git a/assets/ht-json.html-INXtboAi.js b/assets/ht-json.html-INXtboAi.js new file mode 100644 index 0000000..6ef6e9f --- /dev/null +++ b/assets/ht-json.html-INXtboAi.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-5cac6c5c","path":"/guide/ht-json.html","title":"Use JSON Schema","lang":"en-US","frontmatter":{"prev":"./ht-regex","next":"./ht-delays"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/ht-json.md"}');export{e as data}; diff --git a/assets/ht-regex.html-NdAzqI34.js b/assets/ht-regex.html-NdAzqI34.js new file mode 100644 index 0000000..d86d0a2 --- /dev/null +++ b/assets/ht-regex.html-NdAzqI34.js @@ -0,0 +1,52 @@ +import{_ as o,r as p,o as u,c as r,a as s,b as n,d as e,e as t}from"./app-GKjJbFgT.js";const i={},l=s("h1",{id:"use-regular-expressions-regex",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#use-regular-expressions-regex","aria-hidden":"true"},"#"),n(" Use regular expressions (regex)")],-1),c=s("h2",{id:"regex-in-the-endpoint",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#regex-in-the-endpoint","aria-hidden":"true"},"#"),n(" Regex in the endpoint")],-1),d={href:"https://github.com/gorilla/mux",target:"_blank",rel:"noopener noreferrer"},q={href:"https://cran.r-project.org/web/packages/ulid/vignettes/intro-to-ulid.html",target:"_blank",rel:"noopener noreferrer"},k=t(`
    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{_id:[\\\\w]{26}}"
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\\"data\\":{\\"type\\":\\"gophers\\",\\"id\\":\\"01D8EMQ185CA8PRGE20DKZTGSR\\",\\"attributes\\":{\\"name\\":\\"Zebediah\\",\\"color\\":\\"Purples\\",\\"age\\":55}}}"
    +    }
    +  }
    +]
    +

    Regex in the query parameters

    `,2),v={href:"https://github.com/gorilla/mux",target:"_blank",rel:"noopener noreferrer"},m=t(`

    In this example, we have configured an imposter that only matches if we receive an apiKey as query parameter:

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{_id:[\\\\w]{26}}",
    +      "params": {
    +        "apiKey": "{_apiKey:[\\\\w]+}"
    +      }
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\\"data\\":{\\"type\\":\\"gophers\\",\\"id\\":\\"01D8EMQ185CA8PRGE20DKZTGSR\\",\\"attributes\\":{\\"name\\":\\"Zebediah\\",\\"color\\":\\"Purples\\",\\"age\\":55}}}"
    +    }
    +  }
    +]
    +

    Regex in the headers:

    In this case we will not need the gorilla mux nomenclature to write our regex.

    In the next example, we have configured an imposter that uses regex to match an Authorization header.

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{id:[\\\\w]{26}}",
    +      "headers": {
    +        "Authorization": "\\\\w+"
    +      }
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\\"data\\":{\\"type\\":\\"gophers\\",\\"id\\":\\"01D8EMQ185CA8PRGE20DKZTGSR\\",\\"attributes\\":{\\"name\\":\\"Zebediah\\",\\"color\\":\\"Purples\\",\\"age\\":55}}}"
    +    }
    +  }
    +]
    +
    `,6);function h(b,g){const a=p("ExternalLinkIcon");return u(),r("div",null,[l,c,s("p",null,[n("Killgrave uses the "),s("a",d,[n("gorilla/mux"),e(a)]),n(" regular expression format for endpoint matching.")]),s("p",null,[n("In the next example, we have configured an endpoint to match with any kind of "),s("a",q,[n("ULID ID"),e(a)]),n(":")]),k,s("p",null,[n("Killgrave uses the "),s("a",v,[n("gorilla/mux"),e(a)]),n(" regular expression format for query parameter matching.")]),m])}const x=o(i,[["render",h],["__file","ht-regex.html.vue"]]);export{x as default}; diff --git a/assets/ht-regex.html-btTFIkhL.js b/assets/ht-regex.html-btTFIkhL.js new file mode 100644 index 0000000..1136fad --- /dev/null +++ b/assets/ht-regex.html-btTFIkhL.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1f5d0ae7","path":"/guide/ht-regex.html","title":"Use regular expressions (regex)","lang":"en-US","frontmatter":{"prev":"./advanced","next":"./ht-json"},"headers":[{"level":2,"title":"Regex in the endpoint","slug":"regex-in-the-endpoint","link":"#regex-in-the-endpoint","children":[]},{"level":2,"title":"Regex in the query parameters","slug":"regex-in-the-query-parameters","link":"#regex-in-the-query-parameters","children":[]},{"level":2,"title":"Regex in the headers:","slug":"regex-in-the-headers","link":"#regex-in-the-headers","children":[]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/ht-regex.md"}');export{e as data}; diff --git a/assets/index.html-9fYTIma7.js b/assets/index.html-9fYTIma7.js new file mode 100644 index 0000000..87ce8af --- /dev/null +++ b/assets/index.html-9fYTIma7.js @@ -0,0 +1 @@ +const a=JSON.parse('{"key":"v-74457188","path":"/cli/","title":"Command-line interface (CLI)","lang":"en-US","frontmatter":{"sidebar":"auto"},"headers":[{"level":2,"title":"Killgrave","slug":"killgrave","link":"#killgrave","children":[{"level":3,"title":"Available flags","slug":"available-flags","link":"#available-flags","children":[]}]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"cli/README.md"}');export{a as data}; diff --git a/assets/index.html-CLGSAmWB.js b/assets/index.html-CLGSAmWB.js new file mode 100644 index 0000000..2f20b77 --- /dev/null +++ b/assets/index.html-CLGSAmWB.js @@ -0,0 +1,236 @@ +import{_ as l,r as p,o as i,c as r,a as n,b as s,d as t,e as a}from"./app-GKjJbFgT.js";const c={},u=n("h1",{id:"config-reference",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#config-reference","aria-hidden":"true"},"#"),s(" Config Reference")],-1),d=["src"],v=a('

    Killgrave

    Killgrave can be used without explicitly providing any configuration. However, you can tune up some of their settings like the host and port where the mock server is listening to, among others, by providing some configuration settings.

    To provide those settings, you can either use the available CLI flags or use the -config flag to provide the path to a settings file. In such case, you can either use JSON or YAML.

    Basic

    Minimal configuration attributes needed to get your mock up and running.

    host

    • Type: string
    • Default: localhost
    ',7),k={href:"https://www.docker.com/",target:"_blank",rel:"noopener noreferrer"},m=a(`
    {
    +  "host": "localhost"
    +}
    +
    host: "localhost"
    +

    port

    • Type: number
    • Default: 3000
    `,4),h={href:"https://www.docker.com/",target:"_blank",rel:"noopener noreferrer"},b=a(`
    {
    +  "port": 3000 
    +}
    +
    port: 3000
    +

    imposters_path

    • Type: string
    • Default: imposters

    Specify the directory the imposter files (either .imp.json, .imp.yml or .imp.yaml) will be loaded from. On a regular set up, this directory will contain multiple of those imposter files and the directories with schemas and responses.

    {
    +  "imposters_path": "imposters" 
    +}
    +
    imposters_path: imposters
    +

    Proxy

    Set up a proxy to redirect the incoming requests as you want.

    mode

    • Type: string
    • Default: none

    Specify the proxy mode for the Killgrave server. The default value is none which means no proxy. Use missing to redirect only those incoming requests that aren't defined within the imposters. Use all to redirect all incoming requests.

    {
    +  "proxy": {
    +    "mode": "missing"
    +  }
    +}
    +
    proxy:
    +  mode: missing
    +

    url

    • Type: string
    • Default: -

    Specify the url for the Killgrave's proxy. The incoming requests will be redirected to this url based on the proxy mode.

    {
    +  "proxy": {
    +    "url": "https://example.com"
    +  }
    +}
    +
    proxy:
    +  url: https://example.com
    +

    CORS

    `,20),g={href:"https://developer.mozilla.org/docs/Web/HTTP/CORS",target:"_blank",rel:"noopener noreferrer"},y=a(`

    methods

    • Type: string array
    • Default: ["GET", "HEAD", "POST", "PUT", "OPTIONS", "DELETE", "PATCH", "TRACE", "CONNECT"]

    Represents the Access-Control-Request-Method header.

    {
    +  "cors": {
    +    "methods": ["GET"]
    +  }
    +}
    +
    cors:
    +  methods: ["GET"]
    +

    headers

    • Type: string array
    • Default: ["X-Requested-With", "Content-Type", "Authorization"]

    Represents the Access-Control-Request-Headers header.

    {
    +  "cors": {
    +    "headers": ["Content-Type"]
    +  }
    +}
    +
    cors:
    +  headers: ["Content-Type"]
    +

    exposed_headers

    • Type: string array
    • Default: ["Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma"]

    Represents the Access-Control-Expose-Headers header.

    {
    +  "cors": {
    +    "exposed_headers": ["Cache-Control"]
    +  }
    +}
    +
    cors:
    +  exposed_headers: ["Cache-Control"]
    +

    origins

    • Type: string array
    • Default: []

    Represents the Access-Control-Allow-Origin header.

    {
    +  "cors": {
    +    "origins": ["*"]
    +  }
    +}
    +
    cors:
    +  origins: ["*"]
    +

    allow_credentials

    • Type: boolean
    • Default: false

    Enables or disables the Access-Control-Allow-Credentials header.

    {
    +  "cors": {
    +    "allow_credentials": true
    +  }
    +}
    +
    cors:
    +  allow_credentials: true
    +

    Security

    Sometimes you may want to simulate a production-like behavior with your mock servers, for instance to verify that your frontend application manages correctly HTTPS/TLS connections.

    secure

    • Type: boolean
    • Default: false

    Expose the mock server through HTTP over TLS(SSL).

    {
    +  "secure": true
    +}
    +
    secure: true
    +

    Hot reloads

    When building the imposters to mock your server, you way want to reduce the feedback loop on configuration changes.

    watcher

    • Type: boolean
    • Default: false

    Enable the file watcher to hot reload the mock server on every imposters change.

    {
    +  "watcher": true
    +}
    +
    watcher: true
    +

    Full example

    See below a full example of the configuration file:

    {
    +    "port": 3000,
    +    "host": "localhost",
    +    "imposters_path": "imposters",
    +    "proxy": {
    +      "url": "https://example.com",
    +      "mode": "missing"
    +    },
    +    "cors": {
    +      "methods": [
    +        "GET"
    +      ],
    +      "headers": [
    +        "Content-Type"
    +      ],
    +      "exposed_headers": [
    +        "Cache-Control"
    +      ],
    +      "origins": [
    +        "*"
    +      ],
    +      "allow_credentials": true
    +    },
    +    "secure": true,
    +    "watcher": true
    +}
    +
    port: 3000
    +host: "localhost"
    +imposters_path: "imposters"
    +proxy:
    +  url: https://example.com
    +  mode: missing
    +cors:
    +  methods: ["GET"]
    +  headers: ["Content-Type"]
    +  exposed_headers: ["Cache-Control"]
    +  origins: ["*"]
    +  allow_credentials: true
    +secure: true
    +watcher: true
    +

    Imposters

    Imposters are the first-class citizens in Killgrave, they define how the mock server will respond to the incoming requests. You can use either JSON or YAML to define them.

    Request

    The request configuration is used to evaluate whether an incoming request matches the imposter or not. If there's a match, the mock server will respond with the imposter's response.

    method

    • Type: string
    • Default: -

    Specify the expected HTTP method.

    {
    +  "request": {
    +    "method": "POST"
    +  }
    +}
    +
    request:
    +  method: "POST"
    +

    endpoint

    • Type: string
    • Default: -
    `,54),q={href:"https://github.com/gorilla/mux#examples",target:"_blank",rel:"noopener noreferrer"},f=a(`
    {
    +  "request": {
    +    "endpoint": "/gophers"
    +  }
    +}
    +
    request:
    +  endpoint: /gophers
    +

    schemaFile

    • Type: string
    • Default: -

    Specify the path to the file that contains the expected JSON schema.

    {
    +  "request": {
    +    "schemaFile": "schemas/create_gopher_request.json"
    +  }
    +}
    +
    request:
    +  schemaFile: "schemas/create_gopher_request.json"
    +

    params

    • Type: string map
    • Default: -
    `,9),x={href:"https://github.com/gorilla/mux#examples",target:"_blank",rel:"noopener noreferrer"},j=a(`
    {
    +  "request": {
    +    "params": {
    +      "id": "01EKPT"
    +    }
    +  }
    +}
    +
    request:
    +  params:
    +    id: "01EKPT"
    +

    headers

    • Type: string map
    • Default: -

    Specify the expected HTTP headers.

    {
    +  "request": {
    +    "headers": {
    +      "Content-Type": "application/json",
    +      "Return-Error": "error"
    +    }
    +  }
    +}
    +
    request:
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    Response

    The response configuration is used to build the response in case of match with the incoming request.

    status

    • Type: number
    • Default: 200

    Specify the response's HTTP status code.

    {
    +  "response": {
    +    "status": 401
    +  }
    +}
    +
    response:
    +  status: 401
    +

    body

    • Type: string
    • Default: -

    Specify the raw contents (as string) to be returned as the response body. You could use a stringified JSON, for instance.

    Although, in such cases where the desired response body is a complex payload (e.g. a JSON object), we recommend to use a separate file in combination with the bodyFile request attribute.

    {
    +  "response": {
    +    "body": "Simple response body"
    +  }
    +}
    +
    response:
    +  body: "Simple response body"
    +

    bodyFile

    • Type: string
    • Default: -

    Specify the path to the file that contains the response body's contents.

    {
    +  "response": {
    +    "bodyFile": "/path/to/file"
    +  }
    +}
    +
    response:
    +  bodyFile: "/path/to/file"
    +

    headers

    • Type: string map
    • Default: -

    Specify the response's HTTP headers.

    {
    +  "response": {
    +    "headers": {
    +      "Content-Type": "application/json",
    +      "Return-Error": "error"
    +    }
    +  }
    +}
    +
    response:
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    delay

    • Type: string
    • Default: -

    Specify the response delay. It is really helpful to reproduce real-world examples and/or to simulate situations with peaks of load where the responses are considerably slow.

    You can use either a fixed time (single value) or an interval (two values joined by :).

    `,34),T={href:"https://pkg.go.dev/time#ParseDuration",target:"_blank",rel:"noopener noreferrer"},_=n("code",null,"time.ParseDuration",-1),w=a(`
    {
    +  "response": {
    +    "delay": "2s:5s"
    +  }
    +}
    +
    response:
    +  delay: "2s:5s"
    +

    Full examples

    See below some full examples:

    Request

    {
    +    "request": {
    +      "method": "POST",
    +      "endpoint": "/gophers",
    +      "schemaFile": "schemas/create_gopher_request.json",
    +      "params": {
    +        "id": "01EKPT"
    +      },
    +      "headers": {
    +        "Content-Type": "application/json",
    +        "Return-Error": "error"
    +      }
    +    }
    +}
    +
    request:
    +  method: "POST"
    +  endpoint: "/gophers"
    +  schemaFile": "schemas/create_gopher_request.json"
    +  params":
    +    id: "01EKPT"
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    Response

    {
    +    "response": {
    +      "status": 401,
    +      "body": "Simple response body",
    +      "bodyFile": "/path/to/file",
    +      "headers": {
    +        "Content-Type": "application/json",
    +        "Return-Error": "error"
    +      },
    +      "delay": "2s:5s"
    +    }
    +}
    +
    response:
    +  status: 401
    +  body: "Simple response body"
    +  bodyFile: "/path/to/file"
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +  delay: "2s:5s"
    +

    Note from the examples above that you should only provide one of body or bodyFile, but not both. Here both are defined just for the sake of showing a full example.

    `,11);function S(o,C){const e=p("ExternalLinkIcon");return i(),r("div",null,[u,n("img",{src:o.$withBase("/img/killgrave.png"),alt:"killgrave",style:{"max-width":"130px"}},null,8,d),v,n("p",null,[s("Specify the host for the Killgrave server. If you are using "),n("a",k,[s("Docker"),t(e)]),s(", you must override the default value. Otherwise, the server will be reachable only from the container itself, so probably it won't work as you expect.")]),m,n("p",null,[s("Specify the port for the Killgrave server. If you are using "),n("a",h,[s("Docker"),t(e)]),s(", you need to forward it.")]),b,n("p",null,[s("Set up the "),n("a",g,[s("cross-origin resource sharing (CORS)"),t(e)]),s(" mechanism for the Killgrave server. Especially useful when mocking servers that are consumed by frontend applications.")]),y,n("p",null,[s("Specify the expected URL endpoint (path). You can define URL parameters and use regular expressions. Look at "),n("a",q,[s("Gorilla Mux examples"),t(e)]),s(" to see how regular expressions work.")]),f,n("p",null,[s("Specify the expected URL params. You can use regular expressions. Look at "),n("a",x,[s("Gorilla Mux examples"),t(e)]),s(" to see how regular expressions work.")]),j,n("p",null,[s("Look at Go "),n("a",T,[_,t(e)]),s(" examples to see the accepted format to specify the time durations of the response delay.")]),w])}const D=l(c,[["render",S],["__file","index.html.vue"]]);export{D as default}; diff --git a/assets/index.html-IYIbccC0.js b/assets/index.html-IYIbccC0.js new file mode 100644 index 0000000..cfc1db6 --- /dev/null +++ b/assets/index.html-IYIbccC0.js @@ -0,0 +1 @@ +import{_ as i,o as r,c as o,a as e,b as s,e as t}from"./app-GKjJbFgT.js";const l={},n=e("h1",{id:"killgrave",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#killgrave","aria-hidden":"true"},"#"),s(" Killgrave")],-1),c=["src"],d=t("

    Killgrave is a tool that provides a simple way to create a powerful simulator for HTTP-based APIs.

    The Killgrave's philosophy is to provide an easy way to configure your mock server, ensuring that you don't need to learn another tooling language. For that reason we use JSON and YAML to generate all necessary configurations.

    Some Killgrave features are:

    • An easy way to create imposters files, either using JSON or YAML.
    • The possibility to validate requests against JSON schemas.
    • Use of regular expressions to allow different parameters in headers and urls.
    • Custom and dynamic response bodies, of all content types (application/json, text/html...).
    • Custom response headers and cross-origin resource sharing (CORS).
    • Simulate network issues and server high loads with configurable, dynamic responses delay.
    • Use of configurable proxy server to call to the original server.
    • Use either command-line interface flags or a configuration file (JSON/YAML).
    • Hot configuration reloads based on a configurable file watcher.
    • Expose the mocker server through HTTP over TLS (SSL).
    • Use of an interactive mode to debug your mock server with a web app.
    ",4);function h(a,u){return r(),o("div",null,[n,e("img",{src:a.$withBase("/img/killgrave.png"),alt:"killgrave",style:{"max-width":"130px"}},null,8,c),d])}const p=i(l,[["render",h],["__file","index.html.vue"]]);export{p as default}; diff --git a/assets/index.html-P364yGk2.js b/assets/index.html-P364yGk2.js new file mode 100644 index 0000000..552d8e8 --- /dev/null +++ b/assets/index.html-P364yGk2.js @@ -0,0 +1,25 @@ +import{_ as i,r as t,o,c as r,a as n,b as e,d as l,w as c,e as p}from"./app-GKjJbFgT.js";const d={},u=n("h1",{id:"command-line-interface-cli",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#command-line-interface-cli","aria-hidden":"true"},"#"),e(" Command-line interface (CLI)")],-1),v=["src"],h=n("h2",{id:"killgrave",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#killgrave","aria-hidden":"true"},"#"),e(" Killgrave")],-1),m=n("a",{href:"/config"},"config reference",-1),g=n("a",{href:"/guide"},"guide",-1),b=p(`

    However, you can tune up some of their settings like the host and port where the mock server is listening to, among others, by providing some configuration settings.

    To provide those settings, you can either use the available CLI flags or use the -config flag to provide the path to a settings file. In such case, you can either use a JSON or YAML configuration file.

    Available flags

    See below the list of available flags:

    $ killgrave -h
    +
    +  -config string
    +        path to the configuration file
    +  -debugger
    +        run your server with the debugger
    +  -debugger-addr string
    +        debugger address (default "localhost:3030")
    +  -host string
    +        run your server on a different host (default "localhost")
    +  -imposters string
    +        directory where imposters are read from (default "imposters")
    +  -port int
    +        run your server on a different port (default 3000)
    +  -proxy-mode string
    +        proxy mode (choose between 'all', 'missing' or 'none') (default "none")
    +  -proxy-url string
    +        proxy url, use it in combination with proxy-mode
    +  -secure
    +        run your server using TLS (https)
    +  -version
    +        show the version of the application
    +  -watcher
    +        enable the file watcher, which reloads the server on every file change
    +
    `,5);function f(a,k){const s=t("RouterLink");return o(),r("div",null,[u,n("img",{src:a.$withBase("/img/killgrave.png"),alt:"killgrave",style:{"max-width":"130px"}},null,8,v),h,n("p",null,[e("Killgrave is basically a command-line interface (CLI) that can be used with no explicit configuration, but a set of "),l(s,{to:"/config/#imposters"},{default:c(()=>[e("imposters")]),_:1}),e(". Look at the "),m,e(" or "),g,e(" for further details.")]),b])}const x=i(d,[["render",f],["__file","index.html.vue"]]);export{x as default}; diff --git a/assets/index.html-_BzUMnyZ.js b/assets/index.html-_BzUMnyZ.js new file mode 100644 index 0000000..41a8fb1 --- /dev/null +++ b/assets/index.html-_BzUMnyZ.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-ba934fd8","path":"/config/","title":"Config Reference","lang":"en-US","frontmatter":{"sidebar":"auto"},"headers":[{"level":2,"title":"Killgrave","slug":"killgrave","link":"#killgrave","children":[{"level":3,"title":"Basic","slug":"basic","link":"#basic","children":[]},{"level":3,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":3,"title":"CORS","slug":"cors","link":"#cors","children":[]},{"level":3,"title":"Security","slug":"security","link":"#security","children":[]},{"level":3,"title":"Hot reloads","slug":"hot-reloads","link":"#hot-reloads","children":[]},{"level":3,"title":"Full example","slug":"full-example","link":"#full-example","children":[]}]},{"level":2,"title":"Imposters","slug":"imposters","link":"#imposters","children":[{"level":3,"title":"Request","slug":"request","link":"#request","children":[]},{"level":3,"title":"Response","slug":"response","link":"#response","children":[]},{"level":3,"title":"Full examples","slug":"full-examples","link":"#full-examples","children":[]}]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"config/README.md"}');export{e as data}; diff --git a/assets/index.html-jIgMvDZ4.js b/assets/index.html-jIgMvDZ4.js new file mode 100644 index 0000000..3aea2fb --- /dev/null +++ b/assets/index.html-jIgMvDZ4.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as t}from"./app-GKjJbFgT.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default}; diff --git a/assets/index.html-mIPCr_qu.js b/assets/index.html-mIPCr_qu.js new file mode 100644 index 0000000..bdcf226 --- /dev/null +++ b/assets/index.html-mIPCr_qu.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-fffb8e28","path":"/guide/","title":"Killgrave","lang":"en-US","frontmatter":{"prev":false,"next":"./concepts.md"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/README.md"}');export{e as data}; diff --git a/assets/index.html-tQcrVKVd.js b/assets/index.html-tQcrVKVd.js new file mode 100644 index 0000000..94ae36a --- /dev/null +++ b/assets/index.html-tQcrVKVd.js @@ -0,0 +1 @@ +const e=JSON.parse(`{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"heroImage":"img/killgrave.png","tagline":"The simplest way to generate your mock servers","actions":[{"text":"Get started","link":"/guide/","type":"primary"}],"features":[{"title":"Dynamic responses","details":"Define the mock responses based on the request's content with the minimal configuration"},{"title":"Simulate the real world","details":"Network issues, delays and some others are common in the real world. Just simulate them."},{"title":"Proxy your mock","details":"Redirect the incoming requests to another API in a simple and easy way"}],"footer":"Made by Friends of Go with ❤️"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"index.md"}`);export{e as data}; diff --git a/assets/installation.html-13nM83rt.js b/assets/installation.html-13nM83rt.js new file mode 100644 index 0000000..294a605 --- /dev/null +++ b/assets/installation.html-13nM83rt.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-d7be191a","path":"/guide/installation.html","title":"Installation","lang":"en-US","frontmatter":{"prev":"./concepts","next":"./getting-started"},"headers":[{"level":2,"title":"Go Toolchain","slug":"go-toolchain","link":"#go-toolchain","children":[]},{"level":2,"title":"Homebrew","slug":"homebrew","link":"#homebrew","children":[]},{"level":2,"title":"Docker","slug":"docker","link":"#docker","children":[]},{"level":2,"title":"Other","slug":"other","link":"#other","children":[]}],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/installation.md"}');export{e as data}; diff --git a/assets/installation.html-_D7ND1iN.js b/assets/installation.html-_D7ND1iN.js new file mode 100644 index 0000000..1e0bdb3 --- /dev/null +++ b/assets/installation.html-_D7ND1iN.js @@ -0,0 +1,4 @@ +import{_ as r,r as t,o as i,c as l,a,b as e,d as s,e as o}from"./app-GKjJbFgT.js";const c={},d=a("h1",{id:"installation",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#installation","aria-hidden":"true"},"#"),e(" Installation")],-1),h={href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"},p=o(`

    You can install Killgrave in different ways, but all of them are very simple:

    Go Toolchain

    One of them is of course using go install, Killgrave is a Go project and therefore can be compiled using the go toolchain:

    $ go install github.com/friendsofgo/killgrave/cmd/killgrave@{version}
    +

    Note that version must be replaced by the version that you want to install. If left unspecified, the main branch will be installed.

    Homebrew

    `,6),u={href:"https://brew.sh/",target:"_blank",rel:"noopener noreferrer"},b=o(`
    $ brew install friendsofgo/tap/killgrave
    +

    ⚠️ If you are installing via Homebrew, you always get the latest Killgrave version, we hope to fix this soon!

    Docker

    `,3),m={href:"https://www.docker.com/",target:"_blank",rel:"noopener noreferrer"},g=o(`
    $ docker run -it --rm -p 3000:3000 -v $PWD/:/home -w /home friendsofgo/killgrave -host 0.0.0.0
    +
    • -p 3000:3000 is used to forward the local port 3000 (Killgrave's default port) to container's port 3000, otherwise Killgrave won't be reachable from the host.

    • -host 0.0.0.0 is used to change the Killgrave's default host (localhost) to allow Killgrave to listen to and respond to incoming requests from outside the container, otherwise Killgrave won't be reachable from the host.

    Other

    `,3),v={href:"https://github.com/friendsofgo/killgrave/releases",target:"_blank",rel:"noopener noreferrer"};function f(k,_){const n=t("ExternalLinkIcon");return i(),l("div",null,[d,a("blockquote",null,[a("p",null,[e("⚠️ Even though Killgrave is a very robust tool and is being used by some companies in production environments, it's still in initial development. Therefore, 'minor' version numbers are used to signify breaking changes and 'patch' version numbers are used for non-breaking changes or bugfixing. As soon as v1.0.0 is released, Killgrave will start to use "),a("a",h,[e("SemVer"),s(n)]),e(" as usual.")])]),p,a("p",null,[e("If you are a macOS user, you can install Killgrave using "),a("a",u,[e("Homebrew"),s(n)]),e(":")]),b,a("p",null,[e("Killgrave is also available through "),a("a",m,[e("Docker"),s(n)]),e(".")]),g,a("p",null,[e("Windows and Linux users can download binaries from the "),a("a",v,[e("GitHub Releases"),s(n)]),e(" page.")])])}const x=r(c,[["render",f],["__file","installation.html.vue"]]);export{x as default}; diff --git a/assets/style-ysdZ3Cf_.css b/assets/style-ysdZ3Cf_.css new file mode 100644 index 0000000..98e5de9 --- /dev/null +++ b/assets/style-ysdZ3Cf_.css @@ -0,0 +1 @@ +:root{--back-to-top-z-index: 5;--back-to-top-color: #3eaf7c;--back-to-top-color-hover: #71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2049.484%2028.284'%3e%3cg%20transform='translate(-229%20-126.358)'%20fill='currentColor'%3e%3crect%20width='35'%20height='5'%20rx='2'%20transform='rotate(-45%20296.902%20-200.874)'/%3e%3crect%20width='35'%20height='5'%20rx='2'%20transform='rotate(-135%20169.502%2020.377)'/%3e%3c/g%3e%3c/svg%3e") no-repeat;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2049.484%2028.284'%3e%3cg%20transform='translate(-229%20-126.358)'%20fill='currentColor'%3e%3crect%20width='35'%20height='5'%20rx='2'%20transform='rotate(-45%20296.902%20-200.874)'/%3e%3crect%20width='35'%20height='5'%20rx='2'%20transform='rotate(-135%20169.502%2020.377)'/%3e%3c/g%3e%3c/svg%3e") no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width: 959px){.back-to-top{display:none}}@media print{.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--medium-zoom-z-index: 100;--medium-zoom-bg-color: #ffffff;--medium-zoom-opacity: 1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-dark: #ebebec;--c-bg-darker: #e6e6e6;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #ffc310;--c-warning-bg: #fffae3;--c-warning-bg-light: #fff3ba;--c-warning-bg-lighter: #fff0b0;--c-warning-border-dark: #f7dc91;--c-warning-details-bg: #fff5ca;--c-warning-title: #f1b300;--c-warning-text: #746000;--c-warning-text-accent: #edb100;--c-warning-text-light: #c1971c;--c-warning-text-quote: #ccab49;--c-danger: #f11e37;--c-danger-bg: #ffe0e0;--c-danger-bg-light: #ffcfde;--c-danger-bg-lighter: #ffc9c9;--c-danger-border-dark: #f1abab;--c-danger-details-bg: #ffd4d4;--c-danger-title: #ed1e2c;--c-danger-text: #660000;--c-danger-text-accent: #bd1a1a;--c-danger-text-light: #b5474d;--c-danger-text-quote: #c15b5b;--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: #ecc808;--c-badge-warning-text: var(--c-bg);--c-badge-danger: #dc2626;--c-badge-danger-text: var(--c-bg);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--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}.back-to-top{--back-to-top-color: var(--c-brand);--back-to-top-color-hover: var(--c-brand-light)}.DocSearch{--docsearch-primary-color: var(--c-brand);--docsearch-text-color: var(--c-text);--docsearch-highlight-color: var(--c-brand);--docsearch-muted-color: var(--c-text-quote);--docsearch-container-background: rgba(9, 10, 17, .8);--docsearch-modal-background: var(--c-bg-light);--docsearch-searchbox-background: var(--c-bg-lighter);--docsearch-searchbox-focus-background: var(--c-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);--docsearch-hit-color: var(--c-text-light);--docsearch-hit-active-color: var(--c-bg);--docsearch-hit-background: var(--c-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background: var(--c-bg)}.external-link-icon{--external-link-icon-color: var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg)}#nprogress{--nprogress-color: var(--c-brand)}.pwa-popup{--pwa-popup-text-color: var(--c-text);--pwa-popup-bg-color: var(--c-bg);--pwa-popup-border-color: var(--c-brand);--pwa-popup-shadow: 0 4px 16px var(--c-brand);--pwa-popup-btn-text-color: var(--c-bg);--pwa-popup-btn-bg-color: var(--c-brand);--pwa-popup-btn-hover-bg-color: var(--c-brand-light)}.search-box{--search-bg-color: var(--c-bg);--search-accent-color: var(--c-brand);--search-text-color: var(--c-text);--search-border-color: var(--c-border);--search-item-text-color: var(--c-text-lighter);--search-item-focus-bg-color: var(--c-bg-light)}html.dark{--c-brand: #3aa675;--c-brand-light: #349469;--c-bg: #22272e;--c-bg-light: #2b313a;--c-bg-lighter: #262c34;--c-bg-dark: #343b44;--c-bg-darker: #37404c;--c-text: #adbac7;--c-text-light: #96a7b7;--c-text-lighter: #8b9eb0;--c-text-lightest: #8094a8;--c-border: #3e4c5a;--c-border-dark: #34404c;--c-tip: #318a62;--c-warning: #e0ad15;--c-warning-bg: #2d2f2d;--c-warning-bg-light: #423e2a;--c-warning-bg-lighter: #44442f;--c-warning-border-dark: #957c35;--c-warning-details-bg: #39392d;--c-warning-title: #fdca31;--c-warning-text: #d8d96d;--c-warning-text-accent: #ffbf00;--c-warning-text-light: #ddb84b;--c-warning-text-quote: #ccab49;--c-danger: #fc1e38;--c-danger-bg: #39232c;--c-danger-bg-light: #4b2b35;--c-danger-bg-lighter: #553040;--c-danger-border-dark: #a25151;--c-danger-details-bg: #482936;--c-danger-title: #fc2d3b;--c-danger-text: #ea9ca0;--c-danger-text-accent: #fd3636;--c-danger-text-light: #d9777c;--c-danger-text-quote: #d56b6b;--c-details-bg: #323843;--c-badge-warning: var(--c-warning);--c-badge-warning-text: #3c2e05;--c-badge-danger: var(--c-danger);--c-badge-danger-text: #401416;--code-hl-bg-color: #363b46}html.dark .DocSearch{--docsearch-logo-color: var(--c-text);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);--docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}html,body{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}html.dark{color-scheme:dark}html{font-size:16px}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem;color:var(--c-text)}a{font-weight:500;color:var(--c-text-accent);text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400;color:var(--c-text-accent)}kbd{font-family:var(--font-family-code);color:var(--c-text);background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{font-family:var(--font-family-code);color:var(--c-text-lighter);padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--c-bg-light);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem;overflow-wrap:break-word}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}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:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media print{a.header-anchor{display:none}}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}@media print{a[href^="http://"]:after,a[href^="https://"]:after{content:" (" attr(href) ") "}}p,ul,ol{line-height:1.7;overflow-wrap:break-word}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto;transition:border-color var(--t-color)}tr{border-top:1px solid var(--c-border-dark);transition:border-color var(--t-color)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}tr:nth-child(2n) code{background-color:var(--c-bg-dark)}th,td{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--c-bg-arrow)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--c-bg-arrow)}.badge{display:inline-block;font-size:14px;font-weight:600;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning);color:var(--c-badge-warning-text)}.badge.danger{background-color:var(--c-badge-danger);color:var(--c-badge-danger-text)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.375;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent!important;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{content:attr(data-ext);position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.375}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.375;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;-moz-user-select:none;user-select:none;height:1.375em}div[class*=language-].line-numbers-mode .line-numbers .line-number:before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}@media (max-width: 419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:none}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width: 419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.tip,.custom-container.warning,.custom-container.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.tip code{background-color:var(--c-bg-dark)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.warning blockquote{border-left-color:var(--c-warning-border-dark);color:var(--c-warning-text-quote)}.custom-container.warning code{color:var(--c-warning-text-light);background-color:var(--c-warning-bg-light)}.custom-container.warning details{background-color:var(--c-warning-details-bg)}.custom-container.warning details code{background-color:var(--c-warning-bg-lighter)}.custom-container.warning .external-link-icon{--external-link-icon-color: var(--c-warning-text-quote)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.danger blockquote{border-left-color:var(--c-danger-border-dark);color:var(--c-danger-text-quote)}.custom-container.danger code{color:var(--c-danger-text-light);background-color:var(--c-danger-bg-light)}.custom-container.danger details{background-color:var(--c-danger-details-bg)}.custom-container.danger details code{background-color:var(--c-danger-bg-lighter)}.custom-container.danger .external-link-icon{--external-link-icon-color: var(--c-danger-text-quote)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details code{background-color:var(--c-bg-darker)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:none;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width: 719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width: 419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:var(--navbar-height);box-sizing:border-box;border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);position:fixed;z-index:10;margin:0;top:var(--navbar-height);left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-sidebar .sidebar{display:none}@media (max-width: 719px){.theme-container.no-sidebar .sidebar{display:block}}.theme-container.no-sidebar .page{padding-left:0}.theme-default-content a:hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media screen and (max-width: 719px){.navbar{padding-left:4rem}.navbar .site-name{display:block;width:calc(100vw - 11rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.navbar .can-hide{display:none}}.navbar-items{display:inline-block}@media print{.navbar-items{display:none}}.navbar-items a{display:inline-block;line-height:1.4rem;color:inherit}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}.navbar-items .navbar-item>a:hover,.navbar-items .navbar-item>a.router-link-active{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}@media (max-width: 719px){.navbar-items .navbar-item{margin-left:0}.navbar-items .navbar-item>a:hover,.navbar-items .navbar-item>a.router-link-active{margin-bottom:0;border-bottom:none}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width: 719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--c-text);opacity:.8;cursor:pointer}@media print{.toggle-color-mode-button{display:none}}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title:hover,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title,.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title,.navbar-dropdown-wrapper.mobile .navbar-dropdown-title-mobile{display:none}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper.mobile .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle,.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}.navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.navbar-dropdown-wrapper:not(.mobile):hover .navbar-dropdown,.navbar-dropdown-wrapper:not(.mobile).open .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper:not(.mobile).open:blur{display:none}.navbar-dropdown-wrapper:not(.mobile) .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.page .theme-default-content{padding:2rem}}@media (max-width: 419px){.page .theme-default-content{padding:1.5rem}}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width: 959px){.page-meta{padding:2rem}}@media (max-width: 419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}@media print{.page-meta .edit-link{display:none}}.page-meta .last-updated{float:right}@media (max-width: 719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width: 959px){.page-nav{padding:2rem}}@media (max-width: 419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"←"}.page-nav .next{float:right}.page-nav .next a:after{content:"→"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width: 719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.collapsible{cursor:pointer}.sidebar-item.collapsible .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item{cursor:pointer}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}:root{--c-brand: #db502a;--c-brand-light: #db502a}html.dark{--c-brand: #db502a;--c-brand-light: #db502a}:root{--search-bg-color: #ffffff;--search-accent-color: #3eaf7c;--search-text-color: #2c3e50;--search-border-color: #eaecef;--search-item-text-color: #5d81a5;--search-item-focus-bg-color: #f3f4f5;--search-input-width: 8rem;--search-result-width: 20rem}.search-box{display:inline-block;position:relative;margin-left:1rem}@media print{.search-box{display:none}}.search-box input{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:text;width:var(--search-input-width);height:2rem;color:var(--search-text-color);display:inline-block;border:1px solid var(--search-border-color);border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all ease .3s;background:var(--search-bg-color) url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='13'%3e%3cg%20stroke-width='2'%20stroke='%23aaa'%20fill='none'%3e%3cpath%20d='M11.29%2011.71l-4-4'/%3e%3ccircle%20cx='5'%20cy='5'%20r='4'/%3e%3c/g%3e%3c/svg%3e") .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:var(--search-accent-color)}.search-box .suggestions{background:var(--search-bg-color);width:var(--search-result-width);position:absolute;top:2rem;right:0;border:1px solid var(--search-border-color);border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion.focus{background-color:var(--search-item-focus-bg-color)}.search-box .suggestion.focus a{color:var(--search-accent-color)}.search-box .suggestion a{white-space:normal;color:var(--search-item-text-color)}.search-box .suggestion .page-title{font-weight:600}.search-box .suggestion .page-header{font-size:.9em;margin-left:.25em}@media (max-width: 719px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width: 419px){.search-box input:focus{width:8rem}.search-box .suggestions{width:calc(100vw - 4rem);right:-.5rem}} diff --git a/assets/your-first-imposter.html-C8xizH02.js b/assets/your-first-imposter.html-C8xizH02.js new file mode 100644 index 0000000..b53c97b --- /dev/null +++ b/assets/your-first-imposter.html-C8xizH02.js @@ -0,0 +1,16 @@ +import{_ as s,o as n,c as t,e}from"./app-GKjJbFgT.js";const o={},a=e(`

    Your first imposter

    At least one imposter must be configured in order to use Killgrave.

    Every file with any of the valid extensions (.imp.json, .imp.yml or .imp.yaml), present in the "imposters" folder (default "./imposters") will be interpreted as an imposters file.

    We use a rule-based system to match requests to imposters. Therefore, you have to organize your imposters from most restrictive to least.

    Here's an example of the contents of an imposters file with a single imposter:

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/01D8EMQ185CA8PRGE20DKZTGSR"
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\\"data\\":{\\"type\\":\\"gophers\\",\\"id\\":\\"01D8EMQ185CA8PRGE20DKZTGSR\\",\\"attributes\\":{\\"name\\":\\"Zebediah\\",\\"color\\":\\"Purples\\",\\"age\\":55}}}"
    +    }
    +  }
    +]
    +

    This a very simple example. Killgrave has more possibilities for configuring imposters.

    You can take a look at some of them in the "How to...?" section below.

    ⚠️Remember that you will need to escape any special char, in the properties that admit text.

    `,9),p=[a];function i(r,u){return n(),t("div",null,p)}const c=s(o,[["render",i],["__file","your-first-imposter.html.vue"]]);export{c as default}; diff --git a/assets/your-first-imposter.html-t5dvpvCj.js b/assets/your-first-imposter.html-t5dvpvCj.js new file mode 100644 index 0000000..2912c24 --- /dev/null +++ b/assets/your-first-imposter.html-t5dvpvCj.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-56beebfd","path":"/guide/your-first-imposter.html","title":"Your first imposter","lang":"en-US","frontmatter":{"prev":"./getting-started","next":"./advanced"},"headers":[],"git":{"updatedTime":1700862554000,"contributors":[{"name":"Joan López de la Franca Beltran","email":"joanjan14@gmail.com","commits":1}]},"filePathRelative":"guide/your-first-imposter.md"}');export{e as data}; diff --git a/cli/index.html b/cli/index.html new file mode 100644 index 0000000..d520866 --- /dev/null +++ b/cli/index.html @@ -0,0 +1,58 @@ + + + + + + + + + Command-line interface (CLI) | Killgrave + + + + + +

    Command-line interface (CLI)

    killgrave

    Killgrave

    Killgrave is basically a command-line interface (CLI) that can be used with no explicit configuration, but a set of imposters. Look at the config reference or guide for further details.

    However, you can tune up some of their settings like the host and port where the mock server is listening to, among others, by providing some configuration settings.

    To provide those settings, you can either use the available CLI flags or use the -config flag to provide the path to a settings file. In such case, you can either use a JSON or YAML configuration file.

    Available flags

    See below the list of available flags:

    $ killgrave -h
    +
    +  -config string
    +        path to the configuration file
    +  -debugger
    +        run your server with the debugger
    +  -debugger-addr string
    +        debugger address (default "localhost:3030")
    +  -host string
    +        run your server on a different host (default "localhost")
    +  -imposters string
    +        directory where imposters are read from (default "imposters")
    +  -port int
    +        run your server on a different port (default 3000)
    +  -proxy-mode string
    +        proxy mode (choose between 'all', 'missing' or 'none') (default "none")
    +  -proxy-url string
    +        proxy url, use it in combination with proxy-mode
    +  -secure
    +        run your server using TLS (https)
    +  -version
    +        show the version of the application
    +  -watcher
    +        enable the file watcher, which reloads the server on every file change
    +
    + + + diff --git a/config/index.html b/config/index.html new file mode 100644 index 0000000..10bd646 --- /dev/null +++ b/config/index.html @@ -0,0 +1,269 @@ + + + + + + + + + Config Reference | Killgrave + + + + + +

    Config Reference

    killgrave

    Killgrave

    Killgrave can be used without explicitly providing any configuration. However, you can tune up some of their settings like the host and port where the mock server is listening to, among others, by providing some configuration settings.

    To provide those settings, you can either use the available CLI flags or use the -config flag to provide the path to a settings file. In such case, you can either use JSON or YAML.

    Basic

    Minimal configuration attributes needed to get your mock up and running.

    host

    • Type: string
    • Default: localhost

    Specify the host for the Killgrave server. If you are using Dockeropen in new window, you must override the default value. Otherwise, the server will be reachable only from the container itself, so probably it won't work as you expect.

    {
    +  "host": "localhost"
    +}
    +
    host: "localhost"
    +

    port

    • Type: number
    • Default: 3000

    Specify the port for the Killgrave server. If you are using Dockeropen in new window, you need to forward it.

    {
    +  "port": 3000 
    +}
    +
    port: 3000
    +

    imposters_path

    • Type: string
    • Default: imposters

    Specify the directory the imposter files (either .imp.json, .imp.yml or .imp.yaml) will be loaded from. On a regular set up, this directory will contain multiple of those imposter files and the directories with schemas and responses.

    {
    +  "imposters_path": "imposters" 
    +}
    +
    imposters_path: imposters
    +

    Proxy

    Set up a proxy to redirect the incoming requests as you want.

    mode

    • Type: string
    • Default: none

    Specify the proxy mode for the Killgrave server. The default value is none which means no proxy. Use missing to redirect only those incoming requests that aren't defined within the imposters. Use all to redirect all incoming requests.

    {
    +  "proxy": {
    +    "mode": "missing"
    +  }
    +}
    +
    proxy:
    +  mode: missing
    +

    url

    • Type: string
    • Default: -

    Specify the url for the Killgrave's proxy. The incoming requests will be redirected to this url based on the proxy mode.

    {
    +  "proxy": {
    +    "url": "https://example.com"
    +  }
    +}
    +
    proxy:
    +  url: https://example.com
    +

    CORS

    Set up the cross-origin resource sharing (CORS)open in new window mechanism for the Killgrave server. Especially useful when mocking servers that are consumed by frontend applications.

    methods

    • Type: string array
    • Default: ["GET", "HEAD", "POST", "PUT", "OPTIONS", "DELETE", "PATCH", "TRACE", "CONNECT"]

    Represents the Access-Control-Request-Method header.

    {
    +  "cors": {
    +    "methods": ["GET"]
    +  }
    +}
    +
    cors:
    +  methods: ["GET"]
    +

    headers

    • Type: string array
    • Default: ["X-Requested-With", "Content-Type", "Authorization"]

    Represents the Access-Control-Request-Headers header.

    {
    +  "cors": {
    +    "headers": ["Content-Type"]
    +  }
    +}
    +
    cors:
    +  headers: ["Content-Type"]
    +

    exposed_headers

    • Type: string array
    • Default: ["Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma"]

    Represents the Access-Control-Expose-Headers header.

    {
    +  "cors": {
    +    "exposed_headers": ["Cache-Control"]
    +  }
    +}
    +
    cors:
    +  exposed_headers: ["Cache-Control"]
    +

    origins

    • Type: string array
    • Default: []

    Represents the Access-Control-Allow-Origin header.

    {
    +  "cors": {
    +    "origins": ["*"]
    +  }
    +}
    +
    cors:
    +  origins: ["*"]
    +

    allow_credentials

    • Type: boolean
    • Default: false

    Enables or disables the Access-Control-Allow-Credentials header.

    {
    +  "cors": {
    +    "allow_credentials": true
    +  }
    +}
    +
    cors:
    +  allow_credentials: true
    +

    Security

    Sometimes you may want to simulate a production-like behavior with your mock servers, for instance to verify that your frontend application manages correctly HTTPS/TLS connections.

    secure

    • Type: boolean
    • Default: false

    Expose the mock server through HTTP over TLS(SSL).

    {
    +  "secure": true
    +}
    +
    secure: true
    +

    Hot reloads

    When building the imposters to mock your server, you way want to reduce the feedback loop on configuration changes.

    watcher

    • Type: boolean
    • Default: false

    Enable the file watcher to hot reload the mock server on every imposters change.

    {
    +  "watcher": true
    +}
    +
    watcher: true
    +

    Full example

    See below a full example of the configuration file:

    {
    +    "port": 3000,
    +    "host": "localhost",
    +    "imposters_path": "imposters",
    +    "proxy": {
    +      "url": "https://example.com",
    +      "mode": "missing"
    +    },
    +    "cors": {
    +      "methods": [
    +        "GET"
    +      ],
    +      "headers": [
    +        "Content-Type"
    +      ],
    +      "exposed_headers": [
    +        "Cache-Control"
    +      ],
    +      "origins": [
    +        "*"
    +      ],
    +      "allow_credentials": true
    +    },
    +    "secure": true,
    +    "watcher": true
    +}
    +
    port: 3000
    +host: "localhost"
    +imposters_path: "imposters"
    +proxy:
    +  url: https://example.com
    +  mode: missing
    +cors:
    +  methods: ["GET"]
    +  headers: ["Content-Type"]
    +  exposed_headers: ["Cache-Control"]
    +  origins: ["*"]
    +  allow_credentials: true
    +secure: true
    +watcher: true
    +

    Imposters

    Imposters are the first-class citizens in Killgrave, they define how the mock server will respond to the incoming requests. You can use either JSON or YAML to define them.

    Request

    The request configuration is used to evaluate whether an incoming request matches the imposter or not. If there's a match, the mock server will respond with the imposter's response.

    method

    • Type: string
    • Default: -

    Specify the expected HTTP method.

    {
    +  "request": {
    +    "method": "POST"
    +  }
    +}
    +
    request:
    +  method: "POST"
    +

    endpoint

    • Type: string
    • Default: -

    Specify the expected URL endpoint (path). You can define URL parameters and use regular expressions. Look at Gorilla Mux examplesopen in new window to see how regular expressions work.

    {
    +  "request": {
    +    "endpoint": "/gophers"
    +  }
    +}
    +
    request:
    +  endpoint: /gophers
    +

    schemaFile

    • Type: string
    • Default: -

    Specify the path to the file that contains the expected JSON schema.

    {
    +  "request": {
    +    "schemaFile": "schemas/create_gopher_request.json"
    +  }
    +}
    +
    request:
    +  schemaFile: "schemas/create_gopher_request.json"
    +

    params

    • Type: string map
    • Default: -

    Specify the expected URL params. You can use regular expressions. Look at Gorilla Mux examplesopen in new window to see how regular expressions work.

    {
    +  "request": {
    +    "params": {
    +      "id": "01EKPT"
    +    }
    +  }
    +}
    +
    request:
    +  params:
    +    id: "01EKPT"
    +

    headers

    • Type: string map
    • Default: -

    Specify the expected HTTP headers.

    {
    +  "request": {
    +    "headers": {
    +      "Content-Type": "application/json",
    +      "Return-Error": "error"
    +    }
    +  }
    +}
    +
    request:
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    Response

    The response configuration is used to build the response in case of match with the incoming request.

    status

    • Type: number
    • Default: 200

    Specify the response's HTTP status code.

    {
    +  "response": {
    +    "status": 401
    +  }
    +}
    +
    response:
    +  status: 401
    +

    body

    • Type: string
    • Default: -

    Specify the raw contents (as string) to be returned as the response body. You could use a stringified JSON, for instance.

    Although, in such cases where the desired response body is a complex payload (e.g. a JSON object), we recommend to use a separate file in combination with the bodyFile request attribute.

    {
    +  "response": {
    +    "body": "Simple response body"
    +  }
    +}
    +
    response:
    +  body: "Simple response body"
    +

    bodyFile

    • Type: string
    • Default: -

    Specify the path to the file that contains the response body's contents.

    {
    +  "response": {
    +    "bodyFile": "/path/to/file"
    +  }
    +}
    +
    response:
    +  bodyFile: "/path/to/file"
    +

    headers

    • Type: string map
    • Default: -

    Specify the response's HTTP headers.

    {
    +  "response": {
    +    "headers": {
    +      "Content-Type": "application/json",
    +      "Return-Error": "error"
    +    }
    +  }
    +}
    +
    response:
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    delay

    • Type: string
    • Default: -

    Specify the response delay. It is really helpful to reproduce real-world examples and/or to simulate situations with peaks of load where the responses are considerably slow.

    You can use either a fixed time (single value) or an interval (two values joined by :).

    Look at Go time.ParseDurationopen in new window examples to see the accepted format to specify the time durations of the response delay.

    {
    +  "response": {
    +    "delay": "2s:5s"
    +  }
    +}
    +
    response:
    +  delay: "2s:5s"
    +

    Full examples

    See below some full examples:

    Request

    {
    +    "request": {
    +      "method": "POST",
    +      "endpoint": "/gophers",
    +      "schemaFile": "schemas/create_gopher_request.json",
    +      "params": {
    +        "id": "01EKPT"
    +      },
    +      "headers": {
    +        "Content-Type": "application/json",
    +        "Return-Error": "error"
    +      }
    +    }
    +}
    +
    request:
    +  method: "POST"
    +  endpoint: "/gophers"
    +  schemaFile": "schemas/create_gopher_request.json"
    +  params":
    +    id: "01EKPT"
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +

    Response

    {
    +    "response": {
    +      "status": 401,
    +      "body": "Simple response body",
    +      "bodyFile": "/path/to/file",
    +      "headers": {
    +        "Content-Type": "application/json",
    +        "Return-Error": "error"
    +      },
    +      "delay": "2s:5s"
    +    }
    +}
    +
    response:
    +  status: 401
    +  body: "Simple response body"
    +  bodyFile: "/path/to/file"
    +  headers:
    +    Content-Type: "application/json"
    +    Return-Error: "error"
    +  delay: "2s:5s"
    +

    Note from the examples above that you should only provide one of body or bodyFile, but not both. Here both are defined just for the sake of showing a full example.

    + + + diff --git a/guide/advanced.html b/guide/advanced.html new file mode 100644 index 0000000..af1a5fd --- /dev/null +++ b/guide/advanced.html @@ -0,0 +1,34 @@ + + + + + + + + + Advanced features | Killgrave + + + + + +

    Advanced features

    Killgrave has some advanced features:

    CORS

    If you want to use Killgrave from a frontend application, you should consider configuring cross-origin resource sharing (CORS)open in new window.

    In the CORS section of the file you can find the following options:

    • methods: Access-Control-Request-Method
    • headers: Access-Control-Request-Headers
    • exposed_headers: Access-Control-Expose-Headers
    • origins: Access-Control-Allow-Origin
    • allow_credentials: Access-Control-Allow-Credentials

    You can find further details here.

    Proxy

    You can use Killgrave in proxy mode using the flags proxy-mode and proxy-url or their equivalent fields in the configuration file. The following three proxy modes are available:

    • none: (Default) Killgrave won't behave as a proxy and will only use the configured imposters.
    • missing: Killgrave will try to match the request with a configured imposter. Otherwise, it will forward the request to the configured proxy.
    • all: Killgrave will forward all the incoming requests to the configured proxy.

    The proxy-url must be the root path of the proxy server. For instance, if we have an API running on http://example.com/things, the configured proxy-url should be http://example.com.

    Secure (HTTP over TLS)

    Killgrave has a secure mode that lets you expose your mock servers over secure connections by using HTTP over TLS/SSL (HTTPS).

    You can use the secure setting to enable the secure mode. Disabled by default.

    If enabled, the mock server will use TLS options with a dummy certificate, to make it work with the HTTPS protocol.

    Watcher

    Killgrave has a file watcher that lets you hot reload your mock servers on every imposters change.

    You can use the watcher setting to enable the secure mode. Disabled by default.

    If enabled, the file watcher will be watching changes on the imposters directory so the mock server will be restarted on every imposters change.

    Debugger

    Killgrave has an interactive mode that lets you debug the behavior of your mock server.

    You can use the debugger settings to enable the interactive mode. Disabled by default.

    You can find further details here.

    + + + diff --git a/guide/concepts.html b/guide/concepts.html new file mode 100644 index 0000000..ff5ba72 --- /dev/null +++ b/guide/concepts.html @@ -0,0 +1,34 @@ + + + + + + + + + Concepts | Killgrave + + + + + +

    Concepts

    Imposters

    Imposters are the most important concept in the Killgrave's world.

    They conform the rules that determine how the mock server should respond to a request.

    You can identify a Killgrave imposter file by its extension: .imp.json, .imp.yml or .imp.yaml.

    You can learn more about how to configure imposters in the Imposter Configuration Section.

    Imposters Structure

    The imposter object can be divided in two parts:

    Request

    This part defines how Killgrave should determine whether an incoming request matches the imposter or not.

    The request object has the following properties:

    • method (mandatory): The HTTP method of the incoming request.
    • endpoint (mandatory): Path of the endpoint relative to the base. Supports regular expressions.
    • schemaFile: A JSON schema to validate the incoming request against.
    • params: Restrict incoming requests by query parameters. Supports regular expressions.
    • headers: Restrict incoming requests by HTTP header.

    Response

    This part defines how Killgrave should, in case of match, respond to the incoming request.

    The response object has the following properties:

    • status (mandatory): Integer defining the HTTP status code to return.
    • body or bodyFile: The response body. Either a literal string (body) or a path to a file (bodyFile). bodyFile is especially useful in the case of large outputs. This property is optional: if not response body should be returned it should be removed or left empty.
    • headers: HTTP headers to return in the response.
    • delay: Time the server waits before responding. This can help simulate network issues, or high server load. Uses the Go time.ParseDurationopen in new window format. Also, you can specify minimum and maximum delays separated by :. The response delay will be chosen randomly between these values. Default value is "0s" (no delay).
    + + + diff --git a/guide/getting-started.html b/guide/getting-started.html new file mode 100644 index 0000000..53283fd --- /dev/null +++ b/guide/getting-started.html @@ -0,0 +1,36 @@ + + + + + + + + + Getting started | Killgrave + + + + + +

    Getting started

    To start Killgrave, you can simply do it by running:

    $ killgrave
    +

    While you are welcome to provide your own configuration, Killgrave will default to the following configuration:

    • imposters path: imposters
    • host: localhost
    • port: 3000
    • CORS: []
    • proxy: none
    • watcher: false
    • debugger:
      • enabled: false
      • address: localhost:3030

    Command-line interface

    Killgrave is almost fully configurable through the command line, except for CORS, which can only be configured using the config file.

    You can find the list with all the available flags at CLI section or by running:

    $ killgrave -h
    +

    Configuration file

    In case you are looking for a predictable and reproducible configuration, you can use the -config command-line flag to specify the location of a configuration file, which can be written either in JSON or YAML.

    You can find the list with all the available settings at Config Reference section.

    As you can see, you can configure all the options in a very easy way.

    Historically, the options imposters_path, port and host were mandatory when using a configuration file. However, since the last version (v0.4.1), they are no longer needed, so you can simply override those options if you actually want to. Furthermore, in previous versions (prior to v0.4.1), the imposters_path option was used to refer to the path to the working directory where Killgrave was executed from, but since the last version (v0.4.1) this is relative to the location of the config file.

    + + + diff --git a/guide/ht-delays.html b/guide/ht-delays.html new file mode 100644 index 0000000..fe63f98 --- /dev/null +++ b/guide/ht-delays.html @@ -0,0 +1,53 @@ + + + + + + + + + Use delayed responses | Killgrave + + + + + +

    Use delayed responses

    If you want to simulate a problem with the network, or create a more realistic response, you can use the delay property.

    The delay property can take duration in the Go ParseDuration formatopen in new window. The server response will be delayed by the specified duration.

    Alternatively, the delay property can take a range of two durations, separated by :. In this case, the server will respond with a random delay within this range.

    With the example below, the response would be delayed between 1 and 5 seconds:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        },
    +        "delay": "1s:5s"
    +    }
    +  }
    +]
    +
    + + + diff --git a/guide/ht-dynamic.html b/guide/ht-dynamic.html new file mode 100644 index 0000000..85964af --- /dev/null +++ b/guide/ht-dynamic.html @@ -0,0 +1,65 @@ + + + + + + + + + Use dynamic responses | Killgrave + + + + + +

    Use dynamic responses

    Killgrave allows dynamic responses. Using this feature, Killgrave can return different responses on the same endpoint.

    To do this, all imposters need to be sorted from most restrictive to least. Killgrave tries to match the request with each of the imposters in sequence, stopping at the first imposter that matches the request.

    In the following example, there are defined multiple imposters for the POST /gophers endpoint:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    }
    +  },
    +  {
    +      "request": {
    +          "method": "POST",
    +          "endpoint": "/gophers"
    +      },
    +      "response": {
    +          "status": 400,
    +          "headers": {
    +              "Content-Type": "application/json"
    +          },
    +          "body": "{\"errors\":\"bad request\"}"
    +      }
    +  }
    +]
    +

    Now,

    1. Let's say an incoming request does not match the JSON schema specified in the first imposter's schemaFile.
    2. Therefore, Killgrave skips this imposter and tries to match the request against the next configured imposter.
    3. The next configured imposter is much less restrictive, so the request matches and the associated response is returned.
    + + + diff --git a/guide/ht-json.html b/guide/ht-json.html new file mode 100644 index 0000000..b5054ee --- /dev/null +++ b/guide/ht-json.html @@ -0,0 +1,104 @@ + + + + + + + + + Use JSON Schema | Killgrave + + + + + +

    Use JSON Schema

    Sometimes you may need to validate requests more thoroughly. In such case, you can create an imposter that only matches with a valid json schemaopen in new window.

    To do that you will need to define our json schema first:

    e.g. imposters/schemas/create_gopher_request.json

    {
    +    "type": "object",
    +    "properties": {
    +        "data": {
    +            "type": "object",
    +            "properties": {
    +                "type": {
    +                    "type": "string",
    +                    "enum": [
    +                        "gophers"
    +                    ]
    +                },
    +                "attributes": {
    +                    "type": "object",
    +                    "properties": {
    +                        "name": {
    +                            "type": "string"
    +                        },
    +                        "color": {
    +                            "type": "string"
    +                        },
    +                        "age": {
    +                            "type": "integer"
    +                        }
    +                    },
    +                    "required": [
    +                        "name",
    +                        "color",
    +                        "age"
    +                    ]
    +                }
    +            },
    +            "required": [
    +                "type",
    +                "attributes"
    +            ]
    +        }
    +    },
    +    "required": [
    +        "data"
    +    ]
    +}
    +

    With this json schema, we expect a request like this:

    {
    +    "data": {
    +        "type": "gophers",
    +        "attributes": {
    +            "name": "Zebediah",
    +            "color": "Purples",
    +            "age": 55
    +        }
    +    }
    +}
    +

    Then the imposter could be configured as follows:

    [
    +  {
    +    "request": {
    +        "method": "POST",
    +        "endpoint": "/gophers",
    +        "schemaFile": "schemas/create_gopher_request.json",
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    },
    +    "response": {
    +        "status": 201,
    +        "headers": {
    +            "Content-Type": "application/json"
    +        }
    +    }
    +  }
    +]
    +

    The path where the schema is located is relative to where the imposters are.

    + + + diff --git a/guide/ht-regex.html b/guide/ht-regex.html new file mode 100644 index 0000000..5de78fa --- /dev/null +++ b/guide/ht-regex.html @@ -0,0 +1,85 @@ + + + + + + + + + Use regular expressions (regex) | Killgrave + + + + + +

    Use regular expressions (regex)

    Regex in the endpoint

    Killgrave uses the gorilla/muxopen in new window regular expression format for endpoint matching.

    In the next example, we have configured an endpoint to match with any kind of ULID IDopen in new window:

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{_id:[\\w]{26}}"
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\"data\":{\"type\":\"gophers\",\"id\":\"01D8EMQ185CA8PRGE20DKZTGSR\",\"attributes\":{\"name\":\"Zebediah\",\"color\":\"Purples\",\"age\":55}}}"
    +    }
    +  }
    +]
    +

    Regex in the query parameters

    Killgrave uses the gorilla/muxopen in new window regular expression format for query parameter matching.

    In this example, we have configured an imposter that only matches if we receive an apiKey as query parameter:

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{_id:[\\w]{26}}",
    +      "params": {
    +        "apiKey": "{_apiKey:[\\w]+}"
    +      }
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\"data\":{\"type\":\"gophers\",\"id\":\"01D8EMQ185CA8PRGE20DKZTGSR\",\"attributes\":{\"name\":\"Zebediah\",\"color\":\"Purples\",\"age\":55}}}"
    +    }
    +  }
    +]
    +

    Regex in the headers:

    In this case we will not need the gorilla mux nomenclature to write our regex.

    In the next example, we have configured an imposter that uses regex to match an Authorization header.

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/{id:[\\w]{26}}",
    +      "headers": {
    +        "Authorization": "\\w+"
    +      }
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\"data\":{\"type\":\"gophers\",\"id\":\"01D8EMQ185CA8PRGE20DKZTGSR\",\"attributes\":{\"name\":\"Zebediah\",\"color\":\"Purples\",\"age\":55}}}"
    +    }
    +  }
    +]
    +
    + + + diff --git a/guide/index.html b/guide/index.html new file mode 100644 index 0000000..263f1d2 --- /dev/null +++ b/guide/index.html @@ -0,0 +1,34 @@ + + + + + + + + + Killgrave | Killgrave + + + + + +

    Killgrave

    killgrave

    Killgrave is a tool that provides a simple way to create a powerful simulator for HTTP-based APIs.

    The Killgrave's philosophy is to provide an easy way to configure your mock server, ensuring that you don't need to learn another tooling language. For that reason we use JSON and YAML to generate all necessary configurations.

    Some Killgrave features are:

    • An easy way to create imposters files, either using JSON or YAML.
    • The possibility to validate requests against JSON schemas.
    • Use of regular expressions to allow different parameters in headers and urls.
    • Custom and dynamic response bodies, of all content types (application/json, text/html...).
    • Custom response headers and cross-origin resource sharing (CORS).
    • Simulate network issues and server high loads with configurable, dynamic responses delay.
    • Use of configurable proxy server to call to the original server.
    • Use either command-line interface flags or a configuration file (JSON/YAML).
    • Hot configuration reloads based on a configurable file watcher.
    • Expose the mocker server through HTTP over TLS (SSL).
    • Use of an interactive mode to debug your mock server with a web app.
    + + + diff --git a/guide/installation.html b/guide/installation.html new file mode 100644 index 0000000..16459b9 --- /dev/null +++ b/guide/installation.html @@ -0,0 +1,37 @@ + + + + + + + + + Installation | Killgrave + + + + + +

    Installation

    ⚠️ Even though Killgrave is a very robust tool and is being used by some companies in production environments, it's still in initial development. Therefore, 'minor' version numbers are used to signify breaking changes and 'patch' version numbers are used for non-breaking changes or bugfixing. As soon as v1.0.0 is released, Killgrave will start to use SemVeropen in new window as usual.

    You can install Killgrave in different ways, but all of them are very simple:

    Go Toolchain

    One of them is of course using go install, Killgrave is a Go project and therefore can be compiled using the go toolchain:

    $ go install github.com/friendsofgo/killgrave/cmd/killgrave@{version}
    +

    Note that version must be replaced by the version that you want to install. If left unspecified, the main branch will be installed.

    Homebrew

    If you are a macOS user, you can install Killgrave using Homebrewopen in new window:

    $ brew install friendsofgo/tap/killgrave
    +

    ⚠️ If you are installing via Homebrew, you always get the latest Killgrave version, we hope to fix this soon!

    Docker

    Killgrave is also available through Dockeropen in new window.

    $ docker run -it --rm -p 3000:3000 -v $PWD/:/home -w /home friendsofgo/killgrave -host 0.0.0.0
    +
    • -p 3000:3000 is used to forward the local port 3000 (Killgrave's default port) to container's port 3000, otherwise Killgrave won't be reachable from the host.

    • -host 0.0.0.0 is used to change the Killgrave's default host (localhost) to allow Killgrave to listen to and respond to incoming requests from outside the container, otherwise Killgrave won't be reachable from the host.

    Other

    Windows and Linux users can download binaries from the GitHub Releasesopen in new window page.

    + + + diff --git a/guide/your-first-imposter.html b/guide/your-first-imposter.html new file mode 100644 index 0000000..e5b5168 --- /dev/null +++ b/guide/your-first-imposter.html @@ -0,0 +1,49 @@ + + + + + + + + + Your first imposter | Killgrave + + + + + +

    Your first imposter

    At least one imposter must be configured in order to use Killgrave.

    Every file with any of the valid extensions (.imp.json, .imp.yml or .imp.yaml), present in the "imposters" folder (default "./imposters") will be interpreted as an imposters file.

    We use a rule-based system to match requests to imposters. Therefore, you have to organize your imposters from most restrictive to least.

    Here's an example of the contents of an imposters file with a single imposter:

    [
    +  {
    +    "request": {
    +      "method": "GET",
    +      "endpoint": "/gophers/01D8EMQ185CA8PRGE20DKZTGSR"
    +    },
    +    "response": {
    +      "status": 200,
    +      "headers": {
    +        "Content-Type": "application/json"
    +      },
    +      "body": "{\"data\":{\"type\":\"gophers\",\"id\":\"01D8EMQ185CA8PRGE20DKZTGSR\",\"attributes\":{\"name\":\"Zebediah\",\"color\":\"Purples\",\"age\":55}}}"
    +    }
    +  }
    +]
    +

    This a very simple example. Killgrave has more possibilities for configuring imposters.

    You can take a look at some of them in the "How to...?" section below.

    ⚠️Remember that you will need to escape any special char, in the properties that admit text.

    + + + diff --git a/img/killgrave.png b/img/killgrave.png new file mode 100644 index 0000000000000000000000000000000000000000..92ee705d9d5c4b990f15f262f72ff2b89ce6e49a GIT binary patch literal 45764 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 + + + + + + + + Killgrave + + + + + +
    Killgrave

    Killgrave

    The simplest way to generate your mock servers

    Get started

    Dynamic responses

    Define the mock responses based on the request's content with the minimal configuration

    Simulate the real world

    Network issues, delays and some others are common in the real world. Just simulate them.

    Proxy your mock

    Redirect the incoming requests to another API in a simple and easy way

    + + +