From a8600acd46929c56774f0942e89e05c9e34fd6e3 Mon Sep 17 00:00:00 2001 From: Yunfeng Bai Date: Tue, 18 Jul 2023 18:55:54 -0700 Subject: [PATCH] Deployed 823baa1 with MkDocs version: 1.4.3 --- 404.html | 4 +- api/data_types/index.html | 75 +++------- api/error_handling/index.html | 4 +- api/langchain/index.html | 4 +- api/python_client/index.html | 58 +++----- assets/stylesheets/main.26e3688c.min.css | 1 - assets/stylesheets/main.eebd395e.min.css | 1 + ....min.css.map => main.eebd395e.min.css.map} | 2 +- contributing/index.html | 4 +- examples/finetuning.ipynb | 92 +++++------- faq/index.html | 4 +- getting_started/index.html | 4 +- guides/completions/index.html | 131 +++++++++--------- guides/fine_tuning/index.html | 41 +++--- guides/rate_limits/index.html | 22 +-- guides/self_hosting/index.html | 37 ++++- guides/token_streaming/index.html | 4 +- index.html | 4 +- model_zoo/index.html | 9 +- pricing/index.html | 4 +- search/search_index.json | 2 +- sitemap.xml.gz | Bin 127 -> 127 bytes 22 files changed, 233 insertions(+), 274 deletions(-) delete mode 100644 assets/stylesheets/main.26e3688c.min.css create mode 100644 assets/stylesheets/main.eebd395e.min.css rename assets/stylesheets/{main.26e3688c.min.css.map => main.eebd395e.min.css.map} (51%) diff --git a/404.html b/404.html index af1b9b898..38e2eb533 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/api/data_types/index.html b/api/data_types/index.html index 5d1204ab6..e221b7009 100644 --- a/api/data_types/index.html +++ b/api/data_types/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -1623,9 +1623,7 @@

-
fine_tune_id: str = Field(
-    ..., description="ID of the created fine-tuning job."
-)
+
fine_tune_id: str = Field(..., description='ID of the created fine-tuning job.')
 
@@ -1688,9 +1686,7 @@

-
fine_tune_id: str = Field(
-    ..., description="ID of the requested job."
-)
+
fine_tune_id: str = Field(..., description='ID of the requested job.')
 
@@ -1714,9 +1710,7 @@

-
status: BatchJobStatus = Field(
-    ..., description="Status of the requested job."
-)
+
status: BatchJobStatus = Field(..., description='Status of the requested job.')
 
@@ -1779,10 +1773,7 @@

-
jobs: List[GetFineTuneResponse] = Field(
-    ...,
-    description="List of fine-tuning jobs and their statuses.",
-)
+
jobs: List[GetFineTuneResponse] = Field(..., description='List of fine-tuning jobs and their statuses.')
 
@@ -1845,9 +1836,7 @@

-
success: bool = Field(
-    ..., description="Whether cancellation was successful."
-)
+
success: bool = Field(..., description='Whether cancellation was successful.')
 
@@ -1910,9 +1899,7 @@

-
name: str = Field(
-    description="The name of the model. Use this for making inference requests to the model."
-)
+
name: str = Field(description='The name of the model. Use this for making inference requests to the model.')
 
@@ -1936,9 +1923,7 @@

-
source: LLMSource = Field(
-    description="The source of the model, e.g. Hugging Face."
-)
+
source: LLMSource = Field(description='The source of the model, e.g. Hugging Face.')
 
@@ -1962,9 +1947,7 @@

-
inference_framework: LLMInferenceFramework = Field(
-    description="The inference framework used by the model."
-)
+
inference_framework: LLMInferenceFramework = Field(description='The inference framework used by the model.')
 
@@ -1988,10 +1971,7 @@

-
id: Optional[str] = Field(
-    default=None,
-    description="(For self-hosted users) The autogenerated ID of the model.",
-)
+
id: Optional[str] = Field(default=None, description='(For self-hosted users) The autogenerated ID of the model.')
 
@@ -2015,10 +1995,7 @@

-
model_name: Optional[str] = Field(
-    default=None,
-    description="(For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as `name`.",
-)
+
model_name: Optional[str] = Field(default=None, description='(For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as `name`.')
 
@@ -2042,10 +2019,7 @@

-
inference_framework_tag: Optional[str] = Field(
-    default=None,
-    description="(For self-hosted users) The Docker image tag used to run the model.",
-)
+
inference_framework_tag: Optional[str] = Field(default=None, description='(For self-hosted users) The Docker image tag used to run the model.')
 
@@ -2069,10 +2043,7 @@

-
num_shards: Optional[int] = Field(
-    default=None,
-    description="(For self-hosted users) The number of shards.",
-)
+
num_shards: Optional[int] = Field(default=None, description='(For self-hosted users) The number of shards.')
 
@@ -2096,10 +2067,7 @@

-
quantize: Optional[Quantization] = Field(
-    default=None,
-    description="(For self-hosted users) The quantization method.",
-)
+
quantize: Optional[Quantization] = Field(default=None, description='(For self-hosted users) The quantization method.')
 
@@ -2123,10 +2091,7 @@

-
spec: Optional[GetModelEndpointResponse] = Field(
-    default=None,
-    description="(For self-hosted users) Model endpoint details.",
-)
+
spec: Optional[GetModelEndpointResponse] = Field(default=None, description='(For self-hosted users) Model endpoint details.')
 
@@ -2189,9 +2154,7 @@

-
model_endpoints: List[GetLLMEndpointResponse] = Field(
-    ..., description="The list of models."
-)
+
model_endpoints: List[GetLLMEndpointResponse] = Field(..., description='The list of models.')
 
@@ -2254,9 +2217,7 @@

-
deleted: bool = Field(
-    ..., description="Whether deletion was successful."
-)
+
deleted: bool = Field(..., description='Whether deletion was successful.')
 
diff --git a/api/error_handling/index.html b/api/error_handling/index.html index 8d6405823..e948617ae 100644 --- a/api/error_handling/index.html +++ b/api/error_handling/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/api/langchain/index.html b/api/langchain/index.html index e442a5dfc..8af56e747 100644 --- a/api/langchain/index.html +++ b/api/langchain/index.html @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/api/python_client/index.html b/api/python_client/index.html index 55141cf51..0b9ffa489 100644 --- a/api/python_client/index.html +++ b/api/python_client/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -836,17 +836,7 @@

-
create(
-    model: str,
-    prompt: str,
-    max_new_tokens: int = 20,
-    temperature: float = 0.2,
-    timeout: int = 10,
-    stream: bool = False,
-) -> Union[
-    CompletionSyncResponse,
-    Iterator[CompletionStreamResponse],
-]
+
create(model: str, prompt: str, max_new_tokens: int = 20, temperature: float = 0.2, timeout: int = 10, stream: bool = False) -> Union[CompletionSyncResponse, Iterator[CompletionStreamResponse]]
 
@@ -995,7 +985,7 @@

from llmengine import Completion
 
 response = Completion.create(
-    model="llama-7b",
+    model="llama-2-7b",
     prompt="Hello, my name is",
     max_new_tokens=10,
     temperature=0.2,
@@ -1022,7 +1012,7 @@ 

from llmengine import Completion
 
 stream = Completion.create(
-    model="llama-7b",
+    model="llama-2-7b",
     prompt="why is the sky blue?",
     max_new_tokens=5,
     temperature=0.2,
@@ -1064,17 +1054,7 @@ 

-
acreate(
-    model: str,
-    prompt: str,
-    max_new_tokens: int = 20,
-    temperature: float = 0.2,
-    timeout: int = 10,
-    stream: bool = False,
-) -> Union[
-    CompletionSyncResponse,
-    AsyncIterable[CompletionStreamResponse],
-]
+
acreate(model: str, prompt: str, max_new_tokens: int = 20, temperature: float = 0.2, timeout: int = 10, stream: bool = False) -> Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]
 
@@ -1225,7 +1205,7 @@

async def main(): response = await Completion.acreate( - model="llama-7b", + model="llama-2-7b", prompt="Hello, my name is", max_new_tokens=10, temperature=0.2, @@ -1256,7 +1236,7 @@

async def main(): stream = await Completion.acreate( - model="llama-7b", + model="llama-2-7b", prompt="why is the sky blue?", max_new_tokens=5, temperature=0.2, @@ -1341,13 +1321,7 @@

-
create(
-    model: str,
-    training_file: str,
-    validation_file: Optional[str] = None,
-    hyperparameters: Optional[Dict[str, str]] = None,
-    suffix: Optional[str] = None,
-) -> CreateFineTuneResponse
+
create(model: str, training_file: str, validation_file: Optional[str] = None, hyperparameters: Optional[Dict[str, str]] = None, suffix: Optional[str] = None) -> CreateFineTuneResponse
 
@@ -1451,7 +1425,7 @@

will be formatted like "[model].[suffix].[YYYY-MM-DD-HH-MM-SS]". If absent, the fine-tuned model name will be formatted "[model].[YYYY-MM-DD-HH-MM-SS]". For example, if suffix is "my-experiment", the fine-tuned model name could be -"llama-7b.my-experiment.2023-07-17-23-01-50".

+"llama-2-7b.my-experiment.2023-07-17-23-01-50".

@@ -1523,7 +1497,7 @@

from llmengine import FineTune
 
 response = FineTune.create(
-    model="llama-7b",
+    model="llama-2-7b",
     training_file="https://my-bucket.s3.us-west-2.amazonaws.com/path/to/training-file.csv",
 )
 
@@ -2075,7 +2049,7 @@ 

from llmengine import Model
 
-response = Model.get("llama-7b.suffix.2023-07-18-12-00-00")
+response = Model.get("llama-2-7b.suffix.2023-07-18-12-00-00")
 
 print(response.json())
 
@@ -2083,7 +2057,7 @@

{
     "id": null,
-    "name": "llama-7b.suffix.2023-07-18-12-00-00",
+    "name": "llama-2-7b.suffix.2023-07-18-12-00-00",
     "model_name": null,
     "source": "hugging_face",
     "inference_framework": "text_generation_inference",
@@ -2164,7 +2138,7 @@ 

"model_endpoints": [ { "id": null, - "name": "llama-7b.suffix.2023-07-18-12-00-00", + "name": "llama-2-7b.suffix.2023-07-18-12-00-00", "model_name": null, "source": "hugging_face", "inference_framework": "text_generation_inference", @@ -2175,7 +2149,7 @@

}, { "id": null, - "name": "llama-7b", + "name": "llama-2-7b", "model_name": null, "source": "hugging_face", "inference_framework": "text_generation_inference", @@ -2301,7 +2275,7 @@

from llmengine import Model
 
-response = Model.delete("llama-7b.suffix.2023-07-18-12-00-00")
+response = Model.delete("llama-2-7b.suffix.2023-07-18-12-00-00")
 print(response.json())
 
diff --git a/assets/stylesheets/main.26e3688c.min.css b/assets/stylesheets/main.26e3688c.min.css deleted file mode 100644 index d6684d58a..000000000 --- a/assets/stylesheets/main.26e3688c.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#ffff0080;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:#ffff0080;--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr[title]:focus:after,.md-typeset abbr[title]:hover:after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);font-size:.7rem;left:.8rem;margin-top:2em;padding:.2rem .3rem;position:absolute;right:.8rem}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;justify-content:space-between;margin-top:.625em;overflow:hidden;scroll-snap-align:start;text-overflow:ellipsis;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:focus,.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);font-weight:700;margin-top:0;padding:0 .6rem;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__link--index){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.1875em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags{margin-bottom:.75em;margin-top:-.125em}[dir=ltr] .md-typeset .md-tag{margin-right:.5em}[dir=rtl] .md-typeset .md-tag{margin-left:.5em}.md-typeset .md-tag{background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-block;font-size:.64rem;font-weight:700;letter-spacing:normal;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em;vertical-align:middle}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;margin-right:.4em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em #0000;transform:scale(1)}to{box-shadow:0 0 0 0 #0000;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation__index{cursor:pointer;font-family:var(--md-code-font-family);font-size:.85em;margin:0 1ch;outline:none;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:0}.md-annotation .md-annotation__index{color:#fff;transition:z-index .25s}.md-annotation .md-annotation__index:focus,.md-annotation .md-annotation__index:hover{color:#fff}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.125em;margin:0 -.4ch;padding:0 .4ch;position:absolute;top:0;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{animation:pulse 2s infinite}}.md-tooltip--active+.md-annotation__index:after{animation:none;transition:color .25s,background-color .25s}code .md-annotation__index{font-family:var(--md-code-font-family);font-size:inherit}.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index{color:var(--md-accent-bg-color)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}.md-tooltip--active+.md-annotation__index{animation:none;transition:none;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.05rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.eebd395e.min.css b/assets/stylesheets/main.eebd395e.min.css new file mode 100644 index 000000000..eb7ce640f --- /dev/null +++ b/assets/stylesheets/main.eebd395e.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#ffff0080;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:#ffff0080;--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr[title]:focus:after,.md-typeset abbr[title]:hover:after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);font-size:.7rem;left:.8rem;margin-top:2em;padding:.2rem .3rem;position:absolute;right:.8rem}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;justify-content:space-between;margin-top:.625em;overflow:hidden;scroll-snap-align:start;text-overflow:ellipsis;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:focus,.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);font-weight:700;margin-top:0;padding:0 .6rem;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__link--index){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.1875em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags{margin-bottom:.75em;margin-top:-.125em}[dir=ltr] .md-typeset .md-tag{margin-right:.5em}[dir=rtl] .md-typeset .md-tag{margin-left:.5em}.md-typeset .md-tag{background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-block;font-size:.64rem;font-weight:700;letter-spacing:normal;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em;vertical-align:middle}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;margin-right:.4em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em #0000;transform:scale(1)}to{box-shadow:0 0 0 0 #0000;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation__index{cursor:pointer;font-family:var(--md-code-font-family);font-size:.85em;margin:0 1ch;outline:none;position:relative;-webkit-user-select:none;user-select:none;z-index:0}.md-annotation .md-annotation__index{color:#fff;transition:z-index .25s}.md-annotation .md-annotation__index:focus,.md-annotation .md-annotation__index:hover{color:#fff}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.125em;margin:0 -.4ch;padding:0 .4ch;position:absolute;top:0;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{animation:pulse 2s infinite}}.md-tooltip--active+.md-annotation__index:after{animation:none;transition:color .25s,background-color .25s}code .md-annotation__index{font-family:var(--md-code-font-family);font-size:inherit}.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index{color:var(--md-accent-bg-color)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}.md-tooltip--active+.md-annotation__index{animation:none;transition:none;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.05rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.26e3688c.min.css.map b/assets/stylesheets/main.eebd395e.min.css.map similarity index 51% rename from assets/stylesheets/main.26e3688c.min.css.map rename to assets/stylesheets/main.eebd395e.min.css.map index 2e5e7a7a4..231356ef0 100644 --- a/assets/stylesheets/main.26e3688c.min.css.map +++ b/assets/stylesheets/main.eebd395e.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["src/assets/stylesheets/main/extensions/pymdownx/_keys.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/components/_banner.scss","src/assets/stylesheets/main/components/_base.scss","src/assets/stylesheets/main/components/_clipboard.scss","src/assets/stylesheets/main/components/_consent.scss","src/assets/stylesheets/main/components/_content.scss","src/assets/stylesheets/main/components/_dialog.scss","src/assets/stylesheets/main/components/_feedback.scss","src/assets/stylesheets/main/components/_footer.scss","src/assets/stylesheets/main/components/_form.scss","src/assets/stylesheets/main/components/_header.scss","src/assets/stylesheets/main/components/_nav.scss","src/assets/stylesheets/main/components/_search.scss","src/assets/stylesheets/main/components/_select.scss","src/assets/stylesheets/main/components/_sidebar.scss","src/assets/stylesheets/main/components/_source.scss","src/assets/stylesheets/main/components/_tabs.scss","src/assets/stylesheets/main/components/_tag.scss","src/assets/stylesheets/main/components/_tooltip.scss","src/assets/stylesheets/main/components/_top.scss","src/assets/stylesheets/main/components/_version.scss","src/assets/stylesheets/main/extensions/markdown/_admonition.scss","node_modules/material-design-color/material-color.scss","src/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/assets/stylesheets/main/extensions/markdown/_toc.scss","src/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/assets/stylesheets/main/integrations/_mermaid.scss","src/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"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A,UnCirHN,CmClqHM,aAII,6CACE,OnCiqHV,CmClqHQ,8CACE,OnCoqHV,CmCrqHQ,8CACE,OnCuqHV,CmCxqHQ,8CACE,OnC0qHV,CmC3qHQ,8CACE,OnC6qHV,CmC9qHQ,8CACE,OnCgrHV,CmCjrHQ,8CACE,OnCmrHV,CmCprHQ,8CACE,OnCsrHV,CmCvrHQ,8CACE,OnCyrHV,CmC1rHQ,+CACE,QnC4rHV,CmC7rHQ,+CACE,QnC+rHV,CmChsHQ,+CACE,QnCksHV,CmCnsHQ,+CACE,QnCqsHV,CmCtsHQ,+CACE,QnCwsHV,CmCzsHQ,+CACE,QnC2sHV,CmC5sHQ,+CACE,QnC8sHV,CmC/sHQ,+CACE,QnCitHV,CmCltHQ,+CACE,QnCotHV,CmCrtHQ,+CACE,QnCutHV,CmCxtHQ,+CACE,QnC0tHV,CACF,CmCrtHM,uCACE,+BnCutHR,CmCjtHE,4BACE,UnCmtHJ,CmChtHI,aAJF,4BAKI,gBnCmtHJ,CACF,CmC/sHE,0BACE,YnCitHJ,CmC9sHI,aAJF,0BAKI,anCitHJ,CmC7sHM,sCACE,OnC+sHR,CmChtHM,uCACE,OnCktHR,CmCntHM,uCACE,OnCqtHR,CmCttHM,uCACE,OnCwtHR,CmCztHM,uCACE,OnC2tHR,CmC5tHM,uCACE,OnC8tHR,CmC/tHM,uCACE,OnCiuHR,CmCluHM,uCACE,OnCouHR,CmCruHM,uCACE,OnCuuHR,CmCxuHM,wCACE,QnC0uHR,CmC3uHM,wCACE,QnC6uHR,CmC9uHM,wCACE,QnCgvHR,CmCjvHM,wCACE,QnCmvHR,CmCpvHM,wCACE,QnCsvHR,CmCvvHM,wCACE,QnCyvHR,CmC1vHM,wCACE,QnC4vHR,CmC7vHM,wCACE,QnC+vHR,CmChwHM,wCACE,QnCkwHR,CmCnwHM,wCACE,QnCqwHR,CmCtwHM,wCACE,QnCwwHR,CACF,CmClwHI,+FAEE,QnCowHN,CmCjwHM,yGACE,wBAAA,CACA,yBnCowHR,CmC3vHM,2DAEE,wBAAA,CACA,yBAAA,CAFA,QnC+vHR,CmCxvHM,iEACE,QnC0vHR,CmCvvHQ,qLAGE,wBAAA,CACA,yBAAA,CAFA,QnC2vHV,CmCrvHQ,6FACE,wBAAA,CACA,yBnCuvHV,CmClvHM,yDACE,kBnCovHR,CmC/uHI,sCACE,QnCivHN,CmC5uHE,2BAEE,iBAAA,CAOA,kBAAA,CAHA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,YAAA,CACA,gBAAA,CAEA,mBAAA,CAGA,gCAAA,CAPA,WnCqvHJ,CmC3uHI,iCAEE,uDAAA,CADA,+BnC8uHN,CmCzuHI,iCAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAMA,8CAAA,CAAA,sCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CANA,+CACE,CALF,UnCmvHN,CmCpuHE,4BAOE,yEACE,CANF,YAAA,CAGA,aAAA,CAFA,qBAAA,CAGA,mBAAA,CALA,iBAAA,CAYA,wBAAA,CATA,YnC0uHJ,CmC9tHI,sCACE,wBnCguHN,CmC5tHI,oCACE,SnC8tHN,CmC1tHI,kCAGE,wEACE,CAFF,mBAAA,CADA,OnC8tHN,CmCptHM,uDACE,8CAAA,CAAA,sCnCstHR,CKt0HI,wC8B8HF,wDAEE,kBnC8sHF,CmChtHA,wDAEE,mBnC8sHF,CmChtHA,8CAGE,eAAA,CAFA,eAAA,CAGA,iCnC4sHF,CmCxsHE,8DACE,mBnC2sHJ,CmC5sHE,8DACE,kBnC2sHJ,CmC5sHE,oDAEE,UnC0sHJ,CmCtsHE,8EAEE,kBnCysHJ,CmC3sHE,8EAEE,mBnCysHJ,CmC3sHE,8EAGE,kBnCwsHJ,CmC3sHE,8EAGE,mBnCwsHJ,CmC3sHE,oEACE,UnC0sHJ,CmCpsHE,8EAEE,mBnCusHJ,CmCzsHE,8EAEE,kBnCusHJ,CmCzsHE,8EAGE,mBnCssHJ,CmCzsHE,8EAGE,kBnCssHJ,CmCzsHE,oEACE,UnCwsHJ,CACF,CmC1rHE,cAHF,olDAII,+BnC6rHF,CmC1rHE,g8GACE,sCnC4rHJ,CACF,CmCvrHA,4sDACE,uDnC0rHF,CmCtrHA,wmDACE,anCyrHF,CoCtiIA,MACE,8WAAA,CAEA,uXpC0iIF,CoChiIE,4BAEE,oBAAA,CADA,iBpCoiIJ,CoC/hII,sDAGE,SpCiiIN,CoCpiII,sDAGE,UpCiiIN,CoCpiII,4CACE,iBAAA,CACA,SpCkiIN,CoC5hIE,+CAEE,SAAA,CADA,UpC+hIJ,CoC1hIE,kDAOE,WpCgiIJ,CoCviIE,kDAOE,YpCgiIJ,CoCviIE,wCAME,qDAAA,CADA,UAAA,CADA,aAAA,CAIA,0CAAA,CAAA,kCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,SAAA,CACA,YpCoiIJ,CoCxhIE,gEACE,wBTyWa,CSxWb,mDAAA,CAAA,2CpC0hIJ,CqC5kIA,QACE,8DAAA,CAGA,+CAAA,CACA,iEAAA,CACA,oDAAA,CACA,sDAAA,CACA,mDrC6kIF,CqCvkIA,SAEE,kBAAA,CADA,YrC2kIF,CKp7HI,mCiChKA,8BACE,UtC4lIJ,CsC7lIE,8BACE,WtC4lIJ,CsC7lIE,8BAGE,kBtC0lIJ,CsC7lIE,8BAGE,iBtC0lIJ,CsC7lIE,oBAKE,mBAAA,CADA,YAAA,CAFA,atC2lIJ,CsCrlII,kCACE,WtCwlIN,CsCzlII,kCACE,UtCwlIN,CsCzlII,kCAEE,iBAAA,CAAA,ctCulIN,CsCzlII,kCAEE,aAAA,CAAA,kBtCulIN,CACF","file":"main.css"} \ No newline at end of file +{"version":3,"sources":["src/assets/stylesheets/main/extensions/pymdownx/_keys.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/components/_banner.scss","src/assets/stylesheets/main/components/_base.scss","src/assets/stylesheets/main/components/_clipboard.scss","src/assets/stylesheets/main/components/_consent.scss","src/assets/stylesheets/main/components/_content.scss","src/assets/stylesheets/main/components/_dialog.scss","src/assets/stylesheets/main/components/_feedback.scss","src/assets/stylesheets/main/components/_footer.scss","src/assets/stylesheets/main/components/_form.scss","src/assets/stylesheets/main/components/_header.scss","src/assets/stylesheets/main/components/_nav.scss","src/assets/stylesheets/main/components/_search.scss","src/assets/stylesheets/main/components/_select.scss","src/assets/stylesheets/main/components/_sidebar.scss","src/assets/stylesheets/main/components/_source.scss","src/assets/stylesheets/main/components/_tabs.scss","src/assets/stylesheets/main/components/_tag.scss","src/assets/stylesheets/main/components/_tooltip.scss","src/assets/stylesheets/main/components/_top.scss","src/assets/stylesheets/main/components/_version.scss","src/assets/stylesheets/main/extensions/markdown/_admonition.scss","node_modules/material-design-color/material-color.scss","src/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/assets/stylesheets/main/extensions/markdown/_toc.scss","src/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/assets/stylesheets/main/integrations/_mermaid.scss","src/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"AAgGM,gBCk+GN,CCtiHA,KAEE,6BAAA,CAAA,0BAAA,CAAA,qBAAA,CADA,qBDzBF,CC8BA,iBAGE,kBD3BF,CC8BE,gCANF,iBAOI,yBDzBF,CACF,CC6BA,KACE,QD1BF,CC8BA,qBAIE,uCD3BF,CC+BA,EACE,aAAA,CACA,oBD5BF,CCgCA,GAME,QAAA,CALA,kBAAA,CACA,aAAA,CACA,aAAA,CAEA,gBAAA,CADA,SD3BF,CCiCA,MACE,aD9BF,CCkCA,QAEE,eD/BF,CCmCA,IACE,iBDhCF,CCoCA,MAEE,uBAAA,CADA,gBDhCF,CCqCA,MAEE,eAAA,CACA,kBDlCF,CCsCA,OAKE,gBAAA,CACA,QAAA,CAHA,mBAAA,CACA,iBAAA,CAFA,QAAA,CADA,SD9BF,CCuCA,MACE,QAAA,CACA,YDpCF,CErDA,MAIE,6BAAA,CACA,oCAAA,CACA,mCAAA,CACA,0BAAA,CACA,sCAAA,CAGA,4BAAA,CACA,2CAAA,CACA,yBAAA,CACA,qCFmDF,CE7CA,+BAIE,kBF6CF,CE1CE,oHAEE,YF4CJ,CEnCA,qCAGE,+BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CACA,0BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CAGA,0BAAA,CACA,0BAAA,CAGA,4BAAA,CACA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,iCAAA,CAGA,gCAAA,CACA,gCAAA,CAGA,8BAAA,CACA,kCAAA,CACA,qCAAA,CAGA,kCAAA,CACA,gDAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,+BAAA,CACA,0BAAA,CAGA,yBAAA,CACA,qCAAA,CACA,uCAAA,CACA,8BAAA,CACA,oCAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DFUF,CG5HE,aAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,YHiIJ,CItIA,KACE,kCAAA,CACA,iCAAA,CAGA,uGAAA,CAKA,mFJuIF,CIjIA,iBAIE,mCAAA,CACA,6BAAA,CAFA,sCJsIF,CIhIA,aAIE,4BAAA,CADA,sCJoIF,CI3HA,MACE,0NAAA,CACA,mNAAA,CACA,oNJ8HF,CIvHA,YAGE,gCAAA,CAAA,kBAAA,CAFA,eAAA,CACA,eJ2HF,CItHE,aAPF,YAQI,gBJyHF,CACF,CItHE,uGAME,iBAAA,CAAA,cJwHJ,CIpHE,eAKE,uCAAA,CAHA,aAAA,CAEA,eAAA,CAHA,iBJ2HJ,CIlHE,8BAPE,eAAA,CAGA,qBJ6HJ,CIzHE,eAEE,kBAAA,CAEA,eAAA,CAHA,oBJwHJ,CIhHE,eAEE,gBAAA,CACA,eAAA,CAEA,qBAAA,CADA,eAAA,CAHA,mBJsHJ,CI9GE,kBACE,eJgHJ,CI5GE,eAEE,eAAA,CACA,qBAAA,CAFA,YJgHJ,CI1GE,8BAKE,uCAAA,CAFA,cAAA,CACA,eAAA,CAEA,qBAAA,CAJA,eJgHJ,CIxGE,eACE,wBJ0GJ,CItGE,eAGE,+DAAA,CAFA,iBAAA,CACA,cJyGJ,CIpGE,cACE,+BAAA,CACA,qBJsGJ,CInGI,mCAEE,sBJoGN,CIhGI,wCACE,+BJkGN,CI/FM,kDACE,uDJiGR,CI5FI,mBACE,kBAAA,CACA,iCJ8FN,CI1FI,4BACE,uCAAA,CACA,oBJ4FN,CIvFE,iDAIE,6BAAA,CACA,aAAA,CAFA,2BJ2FJ,CItFI,aARF,iDASI,oBJ2FJ,CACF,CIvFE,iBAIE,wCAAA,CACA,mBAAA,CACA,kCAAA,CAAA,0BAAA,CAJA,eAAA,CADA,uBAAA,CAEA,qBJ4FJ,CItFI,qCAEE,uCAAA,CADA,YJyFN,CInFE,gBAEE,iBAAA,CACA,eAAA,CAFA,iBJuFJ,CIlFI,qBASE,kCAAA,CAAA,0BAAA,CADA,eAAA,CAPA,aAAA,CAEA,QAAA,CAIA,uCAAA,CAHA,aAAA,CAFA,oCAAA,CASA,yDAAA,CADA,oBAAA,CAJA,iBAAA,CADA,iBJ0FN,CIjFM,2BACE,+CJmFR,CI/EM,wCAEE,YAAA,CADA,WJkFR,CI7EM,8CACE,oDJ+ER,CI5EQ,oDACE,0CJ8EV,CIvEE,gBAOE,4CAAA,CACA,mBAAA,CACA,mKACE,CANF,gCAAA,CAHA,oBAAA,CAEA,eAAA,CADA,uBAAA,CAIA,uBAAA,CADA,qBJ6EJ,CIlEE,iBAGE,6CAAA,CACA,kCAAA,CAAA,0BAAA,CAHA,aAAA,CACA,qBJsEJ,CIhEE,iBAGE,6DAAA,CADA,WAAA,CADA,oBJoEJ,CI/DI,oBAGE,wEAQE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAJA,gCAAA,CACA,mBAAA,CAFA,eAAA,CAHA,UAAA,CAEA,cAAA,CADA,mBAAA,CAFA,iBAAA,CACA,WJuEN,CACF,CI1DE,kBACE,WJ4DJ,CIxDE,oDAEE,qBJ0DJ,CI5DE,oDAEE,sBJ0DJ,CItDE,iCACE,kBJ2DJ,CI5DE,iCACE,mBJ2DJ,CI5DE,iCAIE,2DJwDJ,CI5DE,iCAIE,4DJwDJ,CI5DE,uBAGE,uCAAA,CADA,aAAA,CAAA,cJ0DJ,CIpDE,eACE,oBJsDJ,CIlDE,kDAGE,kBJoDJ,CIvDE,kDAGE,mBJoDJ,CIvDE,8BAEE,SJqDJ,CIjDI,0DACE,iBJoDN,CIhDI,oCACE,2BJmDN,CIhDM,0CACE,2BJmDR,CI9CI,wDACE,kBJkDN,CInDI,wDACE,mBJkDN,CInDI,oCAEE,kBJiDN,CI9CM,kGAEE,aJkDR,CI9CM,0DACE,eJiDR,CI7CM,4HAEE,kBJgDR,CIlDM,4HAEE,mBJgDR,CIlDM,oFACE,kBAAA,CAAA,eJiDR,CI1CE,yBAEE,mBJ4CJ,CI9CE,yBAEE,oBJ4CJ,CI9CE,eACE,mBAAA,CAAA,cJ6CJ,CIxCE,kDAIE,WAAA,CADA,cJ2CJ,CInCI,4BAEE,oBJqCN,CIjCI,6BAEE,oBJmCN,CI/BI,kCACE,YJiCN,CI5BE,mBACE,iBAAA,CAGA,eAAA,CADA,cAAA,CAEA,iBAAA,CAHA,yBAAA,CAAA,sBAAA,CAAA,iBJiCJ,CI3BI,uBACE,aJ6BN,CIxBE,uBAGE,iBAAA,CADA,eAAA,CADA,eJ4BJ,CItBE,mBACE,cJwBJ,CIpBE,+BAME,2CAAA,CACA,iDAAA,CACA,mBAAA,CAPA,oBAAA,CAGA,gBAAA,CAFA,cAAA,CACA,aAAA,CAEA,iBJyBJ,CInBI,aAXF,+BAYI,aJsBJ,CACF,CIjBI,iCACE,gBJmBN,CIZM,8FACE,YJcR,CIVM,4FACE,eJYR,CIPI,8FACE,eJSN,CINM,kHACE,gBJQR,CIHI,kCAGE,eAAA,CAFA,cAAA,CACA,sBAAA,CAEA,kBJKN,CIDI,kCAGE,qDAAA,CAFA,sBAAA,CACA,kBJIN,CICI,wCACE,iCJCN,CIEM,8CACE,qDAAA,CACA,sDJAR,CIKI,iCACE,iBJHN,CIQE,wCACE,cJNJ,CISI,wDAIE,gBJDN,CIHI,wDAIE,iBJDN,CIHI,8CAME,UAAA,CALA,oBAAA,CAEA,YAAA,CAKA,oDAAA,CAAA,4CAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAHA,iCAAA,CAFA,0BAAA,CAHA,WJCN,CIWI,oDACE,oDJTN,CIaI,mEACE,kDAAA,CACA,yDAAA,CAAA,iDJXN,CIeI,oEACE,kDAAA,CACA,0DAAA,CAAA,kDJbN,CIkBE,wBACE,iBAAA,CACA,eAAA,CACA,iBJhBJ,CIoBE,mBACE,oBAAA,CAEA,kBAAA,CADA,eJjBJ,CIqBI,aANF,mBAOI,aJlBJ,CACF,CIqBI,8BACE,aAAA,CAEA,QAAA,CACA,eAAA,CAFA,UJjBN,CK9VI,wCD8XF,uBACE,iBJ5BF,CI+BE,4BACE,eJ7BJ,CACF,CMhiBA,WAGE,0CAAA,CADA,+BAAA,CADA,aNoiBF,CM/hBE,aANF,WAOI,YNkiBF,CACF,CM/hBE,oBAEE,2CAAA,CADA,gCNkiBJ,CM7hBE,kBAGE,eAAA,CADA,iBAAA,CADA,eNiiBJ,CM3hBE,6BACE,WNgiBJ,CMjiBE,6BACE,UNgiBJ,CMjiBE,mBAEE,aAAA,CACA,cAAA,CACA,uBN6hBJ,CM1hBI,yBACE,UN4hBN,CO5jBA,KASE,cAAA,CARA,WAAA,CACA,iBPgkBF,CK5ZI,oCEtKJ,KAaI,gBPyjBF,CACF,CKjaI,oCEtKJ,KAkBI,cPyjBF,CACF,COpjBA,KASE,2CAAA,CAPA,YAAA,CACA,qBAAA,CAKA,eAAA,CAHA,eAAA,CAJA,iBAAA,CAGA,UP0jBF,COljBE,aAZF,KAaI,aPqjBF,CACF,CKlaI,wCEhJF,yBAII,cPkjBJ,CACF,COziBA,SAEE,gBAAA,CAAA,iBAAA,CADA,eP6iBF,COxiBA,cACE,YAAA,CACA,qBAAA,CACA,WP2iBF,COxiBE,aANF,cAOI,aP2iBF,CACF,COviBA,SACE,WP0iBF,COviBE,gBACE,YAAA,CACA,WAAA,CACA,iBPyiBJ,COpiBA,aACE,eAAA,CACA,sBPuiBF,CO9hBA,WACE,YPiiBF,CO5hBA,WAGE,QAAA,CACA,SAAA,CAHA,iBAAA,CACA,OPiiBF,CO5hBE,uCACE,aP8hBJ,CO1hBE,+BAEE,uCAAA,CADA,kBP6hBJ,COvhBA,SASE,2CAAA,CACA,mBAAA,CAFA,gCAAA,CADA,gBAAA,CADA,YAAA,CAMA,SAAA,CADA,uCAAA,CANA,mBAAA,CAJA,cAAA,CAYA,2BAAA,CATA,UPiiBF,COrhBE,eAEE,SAAA,CAIA,uBAAA,CAHA,oEACE,CAHF,UP0hBJ,CO5gBA,MACE,WP+gBF,CQxqBA,MACE,+PR0qBF,CQpqBA,cASE,mBAAA,CAFA,0CAAA,CACA,cAAA,CAFA,YAAA,CAIA,uCAAA,CACA,oBAAA,CAVA,iBAAA,CAEA,UAAA,CADA,QAAA,CAUA,qBAAA,CAPA,WAAA,CADA,SR+qBF,CQpqBE,aAfF,cAgBI,YRuqBF,CACF,CQpqBE,kCAEE,uCAAA,CADA,YRuqBJ,CQlqBE,qBACE,uCRoqBJ,CQhqBE,wCACE,+BRkqBJ,CQ7pBE,oBAME,6BAAA,CADA,UAAA,CAJA,aAAA,CAEA,cAAA,CACA,aAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,aRuqBJ,CQ3pBE,sBACE,cR6pBJ,CQ1pBI,2BACE,2CR4pBN,CQtpBI,kEAEE,uDAAA,CADA,+BRypBN,CS/tBA,mBACE,GACE,SAAA,CACA,0BTkuBF,CS/tBA,GACE,SAAA,CACA,uBTiuBF,CACF,CS7tBA,mBACE,GACE,ST+tBF,CS5tBA,GACE,ST8tBF,CACF,CSntBE,qBASE,2BAAA,CADA,mCAAA,CAAA,2BAAA,CAFA,0BAAA,CADA,WAAA,CAEA,SAAA,CANA,cAAA,CACA,KAAA,CAEA,UAAA,CADA,ST2tBJ,CSjtBE,mBAcE,mDAAA,CANA,2CAAA,CACA,QAAA,CACA,mBAAA,CARA,QAAA,CASA,kDACE,CAPF,eAAA,CAEA,aAAA,CADA,SAAA,CALA,cAAA,CAGA,UAAA,CADA,ST4tBJ,CS7sBE,kBACE,aT+sBJ,CS3sBE,sBACE,YAAA,CACA,YT6sBJ,CS1sBI,oCACE,aT4sBN,CSvsBE,sBACE,mBTysBJ,CStsBI,6CACE,cTwsBN,CKlmBI,wCIvGA,6CAKI,aAAA,CAEA,gBAAA,CACA,iBAAA,CAFA,UT0sBN,CACF,CSnsBE,kBACE,cTqsBJ,CUtyBA,YACE,WAAA,CAIA,WVsyBF,CUnyBE,mBAEE,qBAAA,CADA,iBVsyBJ,CKzoBI,sCKtJE,4EACE,kBVkyBN,CU9xBI,0JACE,mBVgyBN,CUjyBI,8EACE,kBVgyBN,CACF,CU3xBI,0BAGE,UAAA,CAFA,aAAA,CACA,YV8xBN,CUzxBI,+BACE,eV2xBN,CUrxBE,8BACE,WV0xBJ,CU3xBE,8BACE,UV0xBJ,CU3xBE,8BAIE,iBVuxBJ,CU3xBE,8BAIE,kBVuxBJ,CU3xBE,oBAGE,cAAA,CADA,SVyxBJ,CUpxBI,aAPF,oBAQI,YVuxBJ,CACF,CUpxBI,gCACE,yCVsxBN,CUlxBI,wBACE,cAAA,CACA,kBVoxBN,CUjxBM,kCACE,oBVmxBR,CWp1BA,qBAeE,WXq1BF,CWp2BA,qBAeE,UXq1BF,CWp2BA,WAOE,2CAAA,CACA,mBAAA,CANA,YAAA,CAOA,8BAAA,CALA,iBAAA,CAMA,SAAA,CALA,mBAAA,CACA,mBAAA,CALA,cAAA,CAaA,0BAAA,CAHA,wCACE,CATF,SXi2BF,CWl1BE,aAlBF,WAmBI,YXq1BF,CACF,CWl1BE,mBAEE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,kEXq1BJ,CW90BE,kBAEE,gCAAA,CADA,eXi1BJ,CYn3BA,aACE,gBAAA,CACA,iBZs3BF,CYn3BE,sBAGE,WAAA,CADA,QAAA,CADA,SZu3BJ,CYj3BE,oBAEE,eAAA,CADA,eZo3BJ,CY/2BE,oBACE,iBZi3BJ,CY72BE,mBAIE,sBAAA,CAFA,YAAA,CACA,cAAA,CAEA,sBAAA,CAJA,iBZm3BJ,CY52BI,iDACE,yCZ82BN,CY12BI,6BACE,iBZ42BN,CYv2BE,mBAGE,uCAAA,CACA,cAAA,CAHA,aAAA,CACA,cAAA,CAGA,sBZy2BJ,CYt2BI,gDACE,+BZw2BN,CYp2BI,4BACE,0CAAA,CACA,mBZs2BN,CYj2BE,mBAEE,SAAA,CADA,iBAAA,CAKA,2BAAA,CAHA,8DZo2BJ,CY91BI,qBAEE,aAAA,CADA,eZi2BN,CY51BI,6BACE,SAAA,CACA,uBZ81BN,Ca76BA,WAEE,0CAAA,CADA,+Bbi7BF,Ca76BE,aALF,WAMI,Ybg7BF,CACF,Ca76BE,kBACE,6BAAA,CAEA,aAAA,CADA,abg7BJ,Ca56BI,gCACE,Yb86BN,Caz6BE,iBAOE,eAAA,CANA,YAAA,CAKA,cAAA,CAGA,mBAAA,CAAA,eAAA,CADA,cAAA,CAGA,uCAAA,CADA,eAAA,CAEA,uBbu6BJ,Cap6BI,8CACE,Ubs6BN,Cal6BI,+BACE,oBbo6BN,CKtxBI,wCQvIE,uBACE,abg6BN,Ca75BO,yCACC,Yb+5BR,CACF,Ca15BI,iCACE,gBb65BN,Ca95BI,iCACE,iBb65BN,Ca95BI,uBAEE,gBb45BN,Caz5BM,iCACE,eb25BR,Car5BE,kBACE,WAAA,CAIA,eAAA,CADA,mBAAA,CAFA,6BAAA,CACA,cAAA,CAGA,kBbu5BJ,Can5BE,mBAEE,YAAA,CADA,abs5BJ,Caj5BE,sBACE,gBAAA,CACA,Ubm5BJ,Ca94BA,gBACE,gDbi5BF,Ca94BE,uBACE,YAAA,CACA,cAAA,CACA,6BAAA,CACA,abg5BJ,Ca54BE,kCACE,sCb84BJ,Ca34BI,gFACE,+Bb64BN,Car4BA,cAKE,wCAAA,CADA,gBAAA,CADA,iBAAA,CADA,eAAA,CADA,Ub44BF,CKh2BI,mCQ7CJ,cASI,Ubw4BF,CACF,Cap4BE,yBACE,sCbs4BJ,Ca/3BA,WAEE,cAAA,CADA,qBbm4BF,CK72BI,mCQvBJ,WAMI,ebk4BF,CACF,Ca/3BE,iBACE,oBAAA,CAEA,aAAA,CACA,iBAAA,CAFA,Ybm4BJ,Ca93BI,wBACE,ebg4BN,Ca53BI,qBAGE,iBAAA,CAFA,gBAAA,CACA,mBb+3BN,CcniCE,uBAME,kBAAA,CACA,mBAAA,CAHA,gCAAA,CACA,cAAA,CAJA,oBAAA,CAEA,eAAA,CADA,kBAAA,CAMA,gEdsiCJ,CchiCI,gCAEE,2CAAA,CACA,uCAAA,CAFA,gCdoiCN,Cc9hCI,0DAEE,0CAAA,CACA,sCAAA,CAFA,+BdkiCN,Cc3hCE,gCAKE,4BdgiCJ,CcriCE,gEAME,6Bd+hCJ,CcriCE,gCAME,4Bd+hCJ,CcriCE,sBAIE,6DAAA,CAGA,8BAAA,CAJA,eAAA,CAFA,aAAA,CACA,eAAA,CAMA,sCd6hCJ,CcxhCI,wDACE,6CAAA,CACA,8Bd0hCN,CcthCI,+BACE,UdwhCN,Ce3kCA,WAOE,2CAAA,CAGA,8CACE,CALF,gCAAA,CADA,aAAA,CAHA,MAAA,CADA,eAAA,CACA,OAAA,CACA,KAAA,CACA,SfklCF,CevkCE,aAfF,WAgBI,Yf0kCF,CACF,CevkCE,mBAIE,2BAAA,CAHA,iEf0kCJ,CenkCE,mBACE,kDACE,CAEF,kEfmkCJ,Ce7jCE,kBAEE,kBAAA,CADA,YAAA,CAEA,ef+jCJ,Ce3jCE,mBAKE,kBAAA,CAEA,cAAA,CAHA,YAAA,CAIA,uCAAA,CALA,aAAA,CAFA,iBAAA,CAQA,uBAAA,CAHA,qBAAA,CAJA,SfokCJ,Ce1jCI,yBACE,Uf4jCN,CexjCI,iCACE,oBf0jCN,CetjCI,uCAEE,uCAAA,CADA,YfyjCN,CepjCI,2BAEE,YAAA,CADA,afujCN,CKz8BI,wCU/GA,2BAMI,YfsjCN,CACF,CenjCM,8DAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,UfujCR,CKv+BI,mCUzEA,iCAII,YfgjCN,CACF,Ce7iCM,wCACE,Yf+iCR,Ce3iCM,+CACE,oBf6iCR,CKl/BI,sCUtDA,iCAII,YfwiCN,CACF,CeniCE,kBAEE,YAAA,CACA,cAAA,CAFA,iBAAA,CAIA,8DACE,CAFF,kBfsiCJ,CehiCI,oCAGE,SAAA,CADA,mBAAA,CAKA,6BAAA,CAHA,8DACE,CAJF,UfsiCN,Ce7hCM,8CACE,8Bf+hCR,Ce1hCI,8BACE,ef4hCN,CevhCE,4BAGE,gBf4hCJ,Ce/hCE,4BAGE,iBf4hCJ,Ce/hCE,4BAIE,kBf2hCJ,Ce/hCE,4BAIE,iBf2hCJ,Ce/hCE,kBACE,WAAA,CAIA,eAAA,CAHA,aAAA,CAIA,kBfyhCJ,CethCI,4CAGE,SAAA,CADA,mBAAA,CAKA,8BAAA,CAHA,8DACE,CAJF,Uf4hCN,CenhCM,sDACE,6BfqhCR,CejhCM,8DAGE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,8DACE,CAJF,SfuhCR,Ce5gCI,uCAGE,WAAA,CAFA,iBAAA,CACA,Uf+gCN,CezgCE,mBACE,YAAA,CACA,aAAA,CACA,cAAA,CAEA,+CACE,CAFF,kBf4gCJ,CetgCI,8DACE,WAAA,CACA,SAAA,CACA,oCfwgCN,CejgCE,mBACE,YfmgCJ,CKxjCI,mCUoDF,6BAQI,gBfmgCJ,Ce3gCA,6BAQI,iBfmgCJ,Ce3gCA,mBAKI,aAAA,CAEA,iBAAA,CADA,afqgCJ,CACF,CKhkCI,sCUoDF,6BAaI,kBfmgCJ,CehhCA,6BAaI,mBfmgCJ,CACF,CgB3uCA,MACE,0MAAA,CACA,gMAAA,CACA,yNhB8uCF,CgBxuCA,QACE,eAAA,CACA,ehB2uCF,CgBxuCE,eAKE,uCAAA,CAJA,aAAA,CAGA,eAAA,CADA,eAAA,CADA,eAAA,CAIA,sBhB0uCJ,CgBvuCI,+BACE,YhByuCN,CgBtuCM,mCAEE,WAAA,CADA,UhByuCR,CgBjuCQ,sFAME,iBAAA,CALA,aAAA,CAGA,aAAA,CADA,cAAA,CAEA,kBAAA,CAHA,UhBuuCV,CgB5tCE,cAGE,eAAA,CADA,QAAA,CADA,ShBguCJ,CgB1tCE,cACE,ehB4tCJ,CgBztCI,sCACE,ehB2tCN,CgB5tCI,sCACE,chB2tCN,CgBttCE,cAEE,kBAAA,CAKA,cAAA,CANA,YAAA,CAEA,6BAAA,CACA,iBAAA,CACA,eAAA,CAIA,uBAAA,CAHA,sBAAA,CAEA,sBhBytCJ,CgBrtCI,sBACE,uChButCN,CgBntCI,oCACE,+BhBqtCN,CgBjtCI,0CACE,UhBmtCN,CgB/sCI,wCACE,+BhBitCN,CgB7sCI,4BACE,uCAAA,CACA,oBhB+sCN,CgB3sCI,0CACE,YhB6sCN,CgB1sCM,yDAKE,6BAAA,CAJA,aAAA,CAEA,WAAA,CACA,qCAAA,CAAA,6BAAA,CAFA,UhB+sCR,CgBxsCM,kDACE,YhB0sCR,CgBrsCI,gBAEE,cAAA,CADA,YhBwsCN,CgBlsCE,cACE,ahBosCJ,CgBhsCE,gBACE,YhBksCJ,CKjpCI,wCW1CA,0CASE,2CAAA,CAHA,YAAA,CACA,qBAAA,CACA,WAAA,CALA,MAAA,CADA,iBAAA,CACA,OAAA,CACA,KAAA,CACA,ShBisCJ,CgBtrCI,+DACE,eAAA,CACA,ehBwrCN,CgBprCI,gCAQE,qDAAA,CAHA,uCAAA,CAEA,cAAA,CALA,aAAA,CAEA,kBAAA,CADA,wBAAA,CAFA,iBAAA,CAKA,kBhBwrCN,CgBnrCM,wDAGE,UhByrCR,CgB5rCM,wDAGE,WhByrCR,CgB5rCM,8CAIE,aAAA,CAEA,aAAA,CACA,YAAA,CANA,iBAAA,CACA,SAAA,CAGA,YhBurCR,CgBlrCQ,oDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UhB2rCV,CgB/qCM,8CAGE,2CAAA,CACA,gEACE,CAJF,eAAA,CAKA,4BAAA,CAJA,kBhBorCR,CgB7qCQ,2DACE,YhB+qCV,CgB1qCM,8CAGE,2CAAA,CADA,gCAAA,CADA,ehB8qCR,CgBxqCM,yCAIE,aAAA,CAFA,UAAA,CAIA,YAAA,CADA,aAAA,CAJA,iBAAA,CACA,WAAA,CACA,ShB6qCR,CgBrqCI,+BACE,MhBuqCN,CgBnqCI,+BAEE,4DAAA,CADA,ShBsqCN,CgBlqCM,qDACE,+BhBoqCR,CgBjqCQ,sHACE,+BhBmqCV,CgB7pCI,+BAEE,YAAA,CADA,mBhBgqCN,CgB5pCM,uDAGE,mBhB+pCR,CgBlqCM,uDAGE,kBhB+pCR,CgBlqCM,6CAIE,gBAAA,CAFA,aAAA,CADA,YhBiqCR,CgB3pCQ,mDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UhBoqCV,CgBppCM,+CACE,mBhBspCR,CgB9oCM,4CAEE,wBAAA,CADA,ehBipCR,CgB7oCQ,oEACE,mBhB+oCV,CgBhpCQ,oEACE,oBhB+oCV,CgB3oCQ,4EACE,iBhB6oCV,CgB9oCQ,4EACE,kBhB6oCV,CgBzoCQ,oFACE,mBhB2oCV,CgB5oCQ,oFACE,oBhB2oCV,CgBvoCQ,4FACE,mBhByoCV,CgB1oCQ,4FACE,oBhByoCV,CgBloCE,mBACE,wBhBooCJ,CgBhoCE,wBACE,YAAA,CACA,SAAA,CAIA,0BAAA,CAHA,oEhBmoCJ,CgB7nCI,kCACE,2BhB+nCN,CgB1nCE,gCACE,SAAA,CAIA,uBAAA,CAHA,qEhB6nCJ,CgBvnCI,8CAEE,kCAAA,CAAA,0BhBwnCN,CACF,CK/xCI,wCW+KA,0CACE,YhBmnCJ,CgBhnCI,yDACE,UhBknCN,CgB9mCI,wDACE,YhBgnCN,CgB5mCI,kDACE,YhB8mCN,CgBzmCE,gBAIE,iDAAA,CADA,gCAAA,CAFA,aAAA,CACA,ehB6mCJ,CACF,CK51CM,6DWwPF,6CACE,YhBumCJ,CgBpmCI,4DACE,UhBsmCN,CgBlmCI,2DACE,YhBomCN,CgBhmCI,qDACE,YhBkmCN,CACF,CKp1CI,mCW0PA,kCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,ShB6lCJ,CgBxlCI,6CACE,uBhB0lCN,CgBtlCI,gDACE,YhBwlCN,CACF,CKn2CI,sCW7JJ,QA8aI,oDhBslCF,CgBnlCE,gCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,ShBqlCJ,CgBhlCI,8CACE,uBhBklCN,CgBxkCE,sEACE,YhB6kCJ,CgBzkCE,sEACE,ahB2kCJ,CgBvkCE,6CACE,YhBykCJ,CgBrkCE,uBACE,aAAA,CACA,ehBukCJ,CgBpkCI,kCACE,ehBskCN,CgBlkCI,qCACE,eAAA,CACA,mBhBokCN,CgBjkCM,0CACE,uChBmkCR,CgB/jCM,mDACE,mBhBikCR,CgB7jCM,mDACE,YhB+jCR,CgB1jCI,+BACE,ahB4jCN,CgBzjCM,2DACE,ShB2jCR,CgBrjCE,cAGE,kBAAA,CADA,YAAA,CAEA,gCAAA,CAHA,WhB0jCJ,CgBpjCI,oBACE,uDhBsjCN,CgBljCI,oBAME,6BAAA,CACA,kBAAA,CAFA,UAAA,CAJA,oBAAA,CAEA,WAAA,CAMA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAJA,yBAAA,CAJA,qBAAA,CAFA,UhB8jCN,CgBjjCM,8BACE,wBhBmjCR,CgB/iCM,sKAEE,uBhBgjCR,CgBjiCI,+HACE,YhBuiCN,CgBpiCM,oDACE,aAAA,CACA,ShBsiCR,CgBniCQ,kEAOE,qCAAA,CACA,qDAAA,CAFA,eAAA,CADA,YAAA,CADA,eAAA,CAHA,eAAA,CACA,KAAA,CACA,ShB0iCV,CgBliCU,4FACE,mBhBoiCZ,CgBhiCU,gFACE,YhBkiCZ,CgB5hCM,kDACE,uChB8hCR,CgBxhCI,2CACE,ahB0hCN,CgBvhCM,iFACE,mBhByhCR,CgB1hCM,iFACE,kBhByhCR,CgBhhCI,mFACE,ehBkhCN,CgB/gCM,iGACE,ShBihCR,CgB5gCI,qFAGE,mDhB8gCN,CgBjhCI,qFAGE,oDhB8gCN,CgBjhCI,2EACE,aAAA,CACA,oBhB+gCN,CgB3gCM,0FACE,YhB6gCR,CACF,CiB7oDA,MACE,igBjBgpDF,CiB1oDA,WACE,iBjB6oDF,CK/+CI,mCY/JJ,WAKI,ejB6oDF,CACF,CiB1oDE,kBACE,YjB4oDJ,CiBxoDE,oBAEE,SAAA,CADA,SjB2oDJ,CKx+CI,wCYpKF,8BAkBI,YjBwoDJ,CiB1pDA,8BAkBI,ajBwoDJ,CiB1pDA,oBAYI,2CAAA,CACA,kBAAA,CAJA,WAAA,CACA,eAAA,CACA,mBAAA,CALA,iBAAA,CACA,SAAA,CAUA,uBAAA,CAHA,4CACE,CAPF,UjBkpDJ,CiBroDI,+DACE,SAAA,CACA,oCjBuoDN,CACF,CK9gDI,mCYjJF,8BAyCI,MjBioDJ,CiB1qDA,8BAyCI,OjBioDJ,CiB1qDA,oBAoCI,0BAAA,CADA,cAAA,CADA,QAAA,CAHA,cAAA,CACA,KAAA,CAKA,sDACE,CALF,OjByoDJ,CiB9nDI,+DAME,YAAA,CACA,SAAA,CACA,4CACE,CARF,UjBmoDN,CACF,CK7gDI,wCYxGA,+DAII,mBjBqnDN,CACF,CK3jDM,6DY/DF,+DASI,mBjBqnDN,CACF,CKhkDM,6DY/DF,+DAcI,mBjBqnDN,CACF,CiBhnDE,kBAEE,kCAAA,CAAA,0BjBinDJ,CK/hDI,wCYpFF,4BAmBI,MjB6mDJ,CiBhoDA,4BAmBI,OjB6mDJ,CiBhoDA,kBAUI,QAAA,CAEA,SAAA,CADA,eAAA,CALA,cAAA,CACA,KAAA,CAWA,wBAAA,CALA,qGACE,CALF,OAAA,CADA,SjBwnDJ,CiB1mDI,4BACE,yBjB4mDN,CiBxmDI,6DAEE,WAAA,CACA,SAAA,CAMA,uBAAA,CALA,sGACE,CAJF,UjB8mDN,CACF,CK1kDI,mCYjEF,4BA2CI,WjBwmDJ,CiBnpDA,4BA2CI,UjBwmDJ,CiBnpDA,kBA6CI,eAAA,CAHA,iBAAA,CAIA,8CAAA,CAFA,ajBumDJ,CACF,CKzmDM,6DYOF,6DAII,ajBkmDN,CACF,CKxlDI,sCYfA,6DASI,ajBkmDN,CACF,CiB7lDE,iBAIE,2CAAA,CACA,0BAAA,CAFA,aAAA,CAFA,iBAAA,CAKA,2CACE,CALF,SjBmmDJ,CKrmDI,mCYAF,iBAaI,0BAAA,CACA,mBAAA,CAFA,ajB+lDJ,CiB1lDI,uBACE,0BjB4lDN,CACF,CiBxlDI,4DAEE,2CAAA,CACA,6BAAA,CACA,8BAAA,CAHA,gCjB6lDN,CiBrlDE,4BAKE,mBAAA,CAAA,oBjB0lDJ,CiB/lDE,4BAKE,mBAAA,CAAA,oBjB0lDJ,CiB/lDE,kBAQE,gBAAA,CAFA,eAAA,CAFA,WAAA,CAHA,iBAAA,CAMA,sBAAA,CAJA,UAAA,CADA,SjB6lDJ,CiBplDI,+BACE,qBjBslDN,CiBllDI,kEAEE,uCjBmlDN,CiB/kDI,6BACE,YjBilDN,CKrnDI,wCYaF,kBA8BI,eAAA,CADA,aAAA,CADA,UjBklDJ,CACF,CK/oDI,mCYgCF,4BAmCI,mBjBklDJ,CiBrnDA,4BAmCI,oBjBklDJ,CiBrnDA,kBAqCI,aAAA,CADA,ejBilDJ,CiB7kDI,+BACE,uCjB+kDN,CiB3kDI,mCACE,gCjB6kDN,CiBzkDI,6DACE,kBjB2kDN,CiBxkDM,8EACE,uCjB0kDR,CiBtkDM,0EACE,WjBwkDR,CACF,CiBlkDE,iBAIE,cAAA,CAHA,oBAAA,CAEA,aAAA,CAEA,kCACE,CAJF,YjBukDJ,CiB/jDI,uBACE,UjBikDN,CiB7jDI,yCAGE,UjBgkDN,CiBnkDI,yCAGE,WjBgkDN,CiBnkDI,+BACE,iBAAA,CACA,SAAA,CAEA,SjB+jDN,CiB5jDM,6CACE,oBjB8jDR,CKrqDI,wCY+FA,yCAcI,UjB6jDN,CiB3kDE,yCAcI,WjB6jDN,CiB3kDE,+BAaI,SjB8jDN,CiB1jDM,+CACE,YjB4jDR,CACF,CKjsDI,mCYkHA,+BAwBI,mBjB2jDN,CiBxjDM,8CACE,YjB0jDR,CACF,CiBpjDE,8BAGE,WjBwjDJ,CiB3jDE,8BAGE,UjBwjDJ,CiB3jDE,oBAKE,mBAAA,CAJA,iBAAA,CACA,SAAA,CAEA,SjBujDJ,CK7rDI,wCYkIF,8BAUI,WjBsjDJ,CiBhkDA,8BAUI,UjBsjDJ,CiBhkDA,oBASI,SjBujDJ,CACF,CiBnjDI,uCACE,iBjByjDN,CiB1jDI,uCACE,kBjByjDN,CiB1jDI,6BAEE,uCAAA,CACA,SAAA,CAIA,oBAAA,CAHA,+DjBsjDN,CiBhjDM,iDAEE,uCAAA,CADA,YjBmjDR,CiB9iDM,gGAGE,SAAA,CADA,mBAAA,CAEA,kBjB+iDR,CiB5iDQ,sGACE,UjB8iDV,CiBviDE,8BAOE,mBAAA,CAAA,oBjB8iDJ,CiBrjDE,8BAOE,mBAAA,CAAA,oBjB8iDJ,CiBrjDE,oBAIE,kBAAA,CAKA,yCAAA,CANA,YAAA,CAKA,eAAA,CAFA,WAAA,CAKA,SAAA,CAVA,iBAAA,CACA,KAAA,CAUA,uBAAA,CAFA,kBAAA,CALA,UjBgjDJ,CKvvDI,mCYkMF,8BAgBI,mBjB0iDJ,CiB1jDA,8BAgBI,oBjB0iDJ,CiB1jDA,oBAiBI,ejByiDJ,CACF,CiBtiDI,+DACE,SAAA,CACA,0BjBwiDN,CiBniDE,6BAKE,+BjBsiDJ,CiB3iDE,0DAME,gCjBqiDJ,CiB3iDE,6BAME,+BjBqiDJ,CiB3iDE,mBAIE,eAAA,CAHA,iBAAA,CAEA,UAAA,CADA,SjByiDJ,CKtvDI,wCY2MF,mBAWI,QAAA,CADA,UjBsiDJ,CACF,CK/wDI,mCY8NF,mBAiBI,SAAA,CADA,UAAA,CAEA,sBjBqiDJ,CiBliDI,8DACE,8BAAA,CACA,SjBoiDN,CACF,CiB/hDE,uBASE,kCAAA,CAAA,0BAAA,CAFA,2CAAA,CANA,WAAA,CACA,eAAA,CAIA,kBjBgiDJ,CiB1hDI,iEAZF,uBAaI,uBjB6hDJ,CACF,CK5zDM,6DYiRJ,uBAkBI,ajB6hDJ,CACF,CK3yDI,sCY2PF,uBAuBI,ajB6hDJ,CACF,CKhzDI,mCY2PF,uBA4BI,YAAA,CAEA,yDAAA,CADA,oBjB8hDJ,CiB1hDI,kEACE,ejB4hDN,CiBxhDI,6BACE,+CjB0hDN,CiBthDI,0CAEE,YAAA,CADA,WjByhDN,CiBphDI,gDACE,oDjBshDN,CiBnhDM,sDACE,0CjBqhDR,CACF,CiB9gDA,kBACE,gCAAA,CACA,qBjBihDF,CiB9gDE,wBAKE,qDAAA,CADA,uCAAA,CAFA,gBAAA,CACA,kBAAA,CAFA,eAAA,CAKA,uBjBghDJ,CKp1DI,mCY8TF,kCAUI,mBjBghDJ,CiB1hDA,kCAUI,oBjBghDJ,CACF,CiB5gDE,wBAGE,eAAA,CADA,QAAA,CADA,SAAA,CAIA,wBAAA,CAAA,gBjB6gDJ,CiBzgDE,wBACE,yDjB2gDJ,CiBxgDI,oCACE,ejB0gDN,CiBrgDE,wBACE,aAAA,CACA,YAAA,CAEA,uBAAA,CADA,gCjBwgDJ,CiBpgDI,4DACE,uDjBsgDN,CiBlgDI,gDACE,mBjBogDN,CiB//CE,gCAKE,cAAA,CADA,aAAA,CAEA,YAAA,CALA,eAAA,CAMA,uBAAA,CALA,KAAA,CACA,SjBqgDJ,CiB9/CI,wCACE,YjBggDN,CiB3/CI,wDACE,YjB6/CN,CiBz/CI,oCAGE,+BAAA,CADA,gBAAA,CADA,mBAAA,CAGA,2CjB2/CN,CKt4DI,mCYuYA,8CAUI,mBjBy/CN,CiBngDE,8CAUI,oBjBy/CN,CACF,CiBr/CI,oFAEE,uDAAA,CADA,+BjBw/CN,CiBl/CE,sCACE,2CjBo/CJ,CiB/+CE,2BAGE,eAAA,CADA,eAAA,CADA,iBjBm/CJ,CKv5DI,mCYmaF,qCAOI,mBjBi/CJ,CiBx/CA,qCAOI,oBjBi/CJ,CACF,CiB7+CE,kCAEE,MjBm/CJ,CiBr/CE,kCAEE,OjBm/CJ,CiBr/CE,wBAME,uCAAA,CAFA,aAAA,CACA,YAAA,CAJA,iBAAA,CAEA,YjBk/CJ,CKj5DI,wCY4ZF,wBAUI,YjB++CJ,CACF,CiB5+CI,8BAKE,6BAAA,CADA,UAAA,CAHA,oBAAA,CAEA,WAAA,CAGA,+CAAA,CAAA,uCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UjBq/CN,CiB3+CM,wCACE,oBjB6+CR,CiBv+CE,8BAGE,uCAAA,CAFA,gBAAA,CACA,ejB0+CJ,CiBt+CI,iCAKE,gCAAA,CAHA,eAAA,CACA,eAAA,CACA,eAAA,CAHA,ejB4+CN,CiBr+CM,sCACE,oBjBu+CR,CiBl+CI,iCAKE,gCAAA,CAHA,gBAAA,CACA,eAAA,CACA,eAAA,CAHA,ajBw+CN,CiBj+CM,sCACE,oBjBm+CR,CiB79CE,yBAKE,gCAAA,CAJA,aAAA,CAEA,gBAAA,CACA,iBAAA,CAFA,ajBk+CJ,CiB39CE,uBAGE,wBAAA,CAFA,+BAAA,CACA,yBjB89CJ,CkBloEA,WACE,iBAAA,CACA,SlBqoEF,CkBloEE,kBAOE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAHA,gCAAA,CAHA,QAAA,CAEA,gBAAA,CADA,YAAA,CAMA,SAAA,CATA,iBAAA,CACA,sBAAA,CAaA,mCAAA,CAJA,oElBqoEJ,CkB9nEI,6EACE,gBAAA,CACA,SAAA,CAKA,+BAAA,CAJA,8ElBioEN,CkBznEI,wBAWE,+BAAA,CAAA,8CAAA,CAFA,6BAAA,CAAA,8BAAA,CACA,YAAA,CAFA,UAAA,CAHA,QAAA,CAFA,QAAA,CAIA,kBAAA,CADA,iBAAA,CALA,iBAAA,CACA,KAAA,CAEA,OlBkoEN,CkBtnEE,iBAOE,mBAAA,CAFA,eAAA,CACA,oBAAA,CAHA,QAAA,CAFA,kBAAA,CAGA,aAAA,CAFA,SlB6nEJ,CkBpnEE,iBACE,kBlBsnEJ,CkBlnEE,2BAGE,kBAAA,CAAA,oBlBwnEJ,CkB3nEE,2BAGE,mBAAA,CAAA,mBlBwnEJ,CkB3nEE,iBAIE,cAAA,CAHA,aAAA,CAIA,YAAA,CAIA,uBAAA,CAHA,2CACE,CALF,UlBynEJ,CkB/mEI,8CACE,+BlBinEN,CkB7mEI,uBACE,qDlB+mEN,CmBnsEA,YAIE,qBAAA,CADA,aAAA,CAGA,gBAAA,CALA,eAAA,CACA,UAAA,CAGA,anBusEF,CmBnsEE,aATF,YAUI,YnBssEF,CACF,CKxhEI,wCc3KF,+BAeI,anBisEJ,CmBhtEA,+BAeI,cnBisEJ,CmBhtEA,qBAUI,2CAAA,CAHA,aAAA,CAEA,WAAA,CALA,cAAA,CACA,KAAA,CASA,uBAAA,CAHA,iEACE,CAJF,aAAA,CAFA,SnB0sEJ,CmB9rEI,mEACE,8BAAA,CACA,6BnBgsEN,CmB7rEM,6EACE,8BnB+rER,CmB1rEI,6CAEE,QAAA,CAAA,MAAA,CACA,QAAA,CAEA,eAAA,CAJA,iBAAA,CACA,OAAA,CAEA,qBAAA,CAFA,KnB+rEN,CACF,CKvkEI,sCctKJ,YAuDI,QnB0rEF,CmBvrEE,mBACE,WnByrEJ,CmBrrEE,6CACE,UnBurEJ,CACF,CmBnrEE,uBACE,YAAA,CACA,OnBqrEJ,CKtlEI,mCcjGF,uBAMI,QnBqrEJ,CmBlrEI,8BACE,WnBorEN,CmBhrEI,qCACE,anBkrEN,CmB9qEI,+CACE,kBnBgrEN,CACF,CmB3qEE,wBAUE,uBAAA,CANA,kCAAA,CAAA,0BAAA,CAHA,cAAA,CACA,eAAA,CASA,yDAAA,CAFA,oBnB0qEJ,CmBrqEI,2CAEE,YAAA,CADA,WnBwqEN,CmBnqEI,mEACE,+CnBqqEN,CmBlqEM,qHACE,oDnBoqER,CmBjqEQ,iIACE,0CnBmqEV,CmBppEE,wCAGE,wBACE,qBnBopEJ,CmBhpEE,6BACE,kCnBkpEJ,CmBnpEE,6BACE,iCnBkpEJ,CACF,CK9mEI,wCc5BF,YAME,0BAAA,CADA,QAAA,CAEA,SAAA,CANA,cAAA,CACA,KAAA,CAMA,sDACE,CALF,OAAA,CADA,SnBmpEF,CmBxoEE,4CAEE,WAAA,CACA,SAAA,CACA,4CACE,CAJF,UnB6oEJ,CACF,CoB1zEA,iBACE,GACE,QpB4zEF,CoBzzEA,GACE,apB2zEF,CACF,CoBvzEA,gBACE,GACE,SAAA,CACA,0BpByzEF,CoBtzEA,IACE,SpBwzEF,CoBrzEA,GACE,SAAA,CACA,uBpBuzEF,CACF,CoB/yEA,MACE,+eAAA,CACA,ygBAAA,CACA,mmBAAA,CACA,sfpBizEF,CoB3yEA,WAOE,kCAAA,CAAA,0BAAA,CANA,aAAA,CACA,gBAAA,CACA,eAAA,CAEA,uCAAA,CAGA,uBAAA,CAJA,kBpBizEF,CoB1yEE,iBACE,UpB4yEJ,CoBxyEE,iBACE,oBAAA,CAEA,aAAA,CACA,qBAAA,CAFA,UpB4yEJ,CoBvyEI,+BACE,iBpB0yEN,CoB3yEI,+BACE,kBpB0yEN,CoB3yEI,qBAEE,gBpByyEN,CoBryEI,kDACE,iBpBwyEN,CoBzyEI,kDACE,kBpBwyEN,CoBzyEI,kDAEE,iBpBuyEN,CoBzyEI,kDAEE,kBpBuyEN,CoBlyEE,iCAGE,iBpBuyEJ,CoB1yEE,iCAGE,kBpBuyEJ,CoB1yEE,uBACE,oBAAA,CACA,6BAAA,CAEA,eAAA,CACA,sBAAA,CACA,qBpBoyEJ,CoBhyEE,kBACE,YAAA,CAMA,gBAAA,CALA,SAAA,CAMA,oBAAA,CAHA,gBAAA,CAIA,WAAA,CAHA,eAAA,CAFA,SAAA,CADA,UpBwyEJ,CoB/xEI,iDACE,4BpBiyEN,CoB5xEE,iBACE,eAAA,CACA,sBpB8xEJ,CoB3xEI,gDACE,2BpB6xEN,CoBzxEI,kCAIE,kBpBiyEN,CoBryEI,kCAIE,iBpBiyEN,CoBryEI,wBAOE,6BAAA,CADA,UAAA,CALA,oBAAA,CAEA,YAAA,CAKA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CALA,uBAAA,CAHA,WpBmyEN,CoBvxEI,iCACE,apByxEN,CoBrxEI,iCACE,gDAAA,CAAA,wCpBuxEN,CoBnxEI,+BACE,8CAAA,CAAA,sCpBqxEN,CoBjxEI,+BACE,8CAAA,CAAA,sCpBmxEN,CoB/wEI,sCACE,qDAAA,CAAA,6CpBixEN,CqBx6EA,SASE,2CAAA,CADA,gCAAA,CAJA,aAAA,CAGA,eAAA,CADA,aAAA,CADA,UAAA,CAFA,SrB+6EF,CqBt6EE,aAZF,SAaI,YrBy6EF,CACF,CK9vEI,wCgBzLJ,SAkBI,YrBy6EF,CACF,CqBt6EE,iBACE,mBrBw6EJ,CqBp6EE,yBAGE,iBrB26EJ,CqB96EE,yBAGE,kBrB26EJ,CqB96EE,eAOE,eAAA,CADA,eAAA,CAJA,QAAA,CAEA,aAAA,CAHA,SAAA,CAWA,oBAAA,CAPA,kBrBy6EJ,CqB/5EI,kCACE,YrBi6EN,CqB55EE,eACE,oBAAA,CACA,aAAA,CACA,kBAAA,CAAA,mBrB85EJ,CqBz5EE,eAOE,kCAAA,CAAA,0BAAA,CANA,aAAA,CAEA,eAAA,CADA,gBAAA,CAMA,UAAA,CAJA,uCAAA,CACA,oBAAA,CAIA,8DrB05EJ,CqBr5EI,iEAEE,aAAA,CACA,SrBs5EN,CqBj5EM,2CACE,qBrBm5ER,CqBp5EM,2CACE,qBrBs5ER,CqBv5EM,2CACE,qBrBy5ER,CqB15EM,2CACE,qBrB45ER,CqB75EM,2CACE,oBrB+5ER,CqBh6EM,2CACE,qBrBk6ER,CqBn6EM,2CACE,qBrBq6ER,CqBt6EM,2CACE,qBrBw6ER,CqBz6EM,4CACE,qBrB26ER,CqB56EM,4CACE,oBrB86ER,CqB/6EM,4CACE,qBrBi7ER,CqBl7EM,4CACE,qBrBo7ER,CqBr7EM,4CACE,qBrBu7ER,CqBx7EM,4CACE,qBrB07ER,CqB37EM,4CACE,oBrB67ER,CqBv7EI,gCACE,SAAA,CAIA,yBAAA,CAHA,wCrB07EN,CsBjhFA,MACE,wStBohFF,CsB3gFE,qBAEE,mBAAA,CADA,kBtB+gFJ,CsB1gFE,8BAGE,iBtBohFJ,CsBvhFE,8BAGE,gBtBohFJ,CsBvhFE,oBAUE,+CAAA,CACA,oBAAA,CAVA,oBAAA,CAIA,gBAAA,CACA,eAAA,CAEA,qBAAA,CADA,eAAA,CAHA,kBAAA,CAFA,uBAAA,CAOA,qBtB8gFJ,CsBzgFI,0BAGE,uCAAA,CAFA,aAAA,CACA,YAAA,CAEA,6CtB2gFN,CsBtgFM,gEAEE,0CAAA,CADA,+BtBygFR,CsBngFI,yBACE,uBtBqgFN,CsB7/EI,gCAOE,oDAAA,CADA,UAAA,CALA,oBAAA,CAEA,YAAA,CACA,iBAAA,CAKA,qCAAA,CAAA,6BAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAJA,iCAAA,CAHA,0BAAA,CAHA,WtBygFN,CsB3/EI,wFACE,0CtB6/EN,CuBrkFA,iBACE,GACE,uDAAA,CACA,oBvBwkFF,CuBrkFA,IACE,6BAAA,CACA,kBvBukFF,CuBpkFA,GACE,wBAAA,CACA,oBvBskFF,CACF,CuB9jFA,MACE,wBvBgkFF,CuB1jFA,YA6BE,kCAAA,CAAA,0BAAA,CAVA,2CAAA,CACA,mBAAA,CACA,8BAAA,CAHA,gCAAA,CADA,sCAAA,CAdA,+IACE,CAYF,8BAAA,CAMA,SAAA,CArBA,iBAAA,CACA,uBAAA,CAyBA,4BAAA,CAJA,uDACE,CATF,6BAAA,CADA,SvBqkFF,CuBnjFE,oBAEE,SAAA,CAKA,uBAAA,CAJA,2EACE,CAHF,SvBwjFJ,CuB9iFE,8CACE,sCvBgjFJ,CuB5iFE,mBAEE,gBAAA,CADA,avB+iFJ,CuB3iFI,2CACE,YvB6iFN,CuBziFI,0CACE,evB2iFN,CuBniFA,eACE,eAAA,CAEA,YAAA,CADA,kBvBuiFF,CuBniFE,yBACE,avBqiFJ,CuBjiFE,6BACE,oBAAA,CAGA,iBvBiiFJ,CuB7hFE,sBAME,cAAA,CAFA,sCAAA,CACA,eAAA,CAFA,YAAA,CAKA,YAAA,CAPA,iBAAA,CAMA,wBAAA,CAAA,gBAAA,CALA,SvBqiFJ,CuB5hFI,qCACE,UAAA,CACA,uBvB8hFN,CuB3hFM,sFACE,UvB6hFR,CuBrhFI,4BAaE,oDAAA,CACA,iBAAA,CAFA,UAAA,CAHA,YAAA,CANA,YAAA,CAQA,cAAA,CADA,cAAA,CATA,iBAAA,CACA,KAAA,CAaA,2CACE,CATF,wBAAA,CACA,6BAAA,CAJA,UvBgiFN,CuBhhFM,4CAGE,8CACE,2BvBghFR,CACF,CuB5gFM,gDAIE,cAAA,CAHA,2CvB+gFR,CuBvgFI,2BACE,sCAAA,CACA,iBvBygFN,CuBrgFI,uEACE,+BvBugFN,CuBpgFM,mFACE,0CvBsgFR,CuBjgFI,0CAGE,cAAA,CADA,eAAA,CADA,SvBqgFN,CuB//EI,8CACE,oBAAA,CACA,evBigFN,CuB9/EM,qDAIE,mCAAA,CAHA,oBAAA,CACA,mBAAA,CAIA,qBAAA,CADA,iDAAA,CAFA,qBvBmgFR,CuB5/EQ,iBAVF,qDAWI,WvB+/ER,CuB5/EQ,mEACE,mCvB8/EV,CACF,CwB5tFA,kBAME,exBwuFF,CwB9uFA,kBAME,gBxBwuFF,CwB9uFA,QAUE,2CAAA,CACA,oBAAA,CAEA,8BAAA,CALA,uCAAA,CACA,cAAA,CALA,aAAA,CAGA,eAAA,CAKA,YAAA,CAPA,mBAAA,CAJA,cAAA,CACA,UAAA,CAiBA,yBAAA,CALA,mGACE,CAZF,SxB2uFF,CwBxtFE,aAtBF,QAuBI,YxB2tFF,CACF,CwBxtFE,kBACE,wBxB0tFJ,CwBttFE,gBAEE,SAAA,CADA,mBAAA,CAGA,+BAAA,CADA,uBxBytFJ,CwBrtFI,0BACE,8BxButFN,CwBltFE,4BAEE,0CAAA,CADA,+BxBqtFJ,CwBhtFE,YACE,oBAAA,CACA,oBxBktFJ,CyBvwFA,oBACE,GACE,mBzB0wFF,CACF,CyBlwFA,MACE,wfzBowFF,CyB9vFA,YACE,aAAA,CAEA,eAAA,CADA,azBkwFF,CyB9vFE,+BAOE,kBAAA,CAAA,kBzB+vFJ,CyBtwFE,+BAOE,iBAAA,CAAA,mBzB+vFJ,CyBtwFE,qBAQE,aAAA,CACA,cAAA,CACA,YAAA,CATA,iBAAA,CAKA,UzBgwFJ,CyBzvFI,qCAIE,iBzBiwFN,CyBrwFI,qCAIE,kBzBiwFN,CyBrwFI,2BAME,6BAAA,CADA,UAAA,CAJA,oBAAA,CAEA,YAAA,CAIA,yCAAA,CAAA,iCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,WzBmwFN,CyBtvFE,kBAUE,2CAAA,CACA,mBAAA,CACA,8BAAA,CAJA,gCAAA,CACA,oBAAA,CAHA,kBAAA,CAFA,YAAA,CASA,SAAA,CANA,aAAA,CAFA,SAAA,CAJA,iBAAA,CAgBA,4BAAA,CAfA,UAAA,CAYA,+CACE,CAZF,SzBowFJ,CyBnvFI,+EACE,gBAAA,CACA,SAAA,CACA,sCzBqvFN,CyB/uFI,wBAGE,oCACE,gCzB+uFN,CyB3uFI,2CACE,czB6uFN,CACF,CyBxuFE,kBACE,kBzB0uFJ,CyBtuFE,4BAGE,kBAAA,CAAA,oBzB6uFJ,CyBhvFE,4BAGE,mBAAA,CAAA,mBzB6uFJ,CyBhvFE,kBAKE,cAAA,CAJA,aAAA,CAKA,YAAA,CAIA,uBAAA,CAHA,2CACE,CAJF,kBAAA,CAFA,UzB8uFJ,CyBnuFI,gDACE,+BzBquFN,CyBjuFI,wBACE,qDzBmuFN,C0Bp0FA,MAEI,uWAAA,CAAA,8WAAA,CAAA,sPAAA,CAAA,8xBAAA,CAAA,0MAAA,CAAA,gbAAA,CAAA,gMAAA,CAAA,iQAAA,CAAA,0VAAA,CAAA,6aAAA,CAAA,8SAAA,CAAA,gM1B61FJ,C0Bj1FE,4CAME,8CAAA,CACA,2BAAA,CACA,mBAAA,CACA,8BAAA,CAJA,mCAAA,CAJA,iBAAA,CAGA,gBAAA,CADA,iBAAA,CADA,eAAA,CAQA,uB1Bo1FJ,C0Bj1FI,aAbF,4CAcI,e1Bo1FJ,CACF,C0Bh1FI,gDACE,qB1Bk1FN,C0B90FI,gIAEE,iBAAA,CADA,c1Bi1FN,C0B50FI,4FACE,iB1B80FN,C0B10FI,kFACE,e1B40FN,C0Bx0FI,0FACE,Y1B00FN,C0Bt0FI,8EACE,mB1Bw0FN,C0Bn0FE,sEAGE,iBAAA,CAAA,mB1B60FJ,C0Bh1FE,sEAGE,kBAAA,CAAA,kB1B60FJ,C0Bh1FE,sEASE,uB1Bu0FJ,C0Bh1FE,sEASE,wB1Bu0FJ,C0Bh1FE,sEAUE,4B1Bs0FJ,C0Bh1FE,4IAWE,6B1Bq0FJ,C0Bh1FE,sEAWE,4B1Bq0FJ,C0Bh1FE,kDAOE,0BAAA,CACA,WAAA,CAFA,eAAA,CADA,eAAA,CAHA,oBAAA,CAAA,iBAAA,CADA,iB1B+0FJ,C0Bl0FI,kFACE,e1Bo0FN,C0Bh0FI,oFAOE,U1Bs0FN,C0B70FI,oFAOE,W1Bs0FN,C0B70FI,gEAME,wBCwIU,CDzIV,UAAA,CADA,WAAA,CAIA,kDAAA,CAAA,0CAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,UAAA,CACA,U1B00FN,C0B9zFI,4DACE,4D1Bg0FN,C0BlzFE,sDACE,oB1BqzFJ,C0BjzFE,8DACE,0B1BozFJ,C0BjzFI,4EACE,wBAbG,CAcH,kDAAA,CAAA,0C1BmzFN,C0B/yFI,0EACE,a1BizFN,C0Bj0FE,8DACE,oB1Bo0FJ,C0Bh0FE,sEACE,0B1Bm0FJ,C0Bh0FI,oFACE,wBAbG,CAcH,sDAAA,CAAA,8C1Bk0FN,C0B9zFI,kFACE,a1Bg0FN,C0Bh1FE,sDACE,oB1Bm1FJ,C0B/0FE,8DACE,0B1Bk1FJ,C0B/0FI,4EACE,wBAbG,CAcH,kDAAA,CAAA,0C1Bi1FN,C0B70FI,0EACE,a1B+0FN,C0B/1FE,oDACE,oB1Bk2FJ,C0B91FE,4DACE,0B1Bi2FJ,C0B91FI,0EACE,wBAbG,CAcH,iDAAA,CAAA,yC1Bg2FN,C0B51FI,wEACE,a1B81FN,C0B92FE,4DACE,oB1Bi3FJ,C0B72FE,oEACE,0B1Bg3FJ,C0B72FI,kFACE,wBAbG,CAcH,qDAAA,CAAA,6C1B+2FN,C0B32FI,gFACE,a1B62FN,C0B73FE,8DACE,oB1Bg4FJ,C0B53FE,sEACE,0B1B+3FJ,C0B53FI,oFACE,wBAbG,CAcH,sDAAA,CAAA,8C1B83FN,C0B13FI,kFACE,a1B43FN,C0B54FE,4DACE,oB1B+4FJ,C0B34FE,oEACE,0B1B84FJ,C0B34FI,kFACE,wBAbG,CAcH,qDAAA,CAAA,6C1B64FN,C0Bz4FI,gFACE,a1B24FN,C0B35FE,4DACE,oB1B85FJ,C0B15FE,oEACE,0B1B65FJ,C0B15FI,kFACE,wBAbG,CAcH,qDAAA,CAAA,6C1B45FN,C0Bx5FI,gFACE,a1B05FN,C0B16FE,0DACE,oB1B66FJ,C0Bz6FE,kEACE,0B1B46FJ,C0Bz6FI,gFACE,wBAbG,CAcH,oDAAA,CAAA,4C1B26FN,C0Bv6FI,8EACE,a1By6FN,C0Bz7FE,oDACE,oB1B47FJ,C0Bx7FE,4DACE,0B1B27FJ,C0Bx7FI,0EACE,wBAbG,CAcH,iDAAA,CAAA,yC1B07FN,C0Bt7FI,wEACE,a1Bw7FN,C0Bx8FE,4DACE,oB1B28FJ,C0Bv8FE,oEACE,0B1B08FJ,C0Bv8FI,kFACE,wBAbG,CAcH,qDAAA,CAAA,6C1By8FN,C0Br8FI,gFACE,a1Bu8FN,C0Bv9FE,wDACE,oB1B09FJ,C0Bt9FE,gEACE,0B1By9FJ,C0Bt9FI,8EACE,wBAbG,CAcH,mDAAA,CAAA,2C1Bw9FN,C0Bp9FI,4EACE,a1Bs9FN,C4B/mGA,MACE,wM5BknGF,C4BzmGE,sBAEE,uCAAA,CADA,gB5B6mGJ,C4BzmGI,mCACE,a5B2mGN,C4B5mGI,mCACE,c5B2mGN,C4BvmGM,4BACE,sB5BymGR,C4BtmGQ,mCACE,gC5BwmGV,C4BpmGQ,2DACE,SAAA,CAEA,uBAAA,CADA,e5BumGV,C4BlmGQ,yGACE,SAAA,CACA,uB5BomGV,C4BhmGQ,yCACE,Y5BkmGV,C4B3lGE,0BACE,eAAA,CACA,e5B6lGJ,C4B1lGI,+BACE,oB5B4lGN,C4BvlGE,gDACE,Y5BylGJ,C4BrlGE,8BAIE,+BAAA,CAHA,oBAAA,CAEA,WAAA,CAGA,SAAA,CAKA,4BAAA,CAJA,4DACE,CAHF,0B5BylGJ,C4BhlGI,aAdF,8BAeI,+BAAA,CACA,SAAA,CACA,uB5BmlGJ,CACF,C4BhlGI,wCACE,6B5BklGN,C4B9kGI,oCACE,+B5BglGN,C4B5kGI,qCAKE,6BAAA,CADA,UAAA,CAHA,oBAAA,CAEA,YAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,W5BqlGN,C4BxkGQ,mDACE,oB5B0kGV,C6BxrGE,kCAEE,iB7B8rGJ,C6BhsGE,kCAEE,kB7B8rGJ,C6BhsGE,wBAGE,yCAAA,CAFA,oBAAA,CAGA,SAAA,CACA,mC7B2rGJ,C6BtrGI,aAVF,wBAWI,Y7ByrGJ,CACF,C6BrrGE,6FAEE,SAAA,CACA,mC7BurGJ,C6BjrGE,4FAEE,+B7BmrGJ,C6B/qGE,oBACE,yBAAA,CACA,uBAAA,CAGA,yE7B+qGJ,CKhjGI,sCwBrHE,qDACE,uB7BwqGN,CACF,C6BnqGE,kEACE,yB7BqqGJ,C6BjqGE,sBACE,0B7BmqGJ,C8B9tGE,2BACE,a9BiuGJ,CK5iGI,wCyBtLF,2BAKI,e9BiuGJ,CACF,C8B9tGI,6BAGE,0BAAA,CAAA,2BAAA,CADA,eAAA,CAEA,iBAAA,CAHA,yBAAA,CAAA,iB9BmuGN,C8B7tGM,2CACE,kB9B+tGR,C+BhvGE,uBACE,4C/BovGJ,C+B/uGE,8CAJE,kCAAA,CAAA,0B/BuvGJ,C+BnvGE,uBACE,4C/BkvGJ,C+B7uGE,4BAEE,kCAAA,CAAA,0BAAA,CADA,qC/BgvGJ,C+B5uGI,mCACE,a/B8uGN,C+B1uGI,kCACE,a/B4uGN,C+BvuGE,0BAKE,eAAA,CAJA,aAAA,CAEA,YAAA,CACA,aAAA,CAFA,kBAAA,CAAA,mB/B4uGJ,C+BtuGI,uCACE,e/BwuGN,C+BpuGI,sCACE,kB/BsuGN,CgCnxGA,MACE,8LhCsxGF,CgC7wGE,oBAGE,iBAAA,CAEA,gBAAA,CADA,ahC+wGJ,CgC3wGI,wCACE,uBhC6wGN,CgCzwGI,gCAEE,eAAA,CADA,gBhC4wGN,CgCrwGM,wCACE,mBhCuwGR,CgCjwGE,8BAKE,oBhCowGJ,CgCzwGE,8BAKE,mBhCowGJ,CgCzwGE,8BAOE,4BhCkwGJ,CgCzwGE,4DAQE,6BhCiwGJ,CgCzwGE,8BAQE,4BhCiwGJ,CgCzwGE,oBAME,cAAA,CAHA,aAAA,CACA,ehCqwGJ,CgC9vGI,kCACE,uCAAA,CACA,oBhCgwGN,CgC5vGI,wCAEE,uCAAA,CADA,YhC+vGN,CgC1vGI,oCASE,WhCgwGN,CgCzwGI,oCASE,UhCgwGN,CgCzwGI,0BAME,6BAAA,CADA,UAAA,CADA,WAAA,CAMA,yCAAA,CAAA,iCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAZA,iBAAA,CACA,UAAA,CAMA,sBAAA,CADA,yBAAA,CAJA,UhCswGN,CgCzvGM,oCACE,wBhC2vGR,CgCtvGI,4BACE,YhCwvGN,CgCnvGI,4CACE,YhCqvGN,CiC50GE,+DACE,mBAAA,CACA,cAAA,CACA,uBjC+0GJ,CiC50GI,2EAGE,iBAAA,CADA,eAAA,CADA,ajCg1GN,CkCt1GE,6BACE,sClCy1GJ,CkCt1GE,cACE,yClCw1GJ,CkC50GE,sIACE,oClC80GJ,CkCt0GE,2EACE,qClCw0GJ,CkC9zGE,wGACE,oClCg0GJ,CkCvzGE,yFACE,qClCyzGJ,CkCpzGE,6BACE,kClCszGJ,CkChzGE,6CACE,sClCkzGJ,CkC3yGE,4DACE,sClC6yGJ,CkCtyGE,4DACE,qClCwyGJ,CkC/xGE,yFACE,qClCiyGJ,CkCzxGE,2EACE,sClC2xGJ,CkChxGE,wHACE,qClCkxGJ,CkC7wGE,8BAGE,mBAAA,CADA,gBAAA,CADA,gBlCixGJ,CkC5wGE,eACE,4ClC8wGJ,CkC3wGE,eACE,4ClC6wGJ,CkCzwGE,gBAIE,wCAAA,CAHA,aAAA,CAEA,wBAAA,CADA,wBlC6wGJ,CkCvwGE,yBAOE,wCAAA,CACA,+DAAA,CACA,4BAAA,CACA,6BAAA,CARA,iBAAA,CAGA,eAAA,CACA,eAAA,CAFA,cAAA,CADA,oCAAA,CAFA,iBlCkxGJ,CkCtwGI,6BACE,YlCwwGN,CkCrwGM,kCACE,wBAAA,CACA,yBlCuwGR,CkCjwGE,iCAaE,wCAAA,CACA,+DAAA,CAJA,uCAAA,CACA,0BAAA,CALA,UAAA,CAJA,oBAAA,CAOA,2BAAA,CADA,2BAAA,CADA,2BAAA,CANA,eAAA,CAWA,wBAAA,CAAA,gBAAA,CAPA,SlC0wGJ,CkCxvGE,sBACE,iBAAA,CACA,iBlC0vGJ,CkClvGI,sCACE,gBlCovGN,CkChvGI,gDACE,YlCkvGN,CkCxuGA,gBACE,iBlC2uGF,CkCvuGE,yCACE,aAAA,CACA,SlCyuGJ,CkCpuGE,mBACE,YlCsuGJ,CkCjuGE,oBACE,QlCmuGJ,CkC/tGE,4BACE,WAAA,CACA,SAAA,CACA,elCiuGJ,CkC9tGI,0CACE,YlCguGN,CkC1tGE,yBAKE,wCAAA,CAEA,+BAAA,CADA,4BAAA,CAHA,eAAA,CADA,oDAAA,CAEA,wBAAA,CAAA,gBlC+tGJ,CkCxtGE,2BAEE,+DAAA,CADA,2BlC2tGJ,CkCvtGI,+BACE,uCAAA,CACA,gBlCytGN,CkCptGE,sBACE,MAAA,CACA,WlCstGJ,CkCjtGA,aACE,alCotGF,CkC1sGE,4BAEE,aAAA,CADA,YlC8sGJ,CkC1sGI,wDAEE,2BAAA,CADA,wBlC6sGN,CkCvsGE,+BAKE,2CAAA,CAEA,+BAAA,CADA,gCAAA,CADA,sBAAA,CAHA,mBAAA,CACA,gBAAA,CAFA,alC+sGJ,CkCtsGI,qCAEE,UAAA,CACA,UAAA,CAFA,alC0sGN,CK30GI,wC6BgJF,8BACE,iBlC+rGF,CkCrrGE,wSAGE,elC2rGJ,CkCvrGE,sCAEE,mBAAA,CACA,eAAA,CADA,oBAAA,CADA,kBAAA,CAAA,mBlC2rGJ,CACF,CDlhHI,yDAIE,+BAAA,CACA,8BAAA,CAFA,aAAA,CADA,QAAA,CADA,iBCwhHN,CDhhHI,uBAEE,uCAAA,CADA,cCmhHN,CD99GM,iHAEE,WAlDkB,CAiDlB,kBCy+GR,CD1+GM,6HAEE,WAlDkB,CAiDlB,kBCq/GR,CDt/GM,6HAEE,WAlDkB,CAiDlB,kBCigHR,CDlgHM,oHAEE,WAlDkB,CAiDlB,kBC6gHR,CD9gHM,0HAEE,WAlDkB,CAiDlB,kBCyhHR,CD1hHM,uHAEE,WAlDkB,CAiDlB,kBCqiHR,CDtiHM,uHAEE,WAlDkB,CAiDlB,kBCijHR,CDljHM,6HAEE,WAlDkB,CAiDlB,kBC6jHR,CD9jHM,yCAEE,WAlDkB,CAiDlB,kBCikHR,CDlkHM,yCAEE,WAlDkB,CAiDlB,kBCqkHR,CDtkHM,0CAEE,WAlDkB,CAiDlB,kBCykHR,CD1kHM,uCAEE,WAlDkB,CAiDlB,kBC6kHR,CD9kHM,wCAEE,WAlDkB,CAiDlB,kBCilHR,CDllHM,sCAEE,WAlDkB,CAiDlB,kBCqlHR,CDtlHM,wCAEE,WAlDkB,CAiDlB,kBCylHR,CD1lHM,oCAEE,WAlDkB,CAiDlB,kBC6lHR,CD9lHM,2CAEE,WAlDkB,CAiDlB,kBCimHR,CDlmHM,qCAEE,WAlDkB,CAiDlB,kBCqmHR,CDtmHM,oCAEE,WAlDkB,CAiDlB,kBCymHR,CD1mHM,kCAEE,WAlDkB,CAiDlB,kBC6mHR,CD9mHM,qCAEE,WAlDkB,CAiDlB,kBCinHR,CDlnHM,mCAEE,WAlDkB,CAiDlB,kBCqnHR,CDtnHM,qCAEE,WAlDkB,CAiDlB,kBCynHR,CD1nHM,wCAEE,WAlDkB,CAiDlB,kBC6nHR,CD9nHM,sCAEE,WAlDkB,CAiDlB,kBCioHR,CDloHM,2CAEE,WAlDkB,CAiDlB,kBCqoHR,CD1nHM,iCAEE,WAPkB,CAMlB,iBC6nHR,CD9nHM,uCAEE,WAPkB,CAMlB,iBCioHR,CDloHM,mCAEE,WAPkB,CAMlB,iBCqoHR,CmCvtHA,MACE,qMAAA,CACA,mMnC0tHF,CmCjtHE,wBAKE,mBAAA,CAHA,YAAA,CACA,qBAAA,CACA,YAAA,CAHA,iBnCwtHJ,CmC9sHI,8BAGE,QAAA,CACA,SAAA,CAHA,iBAAA,CACA,OnCktHN,CmC7sHM,qCACE,0BnC+sHR,CmChrHE,2BAKE,uBAAA,CADA,+DAAA,CAHA,YAAA,CACA,cAAA,CACA,aAAA,CAGA,oBnCkrHJ,CmC/qHI,aATF,2BAUI,gBnCkrHJ,CACF,CmC/qHI,cAGE,+BACE,iBnC+qHN,CmC5qHM,sCAQE,oCAAA,CANA,QAAA,CAKA,UAAA,CAHA,aAAA,CAEA,UAAA,CAHA,MAAA,CAFA,iBAAA,CAYA,2CAAA,CAJA,qCACE,CAEF,kDAAA,CAPA,+BnCorHR,CACF,CmCvqHI,8CACE,YnCyqHN,CmCrqHI,iCASE,+BAAA,CACA,6BAAA,CAJA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,gBAAA,CACA,eAAA,CAFA,8BAAA,CAWA,+BAAA,CAHA,2CACE,CALF,kBAAA,CALA,UnCirHN,CmClqHM,aAII,6CACE,OnCiqHV,CmClqHQ,8CACE,OnCoqHV,CmCrqHQ,8CACE,OnCuqHV,CmCxqHQ,8CACE,OnC0qHV,CmC3qHQ,8CACE,OnC6qHV,CmC9qHQ,8CACE,OnCgrHV,CmCjrHQ,8CACE,OnCmrHV,CmCprHQ,8CACE,OnCsrHV,CmCvrHQ,8CACE,OnCyrHV,CmC1rHQ,+CACE,QnC4rHV,CmC7rHQ,+CACE,QnC+rHV,CmChsHQ,+CACE,QnCksHV,CmCnsHQ,+CACE,QnCqsHV,CmCtsHQ,+CACE,QnCwsHV,CmCzsHQ,+CACE,QnC2sHV,CmC5sHQ,+CACE,QnC8sHV,CmC/sHQ,+CACE,QnCitHV,CmCltHQ,+CACE,QnCotHV,CmCrtHQ,+CACE,QnCutHV,CmCxtHQ,+CACE,QnC0tHV,CACF,CmCrtHM,uCACE,+BnCutHR,CmCjtHE,4BACE,UnCmtHJ,CmChtHI,aAJF,4BAKI,gBnCmtHJ,CACF,CmC/sHE,0BACE,YnCitHJ,CmC9sHI,aAJF,0BAKI,anCitHJ,CmC7sHM,sCACE,OnC+sHR,CmChtHM,uCACE,OnCktHR,CmCntHM,uCACE,OnCqtHR,CmCttHM,uCACE,OnCwtHR,CmCztHM,uCACE,OnC2tHR,CmC5tHM,uCACE,OnC8tHR,CmC/tHM,uCACE,OnCiuHR,CmCluHM,uCACE,OnCouHR,CmCruHM,uCACE,OnCuuHR,CmCxuHM,wCACE,QnC0uHR,CmC3uHM,wCACE,QnC6uHR,CmC9uHM,wCACE,QnCgvHR,CmCjvHM,wCACE,QnCmvHR,CmCpvHM,wCACE,QnCsvHR,CmCvvHM,wCACE,QnCyvHR,CmC1vHM,wCACE,QnC4vHR,CmC7vHM,wCACE,QnC+vHR,CmChwHM,wCACE,QnCkwHR,CmCnwHM,wCACE,QnCqwHR,CmCtwHM,wCACE,QnCwwHR,CACF,CmClwHI,+FAEE,QnCowHN,CmCjwHM,yGACE,wBAAA,CACA,yBnCowHR,CmC3vHM,2DAEE,wBAAA,CACA,yBAAA,CAFA,QnC+vHR,CmCxvHM,iEACE,QnC0vHR,CmCvvHQ,qLAGE,wBAAA,CACA,yBAAA,CAFA,QnC2vHV,CmCrvHQ,6FACE,wBAAA,CACA,yBnCuvHV,CmClvHM,yDACE,kBnCovHR,CmC/uHI,sCACE,QnCivHN,CmC5uHE,2BAEE,iBAAA,CAOA,kBAAA,CAHA,uCAAA,CAEA,cAAA,CAPA,aAAA,CAGA,YAAA,CACA,gBAAA,CAEA,mBAAA,CAGA,gCAAA,CAPA,WnCqvHJ,CmC3uHI,iCAEE,uDAAA,CADA,+BnC8uHN,CmCzuHI,iCAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAMA,8CAAA,CAAA,sCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CANA,+CACE,CALF,UnCmvHN,CmCpuHE,4BAOE,yEACE,CANF,YAAA,CAGA,aAAA,CAFA,qBAAA,CAGA,mBAAA,CALA,iBAAA,CAYA,wBAAA,CATA,YnC0uHJ,CmC9tHI,sCACE,wBnCguHN,CmC5tHI,oCACE,SnC8tHN,CmC1tHI,kCAGE,wEACE,CAFF,mBAAA,CADA,OnC8tHN,CmCptHM,uDACE,8CAAA,CAAA,sCnCstHR,CKt0HI,wC8B8HF,wDAEE,kBnC8sHF,CmChtHA,wDAEE,mBnC8sHF,CmChtHA,8CAGE,eAAA,CAFA,eAAA,CAGA,iCnC4sHF,CmCxsHE,8DACE,mBnC2sHJ,CmC5sHE,8DACE,kBnC2sHJ,CmC5sHE,oDAEE,UnC0sHJ,CmCtsHE,8EAEE,kBnCysHJ,CmC3sHE,8EAEE,mBnCysHJ,CmC3sHE,8EAGE,kBnCwsHJ,CmC3sHE,8EAGE,mBnCwsHJ,CmC3sHE,oEACE,UnC0sHJ,CmCpsHE,8EAEE,mBnCusHJ,CmCzsHE,8EAEE,kBnCusHJ,CmCzsHE,8EAGE,mBnCssHJ,CmCzsHE,8EAGE,kBnCssHJ,CmCzsHE,oEACE,UnCwsHJ,CACF,CmC1rHE,cAHF,olDAII,+BnC6rHF,CmC1rHE,g8GACE,sCnC4rHJ,CACF,CmCvrHA,4sDACE,uDnC0rHF,CmCtrHA,wmDACE,anCyrHF,CoCtiIA,MACE,8WAAA,CAEA,uXpC0iIF,CoChiIE,4BAEE,oBAAA,CADA,iBpCoiIJ,CoC/hII,sDAGE,SpCiiIN,CoCpiII,sDAGE,UpCiiIN,CoCpiII,4CACE,iBAAA,CACA,SpCkiIN,CoC5hIE,+CAEE,SAAA,CADA,UpC+hIJ,CoC1hIE,kDAOE,WpCgiIJ,CoCviIE,kDAOE,YpCgiIJ,CoCviIE,wCAME,qDAAA,CADA,UAAA,CADA,aAAA,CAIA,0CAAA,CAAA,kCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAVA,iBAAA,CACA,SAAA,CACA,YpCoiIJ,CoCxhIE,gEACE,wBTyWa,CSxWb,mDAAA,CAAA,2CpC0hIJ,CqC5kIA,QACE,8DAAA,CAGA,+CAAA,CACA,iEAAA,CACA,oDAAA,CACA,sDAAA,CACA,mDrC6kIF,CqCvkIA,SAEE,kBAAA,CADA,YrC2kIF,CKp7HI,mCiChKA,8BACE,UtC4lIJ,CsC7lIE,8BACE,WtC4lIJ,CsC7lIE,8BAGE,kBtC0lIJ,CsC7lIE,8BAGE,iBtC0lIJ,CsC7lIE,oBAKE,mBAAA,CADA,YAAA,CAFA,atC2lIJ,CsCrlII,kCACE,WtCwlIN,CsCzlII,kCACE,UtCwlIN,CsCzlII,kCAEE,iBAAA,CAAA,ctCulIN,CsCzlII,kCAEE,aAAA,CAAA,kBtCulIN,CACF","file":"main.css"} \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html index f2af76495..e223523c0 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + diff --git a/examples/finetuning.ipynb b/examples/finetuning.ipynb index 486693185..165733923 100644 --- a/examples/finetuning.ipynb +++ b/examples/finetuning.ipynb @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -79,7 +79,7 @@ "\"From: dougb@comm.mot.com (Doug Bank)\\nSubject: Re: Info needed for Cleveland tickets\\nReply-To: dougb@ecs.comm.mot.com\\nOrganization: Motorola Land Mobile Products Sector\\nDistribution: usa\\nNntp-Posting-Host: 145.1.146.35\\nLines: 17\\n\\nIn article <1993Apr1.234031.4950@leland.Stanford.EDU>, bohnert@leland.Stanford.EDU (matthew bohnert) writes:\\n\\n|> I'm going to be in Cleveland Thursday, April 15 to Sunday, April 18.\\n|> Does anybody know if the Tribe will be in town on those dates, and\\n|> if so, who're they playing and if tickets are available?\\n\\nThe tribe will be in town from April 16 to the 19th.\\nThere are ALWAYS tickets available! (Though they are playing Toronto,\\nand many Toronto fans make the trip to Cleveland as it is easier to\\nget tickets in Cleveland than in Toronto. Either way, I seriously\\ndoubt they will sell out until the end of the season.)\\n\\n-- \\nDoug Bank Private Systems Division\\ndougb@ecs.comm.mot.com Motorola Communications Sector\\ndougb@nwu.edu Schaumburg, Illinois\\ndougb@casbah.acns.nwu.edu 708-576-8207\"" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -102,7 +102,7 @@ "Name: count, dtype: int64" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -113,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -125,7 +125,7 @@ "Name: count, dtype: int64" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -143,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -167,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -234,7 +234,7 @@ "4 baseball Prompt: Subject: Let it be Known\\nFrom: 974\n", " From: maX <maX@maxim.rinaco.msk.su>\\nSubject: ...\n", " hockey\n", - " \n", - " \n", - " \n", - " 988\n", - " From: jca2@cec1.wustl.edu (Joseph Charles Achk...\n", - " hockey\n", - " NHL\n", - " \n", - " \n", - " 997\n", - " From: apland@mala.bc.ca (Ron Apland)\\nSubject:...\n", - " hockey\n", - " \n", + " baseball\n", " \n", " \n", "\n", @@ -587,16 +575,12 @@ "text/plain": [ " raw_prompt response \\\n", "974 From: maX \\nSubject: ... hockey \n", - "988 From: jca2@cec1.wustl.edu (Joseph Charles Achk... hockey \n", - "997 From: apland@mala.bc.ca (Ron Apland)\\nSubject:... hockey \n", "\n", " predicted_response \n", - "974 \n", - "988 NHL \n", - "997 " + "974 baseball " ] }, - "execution_count": 23, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } diff --git a/faq/index.html b/faq/index.html index d14200256..7a983fa73 100644 --- a/faq/index.html +++ b/faq/index.html @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/getting_started/index.html b/getting_started/index.html index e93e1562f..3e471b48c 100644 --- a/getting_started/index.html +++ b/getting_started/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/guides/completions/index.html b/guides/completions/index.html index fd6f91a2a..0694dccb8 100644 --- a/guides/completions/index.html +++ b/guides/completions/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -630,12 +630,12 @@

Completions

-

Language Models are trained to predict natural language and provide text outputs as a response -to their inputs. The inputs are called prompts and outputs are referred to as completions. -LLMs take the input prompts and chunk them into smaller units called tokens to process and -generate language. Tokens may include trailing spaces and even sub-words. This process is +

Language Models are trained to predict natural language and provide text outputs as a response +to their inputs. The inputs are called prompts and outputs are referred to as completions. +LLMs take the input prompts and chunk them into smaller units called tokens to process and +generate language. Tokens may include trailing spaces and even sub-words. This process is language dependent.

-

Scale's LLM Engine provides access to open source language models (see Model Zoo) +

Scale's LLM Engine provides access to open source language models (see Model Zoo) that can be used for producing completions to prompts.

Completion API call

An example API call looks as follows:

@@ -647,7 +647,7 @@

Completion API call
from llmengine import Completion
 
 response = Completion.create(
-    model="llama-7b",
+    model="llama-2-7b",
     prompt="Hello, my name is",
     max_new_tokens=10,
     temperature=0.2,
@@ -660,89 +660,90 @@ 

Completion API call# ________ and I am a ________

    -
  • model: The LLM you want to use (see Model Zoo).
  • -
  • prompt: The main input for the LLM to respond to.
  • -
  • max_new_tokens: The maximum number of tokens to generate in the chat completion.
  • -
  • temperature: The sampling temperature to use. Higher values make the output more random, -while lower values will make it more focused and deterministic.
  • +
  • model: The LLM you want to use (see Model Zoo).
  • +
  • prompt: The main input for the LLM to respond to.
  • +
  • max_new_tokens: The maximum number of tokens to generate in the chat completion.
  • +
  • temperature: The sampling temperature to use. Higher values make the output more random, + while lower values will make it more focused and deterministic.

See the full Completion API reference documentation to learn more.

Completion API response

An example Completion API response looks as follows:

-
+
-
-

>>> print(response.json())
-
-Example output: -
{
-  "request_id": "c4bf0732-08e0-48a8-8b44-dfe8d4702fb0",
-  "output": {
-    "text": "_______ and I am a _______",
-    "num_completion_tokens": 10
-  }
-}
-

+
-
-

>>> print(response.output.text)
-
-Example output: -
_______ and I am a _______
-

+

python + >>> print(response.json()) +Example output: +json + { + "request_id": "c4bf0732-08e0-48a8-8b44-dfe8d4702fb0", + "output": { + "text": "_______ and I am a _______", + "num_completion_tokens": 10 + } + }

+
+
+
+

python + >>> print(response.output.text) +Example output: +_______ and I am a _______

Token streaming

-

The Completions API supports token streaming to reduce perceived latency for certain -applications. When streaming, tokens will be sent as data-only +

The Completions API supports token streaming to reduce perceived latency for certain +applications. When streaming, tokens will be sent as data-only server-side events.

To enable token streaming, pass stream=True to either Completion.create or Completion.acreate.

An example of token streaming using the synchronous Completions API looks as follows:

-
+
-
import sys
-
-from llmengine import Completion
-
-stream = Completion.create(
-    model="falcon-7b-instruct",
-    prompt="Give me a 200 word summary on the current economic events in the US.",
-    max_new_tokens=1000,
-    temperature=0.2,
-    stream=True,
-)
-
-for response in stream:
-    if response.output:
-        print(response.output.text, end="")
-        sys.stdout.flush()
+
import sys
+
+from llmengine import Completion
+
+stream = Completion.create(
+    model="falcon-7b-instruct",
+    prompt="Give me a 200 word summary on the current economic events in the US.",
+    max_new_tokens=1000,
+    temperature=0.2,
+    stream=True,
+)
+
+for response in stream:
+    if response.output:
+        print(response.output.text, end="")
+        sys.stdout.flush()
 

Async requests

The Python client supports asyncio for creating Completions. Use Completion.acreate instead of Completion.create to utilize async processing. The function signatures are otherwise identical.

An example of async Completions looks as follows:

-
+
-
import asyncio
-from llmengine import Completion
-
-async def main():
-    response = await Completion.acreate(
-        model="llama-7b",
-        prompt="Hello, my name is",
-        max_new_tokens=10,
-        temperature=0.2,
-    )
-    print(response.json())
-
-asyncio.run(main())
+
import asyncio
+from llmengine import Completion
+
+async def main():
+    response = await Completion.acreate(
+        model="llama-2-7b",
+        prompt="Hello, my name is",
+        max_new_tokens=10,
+        temperature=0.2,
+    )
+    print(response.json())
+
+asyncio.run(main())
 

Which model should I use?

See the Model Zoo for more information on best practices for which model to use for Completions.

diff --git a/guides/fine_tuning/index.html b/guides/fine_tuning/index.html index 8a3b1b89e..3bfbbe4a3 100644 --- a/guides/fine_tuning/index.html +++ b/guides/fine_tuning/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -664,8 +664,8 @@

IntroductionProducing high quality data for fine-tuning

The training data for fine-tuning should consist of prompt and response pairs.

As a rule of thumb, you should expect to see linear improvements in your fine-tuned model's quality with each doubling of the dataset size. Having high-quality data is also essential to improving performance. For every linear increase in the error rate in your training data, you may encounter a roughly quadratic increase in your fine-tuned model's error rate.

-

High quality data is critical to achieve improved model performance, and in several cases will require experts to -generate and prepare data - the breadth and diversity of the data is highly critical. Scale's Data Engine can help +

High quality data is critical to achieve improved model performance, and in several cases will require experts to +generate and prepare data - the breadth and diversity of the data is highly critical. Scale's Data Engine can help prepare such high quality, diverse data sets - more information here.

Preparing data

Your data must be formatted as a CSV file that includes two columns: prompt and response. A maximum of 100,000 rows of data is currently supported. At least 200 rows of data is recommended to start to see benefits from fine-tuning.

@@ -735,6 +735,7 @@

Preparing data writer.writerow(["prompt", "response"]) writer.writerows(data)

+

Making your data accessible to LLM Engine

@@ -747,18 +748,18 @@

Making your data accessible t you can use the URL given when you click the “Raw” button (URL).

Launching the fine-tune

-

Once you have uploaded your data, you can use the LLM Engine's FineTune.Create API to launch a fine-tune. You will need to specify which base model to fine-tune, the locations of the training file and optional validation data file, an optional set of hyperparameters to customize the fine-tuning behavior, and an optional suffix to append to the name of the fine-tune. For sequences longer than the native +

Once you have uploaded your data, you can use the LLM Engine's FineTune.Create API to launch a fine-tune. You will need to specify which base model to fine-tune, the locations of the training file and optional validation data file, an optional set of hyperparameters to customize the fine-tuning behavior, and an optional suffix to append to the name of the fine-tune. For sequences longer than the native max_seq_length of the model, the sequences will be truncated.

-

If you specify a suffix, the fine-tune will be named model.suffix.<timestamp>. If you do not, -the fine-tune will be named model.<timestamp>. The timestamp will be the time the fine-tune was +

If you specify a suffix, the fine-tune will be named model.suffix.<timestamp>. If you do not, +the fine-tune will be named model.<timestamp>. The timestamp will be the time the fine-tune was launched.

Hyper-parameters for fine-tune -* `lr`: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3) -* `warmup_ratio`: Ratio of training steps used for learning rate warmup. (Default: 0.03) -* `epochs`: Number of fine-tuning epochs. This should be less than 20. (Default: 5) -* `weight_decay`: Regularization penalty applied to learned weights. (Default: 0.001) +- `lr`: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3) +- `warmup_ratio`: Ratio of training steps used for learning rate warmup. (Default: 0.03) +- `epochs`: Number of fine-tuning epochs. This should be less than 20. (Default: 5) +- `weight_decay`: Regularization penalty applied to learned weights. (Default: 0.001)
@@ -769,7 +770,7 @@

Launching the fine-tune
from llmengine import FineTune
 
 response = FineTune.create(
-    model="llama-7b",
+    model="llama-2-7b",
     training_file="s3://my-bucket/path/to/training-file.csv",
 )
 
@@ -778,14 +779,14 @@ 

Launching the fine-tuneSee the Model Zoo to see which models have fine-tuning support.

Once the fine-tune is launched, you can also get the status of your fine-tune. You can also list events that your fine-tune produces.

Making inference calls to your fine-tune

-

Once your fine-tune is finished, you will be able to start making inference requests to the -model. You can use the fine_tuned_model returned from your +

Once your fine-tune is finished, you will be able to start making inference requests to the +model. You can use the fine_tuned_model returned from your FineTune.get -API call to reference your fine-tuned model in the Completions API. Alternatively, you can list -available LLMs with Model.list in order to find the name of your fine-tuned model. See the -Completion API for more details. You can then -use that name to direct your completion requests. You must wait until your fine-tune is complete -before you can plug it into the Completions API. You can check the status of your fine-tune with +API call to reference your fine-tuned model in the Completions API. Alternatively, you can list +available LLMs with Model.list in order to find the name of your fine-tuned model. See the +Completion API for more details. You can then +use that name to direct your completion requests. You must wait until your fine-tune is complete +before you can plug it into the Completions API. You can check the status of your fine-tune with FineTune.get.

@@ -795,7 +796,7 @@

Making inference calls to your
from llmengine import Completion
 
 response = Completion.create(
-    model="llama-7b.airlines.2023-07-17-08-30-45",
+    model="llama-2-7b.airlines.2023-07-17-08-30-45",
     prompt="Do you offer in-flight Wi-fi?",
     max_new_tokens=100,
     temperature=0.2,
diff --git a/guides/rate_limits/index.html b/guides/rate_limits/index.html
index c74684011..dbd6a3dd9 100644
--- a/guides/rate_limits/index.html
+++ b/guides/rate_limits/index.html
@@ -17,7 +17,7 @@
         
       
       
-      
+      
     
     
       
@@ -25,7 +25,7 @@
       
     
     
-      
+      
       
         
         
@@ -617,9 +617,9 @@ 

What are the rate limits for our A will return HTTP 429 on an as-needed basis.

Error mitigation

Retrying with exponential backoff

-

One easy way to avoid rate limit errors is to automatically retry requests with a random exponential backoff. -Retrying with exponential backoff means performing a short sleep when a rate limit error is hit, then retrying the -unsuccessful request. If the request is still unsuccessful, the sleep length is increased and the process is repeated. +

One easy way to avoid rate limit errors is to automatically retry requests with a random exponential backoff. +Retrying with exponential backoff means performing a short sleep when a rate limit error is hit, then retrying the +unsuccessful request. If the request is still unsuccessful, the sleep length is increased and the process is repeated. This continues until the request is successful or until a maximum number of retries is reached. This approach has many benefits:

  • Automatic retries means you can recover from rate limit errors without crashes or missing data
  • @@ -628,9 +628,9 @@

    Retrying with exponential backoff

    Below are a few example solutions for Python that use exponential backoff.

    Example #1: Using the tenacity library

    -

    Tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simplify the task of adding -retry behavior to just about anything. To add exponential backoff to your requests, you can use the tenacity.retry -decorator. The below example uses the tenacity.wait_random_exponential function to add random exponential backoff to a +

    Tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simplify the task of adding +retry behavior to just about anything. To add exponential backoff to your requests, you can use the tenacity.retry +decorator. The below example uses the tenacity.wait_random_exponential function to add random exponential backoff to a request.

    @@ -648,10 +648,10 @@

    Example #1: Using the tenaci def completion_with_backoff(**kwargs): return llmengine.Completion.create(**kwargs) -completion_with_backoff(model="llama-7b", prompt="Why is the sky blue?") +completion_with_backoff(model="llama-2-7b", prompt="Why is the sky blue?")

Example #2: Using the backoff library

-

Backoff is another python library that provides function decorators which can be used to wrap a function such that it will be retried until some condition is met.

+

Backoff is another python library that provides function decorators which can be used to wrap a function such that it will be retried until some condition is met.

@@ -664,7 +664,7 @@

Example #2: Using the backoff def completion_with_backoff(**kwargs): return llmengine.Completion.create(**kwargs) -completions_with_backoff(model="llama-7b", prompt="Why is the sky blue?") +completions_with_backoff(model="llama-2-7b", prompt="Why is the sky blue?")

diff --git a/guides/self_hosting/index.html b/guides/self_hosting/index.html index ba46b07f6..99e57c046 100644 --- a/guides/self_hosting/index.html +++ b/guides/self_hosting/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -466,6 +466,13 @@ Helm Chart + + +
  • + + Play With It + +
  • @@ -685,6 +692,13 @@ Helm Chart + + +
  • + + Play With It + +
  • @@ -974,6 +988,25 @@

    Helm ChartPlay With It

    +

    Once helm install succeeds, you can forward port 5000 from a llm-engine pod and test sending requests to it.

    +

    First, see a list of pods in the namespace that you performed helm install in: +

    $ kubectl get pods -n <NAMESPACE_WHERE_LLM_ENGINE_IS_INSTALLED>
    +NAME                                           READY   STATUS             RESTARTS      AGE
    +llm-engine-668679554-9q4wj                     1/1     Running            0             18m
    +llm-engine-668679554-xfhxx                     1/1     Running            0             18m
    +llm-engine-cacher-5f8b794585-fq7dj             1/1     Running            0             18m
    +llm-engine-endpoint-builder-5cd6bf5bbc-sm254   1/1     Running            0             18m
    +llm-engine-image-cache-a10-sw4pg               1/1     Running            0             18m 
    +
    +Note the pod names you see may be different.

    +

    Forward a port from a llm-engine pod: +

    $ kubectl port-forward pod/llm-engine-<REST_OF_POD_NAME> 5000:5000 -n <NAMESPACE_WHERE_LLM_ENGINE_IS_INSTALLED>
    +

    +

    Then, try sending a request to get LLM model endpoints for test-user-id. You should get a response with empty list: +

    $ curl -X GET -H "Content-Type: application/json" -u "test-user-id:" "http://localhost:5000/v1/llm/model-endpoints"
    +{"model_endpoints":[]}% 
    +

    diff --git a/guides/token_streaming/index.html b/guides/token_streaming/index.html index 46e6107ac..7c4fac5d6 100644 --- a/guides/token_streaming/index.html +++ b/guides/token_streaming/index.html @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/index.html b/index.html index 38ef5160b..20af4d595 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + diff --git a/model_zoo/index.html b/model_zoo/index.html index 706d55372..951abf74c 100644 --- a/model_zoo/index.html +++ b/model_zoo/index.html @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -595,6 +595,11 @@

    Public Model Zoo - + @@ -25,7 +25,7 @@ - + diff --git a/search/search_index.json b/search/search_index.json index f69629ade..98100e7d6 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduction","text":""},{"location":"#llm-engine","title":"LLM Engine","text":"

    The open source engine for fine-tuning and serving large language models.

    LLM Engine is the easiest way to customize and serve LLMs.

    LLMs can be accessed via Scale's hosted version or by using the Helm charts in this repository to run model inference and fine-tuning in your own infrastructure.

    "},{"location":"#quick-install","title":"Quick Install","text":"Install the python package
    pip install scale-llm-engine\n
    "},{"location":"#about","title":"About","text":"

    Foundation models are emerging as the building blocks of AI. However, deploying these models to the cloud and fine-tuning them is an expensive operation that require infrastructure and ML expertise. It is also difficult to maintain over time as new models are released and new techniques for both inference and fine-tuning are made available.

    LLM Engine is a Python library and Helm chart that provides everything you need to serve and fine-tune foundation models, whether you use Scale's hosted infrastructure or do it in your own cloud infrastructure using Kubernetes.

    "},{"location":"#key-features","title":"Key Features","text":"

    Ready-to-use APIs for your favorite models: Deploy and serve open source foundation models - including LLaMA, MPT, and Falcon. Use Scale-hosted models or deploy to your own infrastructure.

    Fine-tune your favorite models: Fine-tune open-source foundation models like LLaMA, MPT, etc. with your own data for optimized performance.

    Optimized Inference: LLM Engine provides inference APIs for streaming responses and dynamically batching inputs for higher throughput and lower latency.

    Open-Source Integrations: Deploy any Hugging Face model with a single command.

    Deploying from any docker image: Turn any Docker image into an auto-scaling deployment with simple APIs.

    "},{"location":"#features-coming-soon","title":"Features Coming Soon","text":"

    Kubernetes Installation Documentation: We are working hard to document the installation and maintenance of inference and fine-tuning functionality on your infrastructure. For now, our documentation covers using our client libraries to access Scale's hosted infrastructure.

    Fast Cold-Start Times: To prevent GPUs from idling, LLM Engine automatically scales your model to zero when it's not in use and scales up within seconds, even for large foundation models.

    Cost Optimization: Deploy AI models cheaper than commercial ones, including cold-start and warm-down times.

    "},{"location":"contributing/","title":"Contributing to LLM Engine","text":""},{"location":"contributing/#updating-llm-engine-documentation","title":"Updating LLM Engine Documentation","text":"

    LLM Engine leverages mkdocs to create beautiful, community-oriented documentation.

    "},{"location":"contributing/#step-1-clone-the-repository","title":"Step 1: Clone the Repository","text":"

    Clone/Fork the LLM Engine Repository. Our documentation lives in the docs folder.

    "},{"location":"contributing/#step-2-install-the-dependencies","title":"Step 2: Install the Dependencies","text":"

    Dependencies are located in requirements-docs.txt, go ahead and pip install those with

    pip install -r requirements-docs.txt\n
    "},{"location":"contributing/#step-3-install-the-python-client-locally","title":"Step 3: Install the Python client locally","text":"

    Our Python client API reference is autogenerated from our client. You can install the client in editable mode with

    pip install -r clients/python\n
    "},{"location":"contributing/#step-4-run-locally","title":"Step 4: Run Locally","text":"

    To run the documentation service locally, execute the following command:

    mkdocs serve\n

    This should kick off a locally running instance on http://127.0.0.1:8000/.

    As you edit the content in the docs folder, the site will be automatically reloaded on each file save.

    "},{"location":"contributing/#step-5-editing-navigation-and-settings","title":"Step 5: Editing Navigation and Settings","text":"

    If you are less familiar with mkdocs, in addition to the markdown content in the docs folder, there is a top-level mkdocs.yml file as well that defines the navigation pane and other website settings. If you don't see your page where you think it should be, double-check the .yml file.

    "},{"location":"contributing/#step-6-building-and-deploying","title":"Step 6: Building and Deploying","text":"

    CircleCI (via .circleci/config.yml) handles the building and deployment of our documentation service for us.

    "},{"location":"faq/","title":"Frequently Asked Questions","text":""},{"location":"getting_started/","title":"Getting Started","text":"

    The fastest way to get started with LLM Engine is to use the Python client in this repository to run inference and fine-tuning on Scale's infrastructure. This path does not require you to install anything on your infrastructure, and Scale's free research preview gives you access to experimentation using open source LLMs.

    To start, install LLM Engine via pip:

    pip
    pip install scale-llm-engine\n
    "},{"location":"getting_started/#scale-api-keys","title":"Scale API Keys","text":"

    Next, you need a Scale Spellbook API key.

    "},{"location":"getting_started/#retrieving-your-api-key","title":"Retrieving your API Key","text":"

    To retrieve your API key, head to Scale Spellbook where you will get an API key on the settings page.

    Different API Keys for different Scale Products

    If you have leveraged Scale's platform for annotation work in the past, please note that your Spellbook API key will be different than the Scale Annotation API key. You will want to create a Spellbook API key before getting started.

    "},{"location":"getting_started/#set-your-api-key","title":"Set your API Key","text":"

    LLM Engine uses environment variables to access your API key.

    Set this API key as the SCALE_API_KEY environment variable by running the following command in your terminal before you run your python application.

    export SCALE_API_KEY=\"[Your API key]\"\n

    You can also add in the line above to your .zshrc or .bash_profile so it's automatically set for future sessions.

    "},{"location":"getting_started/#example-code","title":"Example Code","text":""},{"location":"getting_started/#sample-completion","title":"Sample Completion","text":"

    With your API key set, you can now send LLM Engine requests using the Python client:

    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"I'm opening a pancake restaurant that specializes in unique pancake shapes, colors, and flavors. List 3 quirky names I could name my restaurant.\",\n    max_new_tokens=100,\n    temperature=0.2,\n)\n\nprint(response.output.text)\n
    "},{"location":"getting_started/#with-streaming","title":"With Streaming","text":"
    import sys\nfrom llmengine import Completion\n\nstream = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"Give me a 200 word summary on the current economic events in the US.\",\n    max_new_tokens=1000,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.output.text, end=\"\")\n        sys.stdout.flush()\n
    "},{"location":"model_zoo/","title":"Public Model Zoo","text":"

    Scale hosts the following models in the LLM Engine Model Zoo:

    Model Name Inference APIs Available Fine-tuning APIs Available llama-7b \u2705 \u2705 falcon-7b \u2705 falcon-7b-instruct \u2705 falcon-40b \u2705 falcon-40b-instruct \u2705 mpt-7b \u2705 mpt-7b-instruct \u2705 \u2705 flan-t5-xxl \u2705"},{"location":"model_zoo/#usage","title":"Usage","text":"

    Each of these models can be used with the Completion API.

    The specified models can be fine-tuned with the FineTune API.

    More information about the models can be found using the Model API.

    "},{"location":"pricing/","title":"Pricing","text":"

    LLM Engine is an open-source project and free self-hosting will always be an option.

    A hosted option for LLM Engine is being offered initially as a free preview via Scale Spellbook.

    "},{"location":"pricing/#self-hosted-models","title":"Self-Hosted Models","text":"

    We are committed to supporting the open-source community. Self-hosting LLM Engine will remain free and open-source.

    We would love contributions from the community make this even more amazing!

    "},{"location":"pricing/#hosted-models","title":"Hosted Models","text":"

    Once the limited preview period has ended, billing for hosted models will be managed through the Scale Spellbook product.

    Scale Spellbook leverages usage-based spending, billed to a credit card. Details on usage-based pricing will be shared with everyone before completing the limited preview.

    "},{"location":"api/data_types/","title":"\ud83d\udc0d Python Client Data Type Reference","text":""},{"location":"api/data_types/#llmengine.CompletionOutput","title":"CompletionOutput","text":"

    Bases: BaseModel

    Represents the output of a completion request to a model.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionOutput.text","title":"text instance-attribute","text":"
    text: str\n

    The text of the completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionOutput.num_completion_tokens","title":"num_completion_tokens instance-attribute","text":"
    num_completion_tokens: int\n

    Number of tokens in the completion.

    "},{"location":"api/data_types/#llmengine.CompletionStreamOutput","title":"CompletionStreamOutput","text":"

    Bases: BaseModel

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.text","title":"text instance-attribute","text":"
    text: str\n

    The text of the completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.finished","title":"finished instance-attribute","text":"
    finished: bool\n

    Whether the completion is finished.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.num_completion_tokens","title":"num_completion_tokens class-attribute instance-attribute","text":"
    num_completion_tokens: Optional[int] = None\n

    Number of tokens in the completion.

    "},{"location":"api/data_types/#llmengine.CompletionSyncResponse","title":"CompletionSyncResponse","text":"

    Bases: BaseModel

    Response object for a synchronous prompt completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionSyncResponse.output","title":"output instance-attribute","text":"
    output: CompletionOutput\n

    Completion output.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionSyncResponse.request_id","title":"request_id instance-attribute","text":"
    request_id: str\n

    The unique ID of the corresponding Completion request. This request_id is generated on the server, and all logs associated with the request are grouped by the request_id, which allows for easier troubleshooting of errors as follows:

    • When running the Scale-hosted LLM Engine, please provide the request_id in any bug reports.
    • When running the self-hosted LLM Engine, the request_id serves as a trace ID in your observability provider.
    "},{"location":"api/data_types/#llmengine.CompletionStreamResponse","title":"CompletionStreamResponse","text":"

    Bases: BaseModel

    Response object for a stream prompt completion task.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamResponse.output","title":"output class-attribute instance-attribute","text":"
    output: Optional[CompletionStreamOutput] = None\n

    Completion output.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamResponse.request_id","title":"request_id instance-attribute","text":"
    request_id: str\n

    The unique ID of the corresponding Completion request. This request_id is generated on the server, and all logs associated with the request are grouped by the request_id, which allows for easier troubleshooting of errors as follows:

    • When running the Scale-hosted LLM Engine, please provide the request_id in any bug reports.
    • When running the self-hosted LLM Engine, the request_id serves as a trace ID in your observability provider.
    "},{"location":"api/data_types/#llmengine.CreateFineTuneResponse","title":"CreateFineTuneResponse","text":"

    Bases: BaseModel

    Response object for creating a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.CreateFineTuneResponse.fine_tune_id","title":"fine_tune_id class-attribute instance-attribute","text":"
    fine_tune_id: str = Field(\n    ..., description=\"ID of the created fine-tuning job.\"\n)\n

    The ID of the FineTune.

    "},{"location":"api/data_types/#llmengine.GetFineTuneResponse","title":"GetFineTuneResponse","text":"

    Bases: BaseModel

    Response object for retrieving a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.GetFineTuneResponse.fine_tune_id","title":"fine_tune_id class-attribute instance-attribute","text":"
    fine_tune_id: str = Field(\n    ..., description=\"ID of the requested job.\"\n)\n

    The ID of the FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.GetFineTuneResponse.status","title":"status class-attribute instance-attribute","text":"
    status: BatchJobStatus = Field(\n    ..., description=\"Status of the requested job.\"\n)\n

    The status of the FineTune job.

    "},{"location":"api/data_types/#llmengine.ListFineTunesResponse","title":"ListFineTunesResponse","text":"

    Bases: BaseModel

    Response object for listing FineTunes.

    "},{"location":"api/data_types/#llmengine.data_types.ListFineTunesResponse.jobs","title":"jobs class-attribute instance-attribute","text":"
    jobs: List[GetFineTuneResponse] = Field(\n    ...,\n    description=\"List of fine-tuning jobs and their statuses.\",\n)\n

    A list of FineTunes, represented as GetFineTuneResponses.

    "},{"location":"api/data_types/#llmengine.CancelFineTuneResponse","title":"CancelFineTuneResponse","text":"

    Bases: BaseModel

    Response object for cancelling a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.CancelFineTuneResponse.success","title":"success class-attribute instance-attribute","text":"
    success: bool = Field(\n    ..., description=\"Whether cancellation was successful.\"\n)\n

    Whether the cancellation succeeded.

    "},{"location":"api/data_types/#llmengine.GetLLMEndpointResponse","title":"GetLLMEndpointResponse","text":"

    Bases: BaseModel

    Response object for retrieving a Model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.name","title":"name class-attribute instance-attribute","text":"
    name: str = Field(\n    description=\"The name of the model. Use this for making inference requests to the model.\"\n)\n

    The name of the model. Use this for making inference requests to the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.source","title":"source class-attribute instance-attribute","text":"
    source: LLMSource = Field(\n    description=\"The source of the model, e.g. Hugging Face.\"\n)\n

    The source of the model, e.g. Hugging Face.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.inference_framework","title":"inference_framework class-attribute instance-attribute","text":"
    inference_framework: LLMInferenceFramework = Field(\n    description=\"The inference framework used by the model.\"\n)\n

    (For self-hosted users) The inference framework used by the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.id","title":"id class-attribute instance-attribute","text":"
    id: Optional[str] = Field(\n    default=None,\n    description=\"(For self-hosted users) The autogenerated ID of the model.\",\n)\n

    (For self-hosted users) The autogenerated ID of the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.model_name","title":"model_name class-attribute instance-attribute","text":"
    model_name: Optional[str] = Field(\n    default=None,\n    description=\"(For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as `name`.\",\n)\n

    (For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as name.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.inference_framework_tag","title":"inference_framework_tag class-attribute instance-attribute","text":"
    inference_framework_tag: Optional[str] = Field(\n    default=None,\n    description=\"(For self-hosted users) The Docker image tag used to run the model.\",\n)\n

    (For self-hosted users) The Docker image tag used to run the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.num_shards","title":"num_shards class-attribute instance-attribute","text":"
    num_shards: Optional[int] = Field(\n    default=None,\n    description=\"(For self-hosted users) The number of shards.\",\n)\n

    (For self-hosted users) The number of shards.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.quantize","title":"quantize class-attribute instance-attribute","text":"
    quantize: Optional[Quantization] = Field(\n    default=None,\n    description=\"(For self-hosted users) The quantization method.\",\n)\n

    (For self-hosted users) The quantization method.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.spec","title":"spec class-attribute instance-attribute","text":"
    spec: Optional[GetModelEndpointResponse] = Field(\n    default=None,\n    description=\"(For self-hosted users) Model endpoint details.\",\n)\n

    (For self-hosted users) Model endpoint details.

    "},{"location":"api/data_types/#llmengine.ListLLMEndpointsResponse","title":"ListLLMEndpointsResponse","text":"

    Bases: BaseModel

    Response object for listing Models.

    "},{"location":"api/data_types/#llmengine.data_types.ListLLMEndpointsResponse.model_endpoints","title":"model_endpoints class-attribute instance-attribute","text":"
    model_endpoints: List[GetLLMEndpointResponse] = Field(\n    ..., description=\"The list of models.\"\n)\n

    A list of Models, represented as GetLLMEndpointResponses.

    "},{"location":"api/data_types/#llmengine.DeleteLLMEndpointResponse","title":"DeleteLLMEndpointResponse","text":"

    Bases: BaseModel

    Response object for deleting a Model.

    "},{"location":"api/data_types/#llmengine.data_types.DeleteLLMEndpointResponse.deleted","title":"deleted class-attribute instance-attribute","text":"
    deleted: bool = Field(\n    ..., description=\"Whether deletion was successful.\"\n)\n

    Whether the deletion succeeded.

    "},{"location":"api/error_handling/","title":"Error handling","text":"

    LLM Engine uses conventional HTTP response codes to indicate the success or failure of an API request. In general: codes in the 2xx range indicate success. Codes in the 4xx range indicate indicate an error that failed given the information provided (e.g. a given Model was not found, or an invalid temperature was specified). Codes in the 5xx range indicate an error with the LLM Engine servers.

    In the Python client, errors are presented via a set of corresponding Exception classes, which should be caught and handled by the user accordingly.

    "},{"location":"api/error_handling/#llmengine.errors.BadRequestError","title":"BadRequestError","text":"
    BadRequestError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 400. Indicates that the request had inputs that were invalid. The user should not attempt to retry the request without changing the inputs.

    "},{"location":"api/error_handling/#llmengine.errors.UnauthorizedError","title":"UnauthorizedError","text":"
    UnauthorizedError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 401. This means that no valid API key was provided.

    "},{"location":"api/error_handling/#llmengine.errors.NotFoundError","title":"NotFoundError","text":"
    NotFoundError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 404. This means that the resource (e.g. a Model, FineTune, etc.) could not be found. Note that this can also be returned in some cases where the object might exist, but the user does not have access to the object. This is done to avoid leaking information about the existence or nonexistence of said object that the user does not have access to.

    "},{"location":"api/error_handling/#llmengine.errors.RateLimitExceededError","title":"RateLimitExceededError","text":"
    RateLimitExceededError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 429. Too many requests hit the API too quickly. We recommend an exponential backoff for retries.

    "},{"location":"api/error_handling/#llmengine.errors.ServerError","title":"ServerError","text":"
    ServerError(status_code: int, message: str)\n

    Bases: Exception

    Corresponds to HTTP 5xx errors on the server.

    "},{"location":"api/langchain/","title":"\ud83e\udd9c Langchain","text":"

    Coming soon!

    "},{"location":"api/python_client/","title":"\ud83d\udc0d Python Client API Reference","text":""},{"location":"api/python_client/#llmengine.Completion","title":"Completion","text":"

    Bases: APIEngine

    Completion API. This API is used to generate text completions.

    Language models are trained to understand natural language and predict text outputs as a response to their inputs. The inputs are called prompts and the outputs are referred to as completions. LLMs take the input prompts and chunk them into smaller units called tokens to process and generate language. Tokens may include trailing spaces and even sub-words; this process is language dependent.

    The Completion API can be run either synchronous or asynchronously (via Python asyncio). For each of these modes, you can also choose whether to stream token responses or not.

    "},{"location":"api/python_client/#llmengine.completion.Completion.create","title":"create classmethod","text":"
    create(\n    model: str,\n    prompt: str,\n    max_new_tokens: int = 20,\n    temperature: float = 0.2,\n    timeout: int = 10,\n    stream: bool = False,\n) -> Union[\n    CompletionSyncResponse,\n    Iterator[CompletionStreamResponse],\n]\n

    Creates a completion for the provided prompt and parameters synchronously.

    This API can be used to get the LLM to generate a completion synchronously. It takes as parameters the model (see Model Zoo) and the prompt. Optionally it takes max_new_tokens, temperature, timeout and stream. It returns a CompletionSyncResponse if stream=False or an async iterator of CompletionStreamResponse with request_id and outputs fields.

    Parameters:

    Name Type Description Default model str

    Name of the model to use. See Model Zoo for a list of Models that are supported.

    required prompt str

    The prompt to generate completions for, encoded as a string.

    required max_new_tokens int

    The maximum number of tokens to generate in the completion.

    The token count of your prompt plus max_new_tokens cannot exceed the model's context length. See Model Zoo for information on each supported model's context length.

    20 temperature float

    What sampling temperature to use, in the range (0, 1]. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.

    0.2 timeout int

    Timeout in seconds. This is the maximum amount of time you are willing to wait for a response.

    10 stream bool

    Whether to stream the response. If true, the return type is an Iterator[CompletionStreamResponse]. Otherwise, the return type is a CompletionSyncResponse. When streaming, tokens will be sent as data-only server-sent events.

    False

    Returns:

    Name Type Description response Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]

    The generated response (if stream=False) or iterator of response chunks (if stream=True)

    Synchronous completion without token streaming in PythonResponse in JSON
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-7b\",\n    prompt=\"Hello, my name is\",\n    max_new_tokens=10,\n    temperature=0.2,\n)\nprint(response.json())\n
    {\n    \"request_id\": \"8bbd0e83-f94c-465b-a12b-aabad45750a9\",\n    \"output\": {\n        \"text\": \"_______ and I am a _______\",\n        \"num_completion_tokens\": 10\n}\n}\n

    Token streaming can be used to reduce perceived latency for applications. Here is how applications can use streaming:

    Synchronous completion with token streaming in PythonResponse in JSON
    from llmengine import Completion\n\nstream = Completion.create(\n    model=\"llama-7b\",\n    prompt=\"why is the sky blue?\",\n    max_new_tokens=5,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.json())\n
    {\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"\\n\", \"finished\": false, \"num_completion_tokens\": 1 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"I\", \"finished\": false, \"num_completion_tokens\": 2 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \" don\", \"finished\": false, \"num_completion_tokens\": 3 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"\u2019\", \"finished\": false, \"num_completion_tokens\": 4 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"t\", \"finished\": true, \"num_completion_tokens\": 5 } }\n
    "},{"location":"api/python_client/#llmengine.completion.Completion.acreate","title":"acreate async classmethod","text":"
    acreate(\n    model: str,\n    prompt: str,\n    max_new_tokens: int = 20,\n    temperature: float = 0.2,\n    timeout: int = 10,\n    stream: bool = False,\n) -> Union[\n    CompletionSyncResponse,\n    AsyncIterable[CompletionStreamResponse],\n]\n

    Creates a completion for the provided prompt and parameters asynchronously (with asyncio).

    This API can be used to get the LLM to generate a completion asynchronously. It takes as parameters the model (see Model Zoo) and the prompt. Optionally it takes max_new_tokens, temperature, timeout and stream. It returns a CompletionSyncResponse if stream=False or an async iterator of CompletionStreamResponse with request_id and outputs fields.

    Parameters:

    Name Type Description Default model str

    Name of the model to use. See Model Zoo for a list of Models that are supported.

    required prompt str

    The prompt to generate completions for, encoded as a string.

    required max_new_tokens int

    The maximum number of tokens to generate in the completion.

    The token count of your prompt plus max_new_tokens cannot exceed the model's context length. See Model Zoo for information on each supported model's context length.

    20 temperature float

    What sampling temperature to use, in the range (0, 1]. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.

    0.2 timeout int

    Timeout in seconds. This is the maximum amount of time you are willing to wait for a response.

    10 stream bool

    Whether to stream the response. If true, the return type is an Iterator[CompletionStreamResponse]. Otherwise, the return type is a CompletionSyncResponse. When streaming, tokens will be sent as data-only server-sent events.

    False

    Returns:

    Name Type Description response Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]

    The generated response (if stream=False) or iterator of response chunks (if stream=True)

    Asynchronous completion without token streaming in PythonResponse in JSON
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    response = await Completion.acreate(\n        model=\"llama-7b\",\n        prompt=\"Hello, my name is\",\n        max_new_tokens=10,\n        temperature=0.2,\n    )\n    print(response.json())\n\nasyncio.run(main())\n
    {\n    \"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\",\n    \"output\": {\n        \"text\": \"_______ and I am a _______\",\n        \"num_completion_tokens\": 10\n}\n}\n

    Token streaming can be used to reduce perceived latency for applications. Here is how applications can use streaming:

    Asynchronous completion with token streaming in PythonResponse in JSON
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    stream = await Completion.acreate(\n        model=\"llama-7b\",\n        prompt=\"why is the sky blue?\",\n        max_new_tokens=5,\n        temperature=0.2,\n        stream=True,\n    )\n\nasync for response in stream:\n        if response.output:\n            print(response.json())\n\nasyncio.run(main())\n
    {\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \"\\n\", \"finished\": false, \"num_completion_tokens\": 1}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \"I\", \"finished\": false, \"num_completion_tokens\": 2}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" think\", \"finished\": false, \"num_completion_tokens\": 3}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" the\", \"finished\": false, \"num_completion_tokens\": 4}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" sky\", \"finished\": true, \"num_completion_tokens\": 5}}\n
    "},{"location":"api/python_client/#llmengine.FineTune","title":"FineTune","text":"

    Bases: APIEngine

    FineTune API. This API is used to fine-tune models.

    Fine-tuning is a process where the LLM is further trained on a task-specific dataset, allowing the model to adjust its parameters to better align with the task at hand. Fine-tuning is a supervised training phase, where prompt/response pairs are provided to optimize the performance of the LLM. LLM Engine currently uses LoRA for fine-tuning. Support for additional fine-tuning methods is upcoming.

    LLM Engine provides APIs to create fine-tunes on a base model with training & validation datasets. APIs are also provided to list, cancel and retrieve fine-tuning jobs.

    Creating a fine-tune will end with the creation of a Model, which you can view using Model.get(model_name) or delete using Model.delete(model_name).

    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.create","title":"create classmethod","text":"
    create(\n    model: str,\n    training_file: str,\n    validation_file: Optional[str] = None,\n    hyperparameters: Optional[Dict[str, str]] = None,\n    suffix: Optional[str] = None,\n) -> CreateFineTuneResponse\n

    Creates a job that fine-tunes a specified model with a given dataset.

    This API can be used to fine-tune a model. The model is the name of base model (Model Zoo for available models) to fine-tune. The training and validation files should consist of prompt and response pairs. training_file and validation_file must be publicly accessible HTTP or HTTPS URLs to a CSV file that includes two columns: prompt and response. A maximum of 100,000 rows of data is currently supported. At least 200 rows of data is recommended to start to see benefits from fine-tuning. For sequences longer than the native max_seq_length of the model, the sequences will be truncated.

    A fine-tuning job can take roughly 30 minutes for a small dataset (~200 rows) and several hours for larger ones.

    Parameters:

    Name Type Description Default model `str`

    The name of the base model to fine-tune. See Model Zoo for the list of available models to fine-tune.

    required training_file `str`

    Publicly accessible URL to a CSV file for training.

    required validation_file `Optional[str]`

    Publicly accessible URL to a CSV file for validation. The validation file is used to compute metrics which let LLM Engine pick the best fine-tuned checkpoint, which will be used for inference when fine-tuning is complete.

    None hyperparameters `Optional[Dict[str, str]]`

    A dict of hyperparameters to customize fine-tuning behavior.

    Currently supported hyperparameters:

    • lr: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3)
    • warmup_ratio: Ratio of training steps used for learning rate warmup. (Default: 0.03)
    • epochs: Number of fine-tuning epochs. This should be less than 20. (Default: 5)
    • weight_decay: Regularization penalty applied to learned weights. (Default: 0.001)
    None suffix `Optional[str]`

    A string that will be added to your fine-tuned model name. If present, the entire fine-tuned model name will be formatted like \"[model].[suffix].[YYYY-MM-DD-HH-MM-SS]\". If absent, the fine-tuned model name will be formatted \"[model].[YYYY-MM-DD-HH-MM-SS]\". For example, if suffix is \"my-experiment\", the fine-tuned model name could be \"llama-7b.my-experiment.2023-07-17-23-01-50\".

    None

    Returns:

    Name Type Description CreateFineTuneResponse CreateFineTuneResponse

    an object that contains the ID of the created fine-tuning job

    Here is an example script to create a 5-row CSV of properly formatted data for fine-tuning an airline question answering bot:

    Formatting data in Python
    import csv\n# Define data\ndata = [\n  (\"What is your policy on carry-on luggage?\", \"Our policy allows each passenger to bring one piece of carry-on luggage and one personal item such as a purse or briefcase. The maximum size for carry-on luggage is 22 x 14 x 9 inches.\"),\n  (\"How can I change my flight?\", \"You can change your flight through our website or mobile app. Go to 'Manage my booking' section, enter your booking reference and last name, then follow the prompts to change your flight.\"),\n  (\"What meals are available on my flight?\", \"We offer a variety of meals depending on the flight's duration and route. These can range from snacks and light refreshments to full-course meals on long-haul flights. Specific meal options can be viewed during the booking process.\"),\n  (\"How early should I arrive at the airport before my flight?\", \"We recommend arriving at least two hours before domestic flights and three hours before international flights.\"),\n  \"Can I select my seat in advance?\", \"Yes, you can select your seat during the booking process or afterwards via the 'Manage my booking' section on our website or mobile app.\"),\n  ]\n\n# Write data to a CSV file\nwith open('customer_service_data.csv', 'w', newline='') as file:\n    writer = csv.writer(file)\n    writer.writerow([\"prompt\", \"response\"])\n    writer.writerows(data)\n

    Currently, data needs to be uploaded to a publicly accessible web URL so that it can be read for fine-tuning. Publicly accessible HTTP and HTTPS URLs are currently supported. Support for privately sharing data with the LLM Engine API is coming shortly. For quick iteration, you can look into tools like Pastebin or GitHub Gists to quickly host your CSV files in a public manner. An example Github Gist can be found here. To use the gist, you can use the URL given when you click the \u201cRaw\u201d button (URL).

    Example code for fine-tuning:

    Fine-tuning in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.create(\n    model=\"llama-7b\",\n    training_file=\"https://my-bucket.s3.us-west-2.amazonaws.com/path/to/training-file.csv\",\n)\n\nprint(response.json())\n
    {\n    \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\"\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.get","title":"get classmethod","text":"
    get(fine_tune_id: str) -> GetFineTuneResponse\n

    Get status of a fine-tuning job.

    This API can be used to get the status of an already running fine-tuning job. It takes as a single parameter the fine_tune_id and returns a GetFineTuneResponse object with the id and status (PENDING, STARTED, UNDEFINED, FAILURE or SUCCESS).

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description GetFineTuneResponse GetFineTuneResponse

    an object that contains the ID and status of the requested job

    Getting status of fine-tuning in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.get(\n    fine_tune_id=\"ft-cir3eevt71r003ks6il0\",\n)\n\nprint(response.json())\n
    {\n    \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\",\n    \"status\": \"STARTED\"\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.get_events","title":"get_events classmethod","text":"
    get_events(fine_tune_id: str) -> GetFineTuneEventsResponse\n

    Get events of a fine-tuning job.

    This API can be used to get the list of detailed events for a fine-tuning job. It takes the fine_tune_id as a parameter and returns a response object which has a list of events that has happened for the fine-tuning job. Two events are logged periodically: an evaluation of the training loss, and an evaluation of the eval loss. This API will return all events for the fine-tuning job.

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description GetFineTuneEventsResponse GetFineTuneEventsResponse

    an object that contains the list of events for the fine-tuning job

    Example
    from llmengine import FineTune\n\nresponse = FineTune.get_events(fine_tune_id=\"ft-cir3eevt71r003ks6il0\")\nprint(response.json())\n
    JSON Response
    {\n    \"events\":\n    [\n        {\n            \"timestamp\": 1689665099.6704428,\n            \"message\": \"{'loss': 2.108, 'learning_rate': 0.002, 'epoch': 0.7}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665100.1966307,\n            \"message\": \"{'eval_loss': 1.67730712890625, 'eval_runtime': 0.2023, 'eval_samples_per_second': 24.717, 'eval_steps_per_second': 4.943, 'epoch': 0.7}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665105.6544185,\n            \"message\": \"{'loss': 1.8961, 'learning_rate': 0.0017071067811865474, 'epoch': 1.39}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665106.159139,\n            \"message\": \"{'eval_loss': 1.513688564300537, 'eval_runtime': 0.2025, 'eval_samples_per_second': 24.696, 'eval_steps_per_second': 4.939, 'epoch': 1.39}\",\n            \"level\": \"info\"\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.list","title":"list classmethod","text":"
    list() -> ListFineTunesResponse\n

    List fine-tuning jobs.

    This API can be used to list all the fine-tuning jobs. It returns a list of pairs of fine_tune_id and status for all existing jobs.

    Returns:

    Name Type Description ListFineTunesResponse ListFineTunesResponse

    an object that contains a list of all fine-tuning jobs and their statuses

    Listing fine-tuning jobs in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.list()\nprint(response.json())\n
    {\n    \"jobs\": [\n        {\n            \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\",\n            \"status\": \"STARTED\"\n},\n        {\n            \"fine_tune_id\": \"ft_def456\",\n            \"status\": \"SUCCESS\"\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.cancel","title":"cancel classmethod","text":"
    cancel(fine_tune_id: str) -> CancelFineTuneResponse\n

    Cancel a fine-tuning job.

    This API can be used to cancel an existing fine-tuning job if it's no longer required. It takes the fine_tune_id as a parameter and returns a response object which has a success field confirming if the cancellation was successful.

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description CancelFineTuneResponse CancelFineTuneResponse

    an object that contains whether the cancellation was successful

    Cancelling fine-tuning job in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.cancel(fine_tune_id=\"ft-cir3eevt71r003ks6il0\")\nprint(response.json())\n
    {\n    \"success\": true\n}\n
    "},{"location":"api/python_client/#llmengine.Model","title":"Model","text":"

    Bases: APIEngine

    Model API. This API is used to get, list, and delete models. Models include both base models built into LLM Engine, and fine-tuned models that you create through the FineTune.create() API.

    See Model Zoo for the list of publicly available base models.

    "},{"location":"api/python_client/#llmengine.model.Model.get","title":"get classmethod","text":"
    get(model: str) -> GetLLMEndpointResponse\n

    Get information about an LLM model.

    This API can be used to get information about a Model's source and inference framework. For self-hosted users, it returns additional information about number of shards, quantization, infra settings, etc. The function takes as a single parameter the name model and returns a GetLLMEndpointResponse object.

    Parameters:

    Name Type Description Default model `str`

    Name of the model

    required

    Returns:

    Name Type Description GetLLMEndpointResponse GetLLMEndpointResponse

    object representing the LLM and configurations

    Accessing model in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.get(\"llama-7b.suffix.2023-07-18-12-00-00\")\n\nprint(response.json())\n
    {\n    \"id\": null,\n    \"name\": \"llama-7b.suffix.2023-07-18-12-00-00\",\n    \"model_name\": null,\n    \"source\": \"hugging_face\",\n    \"inference_framework\": \"text_generation_inference\",\n    \"inference_framework_tag\": null,\n    \"num_shards\": null,\n    \"quantize\": null,\n    \"spec\": null\n}\n
    "},{"location":"api/python_client/#llmengine.model.Model.list","title":"list classmethod","text":"
    list() -> ListLLMEndpointsResponse\n

    List LLM models available to call inference on.

    This API can be used to list all available models, including both publicly available models and user-created fine-tuned models. It returns a list of GetLLMEndpointResponse objects for all models. The most important field is the model name.

    Returns:

    Name Type Description ListLLMEndpointsResponse ListLLMEndpointsResponse

    list of models

    Listing available modes in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.list()\nprint(response.json())\n
    {\n    \"model_endpoints\": [\n        {\n            \"id\": null,\n            \"name\": \"llama-7b.suffix.2023-07-18-12-00-00\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"llama-7b\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"llama-13b-deepspeed-sync\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"deepspeed\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"falcon-40b\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.model.Model.delete","title":"delete classmethod","text":"
    delete(model: str) -> DeleteLLMEndpointResponse\n

    Deletes an LLM model.

    This API can be used to delete a fine-tuned model. It takes as parameter the name of the model and returns a response object which has a deleted field confirming if the deletion was successful. If called on a base model included with LLM Engine, an error will be thrown.

    Parameters:

    Name Type Description Default model `str`

    Name of the model

    required

    Returns:

    Name Type Description response DeleteLLMEndpointResponse

    whether the model was successfully deleted

    Deleting model in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.delete(\"llama-7b.suffix.2023-07-18-12-00-00\")\nprint(response.json())\n
    {\n    \"deleted\": true\n}\n
    "},{"location":"guides/completions/","title":"Completions","text":"

    Language Models are trained to predict natural language and provide text outputs as a response to their inputs. The inputs are called prompts and outputs are referred to as completions. LLMs take the input prompts and chunk them into smaller units called tokens to process and generate language. Tokens may include trailing spaces and even sub-words. This process is language dependent.

    Scale's LLM Engine provides access to open source language models (see Model Zoo) that can be used for producing completions to prompts.

    "},{"location":"guides/completions/#completion-api-call","title":"Completion API call","text":"

    An example API call looks as follows:

    Completion call in Python
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-7b\",\n    prompt=\"Hello, my name is\",\n    max_new_tokens=10,\n    temperature=0.2,\n)\n\nprint(response.json())\n# '{\"request_id\": \"c4bf0732-08e0-48a8-8b44-dfe8d4702fb0\", \"output\": {\"text\": \"________ and I am a ________\", \"num_completion_tokens\": 10}}'\nprint(response.output.text)\n# ________ and I am a ________\n
    • model: The LLM you want to use (see Model Zoo).
    • prompt: The main input for the LLM to respond to.
    • max_new_tokens: The maximum number of tokens to generate in the chat completion.
    • temperature: The sampling temperature to use. Higher values make the output more random, while lower values will make it more focused and deterministic.

    See the full Completion API reference documentation to learn more.

    "},{"location":"guides/completions/#completion-api-response","title":"Completion API response","text":"

    An example Completion API response looks as follows:

    Response in JSONResponse in Python

    >>> print(response.json())\n
    Example output:
    {\n  \"request_id\": \"c4bf0732-08e0-48a8-8b44-dfe8d4702fb0\",\n  \"output\": {\n    \"text\": \"_______ and I am a _______\",\n    \"num_completion_tokens\": 10\n}\n}\n

    >>> print(response.output.text)\n
    Example output:
    _______ and I am a _______\n

    "},{"location":"guides/completions/#token-streaming","title":"Token streaming","text":"

    The Completions API supports token streaming to reduce perceived latency for certain applications. When streaming, tokens will be sent as data-only server-side events.

    To enable token streaming, pass stream=True to either Completion.create or Completion.acreate.

    An example of token streaming using the synchronous Completions API looks as follows:

    Token streaming with synchronous API in python
    import sys\nfrom llmengine import Completion\n\nstream = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"Give me a 200 word summary on the current economic events in the US.\",\n    max_new_tokens=1000,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.output.text, end=\"\")\n        sys.stdout.flush()\n
    "},{"location":"guides/completions/#async-requests","title":"Async requests","text":"

    The Python client supports asyncio for creating Completions. Use Completion.acreate instead of Completion.create to utilize async processing. The function signatures are otherwise identical.

    An example of async Completions looks as follows:

    Completions with asynchronous API in python
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    response = await Completion.acreate(\n        model=\"llama-7b\",\n        prompt=\"Hello, my name is\",\n        max_new_tokens=10,\n        temperature=0.2,\n    )\n    print(response.json())\n\nasyncio.run(main())\n
    "},{"location":"guides/completions/#which-model-should-i-use","title":"Which model should I use?","text":"

    See the Model Zoo for more information on best practices for which model to use for Completions.

    "},{"location":"guides/fine_tuning/","title":"Fine-tuning","text":"

    Learn how to customize your models on your data with fine-tuning. Or get started right away with our fine-tuning cookbook.

    "},{"location":"guides/fine_tuning/#introduction","title":"Introduction","text":"

    Fine-tuning helps improve model performance by training on specific examples of prompts and desired responses. LLMs are initially trained on data collected from the entire internet. With fine-tuning, LLMs can be optimized to perform better in a specific domain by learning from examples for that domain. Smaller LLMs that have been fine-tuned on a specific use case often outperform larger ones that were trained more generally.

    Fine-tuning allows for:

    1. Higher quality results than prompt engineering alone
    2. Cost savings through shorter prompts
    3. The ability to reach equivalent accuracy with a smaller model
    4. Lower latency at inference time
    5. The chance to show an LLM more examples than can fit in a single context window

    LLM Engine's fine-tuning API lets you fine-tune various open source LLMs on your own data and then make inference calls to the resulting LLM. For more specific details, see the fine-tuning API reference.

    "},{"location":"guides/fine_tuning/#producing-high-quality-data-for-fine-tuning","title":"Producing high quality data for fine-tuning","text":"

    The training data for fine-tuning should consist of prompt and response pairs.

    As a rule of thumb, you should expect to see linear improvements in your fine-tuned model's quality with each doubling of the dataset size. Having high-quality data is also essential to improving performance. For every linear increase in the error rate in your training data, you may encounter a roughly quadratic increase in your fine-tuned model's error rate.

    High quality data is critical to achieve improved model performance, and in several cases will require experts to generate and prepare data - the breadth and diversity of the data is highly critical. Scale's Data Engine can help prepare such high quality, diverse data sets - more information here.

    "},{"location":"guides/fine_tuning/#preparing-data","title":"Preparing data","text":"

    Your data must be formatted as a CSV file that includes two columns: prompt and response. A maximum of 100,000 rows of data is currently supported. At least 200 rows of data is recommended to start to see benefits from fine-tuning.

    Here is an example script to create a 50-row CSV of properly formatted data for fine-tuning an airline question answering bot

    Creating a sample dataset
    import csv\n# Define data\ndata = [\n    (\"What is your policy on carry-on luggage?\", \"Our policy allows each passenger to bring one piece of carry-on luggage and one personal item such as a purse or briefcase. The maximum size for carry-on luggage is 22 x 14 x 9 inches.\"),\n    (\"How can I change my flight?\", \"You can change your flight through our website or mobile app. Go to 'Manage my booking' section, enter your booking reference and last name, then follow the prompts to change your flight.\"),\n    (\"What meals are available on my flight?\", \"We offer a variety of meals depending on the flight's duration and route. These can range from snacks and light refreshments to full-course meals on long-haul flights. Specific meal options can be viewed during the booking process.\"),\n    (\"How early should I arrive at the airport before my flight?\", \"We recommend arriving at least two hours before domestic flights and three hours before international flights.\"),\n    (\"Can I select my seat in advance?\", \"Yes, you can select your seat during the booking process or afterwards via the 'Manage my booking' section on our website or mobile app.\"),\n    (\"What should I do if my luggage is lost?\", \"If your luggage is lost, please report this immediately at our 'Lost and Found' counter at the airport. We will assist you in tracking your luggage.\"),\n    (\"Do you offer special assistance for passengers with disabilities?\", \"Yes, we offer special assistance for passengers with disabilities. Please notify us of your needs at least 48 hours prior to your flight.\"),\n    (\"Can I bring my pet on the flight?\", \"Yes, we allow small pets in the cabin, and larger pets in the cargo hold. Please check our pet policy for more details.\"),\n    (\"What is your policy on flight cancellations?\", \"In case of flight cancellations, we aim to notify passengers as early as possible and offer either a refund or a rebooking on the next available flight.\"),\n    (\"Can I get a refund if I cancel my flight?\", \"Refunds depend on the type of ticket purchased. Please check our cancellation policy for details. Non-refundable tickets, however, are typically not eligible for refunds unless due to extraordinary circumstances.\"),\n    (\"How can I check-in for my flight?\", \"You can check-in for your flight either online, through our mobile app, or at the airport. Online and mobile app check-in opens 24 hours before departure and closes 90 minutes before.\"),\n    (\"Do you offer free meals on your flights?\", \"Yes, we serve free meals on all long-haul flights. For short-haul flights, we offer a complimentary drink and snack. Special meal requests should be made at least 48 hours before departure.\"),\n    (\"Can I use my electronic devices during the flight?\", \"Small electronic devices can be used throughout the flight in flight mode. Larger devices like laptops may be used above 10,000 feet.\"),\n    (\"How much baggage can I check-in?\", \"The checked baggage allowance depends on the class of travel and route. The details would be mentioned on your ticket, or you can check on our website.\"),\n    (\"How can I request for a wheelchair?\", \"To request a wheelchair or any other special assistance, please call our customer service at least 48 hours before your flight.\"),\n    (\"Do I get a discount for group bookings?\", \"Yes, we offer discounts on group bookings of 10 or more passengers. Please contact our group bookings team for more information.\"),\n    (\"Do you offer Wi-fi on your flights?\", \"Yes, we offer complimentary Wi-fi on select flights. You can check the availability during the booking process.\"),\n    (\"What is the minimum connecting time between flights?\", \"The minimum connecting time varies depending on the airport and whether your flight is international or domestic. Generally, it's recommended to allow at least 45-60 minutes for domestic connections and 60-120 minutes for international.\"),\n    (\"Do you offer duty-free shopping on international flights?\", \"Yes, we have a selection of duty-free items that you can pre-order on our website or purchase onboard on international flights.\"),\n    (\"Can I upgrade my ticket to business class?\", \"Yes, you can upgrade your ticket through the 'Manage my booking' section on our website or by contacting our customer service. The availability and costs depend on the specific flight.\"),\n    (\"Can unaccompanied minors travel on your flights?\", \"Yes, we do accommodate unaccompanied minors on our flights, with special services to ensure their safety and comfort. Please contact our customer service for more details.\"),\n    (\"What amenities do you provide in business class?\", \"In business class, you will enjoy additional legroom, reclining seats, premium meals, priority boarding and disembarkation, access to our business lounge, extra baggage allowance, and personalized service.\"),\n    (\"How much does extra baggage cost?\", \"Extra baggage costs vary based on flight route and the weight of the baggage. Please refer to our 'Extra Baggage' section on the website for specific rates.\"),\n    (\"Are there any specific rules for carrying liquids in carry-on?\", \"Yes, liquids carried in your hand luggage must be in containers of 100 ml or less and they should all fit into a single, transparent, resealable plastic bag of 20 cm x 20 cm.\"),\n    (\"What if I have a medical condition that requires special assistance during the flight?\", \"We aim to make the flight comfortable for all passengers. If you have a medical condition that may require special assistance, please contact our \u2018special services\u2019 team 48 hours before your flight.\"),\n    (\"What in-flight entertainment options are available?\", \"We offer a range of in-flight entertainment options including a selection of movies, TV shows, music, and games, available on your personal seat-back screen.\"),\n    (\"What types of payment methods do you accept?\", \"We accept credit/debit cards, PayPal, bank transfers, and various other forms of payment. The available options may vary depending on the country of departure.\"),\n    (\"How can I earn and redeem frequent flyer miles?\", \"You can earn miles for every journey you take with us or our partner airlines. These miles can be redeemed for flight tickets, upgrades, or various other benefits. To earn and redeem miles, you need to join our frequent flyer program.\"),\n    (\"Can I bring a stroller for my baby?\", \"Yes, you can bring a stroller for your baby. It can be checked in for free and will normally be given back to you at the aircraft door upon arrival.\"),\n    (\"What age does my child have to be to qualify as an unaccompanied minor?\", \"Children aged between 5 and 12 years who are traveling alone are considered unaccompanied minors. Our team provides special care for these children from departure to arrival.\"),\n    (\"What documents do I need to travel internationally?\", \"For international travel, you need a valid passport and may also require visas, depending on your destination and your country of residence. It's important to check the specific requirements before you travel.\"),\n    (\"What happens if I miss my flight?\", \"If you miss your flight, please contact our customer service immediately. Depending on the circumstances, you may be able to rebook on a later flight, but additional fees may apply.\"),\n    (\"Can I travel with my musical instrument?\", \"Yes, small musical instruments can be brought on board as your one carry-on item. Larger instruments must be transported in the cargo, or if small enough, a seat may be purchased for them.\"),\n    (\"Do you offer discounts for children or infants?\", \"Yes, children aged 2-11 traveling with an adult usually receive a discount on the fare. Infants under the age of 2 who do not occupy a seat can travel for a reduced fare or sometimes for free.\"),\n    (\"Is smoking allowed on your flights?\", \"No, all our flights are non-smoking for the comfort and safety of all passengers.\"),\n    (\"Do you have family seating?\", \"Yes, we offer the option to seat families together. You can select seats during booking or afterwards through the 'Manage my booking' section on the website.\"),\n    (\"Is there any discount for senior citizens?\", \"Some flights may offer a discount for senior citizens. Please check our website or contact customer service for accurate information.\"),\n    (\"What items are prohibited on your flights?\", \"Prohibited items include, but are not limited to, sharp objects, firearms, explosive materials, and certain chemicals. You can find a comprehensive list on our website under the 'Security Regulations' section.\"),\n    (\"Can I purchase a ticket for someone else?\", \"Yes, you can purchase a ticket for someone else. You'll need their correct name as it appears on their government-issued ID, and their correct travel dates.\"),\n    (\"What is the process for lost and found items on the plane?\", \"If you realize you forgot an item on the plane, report it as soon as possible to our lost and found counter. We will make every effort to locate and return your item.\"),\n    (\"Can I request a special meal?\", \"Yes, we offer a variety of special meals to accommodate dietary restrictions. Please request your preferred meal at least 48 hours prior to your flight.\"),\n    (\"Is there a weight limit for checked baggage?\", \"Yes, luggage weight limits depend on your ticket class and route. You can find the details on your ticket or by visiting our website.\"),\n    (\"Can I bring my sports equipment?\", \"Yes, certain types of sports equipment can be carried either as or in addition to your permitted baggage. Some equipment may require additional fees. It's best to check our policy on our website or contact us directly.\"),\n    (\"Do I need a visa to travel to certain countries?\", \"Yes, visa requirements depend on the country you are visiting and your nationality. We advise checking with the relevant embassy or consulate prior to travel.\"),\n    (\"How can I add extra baggage to my booking?\", \"You can add extra baggage to your booking through the 'Manage my booking' section on our website or by contacting our customer services.\"),\n    (\"Can I check-in at the airport?\", \"Yes, you can choose to check-in at the airport. However, we also offer online and mobile check-in, which may save you time.\"),\n    (\"How do I know if my flight is delayed or cancelled?\", \"In case of any changes to your flight, we will attempt to notify all passengers using the contact information given at the time of booking. You can also check your flight status on our website.\"),\n    (\"What is your policy on pregnant passengers?\", \"Pregnant passengers can travel up to the end of the 36th week for single pregnancies, and the end of the 32nd week for multiple pregnancies. We recommend consulting your doctor before any air travel.\"),\n    (\"Can children travel alone?\", \"Yes, children age 5 to 12 can travel alone as unaccompanied minors. We provide special care for these seats. Please contact our customer service for more information.\"),\n    (\"How can I pay for my booking?\", \"You can pay for your booking using a variety of methods including credit and debit cards, PayPal, or bank transfers. The options may vary depending on the country of departure.\"),\n]\n\n# Write data to a CSV file\nwith open('customer_service_data.csv', 'w', newline='') as file:\n    writer = csv.writer(file)\n    writer.writerow([\"prompt\", \"response\"])\n    writer.writerows(data)\n
    "},{"location":"guides/fine_tuning/#making-your-data-accessible-to-llm-engine","title":"Making your data accessible to LLM Engine","text":"

    Currently, data needs to be uploaded to a publicly accessible web URL so that it can be read for fine-tuning. Publicly accessible HTTP and HTTPS URLs are currently supported. Support for privately sharing data with the LLM Engine API is coming shortly. For quick iteration, you can look into tools like Pastebin or GitHub Gists to quickly host your CSV files in a public manner. An example Github Gist can be found here. To use the gist, you can use the URL given when you click the \u201cRaw\u201d button (URL).

    "},{"location":"guides/fine_tuning/#launching-the-fine-tune","title":"Launching the fine-tune","text":"

    Once you have uploaded your data, you can use the LLM Engine's FineTune.Create API to launch a fine-tune. You will need to specify which base model to fine-tune, the locations of the training file and optional validation data file, an optional set of hyperparameters to customize the fine-tuning behavior, and an optional suffix to append to the name of the fine-tune. For sequences longer than the native max_seq_length of the model, the sequences will be truncated.

    If you specify a suffix, the fine-tune will be named model.suffix.<timestamp>. If you do not, the fine-tune will be named model.<timestamp>. The timestamp will be the time the fine-tune was launched.

    Hyper-parameters for fine-tune * `lr`: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3) * `warmup_ratio`: Ratio of training steps used for learning rate warmup. (Default: 0.03) * `epochs`: Number of fine-tuning epochs. This should be less than 20. (Default: 5) * `weight_decay`: Regularization penalty applied to learned weights. (Default: 0.001) Create a fine-tune in python
    from llmengine import FineTune\n\nresponse = FineTune.create(\n    model=\"llama-7b\",\n    training_file=\"s3://my-bucket/path/to/training-file.csv\",\n)\n\nprint(response.json())\n

    See the Model Zoo to see which models have fine-tuning support.

    Once the fine-tune is launched, you can also get the status of your fine-tune. You can also list events that your fine-tune produces.

    "},{"location":"guides/fine_tuning/#making-inference-calls-to-your-fine-tune","title":"Making inference calls to your fine-tune","text":"

    Once your fine-tune is finished, you will be able to start making inference requests to the model. You can use the fine_tuned_model returned from your FineTune.get API call to reference your fine-tuned model in the Completions API. Alternatively, you can list available LLMs with Model.list in order to find the name of your fine-tuned model. See the Completion API for more details. You can then use that name to direct your completion requests. You must wait until your fine-tune is complete before you can plug it into the Completions API. You can check the status of your fine-tune with FineTune.get.

    Inference with a fine-tuned model in python
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-7b.airlines.2023-07-17-08-30-45\",\n    prompt=\"Do you offer in-flight Wi-fi?\",\n    max_new_tokens=100,\n    temperature=0.2,\n)\nprint(response.json())\n
    "},{"location":"guides/rate_limits/","title":"Overview","text":""},{"location":"guides/rate_limits/#what-are-rate-limits","title":"What are rate limits?","text":"

    A rate limit is a restriction that an API imposes on the number of times a user or client can access the server within a specified period of time.

    "},{"location":"guides/rate_limits/#how-do-i-know-if-i-am-rate-limited","title":"How do I know if I am rate limited?","text":"

    Per standard HTTP practices, your request will receive a response with HTTP status code of 429, Too Many Requests.

    "},{"location":"guides/rate_limits/#what-are-the-rate-limits-for-our-api","title":"What are the rate limits for our API?","text":"

    The LLM Engine API is currently in a preview mode, and therefore we currently do not have any advertised rate limits. As the API moves towards a production release, we will update this section with specific rate limits. For now, the API will return HTTP 429 on an as-needed basis.

    "},{"location":"guides/rate_limits/#error-mitigation","title":"Error mitigation","text":""},{"location":"guides/rate_limits/#retrying-with-exponential-backoff","title":"Retrying with exponential backoff","text":"

    One easy way to avoid rate limit errors is to automatically retry requests with a random exponential backoff. Retrying with exponential backoff means performing a short sleep when a rate limit error is hit, then retrying the unsuccessful request. If the request is still unsuccessful, the sleep length is increased and the process is repeated. This continues until the request is successful or until a maximum number of retries is reached. This approach has many benefits:

    • Automatic retries means you can recover from rate limit errors without crashes or missing data
    • Exponential backoff means that your first retries can be tried quickly, while still benefiting from longer delays if your first few retries fail
    • Adding random jitter to the delay helps retries from all hitting at the same time.

    Below are a few example solutions for Python that use exponential backoff.

    "},{"location":"guides/rate_limits/#example-1-using-the-tenacity-library","title":"Example #1: Using the tenacity library","text":"

    Tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simplify the task of adding retry behavior to just about anything. To add exponential backoff to your requests, you can use the tenacity.retry decorator. The below example uses the tenacity.wait_random_exponential function to add random exponential backoff to a request.

    Exponential backoff in python
    import llmengine\nfrom tenacity import (\n    retry,\n    stop_after_attempt,\n    wait_random_exponential,\n)  # for exponential backoff\n@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))\ndef completion_with_backoff(**kwargs):\n    return llmengine.Completion.create(**kwargs)\n\ncompletion_with_backoff(model=\"llama-7b\", prompt=\"Why is the sky blue?\")\n
    "},{"location":"guides/rate_limits/#example-2-using-the-backoff-library","title":"Example #2: Using the backoff library","text":"

    Backoff is another python library that provides function decorators which can be used to wrap a function such that it will be retried until some condition is met.

    Decorators for backoff and retry in python
    import llmengine\nimport backoff\n@backoff.on_exception(backoff.expo, llmengine.errors.RateLimitExceededError)\ndef completion_with_backoff(**kwargs):\n    return llmengine.Completion.create(**kwargs)\n\ncompletions_with_backoff(model=\"llama-7b\", prompt=\"Why is the sky blue?\")\n
    "},{"location":"guides/self_hosting/","title":"Self Hosting [Experimental]","text":"

    This guide is currently highly experimental. Instructions are subject to change as we improve support for self-hosting.

    We provide a Helm chart that deploys LLM Engine to an Elastic Kubernetes Cluster (EKS) in AWS. This Helm chart should be configured to connect to dependencies (such as a PostgreSQL database) that you may already have available in your environment.

    The only portions of the Helm chart that are production ready are the parts that configure and manage LLM Server itself (not PostgreSQL, IAM, etc.)

    We first go over required AWS dependencies that are required to exist before we can run helm install in your EKS cluster.

    "},{"location":"guides/self_hosting/#aws-dependencies","title":"AWS Dependencies","text":"

    This section describes assumptions about existing AWS resources required run to the LLM Engine Server

    "},{"location":"guides/self_hosting/#eks","title":"EKS","text":"

    The LLM Engine server must be deployed in an EKS cluster environment. Currently only versions 1.23+ are supported. Below are the assumed requirements for the EKS cluster:

    You will need to provision EKS node groups with GPUs to schedule model pods. These node groups must have the node-lifecycle: normal label on them. Additionally, they must have the k8s.amazonaws.com/accelerator label set appropriately depending on the instance type:

    Instance family k8s.amazonaws.com/accelerator label g4dn nvidia-tesla-t4 g5 nvidia-tesla-a10 p4d nvidia-tesla-a100 p4de nvidia-tesla-a100e

    We also recommend setting the following taint on your GPU nodes to prevent pods requiring GPU resources from being scheduled on them: - { key = \"nvidia.com/gpu\", value = \"true\", effect = \"NO_SCHEDULE\" }

    "},{"location":"guides/self_hosting/#postgresql","title":"PostgreSQL","text":"

    The LLM Engine server requires a PostgreSQL database to back data. LLM Engine currently supports PostgreSQL version 14. Create a PostgreSQL database (e.g. AWS RDS PostgreSQL) if you do not have an existing one you wish to connect LLM Engine to.

    To enable LLM Engine to connect to the PostgreSQL engine, we create a Kubernetes secret with the PostgreSQL url. An example YAML is provided below:

    apiVersion: v1\nkind: Secret\nmetadata:\n  name: llm-engine-database-credentials  # this name will be an input to our Helm Chart\ndata:\n    database_url = \"postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]\"\n

    "},{"location":"guides/self_hosting/#redis","title":"Redis","text":"

    The LLM Engine server requires Redis for various caching/queue functionality. LLM Engine currently supports Redis version 6. Create a Redis cluster (e.g. AWS Elasticache for Redis) if you do not have an existing one you wish to connect LLM Engine to.

    To enable LLM Engine to connect redis, fill out the Helm chart values with the redis host and url.

    "},{"location":"guides/self_hosting/#amazon-s3","title":"Amazon S3","text":"

    You will need to have an S3 bucket for LLM Engine to store various assets (e.g model weigts, prediction restuls). The ARN of this bucket should be provided in the Helm chart values.

    "},{"location":"guides/self_hosting/#amazon-ecr","title":"Amazon ECR","text":"

    You will need to provide an ECR repository for the deployment to store model containers. The ARN of this repository should be provided in the Helm chart values.

    "},{"location":"guides/self_hosting/#amazon-sqs","title":"Amazon SQS","text":"

    LLM Engine utilizes Amazon SQS to keep track of jobs. LLM Engine will create and use SQS queues as needed.

    "},{"location":"guides/self_hosting/#identity-and-access-management-iam","title":"Identity and Access Management (IAM)","text":"

    The LLM Engine server will an IAM role to perform various AWS operations. This role will be assumed by the serviceaccount llm-engine in the launch namespace in the EKS cluster. The ARN of this role needs to be provided to the Helm chart, and the role needs to be provided the following permissions:

    Action Resource s3:Get*, s3:Put* ${s3_bucket_arn}/* s3:List* ${s3_bucket_arn} sqs:* arn:aws:sqs:${region}:${account_id}:llm-engine-endpoint-id-* sqs:ListQueues * ecr:BatchGetImage, ecr:DescribeImages, ecr:GetDownloadUrlForLayer, ecr:ListImages ${ecr_repository_arn}"},{"location":"guides/self_hosting/#helm-chart","title":"Helm Chart","text":"

    Now that all dependencies have been installed and configured, we can run the provided Helm chart. The values in the Helm chart will need to correspond with the resources described in the Dependencies section.

    Ensure that Helm V3 is installed instructions and can connect to the EKS cluster. Users should be able to install the chart with helm install llm-engine llm-engine -f llm-engine/values_sample.yaml -n <DESIRED_NAMESPACE>. Below are the configurations to specify in the values_sample.yaml file.

    Parameter Description Required tag The LLM Engine docker image tag Yes context A user-specified deployment tag No image.gatewayRepository The docker repository to pull the LLM Engine gateway image from Yes image.builderRepository The docker repository to pull the LLM Engine endpoint builder image from Yes image.cacherRepository The docker repository to pull the LLM Engine cacher image from Yes image.forwarderRepository The docker repository to pull the LLM Engine forwarder image from Yes image.pullPolicy The docker image pull policy No secrets.kubernetesDatabaseSecretName The name of the secret that contains the database credentials Yes serviceAccount.annotations.eks.amazonaws.com/role-arn The ARN of the IAM role that the service account will assume Yes service.type The service configuration for the main LLM Engine server No service.port The service configuration for the main LLM Engine server No replicaCount The amount of replica pods for each deployment No autoscaling The autoscaling configuration for LLM Engine server deployments No resources.requests.cpu The k8s resources for LLM Engine server deployments No nodeSelector The node selector for LLM Engine server deployments No tolerations The tolerations for LLM Engine server deployments No affinity The affinity for LLM Engine server deployments No aws.configMap.name The AWS configurations (by configMap) for LLM Engine server deployments No aws.configMap.create The AWS configurations (by configMap) for LLM Engine server deployments No aws.profileName The AWS configurations (by configMap) for LLM Engine server deployments No serviceTemplate.securityContext.capabilities.drop Additional flags for model endpoints No serviceTemplate.mountInfraConfig Additional flags for model endpoints No config.values.infra.k8s_cluster_name The name of the k8s cluster Yes config.values.infra.dns_host_domain The domain name of the k8s cluster Yes config.values.infra.default_region The default AWS region for various resources Yes config.values.infra.ml_account_id The AWS account ID for various resources Yes config.values.infra.docker_repo_prefix The prefix for AWS ECR repositories Yes config.values.infra.redis_host The hostname of the redis cluster you wish to connect Yes config.values.infra.s3_bucket The S3 bucket you wish to connect Yes config.values.llm_engine.endpoint_namespace K8s namespace the endpoints will be created in Yes config.values.llm_engine.cache_redis_url The full url for the redis cluster you wish to connect Yes config.values.llm_engine.s3_file_llm_fine_tuning_job_repository The S3 URI for the S3 bucket/key that you wish to save fine-tuned assets Yes config.values.datadog_trace_enabled Whether to enable datadog tracing, datadog must be installed in the cluster No"},{"location":"guides/token_streaming/","title":"Token streaming","text":"

    The Completions APIs support a stream boolean parameter that, when True, will return a streamed response of token-by-token server-sent events (SSEs) rather than waiting to receive the full response when model generation has finished. This decreases latency of when you start getting a response.

    The response will consist of SSEs of the form {\"token\": dict, \"generated_text\": str | null, \"details\": dict | null}, where the dictionary for each token will contain log probability information in addition to the generated string; the generated_text field will be null for all but the last SSE, for which it will contain the full generated response.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduction","text":""},{"location":"#llm-engine","title":"LLM Engine","text":"

    The open source engine for fine-tuning and serving large language models.

    LLM Engine is the easiest way to customize and serve LLMs.

    LLMs can be accessed via Scale's hosted version or by using the Helm charts in this repository to run model inference and fine-tuning in your own infrastructure.

    "},{"location":"#quick-install","title":"Quick Install","text":"Install the python package
    pip install scale-llm-engine\n
    "},{"location":"#about","title":"About","text":"

    Foundation models are emerging as the building blocks of AI. However, deploying these models to the cloud and fine-tuning them is an expensive operation that require infrastructure and ML expertise. It is also difficult to maintain over time as new models are released and new techniques for both inference and fine-tuning are made available.

    LLM Engine is a Python library and Helm chart that provides everything you need to serve and fine-tune foundation models, whether you use Scale's hosted infrastructure or do it in your own cloud infrastructure using Kubernetes.

    "},{"location":"#key-features","title":"Key Features","text":"

    Ready-to-use APIs for your favorite models: Deploy and serve open source foundation models - including LLaMA, MPT, and Falcon. Use Scale-hosted models or deploy to your own infrastructure.

    Fine-tune your favorite models: Fine-tune open-source foundation models like LLaMA, MPT, etc. with your own data for optimized performance.

    Optimized Inference: LLM Engine provides inference APIs for streaming responses and dynamically batching inputs for higher throughput and lower latency.

    Open-Source Integrations: Deploy any Hugging Face model with a single command.

    Deploying from any docker image: Turn any Docker image into an auto-scaling deployment with simple APIs.

    "},{"location":"#features-coming-soon","title":"Features Coming Soon","text":"

    Kubernetes Installation Documentation: We are working hard to document the installation and maintenance of inference and fine-tuning functionality on your infrastructure. For now, our documentation covers using our client libraries to access Scale's hosted infrastructure.

    Fast Cold-Start Times: To prevent GPUs from idling, LLM Engine automatically scales your model to zero when it's not in use and scales up within seconds, even for large foundation models.

    Cost Optimization: Deploy AI models cheaper than commercial ones, including cold-start and warm-down times.

    "},{"location":"contributing/","title":"Contributing to LLM Engine","text":""},{"location":"contributing/#updating-llm-engine-documentation","title":"Updating LLM Engine Documentation","text":"

    LLM Engine leverages mkdocs to create beautiful, community-oriented documentation.

    "},{"location":"contributing/#step-1-clone-the-repository","title":"Step 1: Clone the Repository","text":"

    Clone/Fork the LLM Engine Repository. Our documentation lives in the docs folder.

    "},{"location":"contributing/#step-2-install-the-dependencies","title":"Step 2: Install the Dependencies","text":"

    Dependencies are located in requirements-docs.txt, go ahead and pip install those with

    pip install -r requirements-docs.txt\n
    "},{"location":"contributing/#step-3-install-the-python-client-locally","title":"Step 3: Install the Python client locally","text":"

    Our Python client API reference is autogenerated from our client. You can install the client in editable mode with

    pip install -r clients/python\n
    "},{"location":"contributing/#step-4-run-locally","title":"Step 4: Run Locally","text":"

    To run the documentation service locally, execute the following command:

    mkdocs serve\n

    This should kick off a locally running instance on http://127.0.0.1:8000/.

    As you edit the content in the docs folder, the site will be automatically reloaded on each file save.

    "},{"location":"contributing/#step-5-editing-navigation-and-settings","title":"Step 5: Editing Navigation and Settings","text":"

    If you are less familiar with mkdocs, in addition to the markdown content in the docs folder, there is a top-level mkdocs.yml file as well that defines the navigation pane and other website settings. If you don't see your page where you think it should be, double-check the .yml file.

    "},{"location":"contributing/#step-6-building-and-deploying","title":"Step 6: Building and Deploying","text":"

    CircleCI (via .circleci/config.yml) handles the building and deployment of our documentation service for us.

    "},{"location":"faq/","title":"Frequently Asked Questions","text":""},{"location":"getting_started/","title":"Getting Started","text":"

    The fastest way to get started with LLM Engine is to use the Python client in this repository to run inference and fine-tuning on Scale's infrastructure. This path does not require you to install anything on your infrastructure, and Scale's free research preview gives you access to experimentation using open source LLMs.

    To start, install LLM Engine via pip:

    pip
    pip install scale-llm-engine\n
    "},{"location":"getting_started/#scale-api-keys","title":"Scale API Keys","text":"

    Next, you need a Scale Spellbook API key.

    "},{"location":"getting_started/#retrieving-your-api-key","title":"Retrieving your API Key","text":"

    To retrieve your API key, head to Scale Spellbook where you will get an API key on the settings page.

    Different API Keys for different Scale Products

    If you have leveraged Scale's platform for annotation work in the past, please note that your Spellbook API key will be different than the Scale Annotation API key. You will want to create a Spellbook API key before getting started.

    "},{"location":"getting_started/#set-your-api-key","title":"Set your API Key","text":"

    LLM Engine uses environment variables to access your API key.

    Set this API key as the SCALE_API_KEY environment variable by running the following command in your terminal before you run your python application.

    export SCALE_API_KEY=\"[Your API key]\"\n

    You can also add in the line above to your .zshrc or .bash_profile so it's automatically set for future sessions.

    "},{"location":"getting_started/#example-code","title":"Example Code","text":""},{"location":"getting_started/#sample-completion","title":"Sample Completion","text":"

    With your API key set, you can now send LLM Engine requests using the Python client:

    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"I'm opening a pancake restaurant that specializes in unique pancake shapes, colors, and flavors. List 3 quirky names I could name my restaurant.\",\n    max_new_tokens=100,\n    temperature=0.2,\n)\n\nprint(response.output.text)\n
    "},{"location":"getting_started/#with-streaming","title":"With Streaming","text":"
    import sys\nfrom llmengine import Completion\n\nstream = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"Give me a 200 word summary on the current economic events in the US.\",\n    max_new_tokens=1000,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.output.text, end=\"\")\n        sys.stdout.flush()\n
    "},{"location":"model_zoo/","title":"Public Model Zoo","text":"

    Scale hosts the following models in the LLM Engine Model Zoo:

    Model Name Inference APIs Available Fine-tuning APIs Available llama-7b \u2705 \u2705 llama-2-7b \u2705 \u2705 falcon-7b \u2705 falcon-7b-instruct \u2705 falcon-40b \u2705 falcon-40b-instruct \u2705 mpt-7b \u2705 mpt-7b-instruct \u2705 \u2705 flan-t5-xxl \u2705"},{"location":"model_zoo/#usage","title":"Usage","text":"

    Each of these models can be used with the Completion API.

    The specified models can be fine-tuned with the FineTune API.

    More information about the models can be found using the Model API.

    "},{"location":"pricing/","title":"Pricing","text":"

    LLM Engine is an open-source project and free self-hosting will always be an option.

    A hosted option for LLM Engine is being offered initially as a free preview via Scale Spellbook.

    "},{"location":"pricing/#self-hosted-models","title":"Self-Hosted Models","text":"

    We are committed to supporting the open-source community. Self-hosting LLM Engine will remain free and open-source.

    We would love contributions from the community make this even more amazing!

    "},{"location":"pricing/#hosted-models","title":"Hosted Models","text":"

    Once the limited preview period has ended, billing for hosted models will be managed through the Scale Spellbook product.

    Scale Spellbook leverages usage-based spending, billed to a credit card. Details on usage-based pricing will be shared with everyone before completing the limited preview.

    "},{"location":"api/data_types/","title":"\ud83d\udc0d Python Client Data Type Reference","text":""},{"location":"api/data_types/#llmengine.CompletionOutput","title":"CompletionOutput","text":"

    Bases: BaseModel

    Represents the output of a completion request to a model.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionOutput.text","title":"text instance-attribute","text":"
    text: str\n

    The text of the completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionOutput.num_completion_tokens","title":"num_completion_tokens instance-attribute","text":"
    num_completion_tokens: int\n

    Number of tokens in the completion.

    "},{"location":"api/data_types/#llmengine.CompletionStreamOutput","title":"CompletionStreamOutput","text":"

    Bases: BaseModel

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.text","title":"text instance-attribute","text":"
    text: str\n

    The text of the completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.finished","title":"finished instance-attribute","text":"
    finished: bool\n

    Whether the completion is finished.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamOutput.num_completion_tokens","title":"num_completion_tokens class-attribute instance-attribute","text":"
    num_completion_tokens: Optional[int] = None\n

    Number of tokens in the completion.

    "},{"location":"api/data_types/#llmengine.CompletionSyncResponse","title":"CompletionSyncResponse","text":"

    Bases: BaseModel

    Response object for a synchronous prompt completion.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionSyncResponse.output","title":"output instance-attribute","text":"
    output: CompletionOutput\n

    Completion output.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionSyncResponse.request_id","title":"request_id instance-attribute","text":"
    request_id: str\n

    The unique ID of the corresponding Completion request. This request_id is generated on the server, and all logs associated with the request are grouped by the request_id, which allows for easier troubleshooting of errors as follows:

    • When running the Scale-hosted LLM Engine, please provide the request_id in any bug reports.
    • When running the self-hosted LLM Engine, the request_id serves as a trace ID in your observability provider.
    "},{"location":"api/data_types/#llmengine.CompletionStreamResponse","title":"CompletionStreamResponse","text":"

    Bases: BaseModel

    Response object for a stream prompt completion task.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamResponse.output","title":"output class-attribute instance-attribute","text":"
    output: Optional[CompletionStreamOutput] = None\n

    Completion output.

    "},{"location":"api/data_types/#llmengine.data_types.CompletionStreamResponse.request_id","title":"request_id instance-attribute","text":"
    request_id: str\n

    The unique ID of the corresponding Completion request. This request_id is generated on the server, and all logs associated with the request are grouped by the request_id, which allows for easier troubleshooting of errors as follows:

    • When running the Scale-hosted LLM Engine, please provide the request_id in any bug reports.
    • When running the self-hosted LLM Engine, the request_id serves as a trace ID in your observability provider.
    "},{"location":"api/data_types/#llmengine.CreateFineTuneResponse","title":"CreateFineTuneResponse","text":"

    Bases: BaseModel

    Response object for creating a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.CreateFineTuneResponse.fine_tune_id","title":"fine_tune_id class-attribute instance-attribute","text":"
    fine_tune_id: str = Field(..., description='ID of the created fine-tuning job.')\n

    The ID of the FineTune.

    "},{"location":"api/data_types/#llmengine.GetFineTuneResponse","title":"GetFineTuneResponse","text":"

    Bases: BaseModel

    Response object for retrieving a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.GetFineTuneResponse.fine_tune_id","title":"fine_tune_id class-attribute instance-attribute","text":"
    fine_tune_id: str = Field(..., description='ID of the requested job.')\n

    The ID of the FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.GetFineTuneResponse.status","title":"status class-attribute instance-attribute","text":"
    status: BatchJobStatus = Field(..., description='Status of the requested job.')\n

    The status of the FineTune job.

    "},{"location":"api/data_types/#llmengine.ListFineTunesResponse","title":"ListFineTunesResponse","text":"

    Bases: BaseModel

    Response object for listing FineTunes.

    "},{"location":"api/data_types/#llmengine.data_types.ListFineTunesResponse.jobs","title":"jobs class-attribute instance-attribute","text":"
    jobs: List[GetFineTuneResponse] = Field(..., description='List of fine-tuning jobs and their statuses.')\n

    A list of FineTunes, represented as GetFineTuneResponses.

    "},{"location":"api/data_types/#llmengine.CancelFineTuneResponse","title":"CancelFineTuneResponse","text":"

    Bases: BaseModel

    Response object for cancelling a FineTune.

    "},{"location":"api/data_types/#llmengine.data_types.CancelFineTuneResponse.success","title":"success class-attribute instance-attribute","text":"
    success: bool = Field(..., description='Whether cancellation was successful.')\n

    Whether the cancellation succeeded.

    "},{"location":"api/data_types/#llmengine.GetLLMEndpointResponse","title":"GetLLMEndpointResponse","text":"

    Bases: BaseModel

    Response object for retrieving a Model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.name","title":"name class-attribute instance-attribute","text":"
    name: str = Field(description='The name of the model. Use this for making inference requests to the model.')\n

    The name of the model. Use this for making inference requests to the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.source","title":"source class-attribute instance-attribute","text":"
    source: LLMSource = Field(description='The source of the model, e.g. Hugging Face.')\n

    The source of the model, e.g. Hugging Face.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.inference_framework","title":"inference_framework class-attribute instance-attribute","text":"
    inference_framework: LLMInferenceFramework = Field(description='The inference framework used by the model.')\n

    (For self-hosted users) The inference framework used by the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.id","title":"id class-attribute instance-attribute","text":"
    id: Optional[str] = Field(default=None, description='(For self-hosted users) The autogenerated ID of the model.')\n

    (For self-hosted users) The autogenerated ID of the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.model_name","title":"model_name class-attribute instance-attribute","text":"
    model_name: Optional[str] = Field(default=None, description='(For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as `name`.')\n

    (For self-hosted users) For fine-tuned models, the base model. For base models, this will be the same as name.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.inference_framework_tag","title":"inference_framework_tag class-attribute instance-attribute","text":"
    inference_framework_tag: Optional[str] = Field(default=None, description='(For self-hosted users) The Docker image tag used to run the model.')\n

    (For self-hosted users) The Docker image tag used to run the model.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.num_shards","title":"num_shards class-attribute instance-attribute","text":"
    num_shards: Optional[int] = Field(default=None, description='(For self-hosted users) The number of shards.')\n

    (For self-hosted users) The number of shards.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.quantize","title":"quantize class-attribute instance-attribute","text":"
    quantize: Optional[Quantization] = Field(default=None, description='(For self-hosted users) The quantization method.')\n

    (For self-hosted users) The quantization method.

    "},{"location":"api/data_types/#llmengine.data_types.GetLLMEndpointResponse.spec","title":"spec class-attribute instance-attribute","text":"
    spec: Optional[GetModelEndpointResponse] = Field(default=None, description='(For self-hosted users) Model endpoint details.')\n

    (For self-hosted users) Model endpoint details.

    "},{"location":"api/data_types/#llmengine.ListLLMEndpointsResponse","title":"ListLLMEndpointsResponse","text":"

    Bases: BaseModel

    Response object for listing Models.

    "},{"location":"api/data_types/#llmengine.data_types.ListLLMEndpointsResponse.model_endpoints","title":"model_endpoints class-attribute instance-attribute","text":"
    model_endpoints: List[GetLLMEndpointResponse] = Field(..., description='The list of models.')\n

    A list of Models, represented as GetLLMEndpointResponses.

    "},{"location":"api/data_types/#llmengine.DeleteLLMEndpointResponse","title":"DeleteLLMEndpointResponse","text":"

    Bases: BaseModel

    Response object for deleting a Model.

    "},{"location":"api/data_types/#llmengine.data_types.DeleteLLMEndpointResponse.deleted","title":"deleted class-attribute instance-attribute","text":"
    deleted: bool = Field(..., description='Whether deletion was successful.')\n

    Whether the deletion succeeded.

    "},{"location":"api/error_handling/","title":"Error handling","text":"

    LLM Engine uses conventional HTTP response codes to indicate the success or failure of an API request. In general: codes in the 2xx range indicate success. Codes in the 4xx range indicate indicate an error that failed given the information provided (e.g. a given Model was not found, or an invalid temperature was specified). Codes in the 5xx range indicate an error with the LLM Engine servers.

    In the Python client, errors are presented via a set of corresponding Exception classes, which should be caught and handled by the user accordingly.

    "},{"location":"api/error_handling/#llmengine.errors.BadRequestError","title":"BadRequestError","text":"
    BadRequestError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 400. Indicates that the request had inputs that were invalid. The user should not attempt to retry the request without changing the inputs.

    "},{"location":"api/error_handling/#llmengine.errors.UnauthorizedError","title":"UnauthorizedError","text":"
    UnauthorizedError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 401. This means that no valid API key was provided.

    "},{"location":"api/error_handling/#llmengine.errors.NotFoundError","title":"NotFoundError","text":"
    NotFoundError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 404. This means that the resource (e.g. a Model, FineTune, etc.) could not be found. Note that this can also be returned in some cases where the object might exist, but the user does not have access to the object. This is done to avoid leaking information about the existence or nonexistence of said object that the user does not have access to.

    "},{"location":"api/error_handling/#llmengine.errors.RateLimitExceededError","title":"RateLimitExceededError","text":"
    RateLimitExceededError(message: str)\n

    Bases: Exception

    Corresponds to HTTP 429. Too many requests hit the API too quickly. We recommend an exponential backoff for retries.

    "},{"location":"api/error_handling/#llmengine.errors.ServerError","title":"ServerError","text":"
    ServerError(status_code: int, message: str)\n

    Bases: Exception

    Corresponds to HTTP 5xx errors on the server.

    "},{"location":"api/langchain/","title":"\ud83e\udd9c Langchain","text":"

    Coming soon!

    "},{"location":"api/python_client/","title":"\ud83d\udc0d Python Client API Reference","text":""},{"location":"api/python_client/#llmengine.Completion","title":"Completion","text":"

    Bases: APIEngine

    Completion API. This API is used to generate text completions.

    Language models are trained to understand natural language and predict text outputs as a response to their inputs. The inputs are called prompts and the outputs are referred to as completions. LLMs take the input prompts and chunk them into smaller units called tokens to process and generate language. Tokens may include trailing spaces and even sub-words; this process is language dependent.

    The Completion API can be run either synchronous or asynchronously (via Python asyncio). For each of these modes, you can also choose whether to stream token responses or not.

    "},{"location":"api/python_client/#llmengine.completion.Completion.create","title":"create classmethod","text":"
    create(model: str, prompt: str, max_new_tokens: int = 20, temperature: float = 0.2, timeout: int = 10, stream: bool = False) -> Union[CompletionSyncResponse, Iterator[CompletionStreamResponse]]\n

    Creates a completion for the provided prompt and parameters synchronously.

    This API can be used to get the LLM to generate a completion synchronously. It takes as parameters the model (see Model Zoo) and the prompt. Optionally it takes max_new_tokens, temperature, timeout and stream. It returns a CompletionSyncResponse if stream=False or an async iterator of CompletionStreamResponse with request_id and outputs fields.

    Parameters:

    Name Type Description Default model str

    Name of the model to use. See Model Zoo for a list of Models that are supported.

    required prompt str

    The prompt to generate completions for, encoded as a string.

    required max_new_tokens int

    The maximum number of tokens to generate in the completion.

    The token count of your prompt plus max_new_tokens cannot exceed the model's context length. See Model Zoo for information on each supported model's context length.

    20 temperature float

    What sampling temperature to use, in the range (0, 1]. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.

    0.2 timeout int

    Timeout in seconds. This is the maximum amount of time you are willing to wait for a response.

    10 stream bool

    Whether to stream the response. If true, the return type is an Iterator[CompletionStreamResponse]. Otherwise, the return type is a CompletionSyncResponse. When streaming, tokens will be sent as data-only server-sent events.

    False

    Returns:

    Name Type Description response Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]

    The generated response (if stream=False) or iterator of response chunks (if stream=True)

    Synchronous completion without token streaming in PythonResponse in JSON
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-2-7b\",\n    prompt=\"Hello, my name is\",\n    max_new_tokens=10,\n    temperature=0.2,\n)\nprint(response.json())\n
    {\n    \"request_id\": \"8bbd0e83-f94c-465b-a12b-aabad45750a9\",\n    \"output\": {\n        \"text\": \"_______ and I am a _______\",\n        \"num_completion_tokens\": 10\n}\n}\n

    Token streaming can be used to reduce perceived latency for applications. Here is how applications can use streaming:

    Synchronous completion with token streaming in PythonResponse in JSON
    from llmengine import Completion\n\nstream = Completion.create(\n    model=\"llama-2-7b\",\n    prompt=\"why is the sky blue?\",\n    max_new_tokens=5,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.json())\n
    {\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"\\n\", \"finished\": false, \"num_completion_tokens\": 1 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"I\", \"finished\": false, \"num_completion_tokens\": 2 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \" don\", \"finished\": false, \"num_completion_tokens\": 3 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"\u2019\", \"finished\": false, \"num_completion_tokens\": 4 } }\n{\"request_id\": \"ebbde00c-8c31-4c03-8306-24f37cd25fa2\", \"output\": {\"text\": \"t\", \"finished\": true, \"num_completion_tokens\": 5 } }\n
    "},{"location":"api/python_client/#llmengine.completion.Completion.acreate","title":"acreate async classmethod","text":"
    acreate(model: str, prompt: str, max_new_tokens: int = 20, temperature: float = 0.2, timeout: int = 10, stream: bool = False) -> Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]\n

    Creates a completion for the provided prompt and parameters asynchronously (with asyncio).

    This API can be used to get the LLM to generate a completion asynchronously. It takes as parameters the model (see Model Zoo) and the prompt. Optionally it takes max_new_tokens, temperature, timeout and stream. It returns a CompletionSyncResponse if stream=False or an async iterator of CompletionStreamResponse with request_id and outputs fields.

    Parameters:

    Name Type Description Default model str

    Name of the model to use. See Model Zoo for a list of Models that are supported.

    required prompt str

    The prompt to generate completions for, encoded as a string.

    required max_new_tokens int

    The maximum number of tokens to generate in the completion.

    The token count of your prompt plus max_new_tokens cannot exceed the model's context length. See Model Zoo for information on each supported model's context length.

    20 temperature float

    What sampling temperature to use, in the range (0, 1]. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.

    0.2 timeout int

    Timeout in seconds. This is the maximum amount of time you are willing to wait for a response.

    10 stream bool

    Whether to stream the response. If true, the return type is an Iterator[CompletionStreamResponse]. Otherwise, the return type is a CompletionSyncResponse. When streaming, tokens will be sent as data-only server-sent events.

    False

    Returns:

    Name Type Description response Union[CompletionSyncResponse, AsyncIterable[CompletionStreamResponse]]

    The generated response (if stream=False) or iterator of response chunks (if stream=True)

    Asynchronous completion without token streaming in PythonResponse in JSON
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    response = await Completion.acreate(\n        model=\"llama-2-7b\",\n        prompt=\"Hello, my name is\",\n        max_new_tokens=10,\n        temperature=0.2,\n    )\n    print(response.json())\n\nasyncio.run(main())\n
    {\n    \"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\",\n    \"output\": {\n        \"text\": \"_______ and I am a _______\",\n        \"num_completion_tokens\": 10\n}\n}\n

    Token streaming can be used to reduce perceived latency for applications. Here is how applications can use streaming:

    Asynchronous completion with token streaming in PythonResponse in JSON
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    stream = await Completion.acreate(\n        model=\"llama-2-7b\",\n        prompt=\"why is the sky blue?\",\n        max_new_tokens=5,\n        temperature=0.2,\n        stream=True,\n    )\n\nasync for response in stream:\n        if response.output:\n            print(response.json())\n\nasyncio.run(main())\n
    {\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \"\\n\", \"finished\": false, \"num_completion_tokens\": 1}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \"I\", \"finished\": false, \"num_completion_tokens\": 2}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" think\", \"finished\": false, \"num_completion_tokens\": 3}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" the\", \"finished\": false, \"num_completion_tokens\": 4}}\n{\"request_id\": \"9cfe4d5a-f86f-4094-a935-87f871d90ec0\", \"output\": {\"text\": \" sky\", \"finished\": true, \"num_completion_tokens\": 5}}\n
    "},{"location":"api/python_client/#llmengine.FineTune","title":"FineTune","text":"

    Bases: APIEngine

    FineTune API. This API is used to fine-tune models.

    Fine-tuning is a process where the LLM is further trained on a task-specific dataset, allowing the model to adjust its parameters to better align with the task at hand. Fine-tuning is a supervised training phase, where prompt/response pairs are provided to optimize the performance of the LLM. LLM Engine currently uses LoRA for fine-tuning. Support for additional fine-tuning methods is upcoming.

    LLM Engine provides APIs to create fine-tunes on a base model with training & validation datasets. APIs are also provided to list, cancel and retrieve fine-tuning jobs.

    Creating a fine-tune will end with the creation of a Model, which you can view using Model.get(model_name) or delete using Model.delete(model_name).

    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.create","title":"create classmethod","text":"
    create(model: str, training_file: str, validation_file: Optional[str] = None, hyperparameters: Optional[Dict[str, str]] = None, suffix: Optional[str] = None) -> CreateFineTuneResponse\n

    Creates a job that fine-tunes a specified model with a given dataset.

    This API can be used to fine-tune a model. The model is the name of base model (Model Zoo for available models) to fine-tune. The training and validation files should consist of prompt and response pairs. training_file and validation_file must be publicly accessible HTTP or HTTPS URLs to a CSV file that includes two columns: prompt and response. A maximum of 100,000 rows of data is currently supported. At least 200 rows of data is recommended to start to see benefits from fine-tuning. For sequences longer than the native max_seq_length of the model, the sequences will be truncated.

    A fine-tuning job can take roughly 30 minutes for a small dataset (~200 rows) and several hours for larger ones.

    Parameters:

    Name Type Description Default model `str`

    The name of the base model to fine-tune. See Model Zoo for the list of available models to fine-tune.

    required training_file `str`

    Publicly accessible URL to a CSV file for training.

    required validation_file `Optional[str]`

    Publicly accessible URL to a CSV file for validation. The validation file is used to compute metrics which let LLM Engine pick the best fine-tuned checkpoint, which will be used for inference when fine-tuning is complete.

    None hyperparameters `Optional[Dict[str, str]]`

    A dict of hyperparameters to customize fine-tuning behavior.

    Currently supported hyperparameters:

    • lr: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3)
    • warmup_ratio: Ratio of training steps used for learning rate warmup. (Default: 0.03)
    • epochs: Number of fine-tuning epochs. This should be less than 20. (Default: 5)
    • weight_decay: Regularization penalty applied to learned weights. (Default: 0.001)
    None suffix `Optional[str]`

    A string that will be added to your fine-tuned model name. If present, the entire fine-tuned model name will be formatted like \"[model].[suffix].[YYYY-MM-DD-HH-MM-SS]\". If absent, the fine-tuned model name will be formatted \"[model].[YYYY-MM-DD-HH-MM-SS]\". For example, if suffix is \"my-experiment\", the fine-tuned model name could be \"llama-2-7b.my-experiment.2023-07-17-23-01-50\".

    None

    Returns:

    Name Type Description CreateFineTuneResponse CreateFineTuneResponse

    an object that contains the ID of the created fine-tuning job

    Here is an example script to create a 5-row CSV of properly formatted data for fine-tuning an airline question answering bot:

    Formatting data in Python
    import csv\n# Define data\ndata = [\n  (\"What is your policy on carry-on luggage?\", \"Our policy allows each passenger to bring one piece of carry-on luggage and one personal item such as a purse or briefcase. The maximum size for carry-on luggage is 22 x 14 x 9 inches.\"),\n  (\"How can I change my flight?\", \"You can change your flight through our website or mobile app. Go to 'Manage my booking' section, enter your booking reference and last name, then follow the prompts to change your flight.\"),\n  (\"What meals are available on my flight?\", \"We offer a variety of meals depending on the flight's duration and route. These can range from snacks and light refreshments to full-course meals on long-haul flights. Specific meal options can be viewed during the booking process.\"),\n  (\"How early should I arrive at the airport before my flight?\", \"We recommend arriving at least two hours before domestic flights and three hours before international flights.\"),\n  \"Can I select my seat in advance?\", \"Yes, you can select your seat during the booking process or afterwards via the 'Manage my booking' section on our website or mobile app.\"),\n  ]\n\n# Write data to a CSV file\nwith open('customer_service_data.csv', 'w', newline='') as file:\n    writer = csv.writer(file)\n    writer.writerow([\"prompt\", \"response\"])\n    writer.writerows(data)\n

    Currently, data needs to be uploaded to a publicly accessible web URL so that it can be read for fine-tuning. Publicly accessible HTTP and HTTPS URLs are currently supported. Support for privately sharing data with the LLM Engine API is coming shortly. For quick iteration, you can look into tools like Pastebin or GitHub Gists to quickly host your CSV files in a public manner. An example Github Gist can be found here. To use the gist, you can use the URL given when you click the \u201cRaw\u201d button (URL).

    Example code for fine-tuning:

    Fine-tuning in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.create(\n    model=\"llama-2-7b\",\n    training_file=\"https://my-bucket.s3.us-west-2.amazonaws.com/path/to/training-file.csv\",\n)\n\nprint(response.json())\n
    {\n    \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\"\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.get","title":"get classmethod","text":"
    get(fine_tune_id: str) -> GetFineTuneResponse\n

    Get status of a fine-tuning job.

    This API can be used to get the status of an already running fine-tuning job. It takes as a single parameter the fine_tune_id and returns a GetFineTuneResponse object with the id and status (PENDING, STARTED, UNDEFINED, FAILURE or SUCCESS).

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description GetFineTuneResponse GetFineTuneResponse

    an object that contains the ID and status of the requested job

    Getting status of fine-tuning in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.get(\n    fine_tune_id=\"ft-cir3eevt71r003ks6il0\",\n)\n\nprint(response.json())\n
    {\n    \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\",\n    \"status\": \"STARTED\"\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.get_events","title":"get_events classmethod","text":"
    get_events(fine_tune_id: str) -> GetFineTuneEventsResponse\n

    Get events of a fine-tuning job.

    This API can be used to get the list of detailed events for a fine-tuning job. It takes the fine_tune_id as a parameter and returns a response object which has a list of events that has happened for the fine-tuning job. Two events are logged periodically: an evaluation of the training loss, and an evaluation of the eval loss. This API will return all events for the fine-tuning job.

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description GetFineTuneEventsResponse GetFineTuneEventsResponse

    an object that contains the list of events for the fine-tuning job

    Example
    from llmengine import FineTune\n\nresponse = FineTune.get_events(fine_tune_id=\"ft-cir3eevt71r003ks6il0\")\nprint(response.json())\n
    JSON Response
    {\n    \"events\":\n    [\n        {\n            \"timestamp\": 1689665099.6704428,\n            \"message\": \"{'loss': 2.108, 'learning_rate': 0.002, 'epoch': 0.7}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665100.1966307,\n            \"message\": \"{'eval_loss': 1.67730712890625, 'eval_runtime': 0.2023, 'eval_samples_per_second': 24.717, 'eval_steps_per_second': 4.943, 'epoch': 0.7}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665105.6544185,\n            \"message\": \"{'loss': 1.8961, 'learning_rate': 0.0017071067811865474, 'epoch': 1.39}\",\n            \"level\": \"info\"\n},\n        {\n            \"timestamp\": 1689665106.159139,\n            \"message\": \"{'eval_loss': 1.513688564300537, 'eval_runtime': 0.2025, 'eval_samples_per_second': 24.696, 'eval_steps_per_second': 4.939, 'epoch': 1.39}\",\n            \"level\": \"info\"\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.list","title":"list classmethod","text":"
    list() -> ListFineTunesResponse\n

    List fine-tuning jobs.

    This API can be used to list all the fine-tuning jobs. It returns a list of pairs of fine_tune_id and status for all existing jobs.

    Returns:

    Name Type Description ListFineTunesResponse ListFineTunesResponse

    an object that contains a list of all fine-tuning jobs and their statuses

    Listing fine-tuning jobs in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.list()\nprint(response.json())\n
    {\n    \"jobs\": [\n        {\n            \"fine_tune_id\": \"ft-cir3eevt71r003ks6il0\",\n            \"status\": \"STARTED\"\n},\n        {\n            \"fine_tune_id\": \"ft_def456\",\n            \"status\": \"SUCCESS\"\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.fine_tuning.FineTune.cancel","title":"cancel classmethod","text":"
    cancel(fine_tune_id: str) -> CancelFineTuneResponse\n

    Cancel a fine-tuning job.

    This API can be used to cancel an existing fine-tuning job if it's no longer required. It takes the fine_tune_id as a parameter and returns a response object which has a success field confirming if the cancellation was successful.

    Parameters:

    Name Type Description Default fine_tune_id `str`

    ID of the fine-tuning job

    required

    Returns:

    Name Type Description CancelFineTuneResponse CancelFineTuneResponse

    an object that contains whether the cancellation was successful

    Cancelling fine-tuning job in PythonResponse in JSON
    from llmengine import FineTune\n\nresponse = FineTune.cancel(fine_tune_id=\"ft-cir3eevt71r003ks6il0\")\nprint(response.json())\n
    {\n    \"success\": true\n}\n
    "},{"location":"api/python_client/#llmengine.Model","title":"Model","text":"

    Bases: APIEngine

    Model API. This API is used to get, list, and delete models. Models include both base models built into LLM Engine, and fine-tuned models that you create through the FineTune.create() API.

    See Model Zoo for the list of publicly available base models.

    "},{"location":"api/python_client/#llmengine.model.Model.get","title":"get classmethod","text":"
    get(model: str) -> GetLLMEndpointResponse\n

    Get information about an LLM model.

    This API can be used to get information about a Model's source and inference framework. For self-hosted users, it returns additional information about number of shards, quantization, infra settings, etc. The function takes as a single parameter the name model and returns a GetLLMEndpointResponse object.

    Parameters:

    Name Type Description Default model `str`

    Name of the model

    required

    Returns:

    Name Type Description GetLLMEndpointResponse GetLLMEndpointResponse

    object representing the LLM and configurations

    Accessing model in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.get(\"llama-2-7b.suffix.2023-07-18-12-00-00\")\n\nprint(response.json())\n
    {\n    \"id\": null,\n    \"name\": \"llama-2-7b.suffix.2023-07-18-12-00-00\",\n    \"model_name\": null,\n    \"source\": \"hugging_face\",\n    \"inference_framework\": \"text_generation_inference\",\n    \"inference_framework_tag\": null,\n    \"num_shards\": null,\n    \"quantize\": null,\n    \"spec\": null\n}\n
    "},{"location":"api/python_client/#llmengine.model.Model.list","title":"list classmethod","text":"
    list() -> ListLLMEndpointsResponse\n

    List LLM models available to call inference on.

    This API can be used to list all available models, including both publicly available models and user-created fine-tuned models. It returns a list of GetLLMEndpointResponse objects for all models. The most important field is the model name.

    Returns:

    Name Type Description ListLLMEndpointsResponse ListLLMEndpointsResponse

    list of models

    Listing available modes in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.list()\nprint(response.json())\n
    {\n    \"model_endpoints\": [\n        {\n            \"id\": null,\n            \"name\": \"llama-2-7b.suffix.2023-07-18-12-00-00\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"llama-2-7b\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"llama-13b-deepspeed-sync\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"deepspeed\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n},\n        {\n            \"id\": null,\n            \"name\": \"falcon-40b\",\n            \"model_name\": null,\n            \"source\": \"hugging_face\",\n            \"inference_framework\": \"text_generation_inference\",\n            \"inference_framework_tag\": null,\n            \"num_shards\": null,\n            \"quantize\": null,\n            \"spec\": null\n}\n    ]\n}\n
    "},{"location":"api/python_client/#llmengine.model.Model.delete","title":"delete classmethod","text":"
    delete(model: str) -> DeleteLLMEndpointResponse\n

    Deletes an LLM model.

    This API can be used to delete a fine-tuned model. It takes as parameter the name of the model and returns a response object which has a deleted field confirming if the deletion was successful. If called on a base model included with LLM Engine, an error will be thrown.

    Parameters:

    Name Type Description Default model `str`

    Name of the model

    required

    Returns:

    Name Type Description response DeleteLLMEndpointResponse

    whether the model was successfully deleted

    Deleting model in PythonResponse in JSON
    from llmengine import Model\n\nresponse = Model.delete(\"llama-2-7b.suffix.2023-07-18-12-00-00\")\nprint(response.json())\n
    {\n    \"deleted\": true\n}\n
    "},{"location":"guides/completions/","title":"Completions","text":"

    Language Models are trained to predict natural language and provide text outputs as a response to their inputs. The inputs are called prompts and outputs are referred to as completions. LLMs take the input prompts and chunk them into smaller units called tokens to process and generate language. Tokens may include trailing spaces and even sub-words. This process is language dependent.

    Scale's LLM Engine provides access to open source language models (see Model Zoo) that can be used for producing completions to prompts.

    "},{"location":"guides/completions/#completion-api-call","title":"Completion API call","text":"

    An example API call looks as follows:

    Completion call in Python
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-2-7b\",\n    prompt=\"Hello, my name is\",\n    max_new_tokens=10,\n    temperature=0.2,\n)\n\nprint(response.json())\n# '{\"request_id\": \"c4bf0732-08e0-48a8-8b44-dfe8d4702fb0\", \"output\": {\"text\": \"________ and I am a ________\", \"num_completion_tokens\": 10}}'\nprint(response.output.text)\n# ________ and I am a ________\n
    • model: The LLM you want to use (see Model Zoo).
    • prompt: The main input for the LLM to respond to.
    • max_new_tokens: The maximum number of tokens to generate in the chat completion.
    • temperature: The sampling temperature to use. Higher values make the output more random, while lower values will make it more focused and deterministic.

    See the full Completion API reference documentation to learn more.

    "},{"location":"guides/completions/#completion-api-response","title":"Completion API response","text":"

    An example Completion API response looks as follows:

    Response in JSON

    python >>> print(response.json()) Example output: json { \"request_id\": \"c4bf0732-08e0-48a8-8b44-dfe8d4702fb0\", \"output\": { \"text\": \"_______ and I am a _______\", \"num_completion_tokens\": 10 } }

    Response in Python

    python >>> print(response.output.text) Example output: _______ and I am a _______

    "},{"location":"guides/completions/#token-streaming","title":"Token streaming","text":"

    The Completions API supports token streaming to reduce perceived latency for certain applications. When streaming, tokens will be sent as data-only server-side events.

    To enable token streaming, pass stream=True to either Completion.create or Completion.acreate.

    An example of token streaming using the synchronous Completions API looks as follows:

    Token streaming with synchronous API in python
    import sys\nfrom llmengine import Completion\n\nstream = Completion.create(\n    model=\"falcon-7b-instruct\",\n    prompt=\"Give me a 200 word summary on the current economic events in the US.\",\n    max_new_tokens=1000,\n    temperature=0.2,\n    stream=True,\n)\n\nfor response in stream:\n    if response.output:\n        print(response.output.text, end=\"\")\n        sys.stdout.flush()\n
    "},{"location":"guides/completions/#async-requests","title":"Async requests","text":"

    The Python client supports asyncio for creating Completions. Use Completion.acreate instead of Completion.create to utilize async processing. The function signatures are otherwise identical.

    An example of async Completions looks as follows:

    Completions with asynchronous API in python
    import asyncio\nfrom llmengine import Completion\n\nasync def main():\n    response = await Completion.acreate(\n        model=\"llama-2-7b\",\n        prompt=\"Hello, my name is\",\n        max_new_tokens=10,\n        temperature=0.2,\n    )\n    print(response.json())\n\nasyncio.run(main())\n
    "},{"location":"guides/completions/#which-model-should-i-use","title":"Which model should I use?","text":"

    See the Model Zoo for more information on best practices for which model to use for Completions.

    "},{"location":"guides/fine_tuning/","title":"Fine-tuning","text":"

    Learn how to customize your models on your data with fine-tuning. Or get started right away with our fine-tuning cookbook.

    "},{"location":"guides/fine_tuning/#introduction","title":"Introduction","text":"

    Fine-tuning helps improve model performance by training on specific examples of prompts and desired responses. LLMs are initially trained on data collected from the entire internet. With fine-tuning, LLMs can be optimized to perform better in a specific domain by learning from examples for that domain. Smaller LLMs that have been fine-tuned on a specific use case often outperform larger ones that were trained more generally.

    Fine-tuning allows for:

    1. Higher quality results than prompt engineering alone
    2. Cost savings through shorter prompts
    3. The ability to reach equivalent accuracy with a smaller model
    4. Lower latency at inference time
    5. The chance to show an LLM more examples than can fit in a single context window

    LLM Engine's fine-tuning API lets you fine-tune various open source LLMs on your own data and then make inference calls to the resulting LLM. For more specific details, see the fine-tuning API reference.

    "},{"location":"guides/fine_tuning/#producing-high-quality-data-for-fine-tuning","title":"Producing high quality data for fine-tuning","text":"

    The training data for fine-tuning should consist of prompt and response pairs.

    As a rule of thumb, you should expect to see linear improvements in your fine-tuned model's quality with each doubling of the dataset size. Having high-quality data is also essential to improving performance. For every linear increase in the error rate in your training data, you may encounter a roughly quadratic increase in your fine-tuned model's error rate.

    High quality data is critical to achieve improved model performance, and in several cases will require experts to generate and prepare data - the breadth and diversity of the data is highly critical. Scale's Data Engine can help prepare such high quality, diverse data sets - more information here.

    "},{"location":"guides/fine_tuning/#preparing-data","title":"Preparing data","text":"

    Your data must be formatted as a CSV file that includes two columns: prompt and response. A maximum of 100,000 rows of data is currently supported. At least 200 rows of data is recommended to start to see benefits from fine-tuning.

    Here is an example script to create a 50-row CSV of properly formatted data for fine-tuning an airline question answering bot

    Creating a sample dataset
    import csv\n# Define data\ndata = [\n    (\"What is your policy on carry-on luggage?\", \"Our policy allows each passenger to bring one piece of carry-on luggage and one personal item such as a purse or briefcase. The maximum size for carry-on luggage is 22 x 14 x 9 inches.\"),\n    (\"How can I change my flight?\", \"You can change your flight through our website or mobile app. Go to 'Manage my booking' section, enter your booking reference and last name, then follow the prompts to change your flight.\"),\n    (\"What meals are available on my flight?\", \"We offer a variety of meals depending on the flight's duration and route. These can range from snacks and light refreshments to full-course meals on long-haul flights. Specific meal options can be viewed during the booking process.\"),\n    (\"How early should I arrive at the airport before my flight?\", \"We recommend arriving at least two hours before domestic flights and three hours before international flights.\"),\n    (\"Can I select my seat in advance?\", \"Yes, you can select your seat during the booking process or afterwards via the 'Manage my booking' section on our website or mobile app.\"),\n    (\"What should I do if my luggage is lost?\", \"If your luggage is lost, please report this immediately at our 'Lost and Found' counter at the airport. We will assist you in tracking your luggage.\"),\n    (\"Do you offer special assistance for passengers with disabilities?\", \"Yes, we offer special assistance for passengers with disabilities. Please notify us of your needs at least 48 hours prior to your flight.\"),\n    (\"Can I bring my pet on the flight?\", \"Yes, we allow small pets in the cabin, and larger pets in the cargo hold. Please check our pet policy for more details.\"),\n    (\"What is your policy on flight cancellations?\", \"In case of flight cancellations, we aim to notify passengers as early as possible and offer either a refund or a rebooking on the next available flight.\"),\n    (\"Can I get a refund if I cancel my flight?\", \"Refunds depend on the type of ticket purchased. Please check our cancellation policy for details. Non-refundable tickets, however, are typically not eligible for refunds unless due to extraordinary circumstances.\"),\n    (\"How can I check-in for my flight?\", \"You can check-in for your flight either online, through our mobile app, or at the airport. Online and mobile app check-in opens 24 hours before departure and closes 90 minutes before.\"),\n    (\"Do you offer free meals on your flights?\", \"Yes, we serve free meals on all long-haul flights. For short-haul flights, we offer a complimentary drink and snack. Special meal requests should be made at least 48 hours before departure.\"),\n    (\"Can I use my electronic devices during the flight?\", \"Small electronic devices can be used throughout the flight in flight mode. Larger devices like laptops may be used above 10,000 feet.\"),\n    (\"How much baggage can I check-in?\", \"The checked baggage allowance depends on the class of travel and route. The details would be mentioned on your ticket, or you can check on our website.\"),\n    (\"How can I request for a wheelchair?\", \"To request a wheelchair or any other special assistance, please call our customer service at least 48 hours before your flight.\"),\n    (\"Do I get a discount for group bookings?\", \"Yes, we offer discounts on group bookings of 10 or more passengers. Please contact our group bookings team for more information.\"),\n    (\"Do you offer Wi-fi on your flights?\", \"Yes, we offer complimentary Wi-fi on select flights. You can check the availability during the booking process.\"),\n    (\"What is the minimum connecting time between flights?\", \"The minimum connecting time varies depending on the airport and whether your flight is international or domestic. Generally, it's recommended to allow at least 45-60 minutes for domestic connections and 60-120 minutes for international.\"),\n    (\"Do you offer duty-free shopping on international flights?\", \"Yes, we have a selection of duty-free items that you can pre-order on our website or purchase onboard on international flights.\"),\n    (\"Can I upgrade my ticket to business class?\", \"Yes, you can upgrade your ticket through the 'Manage my booking' section on our website or by contacting our customer service. The availability and costs depend on the specific flight.\"),\n    (\"Can unaccompanied minors travel on your flights?\", \"Yes, we do accommodate unaccompanied minors on our flights, with special services to ensure their safety and comfort. Please contact our customer service for more details.\"),\n    (\"What amenities do you provide in business class?\", \"In business class, you will enjoy additional legroom, reclining seats, premium meals, priority boarding and disembarkation, access to our business lounge, extra baggage allowance, and personalized service.\"),\n    (\"How much does extra baggage cost?\", \"Extra baggage costs vary based on flight route and the weight of the baggage. Please refer to our 'Extra Baggage' section on the website for specific rates.\"),\n    (\"Are there any specific rules for carrying liquids in carry-on?\", \"Yes, liquids carried in your hand luggage must be in containers of 100 ml or less and they should all fit into a single, transparent, resealable plastic bag of 20 cm x 20 cm.\"),\n    (\"What if I have a medical condition that requires special assistance during the flight?\", \"We aim to make the flight comfortable for all passengers. If you have a medical condition that may require special assistance, please contact our \u2018special services\u2019 team 48 hours before your flight.\"),\n    (\"What in-flight entertainment options are available?\", \"We offer a range of in-flight entertainment options including a selection of movies, TV shows, music, and games, available on your personal seat-back screen.\"),\n    (\"What types of payment methods do you accept?\", \"We accept credit/debit cards, PayPal, bank transfers, and various other forms of payment. The available options may vary depending on the country of departure.\"),\n    (\"How can I earn and redeem frequent flyer miles?\", \"You can earn miles for every journey you take with us or our partner airlines. These miles can be redeemed for flight tickets, upgrades, or various other benefits. To earn and redeem miles, you need to join our frequent flyer program.\"),\n    (\"Can I bring a stroller for my baby?\", \"Yes, you can bring a stroller for your baby. It can be checked in for free and will normally be given back to you at the aircraft door upon arrival.\"),\n    (\"What age does my child have to be to qualify as an unaccompanied minor?\", \"Children aged between 5 and 12 years who are traveling alone are considered unaccompanied minors. Our team provides special care for these children from departure to arrival.\"),\n    (\"What documents do I need to travel internationally?\", \"For international travel, you need a valid passport and may also require visas, depending on your destination and your country of residence. It's important to check the specific requirements before you travel.\"),\n    (\"What happens if I miss my flight?\", \"If you miss your flight, please contact our customer service immediately. Depending on the circumstances, you may be able to rebook on a later flight, but additional fees may apply.\"),\n    (\"Can I travel with my musical instrument?\", \"Yes, small musical instruments can be brought on board as your one carry-on item. Larger instruments must be transported in the cargo, or if small enough, a seat may be purchased for them.\"),\n    (\"Do you offer discounts for children or infants?\", \"Yes, children aged 2-11 traveling with an adult usually receive a discount on the fare. Infants under the age of 2 who do not occupy a seat can travel for a reduced fare or sometimes for free.\"),\n    (\"Is smoking allowed on your flights?\", \"No, all our flights are non-smoking for the comfort and safety of all passengers.\"),\n    (\"Do you have family seating?\", \"Yes, we offer the option to seat families together. You can select seats during booking or afterwards through the 'Manage my booking' section on the website.\"),\n    (\"Is there any discount for senior citizens?\", \"Some flights may offer a discount for senior citizens. Please check our website or contact customer service for accurate information.\"),\n    (\"What items are prohibited on your flights?\", \"Prohibited items include, but are not limited to, sharp objects, firearms, explosive materials, and certain chemicals. You can find a comprehensive list on our website under the 'Security Regulations' section.\"),\n    (\"Can I purchase a ticket for someone else?\", \"Yes, you can purchase a ticket for someone else. You'll need their correct name as it appears on their government-issued ID, and their correct travel dates.\"),\n    (\"What is the process for lost and found items on the plane?\", \"If you realize you forgot an item on the plane, report it as soon as possible to our lost and found counter. We will make every effort to locate and return your item.\"),\n    (\"Can I request a special meal?\", \"Yes, we offer a variety of special meals to accommodate dietary restrictions. Please request your preferred meal at least 48 hours prior to your flight.\"),\n    (\"Is there a weight limit for checked baggage?\", \"Yes, luggage weight limits depend on your ticket class and route. You can find the details on your ticket or by visiting our website.\"),\n    (\"Can I bring my sports equipment?\", \"Yes, certain types of sports equipment can be carried either as or in addition to your permitted baggage. Some equipment may require additional fees. It's best to check our policy on our website or contact us directly.\"),\n    (\"Do I need a visa to travel to certain countries?\", \"Yes, visa requirements depend on the country you are visiting and your nationality. We advise checking with the relevant embassy or consulate prior to travel.\"),\n    (\"How can I add extra baggage to my booking?\", \"You can add extra baggage to your booking through the 'Manage my booking' section on our website or by contacting our customer services.\"),\n    (\"Can I check-in at the airport?\", \"Yes, you can choose to check-in at the airport. However, we also offer online and mobile check-in, which may save you time.\"),\n    (\"How do I know if my flight is delayed or cancelled?\", \"In case of any changes to your flight, we will attempt to notify all passengers using the contact information given at the time of booking. You can also check your flight status on our website.\"),\n    (\"What is your policy on pregnant passengers?\", \"Pregnant passengers can travel up to the end of the 36th week for single pregnancies, and the end of the 32nd week for multiple pregnancies. We recommend consulting your doctor before any air travel.\"),\n    (\"Can children travel alone?\", \"Yes, children age 5 to 12 can travel alone as unaccompanied minors. We provide special care for these seats. Please contact our customer service for more information.\"),\n    (\"How can I pay for my booking?\", \"You can pay for your booking using a variety of methods including credit and debit cards, PayPal, or bank transfers. The options may vary depending on the country of departure.\"),\n]\n\n# Write data to a CSV file\nwith open('customer_service_data.csv', 'w', newline='') as file:\n    writer = csv.writer(file)\n    writer.writerow([\"prompt\", \"response\"])\n    writer.writerows(data)\n
    "},{"location":"guides/fine_tuning/#making-your-data-accessible-to-llm-engine","title":"Making your data accessible to LLM Engine","text":"

    Currently, data needs to be uploaded to a publicly accessible web URL so that it can be read for fine-tuning. Publicly accessible HTTP and HTTPS URLs are currently supported. Support for privately sharing data with the LLM Engine API is coming shortly. For quick iteration, you can look into tools like Pastebin or GitHub Gists to quickly host your CSV files in a public manner. An example Github Gist can be found here. To use the gist, you can use the URL given when you click the \u201cRaw\u201d button (URL).

    "},{"location":"guides/fine_tuning/#launching-the-fine-tune","title":"Launching the fine-tune","text":"

    Once you have uploaded your data, you can use the LLM Engine's FineTune.Create API to launch a fine-tune. You will need to specify which base model to fine-tune, the locations of the training file and optional validation data file, an optional set of hyperparameters to customize the fine-tuning behavior, and an optional suffix to append to the name of the fine-tune. For sequences longer than the native max_seq_length of the model, the sequences will be truncated.

    If you specify a suffix, the fine-tune will be named model.suffix.<timestamp>. If you do not, the fine-tune will be named model.<timestamp>. The timestamp will be the time the fine-tune was launched.

    Hyper-parameters for fine-tune - `lr`: Peak learning rate used during fine-tuning. It decays with a cosine schedule afterward. (Default: 2e-3) - `warmup_ratio`: Ratio of training steps used for learning rate warmup. (Default: 0.03) - `epochs`: Number of fine-tuning epochs. This should be less than 20. (Default: 5) - `weight_decay`: Regularization penalty applied to learned weights. (Default: 0.001) Create a fine-tune in python
    from llmengine import FineTune\n\nresponse = FineTune.create(\n    model=\"llama-2-7b\",\n    training_file=\"s3://my-bucket/path/to/training-file.csv\",\n)\n\nprint(response.json())\n

    See the Model Zoo to see which models have fine-tuning support.

    Once the fine-tune is launched, you can also get the status of your fine-tune. You can also list events that your fine-tune produces.

    "},{"location":"guides/fine_tuning/#making-inference-calls-to-your-fine-tune","title":"Making inference calls to your fine-tune","text":"

    Once your fine-tune is finished, you will be able to start making inference requests to the model. You can use the fine_tuned_model returned from your FineTune.get API call to reference your fine-tuned model in the Completions API. Alternatively, you can list available LLMs with Model.list in order to find the name of your fine-tuned model. See the Completion API for more details. You can then use that name to direct your completion requests. You must wait until your fine-tune is complete before you can plug it into the Completions API. You can check the status of your fine-tune with FineTune.get.

    Inference with a fine-tuned model in python
    from llmengine import Completion\n\nresponse = Completion.create(\n    model=\"llama-2-7b.airlines.2023-07-17-08-30-45\",\n    prompt=\"Do you offer in-flight Wi-fi?\",\n    max_new_tokens=100,\n    temperature=0.2,\n)\nprint(response.json())\n
    "},{"location":"guides/rate_limits/","title":"Overview","text":""},{"location":"guides/rate_limits/#what-are-rate-limits","title":"What are rate limits?","text":"

    A rate limit is a restriction that an API imposes on the number of times a user or client can access the server within a specified period of time.

    "},{"location":"guides/rate_limits/#how-do-i-know-if-i-am-rate-limited","title":"How do I know if I am rate limited?","text":"

    Per standard HTTP practices, your request will receive a response with HTTP status code of 429, Too Many Requests.

    "},{"location":"guides/rate_limits/#what-are-the-rate-limits-for-our-api","title":"What are the rate limits for our API?","text":"

    The LLM Engine API is currently in a preview mode, and therefore we currently do not have any advertised rate limits. As the API moves towards a production release, we will update this section with specific rate limits. For now, the API will return HTTP 429 on an as-needed basis.

    "},{"location":"guides/rate_limits/#error-mitigation","title":"Error mitigation","text":""},{"location":"guides/rate_limits/#retrying-with-exponential-backoff","title":"Retrying with exponential backoff","text":"

    One easy way to avoid rate limit errors is to automatically retry requests with a random exponential backoff. Retrying with exponential backoff means performing a short sleep when a rate limit error is hit, then retrying the unsuccessful request. If the request is still unsuccessful, the sleep length is increased and the process is repeated. This continues until the request is successful or until a maximum number of retries is reached. This approach has many benefits:

    • Automatic retries means you can recover from rate limit errors without crashes or missing data
    • Exponential backoff means that your first retries can be tried quickly, while still benefiting from longer delays if your first few retries fail
    • Adding random jitter to the delay helps retries from all hitting at the same time.

    Below are a few example solutions for Python that use exponential backoff.

    "},{"location":"guides/rate_limits/#example-1-using-the-tenacity-library","title":"Example #1: Using the tenacity library","text":"

    Tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simplify the task of adding retry behavior to just about anything. To add exponential backoff to your requests, you can use the tenacity.retry decorator. The below example uses the tenacity.wait_random_exponential function to add random exponential backoff to a request.

    Exponential backoff in python
    import llmengine\nfrom tenacity import (\n    retry,\n    stop_after_attempt,\n    wait_random_exponential,\n)  # for exponential backoff\n@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))\ndef completion_with_backoff(**kwargs):\n    return llmengine.Completion.create(**kwargs)\n\ncompletion_with_backoff(model=\"llama-2-7b\", prompt=\"Why is the sky blue?\")\n
    "},{"location":"guides/rate_limits/#example-2-using-the-backoff-library","title":"Example #2: Using the backoff library","text":"

    Backoff is another python library that provides function decorators which can be used to wrap a function such that it will be retried until some condition is met.

    Decorators for backoff and retry in python
    import llmengine\nimport backoff\n@backoff.on_exception(backoff.expo, llmengine.errors.RateLimitExceededError)\ndef completion_with_backoff(**kwargs):\n    return llmengine.Completion.create(**kwargs)\n\ncompletions_with_backoff(model=\"llama-2-7b\", prompt=\"Why is the sky blue?\")\n
    "},{"location":"guides/self_hosting/","title":"Self Hosting [Experimental]","text":"

    This guide is currently highly experimental. Instructions are subject to change as we improve support for self-hosting.

    We provide a Helm chart that deploys LLM Engine to an Elastic Kubernetes Cluster (EKS) in AWS. This Helm chart should be configured to connect to dependencies (such as a PostgreSQL database) that you may already have available in your environment.

    The only portions of the Helm chart that are production ready are the parts that configure and manage LLM Server itself (not PostgreSQL, IAM, etc.)

    We first go over required AWS dependencies that are required to exist before we can run helm install in your EKS cluster.

    "},{"location":"guides/self_hosting/#aws-dependencies","title":"AWS Dependencies","text":"

    This section describes assumptions about existing AWS resources required run to the LLM Engine Server

    "},{"location":"guides/self_hosting/#eks","title":"EKS","text":"

    The LLM Engine server must be deployed in an EKS cluster environment. Currently only versions 1.23+ are supported. Below are the assumed requirements for the EKS cluster:

    You will need to provision EKS node groups with GPUs to schedule model pods. These node groups must have the node-lifecycle: normal label on them. Additionally, they must have the k8s.amazonaws.com/accelerator label set appropriately depending on the instance type:

    Instance family k8s.amazonaws.com/accelerator label g4dn nvidia-tesla-t4 g5 nvidia-tesla-a10 p4d nvidia-tesla-a100 p4de nvidia-tesla-a100e

    We also recommend setting the following taint on your GPU nodes to prevent pods requiring GPU resources from being scheduled on them: - { key = \"nvidia.com/gpu\", value = \"true\", effect = \"NO_SCHEDULE\" }

    "},{"location":"guides/self_hosting/#postgresql","title":"PostgreSQL","text":"

    The LLM Engine server requires a PostgreSQL database to back data. LLM Engine currently supports PostgreSQL version 14. Create a PostgreSQL database (e.g. AWS RDS PostgreSQL) if you do not have an existing one you wish to connect LLM Engine to.

    To enable LLM Engine to connect to the PostgreSQL engine, we create a Kubernetes secret with the PostgreSQL url. An example YAML is provided below:

    apiVersion: v1\nkind: Secret\nmetadata:\n  name: llm-engine-database-credentials  # this name will be an input to our Helm Chart\ndata:\n    database_url = \"postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]\"\n

    "},{"location":"guides/self_hosting/#redis","title":"Redis","text":"

    The LLM Engine server requires Redis for various caching/queue functionality. LLM Engine currently supports Redis version 6. Create a Redis cluster (e.g. AWS Elasticache for Redis) if you do not have an existing one you wish to connect LLM Engine to.

    To enable LLM Engine to connect redis, fill out the Helm chart values with the redis host and url.

    "},{"location":"guides/self_hosting/#amazon-s3","title":"Amazon S3","text":"

    You will need to have an S3 bucket for LLM Engine to store various assets (e.g model weigts, prediction restuls). The ARN of this bucket should be provided in the Helm chart values.

    "},{"location":"guides/self_hosting/#amazon-ecr","title":"Amazon ECR","text":"

    You will need to provide an ECR repository for the deployment to store model containers. The ARN of this repository should be provided in the Helm chart values.

    "},{"location":"guides/self_hosting/#amazon-sqs","title":"Amazon SQS","text":"

    LLM Engine utilizes Amazon SQS to keep track of jobs. LLM Engine will create and use SQS queues as needed.

    "},{"location":"guides/self_hosting/#identity-and-access-management-iam","title":"Identity and Access Management (IAM)","text":"

    The LLM Engine server will an IAM role to perform various AWS operations. This role will be assumed by the serviceaccount llm-engine in the launch namespace in the EKS cluster. The ARN of this role needs to be provided to the Helm chart, and the role needs to be provided the following permissions:

    Action Resource s3:Get*, s3:Put* ${s3_bucket_arn}/* s3:List* ${s3_bucket_arn} sqs:* arn:aws:sqs:${region}:${account_id}:llm-engine-endpoint-id-* sqs:ListQueues * ecr:BatchGetImage, ecr:DescribeImages, ecr:GetDownloadUrlForLayer, ecr:ListImages ${ecr_repository_arn}"},{"location":"guides/self_hosting/#helm-chart","title":"Helm Chart","text":"

    Now that all dependencies have been installed and configured, we can run the provided Helm chart. The values in the Helm chart will need to correspond with the resources described in the Dependencies section.

    Ensure that Helm V3 is installed instructions and can connect to the EKS cluster. Users should be able to install the chart with helm install llm-engine llm-engine -f llm-engine/values_sample.yaml -n <DESIRED_NAMESPACE>. Below are the configurations to specify in the values_sample.yaml file.

    Parameter Description Required tag The LLM Engine docker image tag Yes context A user-specified deployment tag No image.gatewayRepository The docker repository to pull the LLM Engine gateway image from Yes image.builderRepository The docker repository to pull the LLM Engine endpoint builder image from Yes image.cacherRepository The docker repository to pull the LLM Engine cacher image from Yes image.forwarderRepository The docker repository to pull the LLM Engine forwarder image from Yes image.pullPolicy The docker image pull policy No secrets.kubernetesDatabaseSecretName The name of the secret that contains the database credentials Yes serviceAccount.annotations.eks.amazonaws.com/role-arn The ARN of the IAM role that the service account will assume Yes service.type The service configuration for the main LLM Engine server No service.port The service configuration for the main LLM Engine server No replicaCount The amount of replica pods for each deployment No autoscaling The autoscaling configuration for LLM Engine server deployments No resources.requests.cpu The k8s resources for LLM Engine server deployments No nodeSelector The node selector for LLM Engine server deployments No tolerations The tolerations for LLM Engine server deployments No affinity The affinity for LLM Engine server deployments No aws.configMap.name The AWS configurations (by configMap) for LLM Engine server deployments No aws.configMap.create The AWS configurations (by configMap) for LLM Engine server deployments No aws.profileName The AWS configurations (by configMap) for LLM Engine server deployments No serviceTemplate.securityContext.capabilities.drop Additional flags for model endpoints No serviceTemplate.mountInfraConfig Additional flags for model endpoints No config.values.infra.k8s_cluster_name The name of the k8s cluster Yes config.values.infra.dns_host_domain The domain name of the k8s cluster Yes config.values.infra.default_region The default AWS region for various resources Yes config.values.infra.ml_account_id The AWS account ID for various resources Yes config.values.infra.docker_repo_prefix The prefix for AWS ECR repositories Yes config.values.infra.redis_host The hostname of the redis cluster you wish to connect Yes config.values.infra.s3_bucket The S3 bucket you wish to connect Yes config.values.llm_engine.endpoint_namespace K8s namespace the endpoints will be created in Yes config.values.llm_engine.cache_redis_url The full url for the redis cluster you wish to connect Yes config.values.llm_engine.s3_file_llm_fine_tuning_job_repository The S3 URI for the S3 bucket/key that you wish to save fine-tuned assets Yes config.values.datadog_trace_enabled Whether to enable datadog tracing, datadog must be installed in the cluster No"},{"location":"guides/self_hosting/#play-with-it","title":"Play With It","text":"

    Once helm install succeeds, you can forward port 5000 from a llm-engine pod and test sending requests to it.

    First, see a list of pods in the namespace that you performed helm install in:

    $ kubectl get pods -n <NAMESPACE_WHERE_LLM_ENGINE_IS_INSTALLED>\nNAME                                           READY   STATUS             RESTARTS      AGE\nllm-engine-668679554-9q4wj                     1/1     Running            0             18m\nllm-engine-668679554-xfhxx                     1/1     Running            0             18m\nllm-engine-cacher-5f8b794585-fq7dj             1/1     Running            0             18m\nllm-engine-endpoint-builder-5cd6bf5bbc-sm254   1/1     Running            0             18m\nllm-engine-image-cache-a10-sw4pg               1/1     Running            0             18m \n
    Note the pod names you see may be different.

    Forward a port from a llm-engine pod:

    $ kubectl port-forward pod/llm-engine-<REST_OF_POD_NAME> 5000:5000 -n <NAMESPACE_WHERE_LLM_ENGINE_IS_INSTALLED>\n

    Then, try sending a request to get LLM model endpoints for test-user-id. You should get a response with empty list:

    $ curl -X GET -H \"Content-Type: application/json\" -u \"test-user-id:\" \"http://localhost:5000/v1/llm/model-endpoints\"\n{\"model_endpoints\":[]}% \n

    "},{"location":"guides/token_streaming/","title":"Token streaming","text":"

    The Completions APIs support a stream boolean parameter that, when True, will return a streamed response of token-by-token server-sent events (SSEs) rather than waiting to receive the full response when model generation has finished. This decreases latency of when you start getting a response.

    The response will consist of SSEs of the form {\"token\": dict, \"generated_text\": str | null, \"details\": dict | null}, where the dictionary for each token will contain log probability information in addition to the generated string; the generated_text field will be null for all but the last SSE, for which it will contain the full generated response.

    "}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 307e17f224821d2c52781b95989ccaff77cd633a..7bc45619378839924b030728a75af875ae6390dd 100644 GIT binary patch delta 13 Ucmb=gXP58h;8^9feIk1W03EFaa{vGU delta 13 Ucmb=gXP58h;0XJ*Z6bRG03S&N)&Kwi