commit 30756ae5d18184c633eca0a39875ab33a26330c8 Author: wayneshn Date: Sun Jul 27 18:34:28 2025 +0000 deploy: 8985655a48d3dedd0a4a71dcc09d3a2d94c129f9 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..1f0d32d --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | OpenArchiver Documentation + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/README.html b/README.html new file mode 100644 index 0000000..8f31551 --- /dev/null +++ b/README.html @@ -0,0 +1,25 @@ + + + + + + Get Started | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Get Started

Welcome to Open Archiver! This guide will help you get started with setting up and using the platform.

What is Open Archiver?

A secure, sovereign, and affordable open-source platform for email archiving and eDiscovery.

Open Archiver provides a robust, self-hosted solution for archiving, storing, indexing, and searching emails from major platforms, including Google Workspace (Gmail), Microsoft 365, as well as generic IMAP-enabled email inboxes. Use Open Archiver to keep a permanent, tamper-proof record of your communication history, free from vendor lock-in.

Key Features

  • Universal Ingestion: Connect to Google Workspace, Microsoft 365, and standard IMAP servers to perform initial bulk imports and maintain continuous, real-time synchronization.
  • Secure & Efficient Storage: Emails are stored in the standard .eml format. The system uses deduplication and compression to minimize storage costs. All data is encrypted at rest.
  • Pluggable Storage Backends: Support both local filesystem storage and S3-compatible object storage (like AWS S3 or MinIO).
  • Powerful Search & eDiscovery: A high-performance search engine indexes the full text of emails and attachments (PDF, DOCX, etc.).
  • Compliance & Retention: Define granular retention policies to automatically manage the lifecycle of your data. Place legal holds on communications to prevent deletion during litigation (TBD).
  • Comprehensive Auditing: An immutable audit trail logs all system activities, ensuring you have a clear record of who accessed what and when (TBD).

Installation

To get your own instance of Open Archiver running, follow our detailed installation guide:

Data Source Configuration

After deploying the application, you will need to configure one or more ingestion sources to begin archiving emails. Follow our detailed guides to connect to your email provider:

Contributing

We welcome contributions from the community!

  • Reporting Bugs: If you find a bug, please open an issue on our GitHub repository.
  • Suggesting Enhancements: Have an idea for a new feature? We'd love to hear it. Open an issue to start the discussion.
  • Code Contributions: If you'd like to contribute code, please fork the repository and submit a pull request.

Please read our CONTRIBUTING.md file for more details on our code of conduct and the process for submitting pull requests.

+ + + + \ No newline at end of file diff --git a/SUMMARY.html b/SUMMARY.html new file mode 100644 index 0000000..9937767 --- /dev/null +++ b/SUMMARY.html @@ -0,0 +1,25 @@ + + + + + + Table of contents | OpenArchiver Documentation + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/api/README.html b/api/README.html new file mode 100644 index 0000000..b2c8c08 --- /dev/null +++ b/api/README.html @@ -0,0 +1,25 @@ + + + + + + API documentation | OpenArchiver Documentation + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/api/ingestion.html b/api/ingestion.html new file mode 100644 index 0000000..7cb2838 --- /dev/null +++ b/api/ingestion.html @@ -0,0 +1,56 @@ + + + + + + Ingestion Sources API Documentation | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Ingestion Sources API Documentation

A guide to using the Ingestion Sources API.

Base Path: /v1/ingestion-sources


Authentication

All endpoints in this API are protected and require authentication. Requests must include an Authorization header containing a valid Bearer token. This can be a JWT obtained from the login endpoint or a SUPER_API_KEY for administrative tasks.

Header Example:Authorization: Bearer <YOUR_JWT_OR_SUPER_API_KEY>


Core Concepts

Ingestion Providers

The provider field determines the type of email source. Each provider requires a different configuration object, for example:

  • google_workspace: For connecting to Google Workspace accounts via OAuth 2.0.
  • microsoft_365: For connecting to Microsoft 365 accounts via OAuth 2.0.
  • generic_imap: For connecting to any email server that supports IMAP.

Ingestion Status

The status field tracks the state of the ingestion source.

  • pending_auth: The source has been created but requires user authorization (OAuth flow).
  • active: The source is authenticated and ready to sync.
  • syncing: An import job is currently in progress.
  • importing: initial syncing in progress
  • paused: The source is temporarily disabled.
  • error: An error occurred during the last sync.

1. Create Ingestion Source

  • Method: POST
  • Path: /
  • Description: Registers a new source for email ingestion. The providerConfig will vary based on the selected provider.

Request Body (CreateIngestionSourceDto)

  • name (string, required): A user-friendly name for the source (e.g., "Marketing Department G-Suite").
  • provider (string, required): One of google_workspace, microsoft_365, or generic_imap.
  • providerConfig (object, required): Configuration specific to the provider.
providerConfig for google_workspace / microsoft_365
json
{
+    "name": "Corporate Google Workspace",
+    "provider": "google_workspace",
+    "providerConfig": {
+        "clientId": "your-oauth-client-id.apps.googleusercontent.com",
+        "clientSecret": "your-super-secret-client-secret",
+        "redirectUri": "https://yourapp.com/oauth/google/callback"
+    }
+}
providerConfig for generic_imap
json
{
+    "name": "Legacy IMAP Server",
+    "provider": "generic_imap",
+    "providerConfig": {
+        "host": "imap.example.com",
+        "port": 993,
+        "secure": true,
+        "username": "archive-user",
+        "password": "imap-password"
+    }
+}

Responses

  • Success (201 Created): Returns the full IngestionSource object, which now includes a system-generated id and default status.

    json
    {
    +    "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
    +    "name": "Corporate Google Workspace",
    +    "provider": "google_workspace",
    +    "status": "pending_auth",
    +    "createdAt": "2025-07-11T12:00:00.000Z",
    +    "updatedAt": "2025-07-11T12:00:00.000Z",
    +    "providerConfig": { ... }
    +}
  • Error (500 Internal Server Error): Indicates a server-side problem during creation.


2. Get All Ingestion Sources

  • Method: GET
  • Path: /
  • Description: Retrieves a list of all configured ingestion sources for the organization.

Responses

  • Success (200 OK): Returns an array of IngestionSource objects.

  • Error (500 Internal Server Error): Indicates a server-side problem.


3. Get Ingestion Source by ID

  • Method: GET
  • Path: /:id
  • Description: Fetches the details of a specific ingestion source.

URL Parameters

  • id (string, required): The UUID of the ingestion source.

Responses

  • Success (200 OK): Returns the corresponding IngestionSource object.

  • Error (404 Not Found): Returned if no source with the given ID exists.

  • Error (500 Internal Server Error): Indicates a server-side problem.


4. Update Ingestion Source

  • Method: PUT
  • Path: /:id
  • Description: Modifies an existing ingestion source. This is useful for changing the name, pausing a source, or updating its configuration.

URL Parameters

  • id (string, required): The UUID of the ingestion source to update.

Request Body (UpdateIngestionSourceDto)

All fields are optional. Only include the fields you want to change.

json
{
+    "name": "Marketing Dept G-Suite (Paused)",
+    "status": "paused"
+}

Responses

  • Success (200 OK): Returns the complete, updated IngestionSource object.

  • Error (404 Not Found): Returned if no source with the given ID exists.

  • Error (500 Internal Server Error): Indicates a server-side problem.


5. Delete Ingestion Source

  • Method: DELETE
  • Path: /:id
  • Description: Permanently removes an ingestion source. This action cannot be undone.

URL Parameters

  • id (string, required): The UUID of the ingestion source to delete.

Responses

  • Success (204 No Content): Indicates successful deletion with no body content.

  • Error (404 Not Found): Returned if no source with the given ID exists.

  • Error (500 Internal Server Error): Indicates a server-side problem.


6. Trigger Initial Import

  • Method: POST
  • Path: /:id/sync
  • Description: Initiates the email import process for a given source. This is an asynchronous operation that enqueues a background job and immediately returns a response. The status of the source will be updated to importing.

URL Parameters

  • id (string, required): The UUID of the ingestion source to sync.

Responses

  • Success (202 Accepted): Confirms that the sync request has been accepted for processing.

    json
    {
    +    "message": "Initial import triggered successfully."
    +}
  • Error (404 Not Found): Returned if no source with the given ID exists.

  • Error (500 Internal Server Error): Indicates a server-side problem.

+ + + + \ No newline at end of file diff --git a/assets/README.md.CQnN0r3v.js b/assets/README.md.CQnN0r3v.js new file mode 100644 index 0000000..a3a5b29 --- /dev/null +++ b/assets/README.md.CQnN0r3v.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ae as i}from"./chunks/framework.Cd-3tpCq.js";const h=JSON.parse('{"title":"Get Started","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md"}'),r={name:"README.md"};function n(s,e,l,c,u,d){return a(),t("div",null,e[0]||(e[0]=[i('

Get Started

Welcome to Open Archiver! This guide will help you get started with setting up and using the platform.

What is Open Archiver?

A secure, sovereign, and affordable open-source platform for email archiving and eDiscovery.

Open Archiver provides a robust, self-hosted solution for archiving, storing, indexing, and searching emails from major platforms, including Google Workspace (Gmail), Microsoft 365, as well as generic IMAP-enabled email inboxes. Use Open Archiver to keep a permanent, tamper-proof record of your communication history, free from vendor lock-in.

Key Features

Installation

To get your own instance of Open Archiver running, follow our detailed installation guide:

Data Source Configuration

After deploying the application, you will need to configure one or more ingestion sources to begin archiving emails. Follow our detailed guides to connect to your email provider:

Contributing

We welcome contributions from the community!

Please read our CONTRIBUTING.md file for more details on our code of conduct and the process for submitting pull requests.

',17)]))}const p=o(r,[["render",n]]);export{h as __pageData,p as default}; diff --git a/assets/README.md.CQnN0r3v.lean.js b/assets/README.md.CQnN0r3v.lean.js new file mode 100644 index 0000000..4a2bc0d --- /dev/null +++ b/assets/README.md.CQnN0r3v.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ae as i}from"./chunks/framework.Cd-3tpCq.js";const h=JSON.parse('{"title":"Get Started","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md"}'),r={name:"README.md"};function n(s,e,l,c,u,d){return a(),t("div",null,e[0]||(e[0]=[i("",17)]))}const p=o(r,[["render",n]]);export{h as __pageData,p as default}; diff --git a/assets/SUMMARY.md.DhPY8nsG.js b/assets/SUMMARY.md.DhPY8nsG.js new file mode 100644 index 0000000..2dea6b7 --- /dev/null +++ b/assets/SUMMARY.md.DhPY8nsG.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as t,ae as r}from"./chunks/framework.Cd-3tpCq.js";const m=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,h){return t(),i("div",null,e[0]||(e[0]=[r('

Table of contents

User guides


',5)]))}const f=a(l,[["render",o]]);export{m as __pageData,f as default}; diff --git a/assets/SUMMARY.md.DhPY8nsG.lean.js b/assets/SUMMARY.md.DhPY8nsG.lean.js new file mode 100644 index 0000000..d4f3bd6 --- /dev/null +++ b/assets/SUMMARY.md.DhPY8nsG.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as t,ae as r}from"./chunks/framework.Cd-3tpCq.js";const m=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,h){return t(),i("div",null,e[0]||(e[0]=[r("",5)]))}const f=a(l,[["render",o]]);export{m as __pageData,f as default}; diff --git a/assets/api_README.md._7P6rt6y.js b/assets/api_README.md._7P6rt6y.js new file mode 100644 index 0000000..ac6d5a6 --- /dev/null +++ b/assets/api_README.md._7P6rt6y.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,j as e,a as r}from"./chunks/framework.Cd-3tpCq.js";const f=JSON.parse('{"title":"API documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api/README.md","filePath":"api/README.md"}'),i={name:"api/README.md"};function s(c,a,d,p,m,l){return n(),o("div",null,a[0]||(a[0]=[e("h1",{id:"api-documentation",tabindex:"-1"},[r("API documentation "),e("a",{class:"header-anchor",href:"#api-documentation","aria-label":'Permalink to "API documentation"'},"​")],-1)]))}const E=t(i,[["render",s]]);export{f as __pageData,E as default}; diff --git a/assets/api_README.md._7P6rt6y.lean.js b/assets/api_README.md._7P6rt6y.lean.js new file mode 100644 index 0000000..ac6d5a6 --- /dev/null +++ b/assets/api_README.md._7P6rt6y.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,j as e,a as r}from"./chunks/framework.Cd-3tpCq.js";const f=JSON.parse('{"title":"API documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api/README.md","filePath":"api/README.md"}'),i={name:"api/README.md"};function s(c,a,d,p,m,l){return n(),o("div",null,a[0]||(a[0]=[e("h1",{id:"api-documentation",tabindex:"-1"},[r("API documentation "),e("a",{class:"header-anchor",href:"#api-documentation","aria-label":'Permalink to "API documentation"'},"​")],-1)]))}const E=t(i,[["render",s]]);export{f as __pageData,E as default}; diff --git a/assets/api_ingestion.md.Cw9WcUAp.js b/assets/api_ingestion.md.Cw9WcUAp.js new file mode 100644 index 0000000..10d837c --- /dev/null +++ b/assets/api_ingestion.md.Cw9WcUAp.js @@ -0,0 +1,32 @@ +import{_ as e,c as i,o as a,ae as t}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Ingestion Sources API Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api/ingestion.md","filePath":"api/ingestion.md"}'),n={name:"api/ingestion.md"};function o(r,s,l,h,d,p){return a(),i("div",null,s[0]||(s[0]=[t(`

Ingestion Sources API Documentation

A guide to using the Ingestion Sources API.

Base Path: /v1/ingestion-sources


Authentication

All endpoints in this API are protected and require authentication. Requests must include an Authorization header containing a valid Bearer token. This can be a JWT obtained from the login endpoint or a SUPER_API_KEY for administrative tasks.

Header Example:Authorization: Bearer <YOUR_JWT_OR_SUPER_API_KEY>


Core Concepts

Ingestion Providers

The provider field determines the type of email source. Each provider requires a different configuration object, for example:

Ingestion Status

The status field tracks the state of the ingestion source.


1. Create Ingestion Source

Request Body (CreateIngestionSourceDto)

providerConfig for google_workspace / microsoft_365
json
{
+    "name": "Corporate Google Workspace",
+    "provider": "google_workspace",
+    "providerConfig": {
+        "clientId": "your-oauth-client-id.apps.googleusercontent.com",
+        "clientSecret": "your-super-secret-client-secret",
+        "redirectUri": "https://yourapp.com/oauth/google/callback"
+    }
+}
providerConfig for generic_imap
json
{
+    "name": "Legacy IMAP Server",
+    "provider": "generic_imap",
+    "providerConfig": {
+        "host": "imap.example.com",
+        "port": 993,
+        "secure": true,
+        "username": "archive-user",
+        "password": "imap-password"
+    }
+}

Responses


2. Get All Ingestion Sources

Responses


3. Get Ingestion Source by ID

URL Parameters

Responses


4. Update Ingestion Source

URL Parameters

Request Body (UpdateIngestionSourceDto)

All fields are optional. Only include the fields you want to change.

json
{
+    "name": "Marketing Dept G-Suite (Paused)",
+    "status": "paused"
+}

Responses


5. Delete Ingestion Source

URL Parameters

Responses


6. Trigger Initial Import

URL Parameters

Responses

`,62)]))}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/api_ingestion.md.Cw9WcUAp.lean.js b/assets/api_ingestion.md.Cw9WcUAp.lean.js new file mode 100644 index 0000000..9c8b1ec --- /dev/null +++ b/assets/api_ingestion.md.Cw9WcUAp.lean.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as a,ae as t}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Ingestion Sources API Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api/ingestion.md","filePath":"api/ingestion.md"}'),n={name:"api/ingestion.md"};function o(r,s,l,h,d,p){return a(),i("div",null,s[0]||(s[0]=[t("",62)]))}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/app.DguYn8Bw.js b/assets/app.DguYn8Bw.js new file mode 100644 index 0000000..5e5d326 --- /dev/null +++ b/assets/app.DguYn8Bw.js @@ -0,0 +1 @@ +import{t as p}from"./chunks/theme.D5-fWCd8.js";import{R as s,a0 as i,a1 as u,a2 as c,a3 as l,a4 as f,a5 as d,a6 as m,a7 as h,a8 as g,a9 as A,d as v,u as y,v as C,s as P,aa as b,ab as w,ac as R,ad as E}from"./chunks/framework.Cd-3tpCq.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/assets/chunks/framework.Cd-3tpCq.js b/assets/chunks/framework.Cd-3tpCq.js new file mode 100644 index 0000000..693e4d9 --- /dev/null +++ b/assets/chunks/framework.Cd-3tpCq.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Ms(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Rt=[],Ue=()=>{},Ro=()=>!1,Zt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Is=e=>e.startsWith("onUpdate:"),fe=Object.assign,Ps=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Oo=Object.prototype.hasOwnProperty,Q=(e,t)=>Oo.call(e,t),B=Array.isArray,Ot=e=>On(e)==="[object Map]",Gr=e=>On(e)==="[object Set]",G=e=>typeof e=="function",le=e=>typeof e=="string",Je=e=>typeof e=="symbol",se=e=>e!==null&&typeof e=="object",Xr=e=>(se(e)||G(e))&&G(e.then)&&G(e.catch),Yr=Object.prototype.toString,On=e=>Yr.call(e),Mo=e=>On(e).slice(8,-1),zr=e=>On(e)==="[object Object]",Ls=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Mt=Ms(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Io=/-(\w)/g,Ne=Mn(e=>e.replace(Io,(t,n)=>n?n.toUpperCase():"")),Po=/\B([A-Z])/g,lt=Mn(e=>e.replace(Po,"-$1").toLowerCase()),In=Mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),mn=Mn(e=>e?`on${In(e)}`:""),rt=(e,t)=>!Object.is(e,t),Gn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Lo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},No=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let nr;const Pn=()=>nr||(nr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ns(e){if(B(e)){const t={};for(let n=0;n{if(n){const s=n.split(Ho);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Fs(e){let t="";if(le(e))t=e;else if(B(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Wo=e=>le(e)?e:e==null?"":B(e)||se(e)&&(e.toString===Yr||!G(e.toString))?Qr(e)?Wo(e.value):JSON.stringify(e,Zr,2):String(e),Zr=(e,t)=>Qr(t)?Zr(e,t.value):Ot(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Xn(s,i)+" =>"]=r,n),{})}:Gr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Xn(n))}:Je(t)?Xn(t):se(t)&&!B(t)&&!zr(t)?String(t):t,Xn=(e,t="")=>{var n;return Je(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ge;class Uo{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ge,!t&&ge&&(this.index=(ge.scopes||(ge.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ge=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Wt){let t=Wt;for(Wt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Vt;){let t=Vt;for(Vt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function ri(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),$s(s),Bo(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function vs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(oi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function oi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt)||(e.globalVersion=Kt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!vs(e))))return;e.flags|=2;const t=e.dep,n=te,s=He;te=e,He=!0;try{ri(e);const r=e.fn(e._value);(t.version===0||rt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,He=s,ii(e),e.flags&=-3}}function $s(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)$s(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Bo(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const li=[];function Ge(){li.push(He),He=!1}function Xe(){const e=li.pop();He=e===void 0?!0:e}function sr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class Ko{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ln{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!te||!He||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new Ko(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,ci(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Hs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ds()}}}function ci(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)ci(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const wn=new WeakMap,pt=Symbol(""),ys=Symbol(""),qt=Symbol("");function ve(e,t,n){if(He&&te){let s=wn.get(e);s||wn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Ln),r.map=s,r.key=n),r.track()}}function qe(e,t,n,s,r,i){const o=wn.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Hs(),t==="clear")o.forEach(l);else{const c=B(e),u=c&&Ls(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,v)=>{(v==="length"||v===qt||!Je(v)&&v>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(qt)),t){case"add":c?u&&l(o.get("length")):(l(o.get(pt)),Ot(e)&&l(o.get(ys)));break;case"delete":c||(l(o.get(pt)),Ot(e)&&l(o.get(ys)));break;case"set":Ot(e)&&l(o.get(pt));break}}Ds()}function qo(e,t){const n=wn.get(e);return n&&n.get(t)}function Et(e){const t=J(e);return t===e?t:(ve(t,"iterate",qt),Ie(e)?t:t.map(ue))}function Nn(e){return ve(e=J(e),"iterate",qt),e}const Go={__proto__:null,[Symbol.iterator](){return zn(this,Symbol.iterator,ue)},concat(...e){return Et(this).concat(...e.map(t=>B(t)?Et(t):t))},entries(){return zn(this,"entries",e=>(e[1]=ue(e[1]),e))},every(e,t){return ke(this,"every",e,t,void 0,arguments)},filter(e,t){return ke(this,"filter",e,t,n=>n.map(ue),arguments)},find(e,t){return ke(this,"find",e,t,ue,arguments)},findIndex(e,t){return ke(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ke(this,"findLast",e,t,ue,arguments)},findLastIndex(e,t){return ke(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ke(this,"forEach",e,t,void 0,arguments)},includes(...e){return Jn(this,"includes",e)},indexOf(...e){return Jn(this,"indexOf",e)},join(e){return Et(this).join(e)},lastIndexOf(...e){return Jn(this,"lastIndexOf",e)},map(e,t){return ke(this,"map",e,t,void 0,arguments)},pop(){return Dt(this,"pop")},push(...e){return Dt(this,"push",e)},reduce(e,...t){return rr(this,"reduce",e,t)},reduceRight(e,...t){return rr(this,"reduceRight",e,t)},shift(){return Dt(this,"shift")},some(e,t){return ke(this,"some",e,t,void 0,arguments)},splice(...e){return Dt(this,"splice",e)},toReversed(){return Et(this).toReversed()},toSorted(e){return Et(this).toSorted(e)},toSpliced(...e){return Et(this).toSpliced(...e)},unshift(...e){return Dt(this,"unshift",e)},values(){return zn(this,"values",ue)}};function zn(e,t,n){const s=Nn(e),r=s[t]();return s!==e&&!Ie(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const Xo=Array.prototype;function ke(e,t,n,s,r,i){const o=Nn(e),l=o!==e&&!Ie(e),c=o[t];if(c!==Xo[t]){const h=c.apply(e,i);return l?ue(h):h}let u=n;o!==e&&(l?u=function(h,v){return n.call(this,ue(h),v,e)}:n.length>2&&(u=function(h,v){return n.call(this,h,v,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function rr(e,t,n,s){const r=Nn(e);let i=n;return r!==e&&(Ie(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ue(l),c,e)}),r[t](i,...s)}function Jn(e,t,n){const s=J(e);ve(s,"iterate",qt);const r=s[t](...n);return(r===-1||r===!1)&&Ws(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Dt(e,t,n=[]){Ge(),Hs();const s=J(e)[t].apply(e,n);return Ds(),Xe(),s}const Yo=Ms("__proto__,__v_isRef,__isVue"),ai=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Je));function zo(e){Je(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class fi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?ol:pi:i?hi:di).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=B(t);if(!r){let c;if(o&&(c=Go[n]))return c;if(n==="hasOwnProperty")return zo}const l=Reflect.get(t,n,ae(t)?t:s);return(Je(n)?ai.has(n):Yo(n))||(r||ve(t,"get",n),i)?l:ae(l)?o&&Ls(n)?l:l.value:se(l)?r?Fn(l):Lt(l):l}}class ui extends fi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=it(i);if(!Ie(s)&&!it(s)&&(i=J(i),s=J(s)),!B(t)&&ae(i)&&!ae(s))return c?!1:(i.value=s,!0)}const o=B(t)&&Ls(n)?Number(n)e,rn=e=>Reflect.getPrototypeOf(e);function tl(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=Ot(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?_s:t?Sn:ue;return!t&&ve(i,"iterate",c?ys:pt),{next(){const{value:h,done:v}=u.next();return v?{value:h,done:v}:{value:l?[a(h[0]),a(h[1])]:a(h),done:v}},[Symbol.iterator](){return this}}}}function on(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function nl(e,t){const n={get(r){const i=this.__v_raw,o=J(i),l=J(r);e||(rt(r,l)&&ve(o,"get",r),ve(o,"get",l));const{has:c}=rn(o),u=t?_s:e?Sn:ue;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&ve(J(r),"iterate",pt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=J(i),l=J(r);return e||(rt(r,l)&&ve(o,"has",r),ve(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=J(l),u=t?_s:e?Sn:ue;return!e&&ve(c,"iterate",pt),l.forEach((a,h)=>r.call(i,u(a),u(h),o))}};return fe(n,e?{add:on("add"),set:on("set"),delete:on("delete"),clear:on("clear")}:{add(r){!t&&!Ie(r)&&!it(r)&&(r=J(r));const i=J(this);return rn(i).has.call(i,r)||(i.add(r),qe(i,"add",r,r)),this},set(r,i){!t&&!Ie(i)&&!it(i)&&(i=J(i));const o=J(this),{has:l,get:c}=rn(o);let u=l.call(o,r);u||(r=J(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?rt(i,a)&&qe(o,"set",r,i):qe(o,"add",r,i),this},delete(r){const i=J(this),{has:o,get:l}=rn(i);let c=o.call(i,r);c||(r=J(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&qe(i,"delete",r,void 0),u},clear(){const r=J(this),i=r.size!==0,o=r.clear();return i&&qe(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=tl(r,e,t)}),n}function js(e,t){const n=nl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Q(n,r)&&r in s?n:s,r,i)}const sl={get:js(!1,!1)},rl={get:js(!1,!0)},il={get:js(!0,!1)};const di=new WeakMap,hi=new WeakMap,pi=new WeakMap,ol=new WeakMap;function ll(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function cl(e){return e.__v_skip||!Object.isExtensible(e)?0:ll(Mo(e))}function Lt(e){return it(e)?e:Vs(e,!1,Qo,sl,di)}function al(e){return Vs(e,!1,el,rl,hi)}function Fn(e){return Vs(e,!0,Zo,il,pi)}function Vs(e,t,n,s,r){if(!se(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=cl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function gt(e){return it(e)?gt(e.__v_raw):!!(e&&e.__v_isReactive)}function it(e){return!!(e&&e.__v_isReadonly)}function Ie(e){return!!(e&&e.__v_isShallow)}function Ws(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function vn(e){return!Q(e,"__v_skip")&&Object.isExtensible(e)&&ms(e,"__v_skip",!0),e}const ue=e=>se(e)?Lt(e):e,Sn=e=>se(e)?Fn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function mt(e){return gi(e,!1)}function Pe(e){return gi(e,!0)}function gi(e,t){return ae(e)?e:new fl(e,t)}class fl{constructor(t,n){this.dep=new Ln,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:ue(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ie(t)||it(t);t=s?t:J(t),rt(t,n)&&(this._rawValue=t,this._value=s?t:ue(t),this.dep.trigger())}}function Us(e){return ae(e)?e.value:e}function ce(e){return G(e)?e():Us(e)}const ul={get:(e,t,n)=>t==="__v_raw"?e:Us(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function mi(e){return gt(e)?e:new Proxy(e,ul)}class dl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Ln,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function hl(e){return new dl(e)}class pl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return qo(J(this._object),this._key)}}class gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function ml(e,t,n){return ae(e)?e:G(e)?new gl(e):se(e)&&arguments.length>1?vl(e,t,n):mt(e)}function vl(e,t,n){const s=e[t];return ae(s)?s:new pl(e,t,n)}class yl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ln(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return si(this,!0),!0}get value(){const t=this.dep.track();return oi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function _l(e,t,n=!1){let s,r;return G(e)?s=e:(s=e.get,r=e.set),new yl(s,r,n)}const ln={},xn=new WeakMap;let dt;function bl(e,t=!1,n=dt){if(n){let s=xn.get(n);s||xn.set(n,s=[]),s.push(e)}}function wl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Ie(g)||r===!1||r===0?st(g,1):st(g);let a,h,v,y,A=!1,P=!1;if(ae(e)?(h=()=>e.value,A=Ie(e)):gt(e)?(h=()=>u(e),A=!0):B(e)?(P=!0,A=e.some(g=>gt(g)||Ie(g)),h=()=>e.map(g=>{if(ae(g))return g.value;if(gt(g))return u(g);if(G(g))return c?c(g,2):g()})):G(e)?t?h=c?()=>c(e,2):e:h=()=>{if(v){Ge();try{v()}finally{Xe()}}const g=dt;dt=a;try{return c?c(e,3,[y]):e(y)}finally{dt=g}}:h=Ue,t&&r){const g=h,M=r===!0?1/0:r;h=()=>st(g(),M)}const K=ei(),H=()=>{a.stop(),K&&K.active&&Ps(K.effects,a)};if(i&&t){const g=t;t=(...M)=>{g(...M),H()}}let U=P?new Array(e.length).fill(ln):ln;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const M=a.run();if(r||A||(P?M.some((W,R)=>rt(W,U[R])):rt(M,U))){v&&v();const W=dt;dt=a;try{const R=[M,U===ln?void 0:P&&U[0]===ln?[]:U,y];U=M,c?c(t,3,R):t(...R)}finally{dt=W}}}else a.run()};return l&&l(p),a=new ti(h),a.scheduler=o?()=>o(p,!1):p,y=g=>bl(g,!1,a),v=a.onStop=()=>{const g=xn.get(a);if(g){if(c)c(g,4);else for(const M of g)M();xn.delete(a)}},t?s?p(!0):U=a.run():o?o(p.bind(null,!0),!0):a.run(),H.pause=a.pause.bind(a),H.resume=a.resume.bind(a),H.stop=H,H}function st(e,t=1/0,n){if(t<=0||!se(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))st(e.value,t,n);else if(B(e))for(let s=0;s{st(s,t,n)});else if(zr(e)){for(const s in e)st(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&st(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function en(e,t,n,s){try{return s?e(...s):e()}catch(r){Hn(r,t,n)}}function De(e,t,n,s){if(G(e)){const r=en(e,t,n,s);return r&&Xr(r)&&r.catch(i=>{Hn(i,t,n)}),r}if(B(e)){const r=[];for(let i=0;i>>1,r=be[s],i=Gt(r);i=Gt(n)?be.push(e):be.splice(xl(t),0,e),e.flags|=1,yi()}}function yi(){Tn||(Tn=vi.then(_i))}function Tl(e){B(e)?It.push(...e):et&&e.id===-1?et.splice(At+1,0,e):e.flags&1||(It.push(e),e.flags|=1),yi()}function ir(e,t,n=Ve+1){for(;nGt(n)-Gt(s));if(It.length=0,et){et.push(...t);return}for(et=t,At=0;Ate.id==null?e.flags&2?-1:1/0:e.id;function _i(e){try{for(Ve=0;Ve{s._d&&vr(-1);const i=Cn(t);let o;try{o=e(...r)}finally{Cn(i),s._d&&vr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function We(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;oe.__isTeleport,tt=Symbol("_leaveCb"),cn=Symbol("_enterCb");function Al(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Nt(()=>{e.isMounted=!0}),Mi(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Si={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},xi=e=>{const t=e.subTree;return t.component?xi(t.component):t},Rl={name:"BaseTransition",props:Si,setup(e,{slots:t}){const n=xt(),s=Al();return()=>{const r=t.default&&Ci(t.default(),!0);if(!r||!r.length)return;const i=Ti(r),o=J(e),{mode:l}=o;if(s.isLeaving)return Qn(i);const c=or(i);if(!c)return Qn(i);let u=bs(c,o,s,n,h=>u=h);c.type!==de&&Xt(c,u);let a=n.subTree&&or(n.subTree);if(a&&a.type!==de&&!ht(c,a)&&xi(n).type!==de){let h=bs(a,o,s,n);if(Xt(a,h),l==="out-in"&&c.type!==de)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},Qn(i);l==="in-out"&&c.type!==de?h.delayLeave=(v,y,A)=>{const P=Ei(s,a);P[String(a.key)]=a,v[tt]=()=>{y(),v[tt]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{A(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ti(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==de){t=n;break}}return t}const Ol=Rl;function Ei(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function bs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:v,onLeave:y,onAfterLeave:A,onLeaveCancelled:P,onBeforeAppear:K,onAppear:H,onAfterAppear:U,onAppearCancelled:p}=t,g=String(e.key),M=Ei(n,e),W=(T,I)=>{T&&De(T,s,9,I)},R=(T,I)=>{const E=I[1];W(T,I),B(T)?T.every(_=>_.length<=1)&&E():T.length<=1&&E()},k={mode:o,persisted:l,beforeEnter(T){let I=c;if(!n.isMounted)if(i)I=K||c;else return;T[tt]&&T[tt](!0);const E=M[g];E&&ht(e,E)&&E.el[tt]&&E.el[tt](),W(I,[T])},enter(T){let I=u,E=a,_=h;if(!n.isMounted)if(i)I=H||u,E=U||a,_=p||h;else return;let N=!1;const Y=T[cn]=re=>{N||(N=!0,re?W(_,[T]):W(E,[T]),k.delayedLeave&&k.delayedLeave(),T[cn]=void 0)};I?R(I,[T,Y]):Y()},leave(T,I){const E=String(e.key);if(T[cn]&&T[cn](!0),n.isUnmounting)return I();W(v,[T]);let _=!1;const N=T[tt]=Y=>{_||(_=!0,I(),Y?W(P,[T]):W(A,[T]),T[tt]=void 0,M[E]===e&&delete M[E])};M[E]=e,y?R(y,[T,N]):N()},clone(T){const I=bs(T,t,n,s,r);return r&&r(I),I}};return k}function Qn(e){if($n(e))return e=ot(e),e.children=null,e}function or(e){if(!$n(e))return wi(e.type)&&e.children?Ti(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&G(n.default))return n.default()}}function Xt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Xt(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 Ci(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iPt(A,t&&(B(t)?t[P]:t),n,s,r));return}if(vt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Pt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Gs(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,h=l.setupState,v=J(h),y=h===ne?()=>!1:A=>Q(v,A);if(u!=null&&u!==c&&(le(u)?(a[u]=null,y(u)&&(h[u]=null)):ae(u)&&(u.value=null)),G(c))en(c,l,12,[o,a]);else{const A=le(c),P=ae(c);if(A||P){const K=()=>{if(e.f){const H=A?y(c)?h[c]:a[c]:c.value;r?B(H)&&Ps(H,i):B(H)?H.includes(i)||H.push(i):A?(a[c]=[i],y(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else A?(a[c]=o,y(c)&&(h[c]=o)):P&&(c.value=o,e.k&&(a[e.k]=o))};o?(K.id=-1,Ce(K,n)):K()}}}let lr=!1;const Ct=()=>{lr||(console.error("Hydration completed but contains mismatches."),lr=!0)},Ml=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Il=e=>e.namespaceURI.includes("MathML"),an=e=>{if(e.nodeType===1){if(Ml(e))return"svg";if(Il(e))return"mathml"}},fn=e=>e.nodeType===8;function Pl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),En(),g._vnode=p;return}h(g.firstChild,p,null,null,null),En(),g._vnode=p},h=(p,g,M,W,R,k=!1)=>{k=k||!!g.dynamicChildren;const T=fn(p)&&p.data==="[",I=()=>P(p,g,M,W,R,T),{type:E,ref:_,shapeFlag:N,patchFlag:Y}=g;let re=p.nodeType;g.el=p,Y===-2&&(k=!1,g.dynamicChildren=null);let j=null;switch(E){case bt:re!==3?g.children===""?(c(g.el=r(""),o(p),p),j=p):j=I():(p.data!==g.children&&(Ct(),p.data=g.children),j=i(p));break;case de:U(p)?(j=i(p),H(g.el=p.content.firstChild,p,M)):re!==8||T?j=I():j=i(p);break;case kt:if(T&&(p=i(p),re=p.nodeType),re===1||re===3){j=p;const X=!g.children.length;for(let D=0;D{k=k||!!g.dynamicChildren;const{type:T,props:I,patchFlag:E,shapeFlag:_,dirs:N,transition:Y}=g,re=T==="input"||T==="option";if(re||E!==-1){N&&We(g,null,M,"created");let j=!1;if(U(p)){j=Gi(null,Y)&&M&&M.vnode.props&&M.vnode.props.appear;const D=p.content.firstChild;if(j){const oe=D.getAttribute("class");oe&&(D.$cls=oe),Y.beforeEnter(D)}H(D,p,M),g.el=p=D}if(_&16&&!(I&&(I.innerHTML||I.textContent))){let D=y(p.firstChild,g,p,M,W,R,k);for(;D;){un(p,1)||Ct();const oe=D;D=D.nextSibling,l(oe)}}else if(_&8){let D=g.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(un(p,0)||Ct(),p.textContent=g.children)}if(I){if(re||!k||E&48){const D=p.tagName.includes("-");for(const oe in I)(re&&(oe.endsWith("value")||oe==="indeterminate")||Zt(oe)&&!Mt(oe)||oe[0]==="."||D)&&s(p,oe,null,I[oe],void 0,M)}else if(I.onClick)s(p,"onClick",null,I.onClick,void 0,M);else if(E&4&>(I.style))for(const D in I.style)I.style[D]}let X;(X=I&&I.onVnodeBeforeMount)&&Oe(X,M,g),N&&We(g,null,M,"beforeMount"),((X=I&&I.onVnodeMounted)||N||j)&&to(()=>{X&&Oe(X,M,g),j&&Y.enter(p),N&&We(g,null,M,"mounted")},W)}return p.nextSibling},y=(p,g,M,W,R,k,T)=>{T=T||!!g.dynamicChildren;const I=g.children,E=I.length;for(let _=0;_{const{slotScopeIds:T}=g;T&&(R=R?R.concat(T):T);const I=o(p),E=y(i(p),g,I,M,W,R,k);return E&&fn(E)&&E.data==="]"?i(g.anchor=E):(Ct(),c(g.anchor=u("]"),I,E),E)},P=(p,g,M,W,R,k)=>{if(un(p.parentElement,1)||Ct(),g.el=null,k){const E=K(p);for(;;){const _=i(p);if(_&&_!==E)l(_);else break}}const T=i(p),I=o(p);return l(p),n(null,g,I,T,M,W,an(I),R),M&&(M.vnode.el=g.el,Zi(M,g.el)),T},K=(p,g="[",M="]")=>{let W=0;for(;p;)if(p=i(p),p&&fn(p)&&(p.data===g&&W++,p.data===M)){if(W===0)return i(p);W--}return p},H=(p,g,M)=>{const W=g.parentNode;W&&W.replaceChild(p,g);let R=M;for(;R;)R.vnode.el===g&&(R.vnode.el=R.subTree.el=p),R=R.parent},U=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const cr="data-allow-mismatch",Ll={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function un(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(cr);)e=e.parentElement;const n=e&&e.getAttribute(cr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(Ll[t])}}Pn().requestIdleCallback;Pn().cancelIdleCallback;const vt=e=>!!e.type.__asyncLoader,$n=e=>e.type.__isKeepAlive;function Nl(e,t){Oi(e,"a",t)}function Fl(e,t){Oi(e,"da",t)}function Oi(e,t,n=ye){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(jn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)$n(r.parent.vnode)&&Hl(s,t,n,r),r=r.parent}}function Hl(e,t,n,s){const r=jn(t,e,s,!0);Vn(()=>{Ps(s[t],r)},n)}function jn(e,t,n=ye,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ge();const l=tn(n),c=De(t,n,e,o);return l(),Xe(),c});return s?r.unshift(i):r.push(i),i}}const Qe=e=>(t,n=ye)=>{(!Jt||e==="sp")&&jn(e,(...s)=>t(...s),n)},Dl=Qe("bm"),Nt=Qe("m"),$l=Qe("bu"),jl=Qe("u"),Mi=Qe("bum"),Vn=Qe("um"),Vl=Qe("sp"),Wl=Qe("rtg"),Ul=Qe("rtc");function kl(e,t=ye){jn("ec",e,t)}const Ii="components";function uf(e,t){return Li(Ii,e,!0,t)||e}const Pi=Symbol.for("v-ndc");function df(e){return le(e)?Li(Ii,e,!1)||e:e||Pi}function Li(e,t,n=!0,s=!1){const r=Se||ye;if(r){const i=r.type;{const l=Ac(i,!1);if(l&&(l===t||l===Ne(t)||l===In(Ne(t))))return i}const o=ar(r[e]||i[e],t)||ar(r.appContext[e],t);return!o&&s?i:o}}function ar(e,t){return e&&(e[t]||e[Ne(t)]||e[In(Ne(t))])}function hf(e,t,n,s){let r;const i=n,o=B(e);if(o||le(e)){const l=o&>(e);let c=!1,u=!1;l&&(c=!Ie(e),u=it(e),e=Nn(e)),r=new Array(e.length);for(let a=0,h=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;czt(t)?!(t.type===de||t.type===we&&!Ni(t.children)):!0)?e:null}function gf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:mn(s)]=e[s];return n}const ws=e=>e?oo(e)?Gs(e):ws(e.parent):null,Ut=fe(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=>ws(e.parent),$root:e=>ws(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Hi(e),$forceUpdate:e=>e.f||(e.f=()=>{ks(e.update)}),$nextTick:e=>e.n||(e.n=Dn.bind(e.proxy)),$watch:e=>uc.bind(e)}),Zn=(e,t)=>e!==ne&&!e.__isScriptSetup&&Q(e,t),Bl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const y=o[t];if(y!==void 0)switch(y){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Zn(s,t))return o[t]=1,s[t];if(r!==ne&&Q(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&Q(u,t))return o[t]=3,i[t];if(n!==ne&&Q(n,t))return o[t]=4,n[t];Ss&&(o[t]=0)}}const a=Ut[t];let h,v;if(a)return t==="$attrs"&&ve(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ne&&Q(n,t))return o[t]=4,n[t];if(v=c.config.globalProperties,Q(v,t))return v[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Zn(r,t)?(r[t]=n,!0):s!==ne&&Q(s,t)?(s[t]=n,!0):Q(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==ne&&Q(e,o)||Zn(t,o)||(l=i[0])&&Q(l,o)||Q(s,o)||Q(Ut,o)||Q(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Q(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function mf(){return Kl().slots}function Kl(e){const t=xt();return t.setupContext||(t.setupContext=co(t))}function fr(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Ss=!0;function ql(e){const t=Hi(e),n=e.proxy,s=e.ctx;Ss=!1,t.beforeCreate&&ur(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:h,mounted:v,beforeUpdate:y,updated:A,activated:P,deactivated:K,beforeDestroy:H,beforeUnmount:U,destroyed:p,unmounted:g,render:M,renderTracked:W,renderTriggered:R,errorCaptured:k,serverPrefetch:T,expose:I,inheritAttrs:E,components:_,directives:N,filters:Y}=t;if(u&&Gl(u,s,null),o)for(const X in o){const D=o[X];G(D)&&(s[X]=D.bind(n))}if(r){const X=r.call(n,n);se(X)&&(e.data=Lt(X))}if(Ss=!0,i)for(const X in i){const D=i[X],oe=G(D)?D.bind(n,n):G(D.get)?D.get.bind(n,n):Ue,nn=!G(D)&&G(D.set)?D.set.bind(n):Ue,ct=ie({get:oe,set:nn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>ct.value,set:$e=>ct.value=$e})}if(l)for(const X in l)Fi(l[X],s,n,X);if(c){const X=G(c)?c.call(n):c;Reflect.ownKeys(X).forEach(D=>{Zl(D,X[D])})}a&&ur(a,e,"c");function j(X,D){B(D)?D.forEach(oe=>X(oe.bind(n))):D&&X(D.bind(n))}if(j(Dl,h),j(Nt,v),j($l,y),j(jl,A),j(Nl,P),j(Fl,K),j(kl,k),j(Ul,W),j(Wl,R),j(Mi,U),j(Vn,g),j(Vl,T),B(I))if(I.length){const X=e.exposed||(e.exposed={});I.forEach(D=>{Object.defineProperty(X,D,{get:()=>n[D],set:oe=>n[D]=oe,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===Ue&&(e.render=M),E!=null&&(e.inheritAttrs=E),_&&(e.components=_),N&&(e.directives=N),T&&Ri(e)}function Gl(e,t,n=Ue){B(e)&&(e=xs(e));for(const s in e){const r=e[s];let i;se(r)?"default"in r?i=_t(r.from||s,r.default,!0):i=_t(r.from||s):i=_t(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function ur(e,t,n){De(B(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Fi(e,t,n,s){let r=s.includes(".")?Ji(n,s):()=>n[s];if(le(e)){const i=t[e];G(i)&&Le(r,i)}else if(G(e))Le(r,e.bind(n));else if(se(e))if(B(e))e.forEach(i=>Fi(i,t,n,s));else{const i=G(e.handler)?e.handler.bind(n):t[e.handler];G(i)&&Le(r,i,e)}}function Hi(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>An(c,u,o,!0)),An(c,t,o)),se(t)&&i.set(t,c),c}function An(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&An(e,i,n,!0),r&&r.forEach(o=>An(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Xl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Xl={data:dr,props:hr,emits:hr,methods:jt,computed:jt,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:jt,directives:jt,watch:zl,provide:dr,inject:Yl};function dr(e,t){return t?e?function(){return fe(G(e)?e.call(this,this):e,G(t)?t.call(this,this):t)}:t:e}function Yl(e,t){return jt(xs(e),xs(t))}function xs(e){if(B(e)){const t={};for(let n=0;n1)return n&&G(t)?t.call(s&&s.proxy):t}}function $i(){return!!(xt()||yt)}const ji={},Vi=()=>Object.create(ji),Wi=e=>Object.getPrototypeOf(e)===ji;function ec(e,t,n,s=!1){const r={},i=Vi();e.propsDefaults=Object.create(null),Ui(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:al(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function tc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[v,y]=ki(h,t,!0);fe(o,v),y&&l.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return se(e)&&s.set(e,Rt),Rt;if(B(i))for(let a=0;ae==="_"||e==="__"||e==="_ctx"||e==="$stable",Ks=e=>B(e)?e.map(Me):[Me(e)],sc=(e,t,n)=>{if(t._n)return t;const s=El((...r)=>Ks(t(...r)),n);return s._c=!1,s},Bi=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Bs(r))continue;const i=e[r];if(G(i))t[r]=sc(r,i,s);else if(i!=null){const o=Ks(i);t[r]=()=>o}}},Ki=(e,t)=>{const n=Ks(t);e.slots.default=()=>n},qi=(e,t,n)=>{for(const s in t)(n||!Bs(s))&&(e[s]=t[s])},rc=(e,t,n)=>{const s=e.slots=Vi();if(e.vnode.shapeFlag&32){const r=t.__;r&&ms(s,"__",r,!0);const i=t._;i?(qi(s,t,n),n&&ms(s,"_",i,!0)):Bi(t,s)}else t&&Ki(e,t)},ic=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:qi(r,t,n):(i=!t.$stable,Bi(t,r)),o=t}else t&&(Ki(e,t),o={default:1});if(i)for(const l in r)!Bs(l)&&o[l]==null&&delete r[l]},Ce=to;function oc(e){return lc(e,Pl)}function lc(e,t){const n=Pn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:h,nextSibling:v,setScopeId:y=Ue,insertStaticContent:A}=e,P=(f,d,m,S=null,b=null,w=null,L=void 0,O=null,C=!!d.dynamicChildren)=>{if(f===d)return;f&&!ht(f,d)&&(S=sn(f),$e(f,b,w,!0),f=null),d.patchFlag===-2&&(C=!1,d.dynamicChildren=null);const{type:x,ref:V,shapeFlag:F}=d;switch(x){case bt:K(f,d,m,S);break;case de:H(f,d,m,S);break;case kt:f==null&&U(d,m,S,L);break;case we:_(f,d,m,S,b,w,L,O,C);break;default:F&1?M(f,d,m,S,b,w,L,O,C):F&6?N(f,d,m,S,b,w,L,O,C):(F&64||F&128)&&x.process(f,d,m,S,b,w,L,O,C,Tt)}V!=null&&b?Pt(V,f&&f.ref,w,d||f,!d):V==null&&f&&f.ref!=null&&Pt(f.ref,null,w,f,!0)},K=(f,d,m,S)=>{if(f==null)s(d.el=l(d.children),m,S);else{const b=d.el=f.el;d.children!==f.children&&u(b,d.children)}},H=(f,d,m,S)=>{f==null?s(d.el=c(d.children||""),m,S):d.el=f.el},U=(f,d,m,S)=>{[f.el,f.anchor]=A(f.children,d,m,S,f.el,f.anchor)},p=({el:f,anchor:d},m,S)=>{let b;for(;f&&f!==d;)b=v(f),s(f,m,S),f=b;s(d,m,S)},g=({el:f,anchor:d})=>{let m;for(;f&&f!==d;)m=v(f),r(f),f=m;r(d)},M=(f,d,m,S,b,w,L,O,C)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),f==null?W(d,m,S,b,w,L,O,C):T(f,d,b,w,L,O,C)},W=(f,d,m,S,b,w,L,O)=>{let C,x;const{props:V,shapeFlag:F,transition:$,dirs:q}=f;if(C=f.el=o(f.type,w,V&&V.is,V),F&8?a(C,f.children):F&16&&k(f.children,C,null,S,b,es(f,w),L,O),q&&We(f,null,S,"created"),R(C,f,f.scopeId,L,S),V){for(const ee in V)ee!=="value"&&!Mt(ee)&&i(C,ee,null,V[ee],w,S);"value"in V&&i(C,"value",null,V.value,w),(x=V.onVnodeBeforeMount)&&Oe(x,S,f)}q&&We(f,null,S,"beforeMount");const z=Gi(b,$);z&&$.beforeEnter(C),s(C,d,m),((x=V&&V.onVnodeMounted)||z||q)&&Ce(()=>{x&&Oe(x,S,f),z&&$.enter(C),q&&We(f,null,S,"mounted")},b)},R=(f,d,m,S,b)=>{if(m&&y(f,m),S)for(let w=0;w{for(let x=C;x{const O=d.el=f.el;let{patchFlag:C,dynamicChildren:x,dirs:V}=d;C|=f.patchFlag&16;const F=f.props||ne,$=d.props||ne;let q;if(m&&at(m,!1),(q=$.onVnodeBeforeUpdate)&&Oe(q,m,d,f),V&&We(d,f,m,"beforeUpdate"),m&&at(m,!0),(F.innerHTML&&$.innerHTML==null||F.textContent&&$.textContent==null)&&a(O,""),x?I(f.dynamicChildren,x,O,m,S,es(d,b),w):L||D(f,d,O,null,m,S,es(d,b),w,!1),C>0){if(C&16)E(O,F,$,m,b);else if(C&2&&F.class!==$.class&&i(O,"class",null,$.class,b),C&4&&i(O,"style",F.style,$.style,b),C&8){const z=d.dynamicProps;for(let ee=0;ee{q&&Oe(q,m,d,f),V&&We(d,f,m,"updated")},S)},I=(f,d,m,S,b,w,L)=>{for(let O=0;O{if(d!==m){if(d!==ne)for(const w in d)!Mt(w)&&!(w in m)&&i(f,w,d[w],null,b,S);for(const w in m){if(Mt(w))continue;const L=m[w],O=d[w];L!==O&&w!=="value"&&i(f,w,O,L,b,S)}"value"in m&&i(f,"value",d.value,m.value,b)}},_=(f,d,m,S,b,w,L,O,C)=>{const x=d.el=f?f.el:l(""),V=d.anchor=f?f.anchor:l("");let{patchFlag:F,dynamicChildren:$,slotScopeIds:q}=d;q&&(O=O?O.concat(q):q),f==null?(s(x,m,S),s(V,m,S),k(d.children||[],m,V,b,w,L,O,C)):F>0&&F&64&&$&&f.dynamicChildren?(I(f.dynamicChildren,$,m,b,w,L,O),(d.key!=null||b&&d===b.subTree)&&Xi(f,d,!0)):D(f,d,m,V,b,w,L,O,C)},N=(f,d,m,S,b,w,L,O,C)=>{d.slotScopeIds=O,f==null?d.shapeFlag&512?b.ctx.activate(d,m,S,L,C):Y(d,m,S,b,w,L,C):re(f,d,C)},Y=(f,d,m,S,b,w,L)=>{const O=f.component=xc(f,S,b);if($n(f)&&(O.ctx.renderer=Tt),Tc(O,!1,L),O.asyncDep){if(b&&b.registerDep(O,j,L),!f.el){const C=O.subTree=he(de);H(null,C,d,m),f.placeholder=C.el}}else j(O,f,d,m,b,w,L)},re=(f,d,m)=>{const S=d.component=f.component;if(mc(f,d,m))if(S.asyncDep&&!S.asyncResolved){X(S,d,m);return}else S.next=d,S.update();else d.el=f.el,S.vnode=d},j=(f,d,m,S,b,w,L)=>{const O=()=>{if(f.isMounted){let{next:F,bu:$,u:q,parent:z,vnode:ee}=f;{const Te=Yi(f);if(Te){F&&(F.el=ee.el,X(f,F,L)),Te.asyncDep.then(()=>{f.isUnmounted||O()});return}}let Z=F,xe;at(f,!1),F?(F.el=ee.el,X(f,F,L)):F=ee,$&&Gn($),(xe=F.props&&F.props.onVnodeBeforeUpdate)&&Oe(xe,z,F,ee),at(f,!0);const pe=ts(f),Fe=f.subTree;f.subTree=pe,P(Fe,pe,h(Fe.el),sn(Fe),f,b,w),F.el=pe.el,Z===null&&Zi(f,pe.el),q&&Ce(q,b),(xe=F.props&&F.props.onVnodeUpdated)&&Ce(()=>Oe(xe,z,F,ee),b)}else{let F;const{el:$,props:q}=d,{bm:z,m:ee,parent:Z,root:xe,type:pe}=f,Fe=vt(d);if(at(f,!1),z&&Gn(z),!Fe&&(F=q&&q.onVnodeBeforeMount)&&Oe(F,Z,d),at(f,!0),$&&qn){const Te=()=>{f.subTree=ts(f),qn($,f.subTree,f,b,null)};Fe&&pe.__asyncHydrate?pe.__asyncHydrate($,f,Te):Te()}else{xe.ce&&xe.ce._def.shadowRoot!==!1&&xe.ce._injectChildStyle(pe);const Te=f.subTree=ts(f);P(null,Te,m,S,f,b,w),d.el=Te.el}if(ee&&Ce(ee,b),!Fe&&(F=q&&q.onVnodeMounted)){const Te=d;Ce(()=>Oe(F,Z,Te),b)}(d.shapeFlag&256||Z&&vt(Z.vnode)&&Z.vnode.shapeFlag&256)&&f.a&&Ce(f.a,b),f.isMounted=!0,d=m=S=null}};f.scope.on();const C=f.effect=new ti(O);f.scope.off();const x=f.update=C.run.bind(C),V=f.job=C.runIfDirty.bind(C);V.i=f,V.id=f.uid,C.scheduler=()=>ks(V),at(f,!0),x()},X=(f,d,m)=>{d.component=f;const S=f.vnode.props;f.vnode=d,f.next=null,tc(f,d.props,S,m),ic(f,d.children,m),Ge(),ir(f),Xe()},D=(f,d,m,S,b,w,L,O,C=!1)=>{const x=f&&f.children,V=f?f.shapeFlag:0,F=d.children,{patchFlag:$,shapeFlag:q}=d;if($>0){if($&128){nn(x,F,m,S,b,w,L,O,C);return}else if($&256){oe(x,F,m,S,b,w,L,O,C);return}}q&8?(V&16&&Ft(x,b,w),F!==x&&a(m,F)):V&16?q&16?nn(x,F,m,S,b,w,L,O,C):Ft(x,b,w,!0):(V&8&&a(m,""),q&16&&k(F,m,S,b,w,L,O,C))},oe=(f,d,m,S,b,w,L,O,C)=>{f=f||Rt,d=d||Rt;const x=f.length,V=d.length,F=Math.min(x,V);let $;for($=0;$V?Ft(f,b,w,!0,!1,F):k(d,m,S,b,w,L,O,C,F)},nn=(f,d,m,S,b,w,L,O,C)=>{let x=0;const V=d.length;let F=f.length-1,$=V-1;for(;x<=F&&x<=$;){const q=f[x],z=d[x]=C?nt(d[x]):Me(d[x]);if(ht(q,z))P(q,z,m,null,b,w,L,O,C);else break;x++}for(;x<=F&&x<=$;){const q=f[F],z=d[$]=C?nt(d[$]):Me(d[$]);if(ht(q,z))P(q,z,m,null,b,w,L,O,C);else break;F--,$--}if(x>F){if(x<=$){const q=$+1,z=q$)for(;x<=F;)$e(f[x],b,w,!0),x++;else{const q=x,z=x,ee=new Map;for(x=z;x<=$;x++){const Ee=d[x]=C?nt(d[x]):Me(d[x]);Ee.key!=null&&ee.set(Ee.key,x)}let Z,xe=0;const pe=$-z+1;let Fe=!1,Te=0;const Ht=new Array(pe);for(x=0;x=pe){$e(Ee,b,w,!0);continue}let je;if(Ee.key!=null)je=ee.get(Ee.key);else for(Z=z;Z<=$;Z++)if(Ht[Z-z]===0&&ht(Ee,d[Z])){je=Z;break}je===void 0?$e(Ee,b,w,!0):(Ht[je-z]=x+1,je>=Te?Te=je:Fe=!0,P(Ee,d[je],m,null,b,w,L,O,C),xe++)}const Zs=Fe?cc(Ht):Rt;for(Z=Zs.length-1,x=pe-1;x>=0;x--){const Ee=z+x,je=d[Ee],er=d[Ee+1],tr=Ee+1{const{el:w,type:L,transition:O,children:C,shapeFlag:x}=f;if(x&6){ct(f.component.subTree,d,m,S);return}if(x&128){f.suspense.move(d,m,S);return}if(x&64){L.move(f,d,m,Tt);return}if(L===we){s(w,d,m);for(let F=0;FO.enter(w),b);else{const{leave:F,delayLeave:$,afterLeave:q}=O,z=()=>{f.ctx.isUnmounted?r(w):s(w,d,m)},ee=()=>{F(w,()=>{z(),q&&q()})};$?$(w,z,ee):ee()}else s(w,d,m)},$e=(f,d,m,S=!1,b=!1)=>{const{type:w,props:L,ref:O,children:C,dynamicChildren:x,shapeFlag:V,patchFlag:F,dirs:$,cacheIndex:q}=f;if(F===-2&&(b=!1),O!=null&&(Ge(),Pt(O,null,m,f,!0),Xe()),q!=null&&(d.renderCache[q]=void 0),V&256){d.ctx.deactivate(f);return}const z=V&1&&$,ee=!vt(f);let Z;if(ee&&(Z=L&&L.onVnodeBeforeUnmount)&&Oe(Z,d,f),V&6)Ao(f.component,m,S);else{if(V&128){f.suspense.unmount(m,S);return}z&&We(f,null,d,"beforeUnmount"),V&64?f.type.remove(f,d,m,Tt,S):x&&!x.hasOnce&&(w!==we||F>0&&F&64)?Ft(x,d,m,!1,!0):(w===we&&F&384||!b&&V&16)&&Ft(C,d,m),S&&Js(f)}(ee&&(Z=L&&L.onVnodeUnmounted)||z)&&Ce(()=>{Z&&Oe(Z,d,f),z&&We(f,null,d,"unmounted")},m)},Js=f=>{const{type:d,el:m,anchor:S,transition:b}=f;if(d===we){Co(m,S);return}if(d===kt){g(f);return}const w=()=>{r(m),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(f.shapeFlag&1&&b&&!b.persisted){const{leave:L,delayLeave:O}=b,C=()=>L(m,w);O?O(f.el,w,C):C()}else w()},Co=(f,d)=>{let m;for(;f!==d;)m=v(f),r(f),f=m;r(d)},Ao=(f,d,m)=>{const{bum:S,scope:b,job:w,subTree:L,um:O,m:C,a:x,parent:V,slots:{__:F}}=f;gr(C),gr(x),S&&Gn(S),V&&B(F)&&F.forEach($=>{V.renderCache[$]=void 0}),b.stop(),w&&(w.flags|=8,$e(L,f,d,m)),O&&Ce(O,d),Ce(()=>{f.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Ft=(f,d,m,S=!1,b=!1,w=0)=>{for(let L=w;L{if(f.shapeFlag&6)return sn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const d=v(f.anchor||f.el),m=d&&d[Cl];return m?v(m):d};let Bn=!1;const Qs=(f,d,m)=>{f==null?d._vnode&&$e(d._vnode,null,null,!0):P(d._vnode||null,f,d,null,null,null,m),d._vnode=f,Bn||(Bn=!0,ir(),En(),Bn=!1)},Tt={p:P,um:$e,m:ct,r:Js,mt:Y,mc:k,pc:D,pbc:I,n:sn,o:e};let Kn,qn;return t&&([Kn,qn]=t(Tt)),{render:Qs,hydrate:Kn,createApp:Ql(Qs,Kn)}}function es({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function at({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Gi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Xi(e,t,n=!1){const s=e.children,r=t.children;if(B(s)&&B(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Yi(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Yi(t)}function gr(e){if(e)for(let t=0;t_t(ac);function zi(e,t){return Wn(e,null,t)}function vf(e,t){return Wn(e,null,{flush:"post"})}function Le(e,t,n){return Wn(e,t,n)}function Wn(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=fe({},n),c=t&&s||!t&&i!=="post";let u;if(Jt){if(i==="sync"){const y=fc();u=y.__watcherHandles||(y.__watcherHandles=[])}else if(!c){const y=()=>{};return y.stop=Ue,y.resume=Ue,y.pause=Ue,y}}const a=ye;l.call=(y,A,P)=>De(y,a,A,P);let h=!1;i==="post"?l.scheduler=y=>{Ce(y,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(y,A)=>{A?y():ks(y)}),l.augmentJob=y=>{t&&(y.flags|=4),h&&(y.flags|=2,a&&(y.id=a.uid,y.i=a))};const v=wl(e,t,l);return Jt&&(u?u.push(v):c&&v()),v}function uc(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Ji(s,e):()=>s[e]:e.bind(s,s);let i;G(t)?i=t:(i=t.handler,n=t);const o=tn(this),l=Wn(r,i.bind(s),n);return o(),l}function Ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ne(t)}Modifiers`]||e[`${lt(t)}Modifiers`];function hc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&dc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Lo)));let l,c=s[l=mn(t)]||s[l=mn(Ne(t))];!c&&i&&(c=s[l=mn(lt(t))]),c&&De(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,De(u,e,6,r)}}function Qi(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!G(e)){const c=u=>{const a=Qi(u,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(se(e)&&s.set(e,null),null):(B(i)?i.forEach(c=>o[c]=null):fe(o,i),se(e)&&s.set(e,o),o)}function Un(e,t){return!e||!Zt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Q(e,t[0].toLowerCase()+t.slice(1))||Q(e,lt(t))||Q(e,t))}function ts(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:h,data:v,setupState:y,ctx:A,inheritAttrs:P}=e,K=Cn(e);let H,U;try{if(n.shapeFlag&4){const g=r||s,M=g;H=Me(u.call(M,g,a,h,y,v,A)),U=l}else{const g=t;H=Me(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),U=t.props?l:pc(l)}}catch(g){Bt.length=0,Hn(g,e,1),H=he(de)}let p=H;if(U&&P!==!1){const g=Object.keys(U),{shapeFlag:M}=p;g.length&&M&7&&(i&&g.some(Is)&&(U=gc(U,i)),p=ot(p,U,!1,!0))}return n.dirs&&(p=ot(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Xt(p,n.transition),H=p,Cn(K),H}const pc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Zt(n))&&((t||(t={}))[n]=e[n]);return t},gc=(e,t)=>{const n={};for(const s in e)(!Is(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function mc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?mr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function to(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):Tl(e)}const we=Symbol.for("v-fgt"),bt=Symbol.for("v-txt"),de=Symbol.for("v-cmt"),kt=Symbol.for("v-stc"),Bt=[];let Ae=null;function Es(e=!1){Bt.push(Ae=e?null:[])}function vc(){Bt.pop(),Ae=Bt[Bt.length-1]||null}let Yt=1;function vr(e,t=!1){Yt+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function no(e){return e.dynamicChildren=Yt>0?Ae||Rt:null,vc(),Yt>0&&Ae&&Ae.push(e),e}function yf(e,t,n,s,r,i){return no(ro(e,t,n,s,r,i,!0))}function Cs(e,t,n,s,r){return no(he(e,t,n,s,r,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function ht(e,t){return e.type===t.type&&e.key===t.key}const so=({key:e})=>e??null,yn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||ae(e)||G(e)?{i:Se,r:e,k:t,f:!!n}:e:null);function ro(e,t=null,n=null,s=0,r=null,i=e===we?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&so(t),ref:t&&yn(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,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Se};return l?(qs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),Yt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const he=yc;function yc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Pi)&&(e=de),zt(e)){const l=ot(e,t,!0);return n&&qs(l,n),Yt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Rc(e)&&(e=e.__vccOpts),t){t=_c(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Fs(l)),se(c)&&(Ws(c)&&!B(c)&&(c=fe({},c)),t.style=Ns(c))}const o=le(e)?1:eo(e)?128:wi(e)?64:se(e)?4:G(e)?2:0;return ro(e,t,n,s,r,o,i,!0)}function _c(e){return e?Ws(e)||Wi(e)?fe({},e):e:null}function ot(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?bc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&so(u),ref:t&&t.ref?n&&i?B(i)?i.concat(yn(t)):[i,yn(t)]:yn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==we?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ot(e.ssContent),ssFallback:e.ssFallback&&ot(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Xt(a,c.clone(a)),a}function io(e=" ",t=0){return he(bt,null,e,t)}function _f(e,t){const n=he(kt,null,e);return n.staticCount=t,n}function bf(e="",t=!1){return t?(Es(),Cs(de,null,e)):he(de,null,e)}function Me(e){return e==null||typeof e=="boolean"?he(de):B(e)?he(we,null,e.slice()):zt(e)?nt(e):he(bt,null,String(e))}function nt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ot(e)}function qs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),qs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Wi(t)?t._ctx=Se:r===3&&Se&&(Se.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else G(t)?(t={default:t,_ctx:Se},n=32):(t=String(t),s&64?(n=16,t=[io(t)]):n=8);e.children=t,e.shapeFlag|=n}function bc(...e){const t={};for(let n=0;nye||Se;let Rn,As;{const e=Pn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Rn=t("__VUE_INSTANCE_SETTERS__",n=>ye=n),As=t("__VUE_SSR_SETTERS__",n=>Jt=n)}const tn=e=>{const t=ye;return Rn(e),e.scope.on(),()=>{e.scope.off(),Rn(t)}},yr=()=>{ye&&ye.scope.off(),Rn(null)};function oo(e){return e.vnode.shapeFlag&4}let Jt=!1;function Tc(e,t=!1,n=!1){t&&As(t);const{props:s,children:r}=e.vnode,i=oo(e);ec(e,s,i,t),rc(e,r,n||t);const o=i?Ec(e,t):void 0;return t&&As(!1),o}function Ec(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Bl);const{setup:s}=n;if(s){Ge();const r=e.setupContext=s.length>1?co(e):null,i=tn(e),o=en(s,e,0,[e.props,r]),l=Xr(o);if(Xe(),i(),(l||e.sp)&&!vt(e)&&Ri(e),l){if(o.then(yr,yr),t)return o.then(c=>{_r(e,c)}).catch(c=>{Hn(c,e,0)});e.asyncDep=o}else _r(e,o)}else lo(e)}function _r(e,t,n){G(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:se(t)&&(e.setupState=mi(t)),lo(e)}function lo(e,t,n){const s=e.type;e.render||(e.render=s.render||Ue);{const r=tn(e);Ge();try{ql(e)}finally{Xe(),r()}}}const Cc={get(e,t){return ve(e,"get",""),e[t]}};function co(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Cc),slots:e.slots,emit:e.emit,expose:t}}function Gs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(mi(vn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function Ac(e,t=!0){return G(e)?e.displayName||e.name:e.name||t&&e.__name}function Rc(e){return G(e)&&"__vccOpts"in e}const ie=(e,t)=>_l(e,t,Jt);function Rs(e,t,n){const s=arguments.length;return s===2?se(t)&&!B(t)?zt(t)?he(e,null,[t]):he(e,t):he(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&zt(n)&&(n=[n]),he(e,t,n))}const Oc="3.5.18";/** +* @vue/runtime-dom v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Os;const br=typeof window<"u"&&window.trustedTypes;if(br)try{Os=br.createPolicy("vue",{createHTML:e=>e})}catch{}const ao=Os?e=>Os.createHTML(e):e=>e,Mc="http://www.w3.org/2000/svg",Ic="http://www.w3.org/1998/Math/MathML",Ke=typeof document<"u"?document:null,wr=Ke&&Ke.createElement("template"),Pc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ke.createElementNS(Mc,e):t==="mathml"?Ke.createElementNS(Ic,e):n?Ke.createElement(e,{is:n}):Ke.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{wr.innerHTML=ao(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=wr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ze="transition",$t="animation",Qt=Symbol("_vtc"),fo={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},Lc=fe({},Si,fo),Nc=e=>(e.displayName="Transition",e.props=Lc,e),wf=Nc((e,{slots:t})=>Rs(Ol,Fc(e),t)),ft=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},Sr=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Fc(e){const t={};for(const _ in e)_ in fo||(t[_]=e[_]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,A=Hc(r),P=A&&A[0],K=A&&A[1],{onBeforeEnter:H,onEnter:U,onEnterCancelled:p,onLeave:g,onLeaveCancelled:M,onBeforeAppear:W=H,onAppear:R=U,onAppearCancelled:k=p}=t,T=(_,N,Y,re)=>{_._enterCancelled=re,ut(_,N?a:l),ut(_,N?u:o),Y&&Y()},I=(_,N)=>{_._isLeaving=!1,ut(_,h),ut(_,y),ut(_,v),N&&N()},E=_=>(N,Y)=>{const re=_?R:U,j=()=>T(N,_,Y);ft(re,[N,j]),xr(()=>{ut(N,_?c:i),Be(N,_?a:l),Sr(re)||Tr(N,s,P,j)})};return fe(t,{onBeforeEnter(_){ft(H,[_]),Be(_,i),Be(_,o)},onBeforeAppear(_){ft(W,[_]),Be(_,c),Be(_,u)},onEnter:E(!1),onAppear:E(!0),onLeave(_,N){_._isLeaving=!0;const Y=()=>I(_,N);Be(_,h),_._enterCancelled?(Be(_,v),Ar()):(Ar(),Be(_,v)),xr(()=>{_._isLeaving&&(ut(_,h),Be(_,y),Sr(g)||Tr(_,s,K,Y))}),ft(g,[_,Y])},onEnterCancelled(_){T(_,!1,void 0,!0),ft(p,[_])},onAppearCancelled(_){T(_,!0,void 0,!0),ft(k,[_])},onLeaveCancelled(_){I(_),ft(M,[_])}})}function Hc(e){if(e==null)return null;if(se(e))return[ns(e.enter),ns(e.leave)];{const t=ns(e);return[t,t]}}function ns(e){return No(e)}function Be(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Qt]||(e[Qt]=new Set)).add(t)}function ut(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Qt];n&&(n.delete(t),n.size||(e[Qt]=void 0))}function xr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Dc=0;function Tr(e,t,n,s){const r=e._endId=++Dc,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=$c(e,t);if(!o)return s();const u=o+"end";let a=0;const h=()=>{e.removeEventListener(u,v),i()},v=y=>{y.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[A]||"").split(", "),r=s(`${Ze}Delay`),i=s(`${Ze}Duration`),o=Er(r,i),l=s(`${$t}Delay`),c=s(`${$t}Duration`),u=Er(l,c);let a=null,h=0,v=0;t===Ze?o>0&&(a=Ze,h=o,v=i.length):t===$t?u>0&&(a=$t,h=u,v=c.length):(h=Math.max(o,u),a=h>0?o>u?Ze:$t:null,v=a?a===Ze?i.length:c.length:0);const y=a===Ze&&/\b(transform|all)(,|$)/.test(s(`${Ze}Property`).toString());return{type:a,timeout:h,propCount:v,hasTransform:y}}function Er(e,t){for(;e.lengthCr(n)+Cr(e[s])))}function Cr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ar(){return document.body.offsetHeight}function jc(e,t,n){const s=e[Qt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Rr=Symbol("_vod"),Vc=Symbol("_vsh"),Wc=Symbol(""),Uc=/(^|;)\s*display\s*:/;function kc(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&_n(s,l,"")}else for(const o in t)n[o]==null&&_n(s,o,"");for(const o in n)o==="display"&&(i=!0),_n(s,o,n[o])}else if(r){if(t!==n){const o=s[Wc];o&&(n+=";"+o),s.cssText=n,i=Uc.test(n)}}else t&&e.removeAttribute("style");Rr in e&&(e[Rr]=i?s.display:"",e[Vc]&&(s.display="none"))}const Or=/\s*!important$/;function _n(e,t,n){if(B(n))n.forEach(s=>_n(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Bc(e,t);Or.test(n)?e.setProperty(lt(s),n.replace(Or,""),"important"):e[s]=n}}const Mr=["Webkit","Moz","ms"],ss={};function Bc(e,t){const n=ss[t];if(n)return n;let s=Ne(t);if(s!=="filter"&&s in e)return ss[t]=s;s=In(s);for(let r=0;rrs||(Yc.then(()=>rs=0),rs=Date.now());function Jc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;De(Qc(s,n.value),t,5,[s])};return n.value=e,n.attached=zc(),n}function Qc(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Hr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Zc=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?jc(e,s,o):t==="style"?kc(e,n,s):Zt(t)?Is(t)||Gc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ea(e,t,s,o))?(Lr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Pr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!le(s))?Lr(e,Ne(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Pr(e,t,s,o))};function ea(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Hr(t)&&G(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Hr(t)&&le(n)?!1:t in e}const ta=["ctrl","shift","alt","meta"],na={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>ta.some(n=>e[`${n}Key`]&&!t.includes(n))},Sf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=lt(r.key);if(t.some(o=>o===i||sa[o]===i))return e(r)})},ra=fe({patchProp:Zc},Pc);let is,Dr=!1;function ia(){return is=Dr?is:oc(ra),Dr=!0,is}const Tf=(...e)=>{const t=ia().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=la(s);if(r)return n(r,!0,oa(r))},t};function oa(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function la(e){return le(e)?document.querySelector(e):e}const ca=window.__VP_SITE_DATA__;function uo(e){return ei()?(ko(e),!0):!1}const os=new WeakMap,aa=(...e)=>{var t;const n=e[0],s=(t=xt())==null?void 0:t.proxy;if(s==null&&!$i())throw new Error("injectLocal must be called in setup");return s&&os.has(s)&&n in os.get(s)?os.get(s)[n]:_t(...e)},ho=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const fa=Object.prototype.toString,ua=e=>fa.call(e)==="[object Object]",St=()=>{},$r=da();function da(){var e,t;return ho&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Xs(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const po=e=>e();function ha(e,t={}){let n,s,r=St;const i=c=>{clearTimeout(c),r(),r=St};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((h,v)=>{r=t.rejectOnCancel?v:h,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,h(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,h(c())},u)})}}function pa(...e){let t=0,n,s=!0,r=St,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=St)};return v=>{const y=ce(o),A=Date.now()-t,P=()=>i=v();return a(),y<=0?(t=Date.now(),P()):(A>y&&(c||!s)?(t=Date.now(),P()):l&&(i=new Promise((K,H)=>{r=u?H:K,n=setTimeout(()=>{t=Date.now(),s=!0,K(P()),a()},Math.max(0,y-A))})),!c&&!n&&(n=setTimeout(()=>s=!0,y)),s=!1,i)}}function ga(e=po,t={}){const{initialState:n="active"}=t,s=Ys(n==="active");function r(){s.value=!1}function i(){s.value=!0}const o=(...l)=>{s.value&&e(...l)};return{isActive:Fn(s),pause:r,resume:i,eventFilter:o}}function jr(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function ma(e){return xt()}function ls(e){return Array.isArray(e)?e:[e]}function Ys(...e){if(e.length!==1)return ml(...e);const t=e[0];return typeof t=="function"?Fn(hl(()=>({get:t,set:St}))):mt(t)}function va(e,t=200,n={}){return Xs(ha(t,n),e)}function ya(e,t=200,n=!1,s=!0,r=!1){return Xs(pa(t,n,s,r),e)}function _a(e,t,n={}){const{eventFilter:s=po,...r}=n;return Le(e,Xs(s,t),r)}function ba(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=ga(s,{initialState:r});return{stop:_a(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function kn(e,t=!0,n){ma()?Nt(e,n):t?e():Dn(e)}function wa(e,t,n){return Le(e,t,{...n,immediate:!0})}const Ye=ho?window:void 0;function zs(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function ze(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=ls(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=wa(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>zs(u)))!=null?c:[Ye].filter(u=>u!=null),ls(ce(r.value?e[1]:e[0])),ls(Us(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const h=ua(a)?{...a}:a;t.push(...l.flatMap(v=>c.flatMap(y=>u.map(A=>s(v,y,A,h)))))},{flush:"post"}),o=()=>{i(),n()};return uo(n),o}function Sa(){const e=Pe(!1),t=xt();return t&&Nt(()=>{e.value=!0},t),e}function xa(e){const t=Sa();return ie(()=>(t.value,!!e()))}function Ta(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Ef(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ye,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Ta(t);return ze(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const Ea=Symbol("vueuse-ssr-width");function Ca(){const e=$i()?aa(Ea,null):null;return typeof e=="number"?e:void 0}function go(e,t={}){const{window:n=Ye,ssrWidth:s=Ca()}=t,r=xa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=Pe(typeof s=="number"),o=Pe(),l=Pe(!1),c=u=>{l.value=u.matches};return zi(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const h=a.includes("not all"),v=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),y=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let A=!!(v||y);return v&&A&&(A=s>=jr(v[1])),y&&A&&(A=s<=jr(y[1])),h?!A:A});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),ze(o,"change",c,{passive:!0}),ie(()=>l.value)}const dn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},hn="__vueuse_ssr_handlers__",Aa=Ra();function Ra(){return hn in dn||(dn[hn]=dn[hn]||{}),dn[hn]}function mo(e,t){return Aa[e]||t}function vo(e){return go("(prefers-color-scheme: dark)",e)}function Oa(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 Ma={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()}},Vr="vueuse-storage";function Ia(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:h=Ye,eventFilter:v,onError:y=E=>{console.error(E)},initOnMounted:A}=s,P=(a?Pe:mt)(typeof t=="function"?t():t),K=ie(()=>ce(e));if(!n)try{n=mo("getDefaultStorage",()=>{var E;return(E=Ye)==null?void 0:E.localStorage})()}catch(E){y(E)}if(!n)return P;const H=ce(t),U=Oa(H),p=(r=s.serializer)!=null?r:Ma[U],{pause:g,resume:M}=ba(P,()=>R(P.value),{flush:i,deep:o,eventFilter:v});Le(K,()=>T(),{flush:i}),h&&l&&kn(()=>{n instanceof Storage?ze(h,"storage",T,{passive:!0}):ze(h,Vr,I),A&&T()}),A||T();function W(E,_){if(h){const N={key:K.value,oldValue:E,newValue:_,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",N):new CustomEvent(Vr,{detail:N}))}}function R(E){try{const _=n.getItem(K.value);if(E==null)W(_,null),n.removeItem(K.value);else{const N=p.write(E);_!==N&&(n.setItem(K.value,N),W(_,N))}}catch(_){y(_)}}function k(E){const _=E?E.newValue:n.getItem(K.value);if(_==null)return c&&H!=null&&n.setItem(K.value,p.write(H)),H;if(!E&&u){const N=p.read(_);return typeof u=="function"?u(N,H):U==="object"&&!Array.isArray(N)?{...H,...N}:N}else return typeof _!="string"?_:p.read(_)}function T(E){if(!(E&&E.storageArea!==n)){if(E&&E.key==null){P.value=H;return}if(!(E&&E.key!==K.value)){g();try{(E==null?void 0:E.newValue)!==p.write(P.value)&&(P.value=k(E))}catch(_){y(_)}finally{E?Dn(M):M()}}}}function I(E){T(E.detail)}return P}const Pa="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function La(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ye,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},v=vo({window:r}),y=ie(()=>v.value?"dark":"light"),A=c||(o==null?Ys(s):Ia(o,s,i,{window:r,listenToStorageChanges:l})),P=ie(()=>A.value==="auto"?y.value:A.value),K=mo("updateHTMLAttrs",(g,M,W)=>{const R=typeof g=="string"?r==null?void 0:r.document.querySelector(g):zs(g);if(!R)return;const k=new Set,T=new Set;let I=null;if(M==="class"){const _=W.split(/\s/g);Object.values(h).flatMap(N=>(N||"").split(/\s/g)).filter(Boolean).forEach(N=>{_.includes(N)?k.add(N):T.add(N)})}else I={key:M,value:W};if(k.size===0&&T.size===0&&I===null)return;let E;a&&(E=r.document.createElement("style"),E.appendChild(document.createTextNode(Pa)),r.document.head.appendChild(E));for(const _ of k)R.classList.add(_);for(const _ of T)R.classList.remove(_);I&&R.setAttribute(I.key,I.value),a&&(r.getComputedStyle(E).opacity,document.head.removeChild(E))});function H(g){var M;K(t,n,(M=h[g])!=null?M:g)}function U(g){e.onChanged?e.onChanged(g,H):H(g)}Le(P,U,{flush:"post",immediate:!0}),kn(()=>U(P.value));const p=ie({get(){return u?A.value:P.value},set(g){A.value=g}});return Object.assign(p,{store:A,system:y,state:P})}function Na(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=La({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function cs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const Wr=1;function Fa(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=St,onScroll:i=St,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ye,onError:a=R=>{console.error(R)}}=t,h=Pe(0),v=Pe(0),y=ie({get(){return h.value},set(R){P(R,void 0)}}),A=ie({get(){return v.value},set(R){P(void 0,R)}});function P(R,k){var T,I,E,_;if(!u)return;const N=ce(e);if(!N)return;(E=N instanceof Document?u.document.body:N)==null||E.scrollTo({top:(T=ce(k))!=null?T:A.value,left:(I=ce(R))!=null?I:y.value,behavior:ce(c)});const Y=((_=N==null?void 0:N.document)==null?void 0:_.documentElement)||(N==null?void 0:N.documentElement)||N;y!=null&&(h.value=Y.scrollLeft),A!=null&&(v.value=Y.scrollTop)}const K=Pe(!1),H=Lt({left:!0,right:!1,top:!0,bottom:!1}),U=Lt({left:!1,right:!1,top:!1,bottom:!1}),p=R=>{K.value&&(K.value=!1,U.left=!1,U.right=!1,U.top=!1,U.bottom=!1,r(R))},g=va(p,n+s),M=R=>{var k;if(!u)return;const T=((k=R==null?void 0:R.document)==null?void 0:k.documentElement)||(R==null?void 0:R.documentElement)||zs(R),{display:I,flexDirection:E,direction:_}=getComputedStyle(T),N=_==="rtl"?-1:1,Y=T.scrollLeft;U.left=Yh.value;const re=Math.abs(Y*N)<=(o.left||0),j=Math.abs(Y*N)+T.clientWidth>=T.scrollWidth-(o.right||0)-Wr;I==="flex"&&E==="row-reverse"?(H.left=j,H.right=re):(H.left=re,H.right=j),h.value=Y;let X=T.scrollTop;R===u.document&&!X&&(X=u.document.body.scrollTop),U.top=Xv.value;const D=Math.abs(X)<=(o.top||0),oe=Math.abs(X)+T.clientHeight>=T.scrollHeight-(o.bottom||0)-Wr;I==="flex"&&E==="column-reverse"?(H.top=oe,H.bottom=D):(H.top=D,H.bottom=oe),v.value=X},W=R=>{var k;if(!u)return;const T=(k=R.target.documentElement)!=null?k:R.target;M(T),K.value=!0,g(R),i(R)};return ze(e,"scroll",n?ya(W,n,!0,!1):W,l),kn(()=>{try{const R=ce(e);if(!R)return;M(R)}catch(R){a(R)}}),ze(e,"scrollend",p,l),{x:y,y:A,isScrolling:K,arrivedState:H,directions:U,measure(){const R=ce(e);u&&R&&M(R)}}}function yo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const as=new WeakMap;function Cf(e,t=!1){const n=Pe(t);let s=null,r="";Le(Ys(e),l=>{const c=cs(ce(l));if(c){const u=c;if(as.get(u)||as.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=cs(ce(e));!l||n.value||($r&&(s=ze(l,"touchmove",c=>{Ha(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=cs(ce(e));!l||!n.value||($r&&(s==null||s()),l.style.overflow=r,as.delete(l),n.value=!1)};return uo(o),ie({get(){return n.value},set(l){l?i():o()}})}function Af(e={}){const{window:t=Ye,...n}=e;return Fa(t,n)}function Rf(e={}){const{window:t=Ye,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=Pe(n),c=Pe(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:h,height:v,scale:y}=t.visualViewport;l.value=Math.round(h*y),c.value=Math.round(v*y)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),kn(u);const a={passive:!0};if(ze("resize",u,a),t&&o==="visual"&&t.visualViewport&&ze(t.visualViewport,"resize",u,a),r){const h=go("(orientation: portrait)");Le(h,()=>u())}return{width:l,height:c}}const fs={};var us={};const _o=/^(?:[a-z]+:|\/\/)/i,Da="vitepress-theme-appearance",$a=/#.*$/,ja=/[?#].*$/,Va=/(?:(^|\/)index)?\.(?:md|html)$/,me=typeof document<"u",bo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Wa(e,t,n=!1){if(t===void 0)return!1;if(e=Ur(`/${e}`),n)return new RegExp(t).test(e);if(Ur(t)!==e)return!1;const s=t.match($a);return s?(me?location.hash:"")===s[0]:!0}function Ur(e){return decodeURI(e).replace(ja,"").replace(Va,"$1")}function Ua(e){return _o.test(e)}function ka(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ua(n)&&Wa(t,`/${n}/`,!0))||"root"}function Ba(e,t){var s,r,i,o,l,c,u;const n=ka(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:So(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function wo(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Ka(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Ka(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function qa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function So(e,t){return[...e.filter(n=>!qa(t,n)),...t]}const Ga=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Xa=/^[a-z]:/i;function kr(e){const t=Xa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ga,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ds=new Set;function Ya(e){if(ds.size===0){const n=typeof process=="object"&&(us==null?void 0:us.VITE_EXTRA_EXTENSIONS)||(fs==null?void 0:fs.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>ds.add(s))}const t=e.split(".").pop();return t==null||!ds.has(t.toLowerCase())}const za=Symbol(),wt=Pe(ca);function Of(e){const t=ie(()=>Ba(wt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?mt(!0):n==="force-auto"?vo():n?Na({storageKey:Da,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):mt(!1),r=mt(me?location.hash:"");return me&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Le(()=>e.data,()=>{r.value=me?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>wo(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Ja(){const e=_t(za);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Qa(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Br(e){return _o.test(e)||!e.startsWith("/")?e:Qa(wt.value.base,e)}function Za(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),me){const n="/";t=kr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${kr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let bn=[];function Mf(e){bn.push(e),Vn(()=>{bn=bn.filter(t=>t!==e)})}function ef(){let e=wt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Kr(e,n);else if(Array.isArray(e))for(const s of e){const r=Kr(s,n);if(r){t=r;break}}return t}function Kr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const tf=Symbol(),xo="http://a.com",nf=()=>({path:"/",component:null,data:bo});function If(e,t){const n=Lt(nf()),s={route:n,go:r};async function r(l=me?location.href:"/"){var c,u;l=hs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(me&&l!==hs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var v,y;if(await((v=s.onBeforePageLoad)==null?void 0:v.call(s,l))===!1)return;const a=new URL(l,xo),h=i=a.pathname;try{let A=await e(h);if(!A)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:P,__pageData:K}=A;if(!P)throw new Error(`Invalid route component: ${P}`);await((y=s.onAfterPageLoad)==null?void 0:y.call(s,l)),n.path=me?h:Br(h),n.component=vn(P),n.data=vn(K),me&&Dn(()=>{let H=wt.value.base+K.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!wt.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==a.pathname&&(a.pathname=H,l=H+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let U=null;try{U=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(U){qr(U,a.hash);return}}window.scrollTo(0,c)})}}catch(A){if(!/fetch|Page not found/.test(A.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(A),!u)try{const P=await fetch(wt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await P.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=me?h:Br(h),n.component=t?vn(t):null;const P=me?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...bo,relativePath:P}}}}return me&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:h,pathname:v,hash:y,search:A}=new URL(u,c.baseURI),P=new URL(location.href);h===P.origin&&Ya(v)&&(l.preventDefault(),v===P.pathname&&A===P.search?(y!==P.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:P.href,newURL:a}))),y?qr(c,y,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=hs(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function sf(){const e=_t(tf);if(!e)throw new Error("useRouter() is called without provider.");return e}function To(){return sf().route}function qr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-ef()+i;requestAnimationFrame(r)}}function hs(e){const t=new URL(e,xo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),wt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const pn=()=>bn.forEach(e=>e()),Pf=Ai({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=To(),{frontmatter:n,site:s}=Ja();return Le(n,pn,{deep:!0,flush:"post"}),()=>Rs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Rs(t.component,{onVnodeMounted:pn,onVnodeUpdated:pn,onVnodeUnmounted:pn}):"404 Page Not Found"])}}),Lf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Nf=Ai({setup(e,{slots:t}){const n=mt(!1);return Nt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Ff(){me&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Hf(){if(me){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),rf(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function rf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Df(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=ps(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(ps);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};zi(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=wo(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):ps(["meta",{name:"description",content:a}]),r(So(o.head,lf(c)))})}function ps([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function of(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function lf(e){return e.filter(t=>!of(t))}const gs=new Set,Eo=()=>document.createElement("link"),cf=e=>{const t=Eo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},af=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let gn;const ff=me&&(gn=Eo())&&gn.relList&&gn.relList.supports&&gn.relList.supports("prefetch")?cf:af;function $f(){if(!me||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!gs.has(c)){gs.add(c);const u=Za(c);u&&ff(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):gs.add(l))})})};Nt(s);const r=To();Le(()=>r.path,s),Vn(()=>{n&&n.disconnect()})}export{mf as $,ef as A,hf as B,uf as C,Pe as D,Mf as E,we as F,he as G,df as H,_o as I,To as J,bc as K,_t as L,Rf as M,Ns as N,Ef as O,Dn as P,Af as Q,me as R,Fn as S,wf as T,Cf as U,Zl as V,gf as W,xf as X,Mi as Y,Sf as Z,Lf as _,io as a,Df as a0,tf as a1,Of as a2,za as a3,Pf as a4,Nf as a5,wt as a6,If as a7,Za as a8,Tf as a9,$f as aa,Hf as ab,Ff as ac,Rs as ad,_f as ae,Cs as b,yf as c,Ai as d,bf as e,Ya as f,Br as g,ie as h,Ua as i,ro as j,Us as k,Wa as l,go as m,Fs as n,Es as o,mt as p,Le as q,pf as r,zi as s,Wo as t,Ja as u,Nt as v,El as w,Vn as x,vf as y,jl as z}; diff --git a/assets/chunks/theme.D5-fWCd8.js b/assets/chunks/theme.D5-fWCd8.js new file mode 100644 index 0000000..b54f952 --- /dev/null +++ b/assets/chunks/theme.D5-fWCd8.js @@ -0,0 +1 @@ +import{d as m,c as u,r as c,n as N,o as a,a as z,t as M,b as k,w as f,T as ce,e as h,_ as b,u as Ae,i as Be,f as Ce,g as ue,h as $,j as v,k as r,l as W,m as ae,p as T,q as D,s as Q,v as j,x as de,y as ve,z as Ee,A as Fe,F as w,B,C as q,D as ge,E as X,G as _,H as E,I as $e,J as Z,K as U,L as x,M as De,N as ye,O as Oe,P as Pe,Q as Le,R as ee,S as Ge,U as Ve,V as Se,W as Ue,X as je,Y as ze,Z as We,$ as qe}from"./framework.Cd-3tpCq.js";const Ke=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),u("span",{class:N(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[z(M(e.text),1)])],2))}}),Re={key:0,class:"VPBackdrop"},Je=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),k(ce,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",Re)):h("",!0)]),_:1}))}}),Ye=b(Je,[["__scopeId","data-v-7e214886"]]),P=Ae;function Qe(s,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(s,e):(s(),(o=!0)&&setTimeout(()=>o=!1,e))}}function re(s){return s.startsWith("/")?s:`/${s}`}function pe(s){const{pathname:e,search:t,hash:o,protocol:n}=new URL(s,"http://a.com");if(Be(s)||s.startsWith("#")||!n.startsWith("http")||!Ce(e))return s;const{site:i}=P(),l=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${o}`);return ue(l)}function R({correspondingLink:s=!1}={}){const{site:e,localeIndex:t,page:o,theme:n,hash:i}=P(),l=$(()=>{var d,y;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((y=e.value.locales[t.value])==null?void 0:y.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:$(()=>Object.entries(e.value.locales).flatMap(([d,y])=>l.value.label===y.label?[]:{text:y.label,link:Xe(y.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&s,o.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function Xe(s,e,t,o){return e?s.replace(/\/$/,"")+re(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const Ze={class:"NotFound"},xe={class:"code"},et={class:"title"},tt={class:"quote"},nt={class:"action"},ot=["href","aria-label"],st=m({__name:"NotFound",setup(s){const{theme:e}=P(),{currentLang:t}=R();return(o,n)=>{var i,l,p,d,y;return a(),u("div",Ze,[v("p",xe,M(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),v("h1",et,M(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=v("div",{class:"divider"},null,-1)),v("blockquote",tt,M(((p=r(e).notFound)==null?void 0:p.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",nt,[v("a",{class:"link",href:r(ue)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},M(((y=r(e).notFound)==null?void 0:y.linkText)??"Take me home"),9,ot)])])}}}),at=b(st,[["__scopeId","data-v-5a673029"]]);function Te(s,e){if(Array.isArray(s))return J(s);if(s==null)return[];e=re(e);const t=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(re(n))),o=t?s[t]:[];return Array.isArray(o)?J(o):J(o.items,o.base)}function rt(s){const e=[];let t=0;for(const o in s){const n=s[o];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function it(s){const e=[];function t(o){for(const n of o)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):W(s,e.link)?!0:e.items?ie(s,e.items):!1}function J(s,e){return[...s].map(t=>{const o={...t},n=o.base||e;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=J(o.items,n)),o})}function O(){const{frontmatter:s,page:e,theme:t}=P(),o=ae("(min-width: 960px)"),n=T(!1),i=$(()=>{const A=t.value.sidebar,S=e.value.relativePath;return A?Te(A,S):[]}),l=T(i.value);D(i,(A,S)=>{JSON.stringify(A)!==JSON.stringify(S)&&(l.value=i.value)});const p=$(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),d=$(()=>y?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),y=$(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),L=$(()=>p.value&&o.value),g=$(()=>p.value?rt(l.value):[]);function V(){n.value=!0}function I(){n.value=!1}function H(){n.value?I():V()}return{isOpen:n,sidebar:l,sidebarGroups:g,hasSidebar:p,hasAside:y,leftAside:d,isSidebarEnabled:L,open:V,close:I,toggle:H}}function lt(s,e){let t;Q(()=>{t=s.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",o)}),de(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}function ct(s){const{page:e,hash:t}=P(),o=T(!1),n=$(()=>s.value.collapsed!=null),i=$(()=>!!s.value.link),l=T(!1),p=()=>{l.value=W(e.value.relativePath,s.value.link)};D([e,s,t],p),j(p);const d=$(()=>l.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),y=$(()=>!!(s.value.items&&s.value.items.length));Q(()=>{o.value=!!(n.value&&s.value.collapsed)}),ve(()=>{(l.value||d.value)&&(o.value=!1)});function L(){n.value&&(o.value=!o.value)}return{collapsed:o,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:y,toggle:L}}function ut(){const{hasSidebar:s}=O(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:$(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const dt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,le=[];function Ne(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function fe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:vt(t),link:"#"+t.id,level:o}});return pt(e,s)}function vt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(dt.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function pt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return mt(s,o,n)}function ft(s,e){const{isAsideEnabled:t}=ut(),o=Qe(i,100);let n=null;j(()=>{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Ee(()=>{l(location.hash)}),de(()=>{window.removeEventListener("scroll",o)});function i(){if(!t.value)return;const p=window.scrollY,d=window.innerHeight,y=document.body.offsetHeight,L=Math.abs(p+d-y)<1,g=le.map(({element:I,link:H})=>({link:H,top:ht(I)})).filter(({top:I})=>!Number.isNaN(I)).sort((I,H)=>I.top-H.top);if(!g.length){l(null);return}if(p<1){l(null);return}if(L){l(g[g.length-1].link);return}let V=null;for(const{link:I,top:H}of g){if(H>p+Fe()+4)break;V=I}l(V)}function l(p){n&&n.classList.remove("active"),p==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ht(s){let e=0;for(;s!==document.body;){if(s===null)return NaN;e+=s.offsetTop,s=s.offsetParent}return e}function mt(s,e,t){le.length=0;const o=[],n=[];return s.forEach(i=>{const l={...i,children:[]};let p=n[n.length-1];for(;p&&p.level>=l.level;)n.pop(),p=n[n.length-1];if(l.element.classList.contains("ignore-header")||p&&"shouldIgnore"in p){n.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const n=q("VPDocOutlineItem",!0);return a(),u("ul",{class:N(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(w,null,B(t.headers,({children:i,link:l,title:p})=>(a(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:e,title:p},M(p),9,_t),i!=null&&i.length?(a(),k(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Me=b(kt,[["__scopeId","data-v-0bb3c463"]]),bt={class:"content"},gt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},$t=m({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),o=ge([]);X(()=>{o.value=fe(e.value.outline??t.value.outline)});const n=T(),i=T();return ft(n,i),(l,p)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n},[v("div",bt,[v("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),v("div",gt,M(r(Ne)(r(t))),1),_(Me,{headers:o.value,root:!0},null,8,["headers"])])],2))}}),yt=b($t,[["__scopeId","data-v-fa352379"]]),Pt={class:"VPDocAsideCarbonAds"},Lt=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,o)=>(a(),u("div",Pt,[_(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Vt={class:"VPDocAside"},St=m({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,o)=>(a(),u("div",Vt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),_(yt),c(t.$slots,"aside-outline-after",{},void 0,!0),o[0]||(o[0]=v("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),k(Lt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Tt=b(St,[["__scopeId","data-v-271fded2"]]);function Nt(){const{theme:s,page:e}=P();return $(()=>{const{text:t="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(e.value):n=o.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Mt(){const{page:s,theme:e,frontmatter:t}=P();return $(()=>{var y,L,g,V,I,H,A,S;const o=Te(e.value.sidebar,s.value.relativePath),n=it(o),i=It(n,C=>C.link.replace(/[?#].*$/,"")),l=i.findIndex(C=>W(s.value.relativePath,C.link)),p=((y=e.value.docFooter)==null?void 0:y.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:p?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((g=i[l-1])==null?void 0:g.docFooterText)??((V=i[l-1])==null?void 0:V.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((I=i[l-1])==null?void 0:I.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((H=i[l+1])==null?void 0:H.docFooterText)??((A=i[l+1])==null?void 0:A.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((S=i[l+1])==null?void 0:S.link)}}})}function It(s,e){const t=new Set;return s.filter(o=>{const n=e(o);return t.has(n)?!1:t.add(n)})}const F=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=$(()=>e.tag??(e.href?"a":"span")),o=$(()=>e.href&&$e.test(e.href)||e.target==="_blank");return(n,i)=>(a(),k(E(t.value),{class:N(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(pe)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:f(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),wt={class:"VPLastUpdated"},Ht=["datetime"],At=m({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,lang:o}=P(),n=$(()=>new Date(t.value.lastUpdated)),i=$(()=>n.value.toISOString()),l=T("");return j(()=>{Q(()=>{var p,d,y;l.value=new Intl.DateTimeFormat((d=(p=e.value.lastUpdated)==null?void 0:p.formatOptions)!=null&&d.forceLocale?o.value:void 0,((y=e.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(p,d)=>{var y;return a(),u("p",wt,[z(M(((y=r(e).lastUpdated)==null?void 0:y.text)||r(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},M(l.value),9,Ht)])}}}),Bt=b(At,[["__scopeId","data-v-3abf3e52"]]),Ct={key:0,class:"VPDocFooter"},Et={key:0,class:"edit-info"},Ft={key:0,class:"edit-link"},Dt={key:1,class:"last-updated"},Ot={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Gt={class:"pager"},Ut=["innerHTML"],jt=["innerHTML"],zt={class:"pager"},Wt=["innerHTML"],qt=["innerHTML"],Kt=m({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:o}=P(),n=Nt(),i=Mt(),l=$(()=>e.value.editLink&&o.value.editLink!==!1),p=$(()=>t.value.lastUpdated),d=$(()=>l.value||p.value||i.value.prev||i.value.next);return(y,L)=>{var g,V,I,H;return d.value?(a(),u("footer",Ct,[c(y.$slots,"doc-footer-before",{},void 0,!0),l.value||p.value?(a(),u("div",Et,[l.value?(a(),u("div",Ft,[_(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:f(()=>[L[0]||(L[0]=v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),z(" "+M(r(n).text),1)]),_:1,__:[0]},8,["href"])])):h("",!0),p.value?(a(),u("div",Dt,[_(Bt)])):h("",!0)])):h("",!0),(g=r(i).prev)!=null&&g.link||(V=r(i).next)!=null&&V.link?(a(),u("nav",Ot,[L[1]||(L[1]=v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),v("div",Gt,[(I=r(i).prev)!=null&&I.link?(a(),k(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:f(()=>{var A;return[v("span",{class:"desc",innerHTML:((A=r(e).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,Ut),v("span",{class:"title",innerHTML:r(i).prev.text},null,8,jt)]}),_:1},8,["href"])):h("",!0)]),v("div",zt,[(H=r(i).next)!=null&&H.link?(a(),k(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:f(()=>{var A;return[v("span",{class:"desc",innerHTML:((A=r(e).docFooter)==null?void 0:A.next)||"Next page"},null,8,Wt),v("span",{class:"title",innerHTML:r(i).next.text},null,8,qt)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Rt=b(Kt,[["__scopeId","data-v-28097769"]]),Jt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Xt={class:"content"},Zt={class:"content-container"},xt={class:"main"},en=m({__name:"VPDoc",setup(s){const{theme:e}=P(),t=Z(),{hasSidebar:o,hasAside:n,leftAside:i}=O(),l=$(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,d)=>{const y=q("Content");return a(),u("div",{class:N(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(p.$slots,"doc-top",{},void 0,!0),v("div",Jt,[r(n)?(a(),u("div",{key:0,class:N(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=v("div",{class:"aside-curtain"},null,-1)),v("div",Yt,[v("div",Qt,[_(Tt,null,{"aside-top":f(()=>[c(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),v("div",Xt,[v("div",Zt,[c(p.$slots,"doc-before",{},void 0,!0),v("main",xt,[_(y,{class:N(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(Rt,null,{"doc-footer-before":f(()=>[c(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(p.$slots,"doc-after",{},void 0,!0)])])]),c(p.$slots,"doc-bottom",{},void 0,!0)],2)}}}),tn=b(en,[["__scopeId","data-v-ef58e7af"]]),nn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const e=s,t=$(()=>e.href&&$e.test(e.href)),o=$(()=>e.tag||(e.href?"a":"button"));return(n,i)=>(a(),k(E(o.value),{class:N(["VPButton",[n.size,n.theme]]),href:n.href?r(pe)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[z(M(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),on=b(nn,[["__scopeId","data-v-f0748002"]]),sn=["src","alt"],an=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const o=q("VPImage",!0);return e.image?(a(),u(w,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",U({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,sn)):(a(),u(w,{key:1},[_(o,U({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,U({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),Y=b(an,[["__scopeId","data-v-085b6aad"]]),rn={class:"container"},ln={class:"main"},cn={class:"heading"},un=["innerHTML"],dn=["innerHTML"],vn=["innerHTML"],pn={key:0,class:"actions"},fn={key:0,class:"image"},hn={class:"image-container"},mn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=x("hero-image-slot-exists");return(t,o)=>(a(),u("div",{class:N(["VPHero",{"has-image":t.image||r(e)}])},[v("div",rn,[v("div",ln,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[v("h1",cn,[t.name?(a(),u("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,un)):h("",!0),t.text?(a(),u("span",{key:1,innerHTML:t.text,class:"text"},null,8,dn)):h("",!0)]),t.tagline?(a(),u("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,vn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",pn,[(a(!0),u(w,null,B(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[_(on,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",fn,[v("div",hn,[o[0]||(o[0]=v("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(Y,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),_n=b(mn,[["__scopeId","data-v-b6380c6a"]]),kn=m({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,o)=>r(e).hero?(a(),k(_n,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),bn={class:"box"},gn={key:0,class:"icon"},$n=["innerHTML"],yn=["innerHTML"],Pn=["innerHTML"],Ln={key:4,class:"link-text"},Vn={class:"link-text-value"},Sn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),k(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[v("article",bn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",gn,[_(Y,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(Y,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,$n)):h("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,yn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Pn)):h("",!0),e.linkText?(a(),u("div",Ln,[v("p",Vn,[z(M(e.linkText)+" ",1),t[0]||(t[0]=v("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Tn=b(Sn,[["__scopeId","data-v-7c7a8824"]]),Nn={key:0,class:"VPFeatures"},Mn={class:"container"},In={class:"items"},wn=m({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=$(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",Nn,[v("div",Mn,[v("div",In,[(a(!0),u(w,null,B(o.features,i=>(a(),u("div",{key:i.title,class:N(["item",[t.value]])},[_(Tn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Hn=b(wn,[["__scopeId","data-v-04629de0"]]),An=m({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,o)=>r(e).features?(a(),k(Hn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),Bn=m({__name:"VPHomeContent",setup(s){const{width:e}=De({initialWidth:0,includeScrollbar:!1});return(t,o)=>(a(),u("div",{class:"vp-doc container",style:ye(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Cn=b(Bn,[["__scopeId","data-v-0300b5ce"]]),En=m({__name:"VPHome",setup(s){const{frontmatter:e,theme:t}=P();return(o,n)=>{const i=q("Content");return a(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":r(t).externalLinkIcon}])},[c(o.$slots,"home-hero-before",{},void 0,!0),_(kn,null,{"home-hero-info-before":f(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(o.$slots,"home-hero-after",{},void 0,!0),c(o.$slots,"home-features-before",{},void 0,!0),_(An),c(o.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),k(Cn,{key:0},{default:f(()=>[_(i)]),_:1})):(a(),k(i,{key:1}))],2)}}}),Fn=b(En,[["__scopeId","data-v-2c057618"]]),Dn={},On={class:"VPPage"};function Gn(s,e){const t=q("Content");return a(),u("div",On,[c(s.$slots,"page-top"),_(t),c(s.$slots,"page-bottom")])}const Un=b(Dn,[["render",Gn]]),jn=m({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:o}=O();return(n,i)=>(a(),u("div",{class:N(["VPContent",{"has-sidebar":r(o),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[_(at)],!0):r(t).layout==="page"?(a(),k(Un,{key:1},{"page-top":f(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),k(Fn,{key:2},{"home-hero-before":f(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),k(E(r(t).layout),{key:3})):(a(),k(tn,{key:4},{"doc-top":f(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),zn=b(jn,[["__scopeId","data-v-da66bf6a"]]),Wn={class:"container"},qn=["innerHTML"],Kn=["innerHTML"],Rn=m({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:o}=O();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(o)}])},[v("div",Wn,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,qn)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,Kn)):h("",!0)])],2)):h("",!0)}}),Jn=b(Rn,[["__scopeId","data-v-15fdbac5"]]);function Yn(){const{theme:s,frontmatter:e}=P(),t=ge([]),o=$(()=>t.value.length>0);return X(()=>{t.value=fe(e.value.outline??s.value.outline)}),{headers:t,hasLocalNav:o}}const Qn={class:"menu-text"},Xn={class:"header"},Zn={class:"outline"},xn=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),o=T(!1),n=T(0),i=T(),l=T();function p(g){var V;(V=i.value)!=null&&V.contains(g.target)||(o.value=!1)}D(o,g=>{if(g){document.addEventListener("click",p);return}document.removeEventListener("click",p)}),Oe("Escape",()=>{o.value=!1}),X(()=>{o.value=!1});function d(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function y(g){g.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Pe(()=>{o.value=!1}))}function L(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(g,V)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:ye({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[g.headers.length>0?(a(),u("button",{key:0,onClick:d,class:N({open:o.value})},[v("span",Qn,M(r(Ne)(r(t))),1),V[0]||(V[0]=v("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:L},M(r(t).returnToTopLabel||"Return to top"),1)),_(ce,{name:"flyout"},{default:f(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:y},[v("div",Xn,[v("a",{class:"top-link",href:"#",onClick:L},M(r(t).returnToTopLabel||"Return to top"),1)]),v("div",Zn,[_(Me,{headers:g.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),eo=b(xn,[["__scopeId","data-v-3b0d77ac"]]),to={class:"container"},no=["aria-expanded"],oo={class:"menu-text"},so=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:o}=O(),{headers:n}=Yn(),{y:i}=Le(),l=T(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),X(()=>{n.value=fe(t.value.outline??e.value.outline)});const p=$(()=>n.value.length===0),d=$(()=>p.value&&!o.value),y=$(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:p.value,fixed:d.value}));return(L,g)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:N(y.value)},[v("div",to,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:g[0]||(g[0]=V=>L.$emit("open-menu"))},[g[1]||(g[1]=v("span",{class:"vpi-align-left menu-icon"},null,-1)),v("span",oo,M(r(e).sidebarMenuLabel||"Menu"),1)],8,no)):h("",!0),_(eo,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),ao=b(so,[["__scopeId","data-v-25ab87d9"]]);function ro(){const s=T(!1);function e(){s.value=!0,window.addEventListener("resize",n)}function t(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=Z();return D(()=>i.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:o}}const io={},lo={class:"VPSwitch",type:"button",role:"switch"},co={class:"check"},uo={key:0,class:"icon"};function vo(s,e){return a(),u("button",lo,[v("span",co,[s.$slots.default?(a(),u("span",uo,[c(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const po=b(io,[["render",vo],["__scopeId","data-v-a6d5da05"]]),fo=m({__name:"VPSwitchAppearance",setup(s){const{isDark:e,theme:t}=P(),o=x("toggle-appearance",()=>{e.value=!e.value}),n=T("");return ve(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),k(po,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(o)},{default:f(()=>l[0]||(l[0]=[v("span",{class:"vpi-sun sun"},null,-1),v("span",{class:"vpi-moon moon"},null,-1)])),_:1,__:[0]},8,["title","aria-checked","onClick"]))}}),he=b(fo,[["__scopeId","data-v-299b7b5e"]]),ho={key:0,class:"VPNavBarAppearance"},mo=m({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",ho,[_(he)])):h("",!0)}}),_o=b(mo,[["__scopeId","data-v-5cc3ce0d"]]),me=T();let Ie=!1,se=0;function ko(s){const e=T(!1);if(ee){!Ie&&bo(),se++;const t=D(me,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(e.value=!0,(i=s.onFocus)==null||i.call(s)):(e.value=!1,(l=s.onBlur)==null||l.call(s))});de(()=>{t(),se--,se||go()})}return Ge(e)}function bo(){document.addEventListener("focusin",we),Ie=!0,me.value=document.activeElement}function go(){document.removeEventListener("focusin",we)}function we(){me.value=document.activeElement}const $o={class:"VPMenuLink"},yo=["innerHTML"],Po=m({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,o)=>(a(),u("div",$o,[_(F,{class:N({active:r(W)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,yo)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=b(Po,[["__scopeId","data-v-04cb418f"]]),Lo={class:"VPMenuGroup"},Vo={key:0,class:"title"},So=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",Lo,[e.text?(a(),u("p",Vo,M(e.text),1)):h("",!0),(a(!0),u(w,null,B(e.items,o=>(a(),u(w,null,["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):h("",!0)],64))),256))]))}}),To=b(So,[["__scopeId","data-v-7ddc3687"]]),No={class:"VPMenu"},Mo={key:0,class:"items"},Io=m({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),u("div",No,[e.items?(a(),u("div",Mo,[(a(!0),u(w,null,B(e.items,o=>(a(),u(w,{key:JSON.stringify(o)},["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):"component"in o?(a(),k(E(o.component),U({key:1,ref_for:!0},o.props),null,16)):(a(),k(To,{key:2,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),wo=b(Io,[["__scopeId","data-v-21da92f6"]]),Ho=["aria-expanded","aria-label"],Ao={key:0,class:"text"},Bo=["innerHTML"],Co={key:1,class:"vpi-more-horizontal icon"},Eo={class:"menu"},Fo=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=T(!1),t=T();ko({el:t,onBlur:o});function o(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",Ao,[n.icon?(a(),u("span",{key:0,class:N([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Bo)):h("",!0),i[3]||(i[3]=v("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Co))],8,Ho),v("div",Eo,[_(wo,{items:n.items},{default:f(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=b(Fo,[["__scopeId","data-v-f22c51c1"]]),Do=["href","aria-label","innerHTML"],Oo=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=T();j(async()=>{var i;await Pe();const n=(i=t.value)==null?void 0:i.children[0];n instanceof HTMLElement&&n.className.startsWith("vpi-social-")&&(getComputedStyle(n).maskImage||getComputedStyle(n).webkitMaskImage)==="none"&&n.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const o=$(()=>typeof e.icon=="object"?e.icon.svg:``);return(n,i)=>(a(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:o.value},null,8,Do))}}),Go=b(Oo,[["__scopeId","data-v-a02566e7"]]),Uo={class:"VPSocialLinks"},jo=m({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),u("div",Uo,[(a(!0),u(w,null,B(e.links,({link:o,icon:n,ariaLabel:i})=>(a(),k(Go,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ke=b(jo,[["__scopeId","data-v-04c9c6b2"]]),zo={key:0,class:"group translations"},Wo={class:"trans-title"},qo={key:1,class:"group"},Ko={class:"item appearance"},Ro={class:"label"},Jo={class:"appearance-action"},Yo={key:2,class:"group"},Qo={class:"item social-links"},Xo=m({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:o,currentLang:n}=R({correspondingLink:!0}),i=$(()=>o.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,p)=>i.value?(a(),k(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[r(o).length&&r(n).label?(a(),u("div",zo,[v("p",Wo,M(r(n).label),1),(a(!0),u(w,null,B(r(o),d=>(a(),k(te,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",qo,[v("div",Ko,[v("p",Ro,M(r(t).darkModeSwitchLabel||"Appearance"),1),v("div",Jo,[_(he)])])])):h("",!0),r(t).socialLinks?(a(),u("div",Yo,[v("div",Qo,[_(ke,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),Zo=b(Xo,[["__scopeId","data-v-cf3d1140"]]),xo=["aria-expanded"],es=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},t[1]||(t[1]=[v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)]),10,xo))}}),ts=b(es,[["__scopeId","data-v-bc4091a7"]]),ns=["innerHTML"],os=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,o)=>(a(),k(F,{class:N({VPNavBarMenuLink:!0,active:r(W)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,ns)]),_:1},8,["class","href","target","rel","no-icon"]))}}),ss=b(os,[["__scopeId","data-v-a32d3490"]]),as=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),o=i=>"component"in i?!1:"link"in i?W(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(o),n=$(()=>o(e.item));return(i,l)=>(a(),k(_e,{class:N({VPNavBarMenuGroup:!0,active:r(W)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),rs={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},is=m({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,o)=>r(e).nav?(a(),u("nav",rs,[o[0]||(o[0]=v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(w,null,B(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(ss,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),U({key:1,ref_for:!0},n.props),null,16)):(a(),k(as,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),ls=b(is,[["__scopeId","data-v-e1b4cdce"]]);function cs(s){const{localeIndex:e,theme:t}=P();function o(n){var H,A,S;const i=n.split("."),l=(H=t.value.search)==null?void 0:H.options,p=l&&typeof l=="object",d=p&&((S=(A=l.locales)==null?void 0:A[e.value])==null?void 0:S.translations)||null,y=p&&l.translations||null;let L=d,g=y,V=s;const I=i.pop();for(const C of i){let G=null;const K=V==null?void 0:V[C];K&&(G=V=K);const ne=g==null?void 0:g[C];ne&&(G=g=ne);const oe=L==null?void 0:L[C];oe&&(G=L=oe),K||(V=G),ne||(g=G),oe||(L=G)}return(L==null?void 0:L[I])??(g==null?void 0:g[I])??(V==null?void 0:V[I])??""}return o}const us=["aria-label"],ds={class:"DocSearch-Button-Container"},vs={class:"DocSearch-Button-Placeholder"},be=m({__name:"VPNavBarSearchButton",setup(s){const t=cs({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[v("span",ds,[n[0]||(n[0]=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),v("span",vs,M(r(t)("button.buttonText")),1)]),n[1]||(n[1]=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,us))}}),ps={class:"VPNavBarSearch"},fs={id:"local-search"},hs={key:1,id:"docsearch"},ms=m({__name:"VPNavBarSearch",setup(s){const e=()=>null,t=()=>null,{theme:o}=P(),n=T(!1),i=T(!1);j(()=>{});function l(){n.value||(n.value=!0,setTimeout(p,16))}function p(){const L=new Event("keydown");L.key="k",L.metaKey=!0,window.dispatchEvent(L),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}const d=T(!1),y="";return(L,g)=>{var V;return a(),u("div",ps,[r(y)==="local"?(a(),u(w,{key:0},[d.value?(a(),k(r(e),{key:0,onClose:g[0]||(g[0]=I=>d.value=!1)})):h("",!0),v("div",fs,[_(be,{onClick:g[1]||(g[1]=I=>d.value=!0)})])],64)):r(y)==="algolia"?(a(),u(w,{key:1},[n.value?(a(),k(r(t),{key:0,algolia:((V=r(o).search)==null?void 0:V.options)??r(o).algolia,onVnodeBeforeMount:g[2]||(g[2]=I=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",hs,[_(be,{onClick:l})]))],64)):h("",!0)])}}}),_s=m({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,o)=>r(e).socialLinks?(a(),k(ke,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),ks=b(_s,[["__scopeId","data-v-10f4fbb2"]]),bs=["href","rel","target"],gs=["innerHTML"],$s={key:2},ys=m({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:o}=O(),{currentLang:n}=R(),i=$(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=$(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),p=$(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,y)=>(a(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(o)}])},[v("a",{class:"title",href:i.value??r(pe)(r(n).link),rel:l.value,target:p.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),k(Y,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",{key:1,innerHTML:r(t).siteTitle},null,8,gs)):r(t).siteTitle===void 0?(a(),u("span",$s,M(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,bs)],2))}}),Ps=b(ys,[["__scopeId","data-v-dcc486d8"]]),Ls={class:"items"},Vs={class:"title"},Ss=m({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:o}=R({correspondingLink:!0});return(n,i)=>r(t).length&&r(o).label?(a(),k(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:f(()=>[v("div",Ls,[v("p",Vs,M(r(o).label),1),(a(!0),u(w,null,B(r(t),l=>(a(),k(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ts=b(Ss,[["__scopeId","data-v-8b1f1298"]]),Ns={class:"wrapper"},Ms={class:"container"},Is={class:"title"},ws={class:"content"},Hs={class:"content-body"},As=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const e=s,{y:t}=Le(),{hasSidebar:o}=O(),{frontmatter:n}=P(),i=T({});return ve(()=>{i.value={"has-sidebar":o.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,p)=>(a(),u("div",{class:N(["VPNavBar",i.value])},[v("div",Ns,[v("div",Ms,[v("div",Is,[_(Ps,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",ws,[v("div",Hs,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),_(ms,{class:"search"}),_(ls,{class:"menu"}),_(Ts,{class:"translations"}),_(_o,{class:"appearance"}),_(ks,{class:"social-links"}),_(Zo,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),_(ts,{class:"hamburger",active:l.isScreenOpen,onClick:p[0]||(p[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),p[1]||(p[1]=v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1))],2))}}),Bs=b(As,[["__scopeId","data-v-632f34fa"]]),Cs={key:0,class:"VPNavScreenAppearance"},Es={class:"text"},Fs=m({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(o,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Cs,[v("p",Es,M(r(t).darkModeSwitchLabel||"Appearance"),1),_(he)])):h("",!0)}}),Ds=b(Fs,[["__scopeId","data-v-542e543f"]]),Os=["innerHTML"],Gs=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,Os)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Us=b(Gs,[["__scopeId","data-v-e84fcf39"]]),js=["innerHTML"],zs=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,js)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),He=b(zs,[["__scopeId","data-v-a32983f4"]]),Ws={class:"VPNavScreenMenuGroupSection"},qs={key:0,class:"title"},Ks=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",Ws,[e.text?(a(),u("p",qs,M(e.text),1)):h("",!0),(a(!0),u(w,null,B(e.items,o=>(a(),k(He,{key:o.text,item:o},null,8,["item"]))),128))]))}}),Rs=b(Ks,[["__scopeId","data-v-79ef7fca"]]),Js=["aria-controls","aria-expanded"],Ys=["innerHTML"],Qs=["id"],Xs={key:0,class:"item"},Zs={key:1,class:"item"},xs={key:2,class:"group"},ea=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=T(!1),o=$(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:N(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:n},[v("span",{class:"button-text",innerHTML:i.text},null,8,Ys),l[0]||(l[0]=v("span",{class:"vpi-plus button-icon"},null,-1))],8,Js),v("div",{id:o.value,class:"items"},[(a(!0),u(w,null,B(i.items,p=>(a(),u(w,{key:JSON.stringify(p)},["link"in p?(a(),u("div",Xs,[_(He,{item:p},null,8,["item"])])):"component"in p?(a(),u("div",Zs,[(a(),k(E(p.component),U({ref_for:!0},p.props,{"screen-menu":""}),null,16))])):(a(),u("div",xs,[_(Rs,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Qs)],2))}}),ta=b(ea,[["__scopeId","data-v-b607952e"]]),na={key:0,class:"VPNavScreenMenu"},oa=m({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,o)=>r(e).nav?(a(),u("nav",na,[(a(!0),u(w,null,B(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(Us,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),U({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),k(ta,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),sa=m({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,o)=>r(e).socialLinks?(a(),k(ke,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),aa={class:"list"},ra=m({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=R({correspondingLink:!0}),o=T(!1);function n(){o.value=!o.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:o.value}])},[v("button",{class:"title",onClick:n},[l[0]||(l[0]=v("span",{class:"vpi-languages icon lang"},null,-1)),z(" "+M(r(t).label)+" ",1),l[1]||(l[1]=v("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),v("ul",aa,[(a(!0),u(w,null,B(r(e),p=>(a(),u("li",{key:p.link,class:"item"},[_(F,{class:"link",href:p.link},{default:f(()=>[z(M(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ia=b(ra,[["__scopeId","data-v-66b1ed4f"]]),la={class:"container"},ca=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=T(null),t=Ve(ee?document.body:null);return(o,n)=>(a(),k(ce,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:f(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",la,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),_(oa,{class:"menu"}),_(ia,{class:"translations"}),_(Ds,{class:"appearance"}),_(sa,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),ua=b(ca,[["__scopeId","data-v-736d0f3a"]]),da={key:0,class:"VPNav"},va=m({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=ro(),{frontmatter:n}=P(),i=$(()=>n.value.navbar!==!1);return Se("close-screen",t),Q(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,p)=>i.value?(a(),u("header",da,[_(Bs,{"is-screen-open":r(e),onToggleScreen:r(o)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(ua,{open:r(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),pa=b(va,[["__scopeId","data-v-196296ba"]]),fa=["role","tabindex"],ha={key:1,class:"items"},ma=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:p,toggle:d}=ct($(()=>e.item)),y=$(()=>p.value?"section":"div"),L=$(()=>n.value?"a":"div"),g=$(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),V=$(()=>n.value?void 0:"button"),I=$(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function H(S){"key"in S&&S.key!=="Enter"||!e.item.link&&d()}function A(){e.item.link&&d()}return(S,C)=>{const G=q("VPSidebarItem",!0);return a(),k(E(y.value),{class:N(["VPSidebarItem",I.value])},{default:f(()=>[S.item.text?(a(),u("div",U({key:0,class:"item",role:V.value},Ue(S.item.items?{click:H,keydown:H}:{},!0),{tabindex:S.item.items&&0}),[C[1]||(C[1]=v("div",{class:"indicator"},null,-1)),S.item.link?(a(),k(F,{key:0,tag:L.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:f(()=>[(a(),k(E(g.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(E(g.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null&&S.item.items&&S.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:A,onKeydown:je(A,["enter"]),tabindex:"0"},C[0]||(C[0]=[v("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,fa)):h("",!0),S.item.items&&S.item.items.length?(a(),u("div",ha,[S.depth<5?(a(!0),u(w,{key:0},B(S.item.items,K=>(a(),k(G,{key:K.text,item:K,depth:S.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),_a=b(ma,[["__scopeId","data-v-b566cf41"]]),ka=m({__name:"VPSidebarGroup",props:{items:{}},setup(s){const e=T(!0);let t=null;return j(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(o,n)=>(a(!0),u(w,null,B(o.items,i=>(a(),u("div",{key:i.text,class:N(["group",{"no-transition":e.value}])},[_(_a,{item:i,depth:0},null,8,["item"])],2))),128))}}),ba=b(ka,[["__scopeId","data-v-3272fbfa"]]),ga={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},$a=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=O(),o=s,n=T(null),i=Ve(ee?document.body:null);D([o,n],()=>{var p;o.open?(i.value=!0,(p=n.value)==null||p.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return D(e,()=>{l.value+=1},{deep:!0}),(p,d)=>r(t)?(a(),u("aside",{key:0,class:N(["VPSidebar",{open:p.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=We(()=>{},["stop"]))},[d[2]||(d[2]=v("div",{class:"curtain"},null,-1)),v("nav",ga,[d[1]||(d[1]=v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(p.$slots,"sidebar-nav-before",{},void 0,!0),(a(),k(ba,{items:r(e),key:l.value},null,8,["items"])),c(p.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),ya=b($a,[["__scopeId","data-v-f58b6c37"]]),Pa=m({__name:"VPSkipLink",setup(s){const{theme:e}=P(),t=Z(),o=T();D(()=>t.path,()=>o.value.focus());function n({target:i}){const l=document.getElementById(decodeURIComponent(i.hash).slice(1));if(l){const p=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",p)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",p),l.focus(),window.scrollTo(0,0)}}return(i,l)=>(a(),u(w,null,[v("span",{ref_key:"backToTop",ref:o,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n},M(r(e).skipToContentLabel||"Skip to content"),1)],64))}}),La=b(Pa,[["__scopeId","data-v-f1a6591b"]]),Va=m({__name:"Layout",setup(s){const{isOpen:e,open:t,close:o}=O(),n=Z();D(()=>n.path,o),lt(e,o);const{frontmatter:i}=P(),l=qe(),p=$(()=>!!l["home-hero-image"]);return Se("hero-image-slot-exists",p),(d,y)=>{const L=q("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:N(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),_(La),_(Ye,{class:"backdrop",show:r(e),onClick:r(o)},null,8,["show","onClick"]),_(pa,null,{"nav-bar-title-before":f(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(ao,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),_(ya,{open:r(e)},{"sidebar-nav-before":f(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(zn,null,{"page-top":f(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(Jn),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(L,{key:1}))}}}),Sa=b(Va,[["__scopeId","data-v-b4de4928"]]),Na={Layout:Sa,enhanceApp:({app:s})=>{s.component("Badge",Ke)}};export{Na as t}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000..b6b603d Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000..def40a4 Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 0000000..e070c3d Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000..a3c16ca Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000..2210a89 Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 0000000..790d62d Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 0000000..1eec077 Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 0000000..2cfe615 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 0000000..e3886dd Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000..36d6748 Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000..2bed1e8 Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000..9a8d1e2 Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000..07d3c53 Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000..57bdc22 Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/services_README.md.DmYG8_uu.js b/assets/services_README.md.DmYG8_uu.js new file mode 100644 index 0000000..c640b8b --- /dev/null +++ b/assets/services_README.md.DmYG8_uu.js @@ -0,0 +1 @@ +import{_ as a,c as r,o as t,j as s,a as c}from"./chunks/framework.Cd-3tpCq.js";const f=JSON.parse('{"title":"services","description":"","frontmatter":{},"headers":[],"relativePath":"services/README.md","filePath":"services/README.md"}'),i={name:"services/README.md"};function o(n,e,d,l,p,m){return t(),r("div",null,e[0]||(e[0]=[s("h1",{id:"services",tabindex:"-1"},[c("services "),s("a",{class:"header-anchor",href:"#services","aria-label":'Permalink to "services"'},"​")],-1)]))}const E=a(i,[["render",o]]);export{f as __pageData,E as default}; diff --git a/assets/services_README.md.DmYG8_uu.lean.js b/assets/services_README.md.DmYG8_uu.lean.js new file mode 100644 index 0000000..c640b8b --- /dev/null +++ b/assets/services_README.md.DmYG8_uu.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,o as t,j as s,a as c}from"./chunks/framework.Cd-3tpCq.js";const f=JSON.parse('{"title":"services","description":"","frontmatter":{},"headers":[],"relativePath":"services/README.md","filePath":"services/README.md"}'),i={name:"services/README.md"};function o(n,e,d,l,p,m){return t(),r("div",null,e[0]||(e[0]=[s("h1",{id:"services",tabindex:"-1"},[c("services "),s("a",{class:"header-anchor",href:"#services","aria-label":'Permalink to "services"'},"​")],-1)]))}const E=a(i,[["render",o]]);export{f as __pageData,E as default}; diff --git a/assets/services_storage-service.md.xOqM9CWx.js b/assets/services_storage-service.md.xOqM9CWx.js new file mode 100644 index 0000000..7aafb1f --- /dev/null +++ b/assets/services_storage-service.md.xOqM9CWx.js @@ -0,0 +1,38 @@ +import{_ as s,c as i,o as a,ae as t}from"./chunks/framework.Cd-3tpCq.js";const k=JSON.parse('{"title":"Pluggable Storage Service (StorageService)","description":"","frontmatter":{},"headers":[],"relativePath":"services/storage-service.md","filePath":"services/storage-service.md"}'),n={name:"services/storage-service.md"};function l(r,e,o,h,p,c){return a(),i("div",null,e[0]||(e[0]=[t(`

Pluggable Storage Service (StorageService)

Overview

The StorageService provides a unified, abstract interface for handling file storage across different backends. Its primary purpose is to decouple the application's core logic from the underlying storage technology. This design allows administrators to switch between storage providers (e.g., from the local filesystem to an S3-compatible object store) with only a configuration change, requiring no modifications to the application code.

The service is built around a standardized IStorageProvider interface, which guarantees that all storage providers have a consistent API for common operations like storing, retrieving, and deleting files.

Configuration

The StorageService is configured via environment variables in the .env file. You must specify the storage backend you wish to use and provide the necessary credentials and settings for it.

1. Choosing the Backend

The STORAGE_TYPE variable determines which provider the service will use.

  • STORAGE_TYPE=local: Uses the local server's filesystem.
  • STORAGE_TYPE=s3: Uses an S3-compatible object storage service (e.g., AWS S3, MinIO, Google Cloud Storage).

2. Local Filesystem Configuration

When STORAGE_TYPE is set to local, you must also provide the root path where files will be stored.

env
# .env
+STORAGE_TYPE=local
+STORAGE_LOCAL_ROOT_PATH=/var/data/open-archiver
  • STORAGE_LOCAL_ROOT_PATH: The absolute path on the server where the archive will be created. The service will create subdirectories within this path as needed.

3. S3-Compatible Storage Configuration

When STORAGE_TYPE is set to s3, you must provide the credentials and endpoint for your object storage provider.

env
# .env
+STORAGE_TYPE=s3
+STORAGE_S3_ENDPOINT=http://127.0.0.1:9000
+STORAGE_S3_BUCKET=email-archive
+STORAGE_S3_ACCESS_KEY_ID=minioadmin
+STORAGE_S3_SECRET_ACCESS_KEY=minioadmin
+STORAGE_S3_REGION=us-east-1
+STORAGE_S3_FORCE_PATH_STYLE=true
  • STORAGE_S3_ENDPOINT: The full URL of the S3 API endpoint.
  • STORAGE_S3_BUCKET: The name of the bucket to use for storage.
  • STORAGE_S3_ACCESS_KEY_ID: The access key for your S3 user.
  • STORAGE_S3_SECRET_ACCESS_KEY: The secret key for your S3 user.
  • STORAGE_S3_REGION (Optional): The AWS region of your bucket. Recommended for AWS S3.
  • STORAGE_S3_FORCE_PATH_STYLE (Optional): Set to true when using non-AWS S3 services like MinIO.

How to Use the Service

The StorageService is designed to be used via dependency injection in other services. You should never instantiate the providers (LocalFileSystemProvider or S3StorageProvider) directly. Instead, create an instance of StorageService and the factory will provide the correct provider based on your .env configuration.

Example: Usage in IngestionService

typescript
import { StorageService } from './StorageService';
+
+class IngestionService {
+    private storageService: StorageService;
+
+    constructor() {
+        // The StorageService is instantiated without any arguments.
+        // It automatically reads the configuration from the environment.
+        this.storageService = new StorageService();
+    }
+
+    public async archiveEmail(
+        rawEmail: Buffer,
+        userId: string,
+        messageId: string
+    ): Promise<void> {
+        // Define a structured, unique path for the email.
+        const archivePath = \`\${userId}/messages/\${messageId}.eml\`;
+
+        try {
+            // Use the service. It doesn't know or care if this is writing
+            // to a local disk or an S3 bucket.
+            await this.storageService.put(archivePath, rawEmail);
+            console.log(\`Successfully archived email to \${archivePath}\`);
+        } catch (error) {
+            console.error(\`Failed to archive email \${messageId}\`, error);
+        }
+    }
+}

API Reference

The StorageService implements the IStorageProvider interface. All methods are asynchronous and return a Promise.


put(path, content)

Stores a file at the specified path. If a file already exists at that path, it will be overwritten.

  • path: string: A unique identifier for the file, including its directory structure (e.g., "user-123/emails/message-abc.eml").
  • content: Buffer | NodeJS.ReadableStream: The content of the file. It can be a Buffer for small files or a ReadableStream for large files to ensure memory efficiency.
  • Returns: Promise<void> - A promise that resolves when the file has been successfully stored.

get(path)

Retrieves a file from the specified path as a readable stream.

  • path: string: The unique identifier of the file to retrieve.
  • Returns: Promise<NodeJS.ReadableStream> - A promise that resolves with a readable stream of the file's content.
  • Throws: An Error if the file is not found at the specified path.

delete(path)

Deletes a file from the storage backend.

  • path: string: The unique identifier of the file to delete.
  • Returns: Promise<void> - A promise that resolves when the file is deleted. If the file does not exist, the promise will still resolve successfully without throwing an error.

exists(path)

Checks for the existence of a file.

  • path: string: The unique identifier of the file to check.
  • Returns: Promise<boolean> - A promise that resolves with true if the file exists, and false otherwise.
`,39)]))}const g=s(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/services_storage-service.md.xOqM9CWx.lean.js b/assets/services_storage-service.md.xOqM9CWx.lean.js new file mode 100644 index 0000000..d09ab8c --- /dev/null +++ b/assets/services_storage-service.md.xOqM9CWx.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,ae as t}from"./chunks/framework.Cd-3tpCq.js";const k=JSON.parse('{"title":"Pluggable Storage Service (StorageService)","description":"","frontmatter":{},"headers":[],"relativePath":"services/storage-service.md","filePath":"services/storage-service.md"}'),n={name:"services/storage-service.md"};function l(r,e,o,h,p,c){return a(),i("div",null,e[0]||(e[0]=[t("",39)]))}const g=s(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/style.L7-rAhYi.css b/assets/style.L7-rAhYi.css new file mode 100644 index 0000000..3499f8c --- /dev/null +++ b/assets/style.L7-rAhYi.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-7e214886]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-7e214886],.VPBackdrop.fade-leave-to[data-v-7e214886]{opacity:0}.VPBackdrop.fade-leave-active[data-v-7e214886]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-7e214886]{display:none}}.NotFound[data-v-5a673029]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-5a673029]{padding:96px 32px 168px}}.code[data-v-5a673029]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-5a673029]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-5a673029]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-5a673029]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-5a673029]{padding-top:20px}.link[data-v-5a673029]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-5a673029]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-0bb3c463]{position:relative;z-index:1}.nested[data-v-0bb3c463]{padding-right:16px;padding-left:16px}.outline-link[data-v-0bb3c463]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-0bb3c463]:hover,.outline-link.active[data-v-0bb3c463]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-0bb3c463]{padding-left:13px}.VPDocAsideOutline[data-v-fa352379]{display:none}.VPDocAsideOutline.has-outline[data-v-fa352379]{display:block}.content[data-v-fa352379]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-fa352379]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-fa352379]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-271fded2]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-271fded2]{flex-grow:1}.VPDocAside[data-v-271fded2] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-271fded2] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-271fded2] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-3abf3e52]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-3abf3e52]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-28097769]{margin-top:64px}.edit-info[data-v-28097769]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-28097769]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-28097769]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-28097769]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-28097769]{margin-right:8px}.prev-next[data-v-28097769]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-28097769]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-28097769]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-28097769]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-28097769]{margin-left:auto;text-align:right}.desc[data-v-28097769]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-28097769]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-ef58e7af]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-ef58e7af]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-ef58e7af]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-ef58e7af]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-ef58e7af]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-ef58e7af]{display:flex;justify-content:center}.VPDoc .aside[data-v-ef58e7af]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-ef58e7af]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-ef58e7af]{max-width:1104px}}.container[data-v-ef58e7af]{margin:0 auto;width:100%}.aside[data-v-ef58e7af]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-ef58e7af]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-ef58e7af]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-ef58e7af]::-webkit-scrollbar{display:none}.aside-curtain[data-v-ef58e7af]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-ef58e7af]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-ef58e7af]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-ef58e7af]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-ef58e7af]{order:1;margin:0;min-width:640px}}.content-container[data-v-ef58e7af]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-ef58e7af]{max-width:688px}.VPButton[data-v-f0748002]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-f0748002]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-f0748002]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-f0748002]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-f0748002]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-f0748002]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-f0748002]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-f0748002]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-f0748002]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-f0748002]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-f0748002]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-f0748002]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-f0748002]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-085b6aad]{display:none}.dark .VPImage.light[data-v-085b6aad]{display:none}.VPHero[data-v-b6380c6a]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b6380c6a]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b6380c6a]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b6380c6a]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b6380c6a]{flex-direction:row}}.main[data-v-b6380c6a]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b6380c6a]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b6380c6a]{text-align:left}}@media (min-width: 960px){.main[data-v-b6380c6a]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b6380c6a]{max-width:592px}}.heading[data-v-b6380c6a]{display:flex;flex-direction:column}.name[data-v-b6380c6a],.text[data-v-b6380c6a]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b6380c6a],.VPHero.has-image .text[data-v-b6380c6a]{margin:0 auto}.name[data-v-b6380c6a]{color:var(--vp-home-hero-name-color)}.clip[data-v-b6380c6a]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b6380c6a],.text[data-v-b6380c6a]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b6380c6a],.text[data-v-b6380c6a]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b6380c6a],.VPHero.has-image .text[data-v-b6380c6a]{margin:0}}.tagline[data-v-b6380c6a]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b6380c6a]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b6380c6a]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b6380c6a]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b6380c6a]{margin:0}}.actions[data-v-b6380c6a]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b6380c6a]{justify-content:center}@media (min-width: 640px){.actions[data-v-b6380c6a]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b6380c6a]{justify-content:flex-start}}.action[data-v-b6380c6a]{flex-shrink:0;padding:6px}.image[data-v-b6380c6a]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b6380c6a]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b6380c6a]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b6380c6a]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b6380c6a]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b6380c6a]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b6380c6a]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b6380c6a]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b6380c6a]{width:320px;height:320px}}[data-v-b6380c6a] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b6380c6a] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b6380c6a] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-7c7a8824]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-7c7a8824]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-7c7a8824]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-7c7a8824]>.VPImage{margin-bottom:20px}.icon[data-v-7c7a8824]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-7c7a8824]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-7c7a8824]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-7c7a8824]{padding-top:8px}.link-text-value[data-v-7c7a8824]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-7c7a8824]{margin-left:6px}.VPFeatures[data-v-04629de0]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-04629de0]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-04629de0]{padding:0 64px}}.container[data-v-04629de0]{margin:0 auto;max-width:1152px}.items[data-v-04629de0]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-04629de0]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-04629de0],.item.grid-4[data-v-04629de0],.item.grid-6[data-v-04629de0]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-04629de0],.item.grid-4[data-v-04629de0]{width:50%}.item.grid-3[data-v-04629de0],.item.grid-6[data-v-04629de0]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-04629de0]{width:25%}}.container[data-v-0300b5ce]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-0300b5ce]{padding:0 48px}}@media (min-width: 960px){.container[data-v-0300b5ce]{width:100%;padding:0 64px}}.vp-doc[data-v-0300b5ce] .VPHomeSponsors,.vp-doc[data-v-0300b5ce] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-0300b5ce] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-0300b5ce] .VPHomeSponsors a,.vp-doc[data-v-0300b5ce] .VPTeamPage a{text-decoration:none}.VPHome[data-v-2c057618]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-2c057618]{margin-bottom:128px}}.VPContent[data-v-da66bf6a]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-da66bf6a]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-da66bf6a]{margin:0}@media (min-width: 960px){.VPContent[data-v-da66bf6a]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-da66bf6a]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-da66bf6a]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-15fdbac5]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-15fdbac5]{display:none}.VPFooter[data-v-15fdbac5] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-15fdbac5] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-15fdbac5]{padding:32px}}.container[data-v-15fdbac5]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-15fdbac5],.copyright[data-v-15fdbac5]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-3b0d77ac]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-3b0d77ac]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-3b0d77ac]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-3b0d77ac]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-3b0d77ac]{color:var(--vp-c-text-1)}.icon[data-v-3b0d77ac]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-3b0d77ac]{font-size:14px}.icon[data-v-3b0d77ac]{font-size:16px}}.open>.icon[data-v-3b0d77ac]{transform:rotate(90deg)}.items[data-v-3b0d77ac]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-3b0d77ac]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-3b0d77ac]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-3b0d77ac]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-3b0d77ac]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-3b0d77ac]{transition:all .2s ease-out}.flyout-leave-active[data-v-3b0d77ac]{transition:all .15s ease-in}.flyout-enter-from[data-v-3b0d77ac],.flyout-leave-to[data-v-3b0d77ac]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-25ab87d9]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-25ab87d9]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-25ab87d9]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-25ab87d9]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-25ab87d9]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-25ab87d9]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-25ab87d9]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-25ab87d9]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-25ab87d9]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-25ab87d9]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-25ab87d9]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-25ab87d9]{display:none}}.menu-icon[data-v-25ab87d9]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-25ab87d9]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-25ab87d9]{padding:12px 32px 11px}}.VPSwitch[data-v-a6d5da05]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-a6d5da05]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-a6d5da05]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-a6d5da05]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-a6d5da05] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-a6d5da05] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-299b7b5e]{opacity:1}.moon[data-v-299b7b5e],.dark .sun[data-v-299b7b5e]{opacity:0}.dark .moon[data-v-299b7b5e]{opacity:1}.dark .VPSwitchAppearance[data-v-299b7b5e] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-5cc3ce0d]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-5cc3ce0d]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-04cb418f]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-04cb418f]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-04cb418f]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-04cb418f]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-7ddc3687]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-7ddc3687]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-7ddc3687]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-7ddc3687]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-21da92f6]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-21da92f6] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-21da92f6] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-21da92f6] .group:last-child{padding-bottom:0}.VPMenu[data-v-21da92f6] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-21da92f6] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-21da92f6] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-21da92f6] .action{padding-left:24px}.VPFlyout[data-v-f22c51c1]{position:relative}.VPFlyout[data-v-f22c51c1]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-f22c51c1]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-f22c51c1]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-f22c51c1]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-f22c51c1]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-f22c51c1]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-f22c51c1],.button[aria-expanded=true]+.menu[data-v-f22c51c1]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-f22c51c1]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-f22c51c1]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-f22c51c1]{margin-right:0;font-size:16px}.text-icon[data-v-f22c51c1]{margin-left:4px;font-size:14px}.icon[data-v-f22c51c1]{font-size:20px;transition:fill .25s}.menu[data-v-f22c51c1]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-a02566e7]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-a02566e7]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-a02566e7]>svg,.VPSocialLink[data-v-a02566e7]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-04c9c6b2]{display:flex;justify-content:center}.VPNavBarExtra[data-v-cf3d1140]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-cf3d1140]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-cf3d1140]{display:none}}.trans-title[data-v-cf3d1140]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-cf3d1140],.item.social-links[data-v-cf3d1140]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-cf3d1140]{min-width:176px}.appearance-action[data-v-cf3d1140]{margin-right:-2px}.social-links-list[data-v-cf3d1140]{margin:-4px -8px}.VPNavBarHamburger[data-v-bc4091a7]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-bc4091a7]{display:none}}.container[data-v-bc4091a7]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-bc4091a7]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-bc4091a7]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-bc4091a7]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-bc4091a7]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-bc4091a7]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-bc4091a7]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-bc4091a7],.VPNavBarHamburger.active:hover .middle[data-v-bc4091a7],.VPNavBarHamburger.active:hover .bottom[data-v-bc4091a7]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-bc4091a7],.middle[data-v-bc4091a7],.bottom[data-v-bc4091a7]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-bc4091a7]{top:0;left:0;transform:translate(0)}.middle[data-v-bc4091a7]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-bc4091a7]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-a32d3490]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-a32d3490],.VPNavBarMenuLink[data-v-a32d3490]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e1b4cdce]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e1b4cdce]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--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-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-10f4fbb2]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-10f4fbb2]{display:flex;align-items:center}}.title[data-v-dcc486d8]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-dcc486d8]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-dcc486d8]{border-bottom-color:var(--vp-c-divider)}}[data-v-dcc486d8] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-8b1f1298]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-8b1f1298]{display:flex;align-items:center}}.title[data-v-8b1f1298]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-632f34fa]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-632f34fa]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-632f34fa]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-632f34fa]:not(.home){background-color:transparent}.VPNavBar[data-v-632f34fa]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-632f34fa]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-632f34fa]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-632f34fa]{padding:0}}.container[data-v-632f34fa]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-632f34fa],.container>.content[data-v-632f34fa]{pointer-events:none}.container[data-v-632f34fa] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-632f34fa]{max-width:100%}}.title[data-v-632f34fa]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-632f34fa]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-632f34fa]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-632f34fa]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-632f34fa]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-632f34fa]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-632f34fa]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-632f34fa]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-632f34fa]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-632f34fa]{column-gap:.5rem}}.menu+.translations[data-v-632f34fa]:before,.menu+.appearance[data-v-632f34fa]:before,.menu+.social-links[data-v-632f34fa]:before,.translations+.appearance[data-v-632f34fa]:before,.appearance+.social-links[data-v-632f34fa]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-632f34fa]:before,.translations+.appearance[data-v-632f34fa]:before{margin-right:16px}.appearance+.social-links[data-v-632f34fa]:before{margin-left:16px}.social-links[data-v-632f34fa]{margin-right:-8px}.divider[data-v-632f34fa]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-632f34fa]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-632f34fa]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-632f34fa]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-632f34fa]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-632f34fa]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-632f34fa]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-542e543f]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-542e543f]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-e84fcf39]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-e84fcf39]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-a32983f4]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-a32983f4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-79ef7fca]{display:block}.title[data-v-79ef7fca]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-b607952e]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-b607952e]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-b607952e]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-b607952e]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-b607952e]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-b607952e]{transform:rotate(45deg)}.button[data-v-b607952e]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-b607952e]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-b607952e]{transition:transform .25s}.group[data-v-b607952e]:first-child{padding-top:0}.group+.group[data-v-b607952e],.group+.item[data-v-b607952e]{padding-top:4px}.VPNavScreenTranslations[data-v-66b1ed4f]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-66b1ed4f]{height:auto}.title[data-v-66b1ed4f]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-66b1ed4f]{font-size:16px}.icon.lang[data-v-66b1ed4f]{margin-right:8px}.icon.chevron[data-v-66b1ed4f]{margin-left:4px}.list[data-v-66b1ed4f]{padding:4px 0 0 24px}.link[data-v-66b1ed4f]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-736d0f3a]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-736d0f3a],.VPNavScreen.fade-leave-active[data-v-736d0f3a]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-736d0f3a],.VPNavScreen.fade-leave-active .container[data-v-736d0f3a]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-736d0f3a],.VPNavScreen.fade-leave-to[data-v-736d0f3a]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-736d0f3a],.VPNavScreen.fade-leave-to .container[data-v-736d0f3a]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-736d0f3a]{display:none}}.container[data-v-736d0f3a]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-736d0f3a],.menu+.appearance[data-v-736d0f3a],.translations+.appearance[data-v-736d0f3a]{margin-top:24px}.menu+.social-links[data-v-736d0f3a]{margin-top:16px}.appearance+.social-links[data-v-736d0f3a]{margin-top:16px}.VPNav[data-v-196296ba]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-196296ba]{position:fixed}}.VPSidebarItem.level-0[data-v-b566cf41]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-b566cf41]{padding-bottom:10px}.item[data-v-b566cf41]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-b566cf41]{cursor:pointer}.indicator[data-v-b566cf41]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-b566cf41],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-b566cf41],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-b566cf41],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-b566cf41]{background-color:var(--vp-c-brand-1)}.link[data-v-b566cf41]{display:flex;align-items:center;flex-grow:1}.text[data-v-b566cf41]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-b566cf41]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-b566cf41],.VPSidebarItem.level-2 .text[data-v-b566cf41],.VPSidebarItem.level-3 .text[data-v-b566cf41],.VPSidebarItem.level-4 .text[data-v-b566cf41],.VPSidebarItem.level-5 .text[data-v-b566cf41]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-b566cf41],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-b566cf41],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-b566cf41],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-b566cf41],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-b566cf41],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-b566cf41]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-1.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-2.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-3.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-4.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-5.has-active>.item>.text[data-v-b566cf41],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-b566cf41],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-b566cf41],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-b566cf41],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-b566cf41],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-b566cf41],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-b566cf41]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-b566cf41],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-b566cf41],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-b566cf41],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-b566cf41],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-b566cf41],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-b566cf41]{color:var(--vp-c-brand-1)}.caret[data-v-b566cf41]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-b566cf41]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-b566cf41]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-b566cf41]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-b566cf41]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-b566cf41],.VPSidebarItem.level-2 .items[data-v-b566cf41],.VPSidebarItem.level-3 .items[data-v-b566cf41],.VPSidebarItem.level-4 .items[data-v-b566cf41],.VPSidebarItem.level-5 .items[data-v-b566cf41]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-b566cf41]{display:none}.no-transition[data-v-3272fbfa] .caret-icon{transition:none}.group+.group[data-v-3272fbfa]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-3272fbfa]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-f58b6c37]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-f58b6c37]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-f58b6c37]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-f58b6c37]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-f58b6c37]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-f58b6c37]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-f58b6c37]{outline:0}.VPSkipLink[data-v-f1a6591b]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-f1a6591b]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-f1a6591b]{top:14px;left:16px}}.Layout[data-v-b4de4928]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-efc97ba7]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-efc97ba7]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-efc97ba7]{margin:128px 0}}.VPHomeSponsors[data-v-efc97ba7]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-efc97ba7]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-efc97ba7]{padding:0 64px}}.container[data-v-efc97ba7]{margin:0 auto;max-width:1152px}.love[data-v-efc97ba7]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-efc97ba7]{display:inline-block}.message[data-v-efc97ba7]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-efc97ba7]{padding-top:32px}.action[data-v-efc97ba7]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-93aa4b90]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-93aa4b90]{padding:32px}.VPTeamMembersItem.small .data[data-v-93aa4b90]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-93aa4b90]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-93aa4b90]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-93aa4b90]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-93aa4b90]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-93aa4b90]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-93aa4b90]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-93aa4b90]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-93aa4b90]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-93aa4b90]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-93aa4b90]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-93aa4b90]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-93aa4b90]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-93aa4b90]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-93aa4b90]{text-align:center}.avatar[data-v-93aa4b90]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-93aa4b90]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-93aa4b90]{margin:0;font-weight:600}.affiliation[data-v-93aa4b90]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-93aa4b90]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-93aa4b90]:hover{color:var(--vp-c-brand-1)}.desc[data-v-93aa4b90]{margin:0 auto}.desc[data-v-93aa4b90] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-93aa4b90]{display:flex;justify-content:center;height:56px}.sp-link[data-v-93aa4b90]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-93aa4b90]:hover,.sp .sp-link.link[data-v-93aa4b90]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-93aa4b90]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-53b34ac8]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-53b34ac8]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-53b34ac8]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-53b34ac8]{max-width:876px}.VPTeamMembers.medium .container[data-v-53b34ac8]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-53b34ac8]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-53b34ac8]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-53b34ac8]{max-width:760px}.container[data-v-53b34ac8]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-b86dc9d6]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-b86dc9d6]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-b86dc9d6-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-b86dc9d6-s],.VPTeamMembers+.VPTeamPageSection[data-v-b86dc9d6-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b86dc9d6-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b86dc9d6-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b86dc9d6-s],.VPTeamMembers+.VPTeamPageSection[data-v-b86dc9d6-s]{margin-top:96px}}.VPTeamMembers[data-v-b86dc9d6-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b86dc9d6-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b86dc9d6-s]{padding:0 64px}}.VPTeamPageSection[data-v-6a23884a]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-6a23884a]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-6a23884a]{padding:0 64px}}.title[data-v-6a23884a]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-6a23884a]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-6a23884a]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-6a23884a]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-6a23884a]{padding-top:40px}.VPTeamPageTitle[data-v-0dc60fa6]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-0dc60fa6]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-0dc60fa6]{padding:80px 64px 48px}}.title[data-v-0dc60fa6]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-0dc60fa6]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-0dc60fa6]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-0dc60fa6]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}} diff --git a/assets/user-guides_email-providers_README.md.yQn5kDaG.js b/assets/user-guides_email-providers_README.md.yQn5kDaG.js new file mode 100644 index 0000000..8c9bb7e --- /dev/null +++ b/assets/user-guides_email-providers_README.md.yQn5kDaG.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as r,a as t}from"./chunks/framework.Cd-3tpCq.js";const v=JSON.parse('{"title":"email-providers","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/README.md","filePath":"user-guides/email-providers/README.md"}'),o={name:"user-guides/email-providers/README.md"};function d(l,e,n,p,m,c){return i(),s("div",null,e[0]||(e[0]=[r("h1",{id:"email-providers",tabindex:"-1"},[t("email-providers "),r("a",{class:"header-anchor",href:"#email-providers","aria-label":'Permalink to "email-providers"'},"​")],-1)]))}const f=a(o,[["render",d]]);export{v as __pageData,f as default}; diff --git a/assets/user-guides_email-providers_README.md.yQn5kDaG.lean.js b/assets/user-guides_email-providers_README.md.yQn5kDaG.lean.js new file mode 100644 index 0000000..8c9bb7e --- /dev/null +++ b/assets/user-guides_email-providers_README.md.yQn5kDaG.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as r,a as t}from"./chunks/framework.Cd-3tpCq.js";const v=JSON.parse('{"title":"email-providers","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/README.md","filePath":"user-guides/email-providers/README.md"}'),o={name:"user-guides/email-providers/README.md"};function d(l,e,n,p,m,c){return i(),s("div",null,e[0]||(e[0]=[r("h1",{id:"email-providers",tabindex:"-1"},[t("email-providers "),r("a",{class:"header-anchor",href:"#email-providers","aria-label":'Permalink to "email-providers"'},"​")],-1)]))}const f=a(o,[["render",d]]);export{v as __pageData,f as default}; diff --git a/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.js b/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.js new file mode 100644 index 0000000..136aba9 --- /dev/null +++ b/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as i,ae as r}from"./chunks/framework.Cd-3tpCq.js";const d=JSON.parse('{"title":"Connecting to Google Workspace","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/google-workspace.md","filePath":"user-guides/email-providers/google-workspace.md"}'),n={name:"user-guides/email-providers/google-workspace.md"};function a(s,e,l,c,u,g){return i(),t("div",null,e[0]||(e[0]=[r('

Connecting to Google Workspace

This guide provides instructions for Google Workspace administrators to set up a connection that allows the archiving of all user mailboxes within their organization.

The connection uses a Google Cloud Service Account with Domain-Wide Delegation. This is a secure method that grants the archiving service permission to access user data on behalf of the administrator, without requiring individual user passwords or consent.

Prerequisites

  • You must have Super Administrator privileges in your Google Workspace account.
  • You must have access to the Google Cloud Console associated with your organization.

Setup Overview

The setup process involves three main parts:

  1. Configuring the necessary permissions in the Google Cloud Console.
  2. Authorizing the service account in the Google Workspace Admin Console.
  3. Entering the generated credentials into the OpenArchiver application.

Part 1: Google Cloud Console Setup

In this part, you will create a service account and enable the APIs it needs to function.

  1. Create a Google Cloud Project:

    • Go to the Google Cloud Console.
    • If you don't already have one, create a new project for the archiving service (e.g., "Email Archiver").
  2. Enable Required APIs:

    • In your selected project, navigate to the "APIs & Services" > "Library" section.
    • Search for and enable the following two APIs:
      • Gmail API
      • Admin SDK API
  3. Create a Service Account:

    • Navigate to "IAM & Admin" > "Service Accounts".
    • Click "Create Service Account".
    • Give the service account a name (e.g., email-archiver-service) and a description.
    • Click "Create and Continue". You do not need to grant this service account any roles on the project. Click "Done".
  4. Generate a JSON Key:

    • Find the service account you just created in the list.
    • Click the three-dot menu under "Actions" and select "Manage keys".
    • Click "Add Key" > "Create new key".
    • Select JSON as the key type and click "Create".
    • A JSON file will be downloaded to your computer. Keep this file secure, as it contains private credentials. You will need the contents of this file in Part 3.

Troubleshooting

Error: "iam.disableServiceAccountKeyCreation"

If you receive an error message stating The organization policy constraint 'iam.disableServiceAccountKeyCreation' is enforced when trying to create a JSON key, it means your Google Cloud organization has a policy preventing the creation of new service account keys.

To resolve this, you must have Organization Administrator permissions.

  1. Navigate to your Organization: In the Google Cloud Console, use the project selector at the top of the page to select your organization node (it usually has a building icon).
  2. Go to IAM: From the navigation menu, select "IAM & Admin" > "IAM".
  3. Edit Your Permissions: Find your user account in the list and click the pencil icon to edit roles. Add the following two roles:
    • Organization Policy Administrator
    • Organization AdministratorNote: These roles are only available at the organization level, not the project level.
  4. Modify the Policy:
    • Navigate to "IAM & Admin" > "Organization Policies".
    • In the filter box, search for the policy "iam.disableServiceAccountKeyCreation".
    • Click on the policy to edit it.
    • You can either disable the policy entirely (if your security rules permit) or add a rule to exclude the specific project you are using for the archiver from this policy.
  5. Retry Key Creation: Once the policy is updated, return to your project and you should be able to generate the JSON key as described in Part 1.

Part 2: Grant Domain-Wide Delegation

Now, you will authorize the service account you created to access data from your Google Workspace.

  1. Get the Service Account's Client ID:

    • Go back to the list of service accounts in the Google Cloud Console.
    • Click on the service account you created.
    • Under the "Details" tab, find and copy the Unique ID (this is the Client ID).
  2. Authorize the Client in Google Workspace:

    • Go to your Google Workspace Admin Console at admin.google.com.
    • Navigate to Security > Access and data control > API controls.
    • Under the "Domain-wide Delegation" section, click "Manage Domain-wide Delegation".
    • Click "Add new".
  3. Enter Client Details and Scopes:

    • In the Client ID field, paste the Unique ID you copied from the service account.
    • In the OAuth scopes field, paste the following two scopes exactly as they appear, separated by a comma:
      https://www.googleapis.com/auth/admin.directory.user.readonly,https://www.googleapis.com/auth/gmail.readonly
    • Click "Authorize".

The service account is now permitted to list users and read their email data across your domain.


Part 3: Connecting in OpenArchiver

Finally, you will provide the generated credentials to the application.

  1. Navigate to Ingestion Sources: From the main dashboard, go to the Ingestion Sources page.

  2. Create a New Source: Click the "Create New" button.

  3. Fill in the Configuration Details:

    • Name: Give the source a name (e.g., "Google Workspace Archive").
    • Provider: Select "Google Workspace" from the dropdown.
    • Service Account Key (JSON): Open the JSON file you downloaded in Part 1. Copy the entire content of the file and paste it into this text area.
    • Impersonated Admin Email: Enter the email address of a Super Administrator in your Google Workspace (e.g., admin@your-domain.com). The service will use this user's authority to discover all other users.
  4. Save Changes: Click "Save changes".

What Happens Next?

Once the connection is saved and verified, the system will begin the archiving process:

  1. User Discovery: The service will first connect to the Admin SDK to get a list of all active users in your Google Workspace.
  2. Initial Import: The system will then start a background job to import the mailboxes of all discovered users. The status will show as "Importing". This can take a significant amount of time depending on the number of users and the size of their mailboxes.
  3. Continuous Sync: After the initial import is complete, the status will change to "Active". The system will then periodically check each user's mailbox for new emails and archive them automatically.
',29)]))}const p=o(n,[["render",a]]);export{d as __pageData,p as default}; diff --git a/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.lean.js b/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.lean.js new file mode 100644 index 0000000..f536715 --- /dev/null +++ b/assets/user-guides_email-providers_google-workspace.md.CWhO43nR.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as i,ae as r}from"./chunks/framework.Cd-3tpCq.js";const d=JSON.parse('{"title":"Connecting to Google Workspace","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/google-workspace.md","filePath":"user-guides/email-providers/google-workspace.md"}'),n={name:"user-guides/email-providers/google-workspace.md"};function a(s,e,l,c,u,g){return i(),t("div",null,e[0]||(e[0]=[r("",29)]))}const p=o(n,[["render",a]]);export{d as __pageData,p as default}; diff --git a/assets/user-guides_email-providers_imap.md.BcXBEq43.js b/assets/user-guides_email-providers_imap.md.BcXBEq43.js new file mode 100644 index 0000000..572430f --- /dev/null +++ b/assets/user-guides_email-providers_imap.md.BcXBEq43.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r,ae as a}from"./chunks/framework.Cd-3tpCq.js";const g=JSON.parse('{"title":"Connecting to a Generic IMAP Server","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/imap.md","filePath":"user-guides/email-providers/imap.md"}'),s={name:"user-guides/email-providers/imap.md"};function i(n,o,l,c,p,u){return r(),t("div",null,o[0]||(o[0]=[a('

Connecting to a Generic IMAP Server

This guide will walk you through connecting a standard IMAP email account as an ingestion source. This allows you to archive emails from any provider that supports the IMAP protocol, which is common for many self-hosted or traditional email services.

Step-by-Step Guide

  1. Navigate to Ingestion Sources: From the main dashboard, go to the Ingestions page.

  2. Create a New Source: Click the "Create New" button to open the ingestion source configuration dialog.

  3. Fill in the Configuration Details: You will see a form with several fields. Here is how to fill them out for an IMAP connection:

    • Name: Give your ingestion source a descriptive name that you will easily recognize, such as "Work Email (IMAP)" or "Personal Gmail".

    • Provider: From the dropdown menu, select "Generic IMAP". This will reveal the specific fields required for an IMAP connection.

    • Host: Enter the server address for your email provider's IMAP service. This often looks like imap.your-provider.com or mail.your-domain.com.

    • Port: Enter the port number for the IMAP server. For a secure connection (which is strongly recommended), this is typically 993.

    • Username: Enter the full email address or username you use to log in to your email account.

    • Password: Enter the password for your email account.

  4. Save Changes: Once you have filled in all the details, click the "Save changes" button.

Security Recommendation: Use an App Password

For enhanced security, we strongly recommend using an "app password" (sometimes called an "app-specific password") instead of your main account password.

Many email providers (like Gmail, Outlook, and Fastmail) allow you to generate a unique password that grants access only to a specific application (in this case, the archiving service). If you ever need to revoke access, you can simply delete the app password without affecting your main account login.

Please consult your email provider's documentation to see if they support app passwords and how to create one.

How to Obtain an App Password for Gmail

  1. Enable 2-Step Verification: You must have 2-Step Verification turned on for your Google Account.
  2. Go to App Passwords: Visit myaccount.google.com/apppasswords. You may be asked to sign in again.
  3. Create the Password:
    • At the bottom, click "Select app" and choose "Other (Custom name)".
    • Give it a name you'll recognize, like "OpenArchiver".
    • Click "Generate".
  4. Use the Password: A 16-digit password will be displayed. Copy this password (without the spaces) and paste it into the Password field in the OpenArchiver ingestion source form.

How to Obtain an App Password for Outlook/Microsoft Accounts

  1. Enable Two-Step Verification: You must have two-step verification enabled for your Microsoft account.
  2. Go to Security Options: Sign in to your Microsoft account and navigate to the Advanced security options.
  3. Create a New App Password:
    • Scroll down to the "App passwords" section.
    • Click "Create a new app password".
  4. Use the Password: A new password will be generated. Use this password in the Password field in the OpenArchiver ingestion source form.

What Happens Next?

After you save the connection, the system will attempt to connect to the IMAP server. The status of the ingestion source will update to reflect its current state:

  • Importing: The system is performing the initial, one-time import of all emails from your INBOX. This may take a while depending on the size of your mailbox.
  • Active: The initial import is complete, and the system will now periodically check for and archive new emails.
  • Paused: The connection is valid, but the system will not check for new emails until you resume it.
  • Error: The system was unable to connect using the provided credentials. Please double-check your Host, Port, Username, and Password and try again.

You can view, edit, pause, or manually sync any of your ingestion sources from the main table on the Ingestions page.

',16)]))}const h=e(s,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/user-guides_email-providers_imap.md.BcXBEq43.lean.js b/assets/user-guides_email-providers_imap.md.BcXBEq43.lean.js new file mode 100644 index 0000000..cd12176 --- /dev/null +++ b/assets/user-guides_email-providers_imap.md.BcXBEq43.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r,ae as a}from"./chunks/framework.Cd-3tpCq.js";const g=JSON.parse('{"title":"Connecting to a Generic IMAP Server","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/imap.md","filePath":"user-guides/email-providers/imap.md"}'),s={name:"user-guides/email-providers/imap.md"};function i(n,o,l,c,p,u){return r(),t("div",null,o[0]||(o[0]=[a("",16)]))}const h=e(s,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.js b/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.js new file mode 100644 index 0000000..634de9c --- /dev/null +++ b/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.js @@ -0,0 +1 @@ +import{_ as e,c as i,o,ae as r}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Connecting to Microsoft 365","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/microsoft-365.md","filePath":"user-guides/email-providers/microsoft-365.md"}'),n={name:"user-guides/email-providers/microsoft-365.md"};function s(a,t,l,c,h,p){return o(),i("div",null,t[0]||(t[0]=[r('

Connecting to Microsoft 365

This guide provides instructions for Microsoft 365 administrators to set up a connection that allows the archiving of all user mailboxes within their organization.

The connection uses the Microsoft Graph API and an App Registration in Microsoft Entra ID. This is a secure, standard method that grants the archiving service permission to read email data on your behalf without ever needing to handle user passwords.

Prerequisites

  • You must have one of the following administrator roles in your Microsoft 365 tenant: Global Administrator, Application Administrator, or Cloud Application Administrator.

Setup Overview

The setup process involves four main parts, all performed within the Microsoft Entra admin center and the OpenArchiver application:

  1. Registering a new application identity for the archiver in Entra ID.
  2. Granting the application the specific permissions it needs to read mail.
  3. Creating a secure password (a client secret) for the application.
  4. Entering the generated credentials into the OpenArchiver application.

Part 1: Register a New Application in Microsoft Entra ID

First, you will create an "App registration," which acts as an identity for the archiving service within your Microsoft 365 ecosystem.

  1. Sign in to the Microsoft Entra admin center.
  2. In the left-hand navigation pane, go to Identity > Applications > App registrations.
  3. Click the + New registration button at the top of the page.
  4. On the "Register an application" screen:
    • Name: Give the application a descriptive name you will recognize, such as OpenArchiver Service.
    • Supported account types: Select "Accounts in this organizational directory only (Default Directory only - Single tenant)". This is the most secure option.
    • Redirect URI (optional): You can leave this blank.
  5. Click the Register button. You will be taken to the application's main "Overview" page.

Part 2: Grant API Permissions

Next, you must grant the application the specific permissions required to read user profiles and their mailboxes.

  1. From your new application's page, select API permissions from the left-hand menu.
  2. Click the + Add a permission button.
  3. In the "Request API permissions" pane, select Microsoft Graph.
  4. Select Application permissions. This is critical as it allows the service to run in the background without a user being signed in.
  5. In the "Select permissions" search box, find and check the boxes for the following two permissions:
    • Mail.Read
    • User.Read.All
  6. Click the Add permissions button at the bottom.
  7. Crucial Final Step: You will now see the permissions in your list with a warning status. You must grant consent on behalf of your organization. Click the "Grant admin consent for [Your Organization's Name]" button located above the permissions table. Click Yes in the confirmation dialog. The status for both permissions should now show a green checkmark.

Part 3: Create a Client Secret

The client secret is a password that the archiving service will use to authenticate. Treat this with the same level of security as an administrator's password.

  1. In your application's menu, navigate to Certificates & secrets.
  2. Select the Client secrets tab and click + New client secret.
  3. In the pane that appears:
    • Description: Enter a clear description, such as OpenArchiver Key.
    • Expires: Select an expiry duration. We recommend 12 or 24 months. Set a calendar reminder to renew it before it expires to prevent service interruption.
  4. Click Add.
  5. IMMEDIATELY COPY THE SECRET: The secret is now visible in the "Value" column. This is the only time it will be fully displayed. Copy this value now and store it in a secure password manager before navigating away. If you lose it, you must create a new one.

Part 4: Connecting in OpenArchiver

You now have the three pieces of information required to configure the connection.

  1. Navigate to Ingestion Sources: In the OpenArchiver application, go to the Ingestion Sources page.

  2. Create a New Source: Click the "Create New" button.

  3. Fill in the Configuration Details:

    • Name: Give the source a name (e.g., "Microsoft 365 Archive").
    • Provider: Select "Microsoft 365" from the dropdown.
    • Application (Client) ID: Go to the Overview page of your app registration in the Entra admin center and copy this value.
    • Directory (Tenant) ID: This value is also on the Overview page.
    • Client Secret Value: Paste the secret Value (not the Secret ID) that you copied and saved in the previous step.
  4. Save Changes: Click "Save changes".

What Happens Next?

Once the connection is saved, the system will begin the archiving process:

  1. User Discovery: The service will connect to the Microsoft Graph API to get a list of all users in your organization.
  2. Initial Import: The system will begin a background job to import the mailboxes of all discovered users, folder by folder. The status will show as "Importing". This can take a significant amount of time.
  3. Continuous Sync: After the initial import, the status will change to "Active". The system will use Microsoft Graph's delta query feature to efficiently fetch only new or changed emails, ensuring the archive stays up-to-date.
',27)]))}const d=e(n,[["render",s]]);export{u as __pageData,d as default}; diff --git a/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.lean.js b/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.lean.js new file mode 100644 index 0000000..64e0a75 --- /dev/null +++ b/assets/user-guides_email-providers_microsoft-365.md.C4O8w9wT.lean.js @@ -0,0 +1 @@ +import{_ as e,c as i,o,ae as r}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Connecting to Microsoft 365","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/email-providers/microsoft-365.md","filePath":"user-guides/email-providers/microsoft-365.md"}'),n={name:"user-guides/email-providers/microsoft-365.md"};function s(a,t,l,c,h,p){return o(),i("div",null,t[0]||(t[0]=[r("",27)]))}const d=e(n,[["render",s]]);export{u as __pageData,d as default}; diff --git a/assets/user-guides_installation.md.Gno3X95r.js b/assets/user-guides_installation.md.Gno3X95r.js new file mode 100644 index 0000000..b4a54d4 --- /dev/null +++ b/assets/user-guides_installation.md.Gno3X95r.js @@ -0,0 +1,9 @@ +import{_ as i,c as a,o as s,ae as t}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Installation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/installation.md","filePath":"user-guides/installation.md"}'),n={name:"user-guides/installation.md"};function o(l,e,r,h,p,c){return s(),a("div",null,e[0]||(e[0]=[t(`

Installation Guide

This guide will walk you through setting up Open Archiver using Docker Compose. This is the recommended method for deploying the application.

Prerequisites

  • Docker and Docker Compose installed on your server or local machine.
  • A server or local machine with at least 2GB of RAM.
  • Git installed on your server or local machine.

1. Clone the Repository

First, clone the Open Archiver repository to your machine:

bash
git clone https://github.com/LogicLabs-OU/OpenArchiver.git
+cd OpenArchiver

2. Configure Your Environment

The application is configured using environment variables. You'll need to create a .env file to store your configuration.

Copy the example environment file for Docker:

bash
cp .env.example.docker .env

Now, open the .env file in a text editor and customize the settings.

Important Configuration

You must change the following placeholder values to secure your instance:

  • POSTGRES_PASSWORD: A strong, unique password for the database.
  • REDIS_PASSWORD: A strong, unique password for the Valkey/Redis service.
  • MEILI_MASTER_KEY: A complex key for Meilisearch.
  • JWT_SECRET: A long, random string for signing authentication tokens.
  • ADMIN_PASSWORD: A strong password for the initial admin user.
  • ENCRYPTION_KEY: A 32-byte hex string for encrypting sensitive data in the database. You can generate one with the following command:
    bash
    openssl rand -hex 32

Storage Configuration

By default, the Docker Compose setup uses local filesystem storage, which is persisted using a Docker volume named archiver-data. This is suitable for most use cases.

If you want to use S3-compatible object storage, change the STORAGE_TYPE to s3 and fill in your S3 credentials (STORAGE_S3_* variables).

3. Run the Application

Once you have configured your .env file, you can start all the services using Docker Compose:

bash
docker compose up -d

This command will:

  • Pull the required Docker images for the frontend, backend, database, and other services.
  • Create and start the containers in the background (-d flag).
  • Create the persistent volumes for your data.

You can check the status of the running containers with:

bash
docker compose ps

4. Access the Application

Once the services are running, you can access the Open Archiver web interface by navigating to http://localhost:3000 in your web browser.

You can log in with the ADMIN_EMAIL and ADMIN_PASSWORD you configured in your .env file.

5. Next Steps

After successfully deploying and logging into Open Archiver, the next step is to configure your ingestion sources to start archiving emails.

Updating Your Installation

To update your Open Archiver instance to the latest version, run the following commands:

bash
# Pull the latest changes from the repository
+git pull
+
+# Pull the latest Docker images
+docker compose pull
+
+# Restart the services with the new images
+docker compose up -d
`,34)]))}const g=i(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/user-guides_installation.md.Gno3X95r.lean.js b/assets/user-guides_installation.md.Gno3X95r.lean.js new file mode 100644 index 0000000..0953e6b --- /dev/null +++ b/assets/user-guides_installation.md.Gno3X95r.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as s,ae as t}from"./chunks/framework.Cd-3tpCq.js";const u=JSON.parse('{"title":"Installation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/installation.md","filePath":"user-guides/installation.md"}'),n={name:"user-guides/installation.md"};function o(l,e,r,h,p,c){return s(),a("div",null,e[0]||(e[0]=[t("",34)]))}const g=i(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..ec1aea6 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"api_ingestion.md":"Cw9WcUAp","api_readme.md":"_7P6rt6y","readme.md":"CQnN0r3v","services_readme.md":"DmYG8_uu","services_storage-service.md":"xOqM9CWx","summary.md":"DhPY8nsG","user-guides_email-providers_google-workspace.md":"CWhO43nR","user-guides_email-providers_imap.md":"BcXBEq43","user-guides_email-providers_microsoft-365.md":"C4O8w9wT","user-guides_email-providers_readme.md":"yQn5kDaG","user-guides_installation.md":"Gno3X95r"} diff --git a/services/README.html b/services/README.html new file mode 100644 index 0000000..5395b6b --- /dev/null +++ b/services/README.html @@ -0,0 +1,25 @@ + + + + + + services | OpenArchiver Documentation + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/services/storage-service.html b/services/storage-service.html new file mode 100644 index 0000000..e44451f --- /dev/null +++ b/services/storage-service.html @@ -0,0 +1,62 @@ + + + + + + Pluggable Storage Service (StorageService) | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Pluggable Storage Service (StorageService)

Overview

The StorageService provides a unified, abstract interface for handling file storage across different backends. Its primary purpose is to decouple the application's core logic from the underlying storage technology. This design allows administrators to switch between storage providers (e.g., from the local filesystem to an S3-compatible object store) with only a configuration change, requiring no modifications to the application code.

The service is built around a standardized IStorageProvider interface, which guarantees that all storage providers have a consistent API for common operations like storing, retrieving, and deleting files.

Configuration

The StorageService is configured via environment variables in the .env file. You must specify the storage backend you wish to use and provide the necessary credentials and settings for it.

1. Choosing the Backend

The STORAGE_TYPE variable determines which provider the service will use.

  • STORAGE_TYPE=local: Uses the local server's filesystem.
  • STORAGE_TYPE=s3: Uses an S3-compatible object storage service (e.g., AWS S3, MinIO, Google Cloud Storage).

2. Local Filesystem Configuration

When STORAGE_TYPE is set to local, you must also provide the root path where files will be stored.

env
# .env
+STORAGE_TYPE=local
+STORAGE_LOCAL_ROOT_PATH=/var/data/open-archiver
  • STORAGE_LOCAL_ROOT_PATH: The absolute path on the server where the archive will be created. The service will create subdirectories within this path as needed.

3. S3-Compatible Storage Configuration

When STORAGE_TYPE is set to s3, you must provide the credentials and endpoint for your object storage provider.

env
# .env
+STORAGE_TYPE=s3
+STORAGE_S3_ENDPOINT=http://127.0.0.1:9000
+STORAGE_S3_BUCKET=email-archive
+STORAGE_S3_ACCESS_KEY_ID=minioadmin
+STORAGE_S3_SECRET_ACCESS_KEY=minioadmin
+STORAGE_S3_REGION=us-east-1
+STORAGE_S3_FORCE_PATH_STYLE=true
  • STORAGE_S3_ENDPOINT: The full URL of the S3 API endpoint.
  • STORAGE_S3_BUCKET: The name of the bucket to use for storage.
  • STORAGE_S3_ACCESS_KEY_ID: The access key for your S3 user.
  • STORAGE_S3_SECRET_ACCESS_KEY: The secret key for your S3 user.
  • STORAGE_S3_REGION (Optional): The AWS region of your bucket. Recommended for AWS S3.
  • STORAGE_S3_FORCE_PATH_STYLE (Optional): Set to true when using non-AWS S3 services like MinIO.

How to Use the Service

The StorageService is designed to be used via dependency injection in other services. You should never instantiate the providers (LocalFileSystemProvider or S3StorageProvider) directly. Instead, create an instance of StorageService and the factory will provide the correct provider based on your .env configuration.

Example: Usage in IngestionService

typescript
import { StorageService } from './StorageService';
+
+class IngestionService {
+    private storageService: StorageService;
+
+    constructor() {
+        // The StorageService is instantiated without any arguments.
+        // It automatically reads the configuration from the environment.
+        this.storageService = new StorageService();
+    }
+
+    public async archiveEmail(
+        rawEmail: Buffer,
+        userId: string,
+        messageId: string
+    ): Promise<void> {
+        // Define a structured, unique path for the email.
+        const archivePath = `${userId}/messages/${messageId}.eml`;
+
+        try {
+            // Use the service. It doesn't know or care if this is writing
+            // to a local disk or an S3 bucket.
+            await this.storageService.put(archivePath, rawEmail);
+            console.log(`Successfully archived email to ${archivePath}`);
+        } catch (error) {
+            console.error(`Failed to archive email ${messageId}`, error);
+        }
+    }
+}

API Reference

The StorageService implements the IStorageProvider interface. All methods are asynchronous and return a Promise.


put(path, content)

Stores a file at the specified path. If a file already exists at that path, it will be overwritten.

  • path: string: A unique identifier for the file, including its directory structure (e.g., "user-123/emails/message-abc.eml").
  • content: Buffer | NodeJS.ReadableStream: The content of the file. It can be a Buffer for small files or a ReadableStream for large files to ensure memory efficiency.
  • Returns: Promise<void> - A promise that resolves when the file has been successfully stored.

get(path)

Retrieves a file from the specified path as a readable stream.

  • path: string: The unique identifier of the file to retrieve.
  • Returns: Promise<NodeJS.ReadableStream> - A promise that resolves with a readable stream of the file's content.
  • Throws: An Error if the file is not found at the specified path.

delete(path)

Deletes a file from the storage backend.

  • path: string: The unique identifier of the file to delete.
  • Returns: Promise<void> - A promise that resolves when the file is deleted. If the file does not exist, the promise will still resolve successfully without throwing an error.

exists(path)

Checks for the existence of a file.

  • path: string: The unique identifier of the file to check.
  • Returns: Promise<boolean> - A promise that resolves with true if the file exists, and false otherwise.
+ + + + \ No newline at end of file diff --git a/user-guides/email-providers/README.html b/user-guides/email-providers/README.html new file mode 100644 index 0000000..38210cf --- /dev/null +++ b/user-guides/email-providers/README.html @@ -0,0 +1,25 @@ + + + + + + email-providers | OpenArchiver Documentation + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user-guides/email-providers/google-workspace.html b/user-guides/email-providers/google-workspace.html new file mode 100644 index 0000000..81a56e0 --- /dev/null +++ b/user-guides/email-providers/google-workspace.html @@ -0,0 +1,25 @@ + + + + + + Connecting to Google Workspace | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Connecting to Google Workspace

This guide provides instructions for Google Workspace administrators to set up a connection that allows the archiving of all user mailboxes within their organization.

The connection uses a Google Cloud Service Account with Domain-Wide Delegation. This is a secure method that grants the archiving service permission to access user data on behalf of the administrator, without requiring individual user passwords or consent.

Prerequisites

  • You must have Super Administrator privileges in your Google Workspace account.
  • You must have access to the Google Cloud Console associated with your organization.

Setup Overview

The setup process involves three main parts:

  1. Configuring the necessary permissions in the Google Cloud Console.
  2. Authorizing the service account in the Google Workspace Admin Console.
  3. Entering the generated credentials into the OpenArchiver application.

Part 1: Google Cloud Console Setup

In this part, you will create a service account and enable the APIs it needs to function.

  1. Create a Google Cloud Project:

    • Go to the Google Cloud Console.
    • If you don't already have one, create a new project for the archiving service (e.g., "Email Archiver").
  2. Enable Required APIs:

    • In your selected project, navigate to the "APIs & Services" > "Library" section.
    • Search for and enable the following two APIs:
      • Gmail API
      • Admin SDK API
  3. Create a Service Account:

    • Navigate to "IAM & Admin" > "Service Accounts".
    • Click "Create Service Account".
    • Give the service account a name (e.g., email-archiver-service) and a description.
    • Click "Create and Continue". You do not need to grant this service account any roles on the project. Click "Done".
  4. Generate a JSON Key:

    • Find the service account you just created in the list.
    • Click the three-dot menu under "Actions" and select "Manage keys".
    • Click "Add Key" > "Create new key".
    • Select JSON as the key type and click "Create".
    • A JSON file will be downloaded to your computer. Keep this file secure, as it contains private credentials. You will need the contents of this file in Part 3.

Troubleshooting

Error: "iam.disableServiceAccountKeyCreation"

If you receive an error message stating The organization policy constraint 'iam.disableServiceAccountKeyCreation' is enforced when trying to create a JSON key, it means your Google Cloud organization has a policy preventing the creation of new service account keys.

To resolve this, you must have Organization Administrator permissions.

  1. Navigate to your Organization: In the Google Cloud Console, use the project selector at the top of the page to select your organization node (it usually has a building icon).
  2. Go to IAM: From the navigation menu, select "IAM & Admin" > "IAM".
  3. Edit Your Permissions: Find your user account in the list and click the pencil icon to edit roles. Add the following two roles:
    • Organization Policy Administrator
    • Organization AdministratorNote: These roles are only available at the organization level, not the project level.
  4. Modify the Policy:
    • Navigate to "IAM & Admin" > "Organization Policies".
    • In the filter box, search for the policy "iam.disableServiceAccountKeyCreation".
    • Click on the policy to edit it.
    • You can either disable the policy entirely (if your security rules permit) or add a rule to exclude the specific project you are using for the archiver from this policy.
  5. Retry Key Creation: Once the policy is updated, return to your project and you should be able to generate the JSON key as described in Part 1.

Part 2: Grant Domain-Wide Delegation

Now, you will authorize the service account you created to access data from your Google Workspace.

  1. Get the Service Account's Client ID:

    • Go back to the list of service accounts in the Google Cloud Console.
    • Click on the service account you created.
    • Under the "Details" tab, find and copy the Unique ID (this is the Client ID).
  2. Authorize the Client in Google Workspace:

    • Go to your Google Workspace Admin Console at admin.google.com.
    • Navigate to Security > Access and data control > API controls.
    • Under the "Domain-wide Delegation" section, click "Manage Domain-wide Delegation".
    • Click "Add new".
  3. Enter Client Details and Scopes:

    • In the Client ID field, paste the Unique ID you copied from the service account.
    • In the OAuth scopes field, paste the following two scopes exactly as they appear, separated by a comma:
      https://www.googleapis.com/auth/admin.directory.user.readonly,https://www.googleapis.com/auth/gmail.readonly
    • Click "Authorize".

The service account is now permitted to list users and read their email data across your domain.


Part 3: Connecting in OpenArchiver

Finally, you will provide the generated credentials to the application.

  1. Navigate to Ingestion Sources: From the main dashboard, go to the Ingestion Sources page.

  2. Create a New Source: Click the "Create New" button.

  3. Fill in the Configuration Details:

    • Name: Give the source a name (e.g., "Google Workspace Archive").
    • Provider: Select "Google Workspace" from the dropdown.
    • Service Account Key (JSON): Open the JSON file you downloaded in Part 1. Copy the entire content of the file and paste it into this text area.
    • Impersonated Admin Email: Enter the email address of a Super Administrator in your Google Workspace (e.g., admin@your-domain.com). The service will use this user's authority to discover all other users.
  4. Save Changes: Click "Save changes".

What Happens Next?

Once the connection is saved and verified, the system will begin the archiving process:

  1. User Discovery: The service will first connect to the Admin SDK to get a list of all active users in your Google Workspace.
  2. Initial Import: The system will then start a background job to import the mailboxes of all discovered users. The status will show as "Importing". This can take a significant amount of time depending on the number of users and the size of their mailboxes.
  3. Continuous Sync: After the initial import is complete, the status will change to "Active". The system will then periodically check each user's mailbox for new emails and archive them automatically.
+ + + + \ No newline at end of file diff --git a/user-guides/email-providers/imap.html b/user-guides/email-providers/imap.html new file mode 100644 index 0000000..74f328c --- /dev/null +++ b/user-guides/email-providers/imap.html @@ -0,0 +1,25 @@ + + + + + + Connecting to a Generic IMAP Server | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Connecting to a Generic IMAP Server

This guide will walk you through connecting a standard IMAP email account as an ingestion source. This allows you to archive emails from any provider that supports the IMAP protocol, which is common for many self-hosted or traditional email services.

Step-by-Step Guide

  1. Navigate to Ingestion Sources: From the main dashboard, go to the Ingestions page.

  2. Create a New Source: Click the "Create New" button to open the ingestion source configuration dialog.

  3. Fill in the Configuration Details: You will see a form with several fields. Here is how to fill them out for an IMAP connection:

    • Name: Give your ingestion source a descriptive name that you will easily recognize, such as "Work Email (IMAP)" or "Personal Gmail".

    • Provider: From the dropdown menu, select "Generic IMAP". This will reveal the specific fields required for an IMAP connection.

    • Host: Enter the server address for your email provider's IMAP service. This often looks like imap.your-provider.com or mail.your-domain.com.

    • Port: Enter the port number for the IMAP server. For a secure connection (which is strongly recommended), this is typically 993.

    • Username: Enter the full email address or username you use to log in to your email account.

    • Password: Enter the password for your email account.

  4. Save Changes: Once you have filled in all the details, click the "Save changes" button.

Security Recommendation: Use an App Password

For enhanced security, we strongly recommend using an "app password" (sometimes called an "app-specific password") instead of your main account password.

Many email providers (like Gmail, Outlook, and Fastmail) allow you to generate a unique password that grants access only to a specific application (in this case, the archiving service). If you ever need to revoke access, you can simply delete the app password without affecting your main account login.

Please consult your email provider's documentation to see if they support app passwords and how to create one.

How to Obtain an App Password for Gmail

  1. Enable 2-Step Verification: You must have 2-Step Verification turned on for your Google Account.
  2. Go to App Passwords: Visit myaccount.google.com/apppasswords. You may be asked to sign in again.
  3. Create the Password:
    • At the bottom, click "Select app" and choose "Other (Custom name)".
    • Give it a name you'll recognize, like "OpenArchiver".
    • Click "Generate".
  4. Use the Password: A 16-digit password will be displayed. Copy this password (without the spaces) and paste it into the Password field in the OpenArchiver ingestion source form.

How to Obtain an App Password for Outlook/Microsoft Accounts

  1. Enable Two-Step Verification: You must have two-step verification enabled for your Microsoft account.
  2. Go to Security Options: Sign in to your Microsoft account and navigate to the Advanced security options.
  3. Create a New App Password:
    • Scroll down to the "App passwords" section.
    • Click "Create a new app password".
  4. Use the Password: A new password will be generated. Use this password in the Password field in the OpenArchiver ingestion source form.

What Happens Next?

After you save the connection, the system will attempt to connect to the IMAP server. The status of the ingestion source will update to reflect its current state:

  • Importing: The system is performing the initial, one-time import of all emails from your INBOX. This may take a while depending on the size of your mailbox.
  • Active: The initial import is complete, and the system will now periodically check for and archive new emails.
  • Paused: The connection is valid, but the system will not check for new emails until you resume it.
  • Error: The system was unable to connect using the provided credentials. Please double-check your Host, Port, Username, and Password and try again.

You can view, edit, pause, or manually sync any of your ingestion sources from the main table on the Ingestions page.

+ + + + \ No newline at end of file diff --git a/user-guides/email-providers/microsoft-365.html b/user-guides/email-providers/microsoft-365.html new file mode 100644 index 0000000..8851784 --- /dev/null +++ b/user-guides/email-providers/microsoft-365.html @@ -0,0 +1,25 @@ + + + + + + Connecting to Microsoft 365 | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Connecting to Microsoft 365

This guide provides instructions for Microsoft 365 administrators to set up a connection that allows the archiving of all user mailboxes within their organization.

The connection uses the Microsoft Graph API and an App Registration in Microsoft Entra ID. This is a secure, standard method that grants the archiving service permission to read email data on your behalf without ever needing to handle user passwords.

Prerequisites

  • You must have one of the following administrator roles in your Microsoft 365 tenant: Global Administrator, Application Administrator, or Cloud Application Administrator.

Setup Overview

The setup process involves four main parts, all performed within the Microsoft Entra admin center and the OpenArchiver application:

  1. Registering a new application identity for the archiver in Entra ID.
  2. Granting the application the specific permissions it needs to read mail.
  3. Creating a secure password (a client secret) for the application.
  4. Entering the generated credentials into the OpenArchiver application.

Part 1: Register a New Application in Microsoft Entra ID

First, you will create an "App registration," which acts as an identity for the archiving service within your Microsoft 365 ecosystem.

  1. Sign in to the Microsoft Entra admin center.
  2. In the left-hand navigation pane, go to Identity > Applications > App registrations.
  3. Click the + New registration button at the top of the page.
  4. On the "Register an application" screen:
    • Name: Give the application a descriptive name you will recognize, such as OpenArchiver Service.
    • Supported account types: Select "Accounts in this organizational directory only (Default Directory only - Single tenant)". This is the most secure option.
    • Redirect URI (optional): You can leave this blank.
  5. Click the Register button. You will be taken to the application's main "Overview" page.

Part 2: Grant API Permissions

Next, you must grant the application the specific permissions required to read user profiles and their mailboxes.

  1. From your new application's page, select API permissions from the left-hand menu.
  2. Click the + Add a permission button.
  3. In the "Request API permissions" pane, select Microsoft Graph.
  4. Select Application permissions. This is critical as it allows the service to run in the background without a user being signed in.
  5. In the "Select permissions" search box, find and check the boxes for the following two permissions:
    • Mail.Read
    • User.Read.All
  6. Click the Add permissions button at the bottom.
  7. Crucial Final Step: You will now see the permissions in your list with a warning status. You must grant consent on behalf of your organization. Click the "Grant admin consent for [Your Organization's Name]" button located above the permissions table. Click Yes in the confirmation dialog. The status for both permissions should now show a green checkmark.

Part 3: Create a Client Secret

The client secret is a password that the archiving service will use to authenticate. Treat this with the same level of security as an administrator's password.

  1. In your application's menu, navigate to Certificates & secrets.
  2. Select the Client secrets tab and click + New client secret.
  3. In the pane that appears:
    • Description: Enter a clear description, such as OpenArchiver Key.
    • Expires: Select an expiry duration. We recommend 12 or 24 months. Set a calendar reminder to renew it before it expires to prevent service interruption.
  4. Click Add.
  5. IMMEDIATELY COPY THE SECRET: The secret is now visible in the "Value" column. This is the only time it will be fully displayed. Copy this value now and store it in a secure password manager before navigating away. If you lose it, you must create a new one.

Part 4: Connecting in OpenArchiver

You now have the three pieces of information required to configure the connection.

  1. Navigate to Ingestion Sources: In the OpenArchiver application, go to the Ingestion Sources page.

  2. Create a New Source: Click the "Create New" button.

  3. Fill in the Configuration Details:

    • Name: Give the source a name (e.g., "Microsoft 365 Archive").
    • Provider: Select "Microsoft 365" from the dropdown.
    • Application (Client) ID: Go to the Overview page of your app registration in the Entra admin center and copy this value.
    • Directory (Tenant) ID: This value is also on the Overview page.
    • Client Secret Value: Paste the secret Value (not the Secret ID) that you copied and saved in the previous step.
  4. Save Changes: Click "Save changes".

What Happens Next?

Once the connection is saved, the system will begin the archiving process:

  1. User Discovery: The service will connect to the Microsoft Graph API to get a list of all users in your organization.
  2. Initial Import: The system will begin a background job to import the mailboxes of all discovered users, folder by folder. The status will show as "Importing". This can take a significant amount of time.
  3. Continuous Sync: After the initial import, the status will change to "Active". The system will use Microsoft Graph's delta query feature to efficiently fetch only new or changed emails, ensuring the archive stays up-to-date.
+ + + + \ No newline at end of file diff --git a/user-guides/installation.html b/user-guides/installation.html new file mode 100644 index 0000000..834fc37 --- /dev/null +++ b/user-guides/installation.html @@ -0,0 +1,33 @@ + + + + + + Installation Guide | OpenArchiver Documentation + + + + + + + + + + + + + + +
Skip to content

Installation Guide

This guide will walk you through setting up Open Archiver using Docker Compose. This is the recommended method for deploying the application.

Prerequisites

  • Docker and Docker Compose installed on your server or local machine.
  • A server or local machine with at least 2GB of RAM.
  • Git installed on your server or local machine.

1. Clone the Repository

First, clone the Open Archiver repository to your machine:

bash
git clone https://github.com/LogicLabs-OU/OpenArchiver.git
+cd OpenArchiver

2. Configure Your Environment

The application is configured using environment variables. You'll need to create a .env file to store your configuration.

Copy the example environment file for Docker:

bash
cp .env.example.docker .env

Now, open the .env file in a text editor and customize the settings.

Important Configuration

You must change the following placeholder values to secure your instance:

  • POSTGRES_PASSWORD: A strong, unique password for the database.
  • REDIS_PASSWORD: A strong, unique password for the Valkey/Redis service.
  • MEILI_MASTER_KEY: A complex key for Meilisearch.
  • JWT_SECRET: A long, random string for signing authentication tokens.
  • ADMIN_PASSWORD: A strong password for the initial admin user.
  • ENCRYPTION_KEY: A 32-byte hex string for encrypting sensitive data in the database. You can generate one with the following command:
    bash
    openssl rand -hex 32

Storage Configuration

By default, the Docker Compose setup uses local filesystem storage, which is persisted using a Docker volume named archiver-data. This is suitable for most use cases.

If you want to use S3-compatible object storage, change the STORAGE_TYPE to s3 and fill in your S3 credentials (STORAGE_S3_* variables).

3. Run the Application

Once you have configured your .env file, you can start all the services using Docker Compose:

bash
docker compose up -d

This command will:

  • Pull the required Docker images for the frontend, backend, database, and other services.
  • Create and start the containers in the background (-d flag).
  • Create the persistent volumes for your data.

You can check the status of the running containers with:

bash
docker compose ps

4. Access the Application

Once the services are running, you can access the Open Archiver web interface by navigating to http://localhost:3000 in your web browser.

You can log in with the ADMIN_EMAIL and ADMIN_PASSWORD you configured in your .env file.

5. Next Steps

After successfully deploying and logging into Open Archiver, the next step is to configure your ingestion sources to start archiving emails.

Updating Your Installation

To update your Open Archiver instance to the latest version, run the following commands:

bash
# Pull the latest changes from the repository
+git pull
+
+# Pull the latest Docker images
+docker compose pull
+
+# Restart the services with the new images
+docker compose up -d
+ + + + \ No newline at end of file diff --git a/vp-icons.css b/vp-icons.css new file mode 100644 index 0000000..e69de29