diff --git a/previews/PR486/404.html b/previews/PR486/404.html
new file mode 100644
index 00000000..8405ed28
--- /dev/null
+++ b/previews/PR486/404.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ 404 | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/cache.html b/previews/PR486/UserGuide/cache.html
new file mode 100644
index 00000000..c2b42a0f
--- /dev/null
+++ b/previews/PR486/UserGuide/cache.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+ Caching YAXArrays | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/chunk.html b/previews/PR486/UserGuide/chunk.html
new file mode 100644
index 00000000..9338d963
--- /dev/null
+++ b/previews/PR486/UserGuide/chunk.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+ Chunk YAXArrays | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/combine.html b/previews/PR486/UserGuide/combine.html
new file mode 100644
index 00000000..000c251a
--- /dev/null
+++ b/previews/PR486/UserGuide/combine.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+ Combine YAXArrays | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/compute.html b/previews/PR486/UserGuide/compute.html
new file mode 100644
index 00000000..0ba9c9f6
--- /dev/null
+++ b/previews/PR486/UserGuide/compute.html
@@ -0,0 +1,419 @@
+
+
+
+
+
+ Compute YAXArrays | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/convert.html b/previews/PR486/UserGuide/convert.html
new file mode 100644
index 00000000..0a2ce3e4
--- /dev/null
+++ b/previews/PR486/UserGuide/convert.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+ Convert YAXArrays | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/create.html b/previews/PR486/UserGuide/create.html
new file mode 100644
index 00000000..c72b467a
--- /dev/null
+++ b/previews/PR486/UserGuide/create.html
@@ -0,0 +1,75 @@
+
+
+
+
+
+ Create YAXArrays and Datasets | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/faq.html b/previews/PR486/UserGuide/faq.html
new file mode 100644
index 00000000..355f3dc7
--- /dev/null
+++ b/previews/PR486/UserGuide/faq.html
@@ -0,0 +1,391 @@
+
+
+
+
+
+ Frequently Asked Questions (FAQ) | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/group.html b/previews/PR486/UserGuide/group.html
new file mode 100644
index 00000000..c995379c
--- /dev/null
+++ b/previews/PR486/UserGuide/group.html
@@ -0,0 +1,235 @@
+
+
+
+
+
+ Group YAXArrays and Datasets | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/read.html b/previews/PR486/UserGuide/read.html
new file mode 100644
index 00000000..c5eb4f90
--- /dev/null
+++ b/previews/PR486/UserGuide/read.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+ Read YAXArrays and Datasets | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/select.html b/previews/PR486/UserGuide/select.html
new file mode 100644
index 00000000..91146935
--- /dev/null
+++ b/previews/PR486/UserGuide/select.html
@@ -0,0 +1,303 @@
+
+
+
+
+
+ Select YAXArrays and Datasets | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/types.html b/previews/PR486/UserGuide/types.html
new file mode 100644
index 00000000..edab0beb
--- /dev/null
+++ b/previews/PR486/UserGuide/types.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Types | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/UserGuide/write.html b/previews/PR486/UserGuide/write.html
new file mode 100644
index 00000000..03992ee8
--- /dev/null
+++ b/previews/PR486/UserGuide/write.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+ Write YAXArrays and Datasets | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/api.html b/previews/PR486/api.html
new file mode 100644
index 00000000..16a936d3
--- /dev/null
+++ b/previews/PR486/api.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+ API Reference | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.js b/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.js
new file mode 100644
index 00000000..56ea08af
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.js
@@ -0,0 +1,5 @@
+import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.piKCME0r.js";const o=JSON.parse('{"title":"Caching YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/cache.md","filePath":"UserGuide/cache.md","lastUpdated":null}'),n={name:"UserGuide/cache.md"};function h(l,s,p,r,c,d){return t(),i("div",null,s[0]||(s[0]=[e(`Caching YAXArrays For some applications like interactive plotting of large datasets it can not be avoided that the same data must be accessed several times. In these cases it can be useful to store recently accessed data in a cache. In YAXArrays this can be easily achieved using the cache
function. For example, if we open a large dataset from a remote source and want to keep data in a cache of size 500MB one can use:
julia using YAXArrays, Zarr
+ds = open_dataset ( "path/to/source" )
+cachesize = 500 #MB
+cache (ds,maxsize = cachesize)
The above will wrap every array in the dataset into its own cache, where the 500MB are distributed equally across datasets. Alternatively individual caches can be applied to single YAXArray
s
julia yax = ds . avariable
+cache (yax,maxsize = 1000 )
`,5)]))}const g=a(n,[["render",h]]);export{o as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.lean.js b/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.lean.js
new file mode 100644
index 00000000..56ea08af
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_cache.md.tsnWjcXo.lean.js
@@ -0,0 +1,5 @@
+import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.piKCME0r.js";const o=JSON.parse('{"title":"Caching YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/cache.md","filePath":"UserGuide/cache.md","lastUpdated":null}'),n={name:"UserGuide/cache.md"};function h(l,s,p,r,c,d){return t(),i("div",null,s[0]||(s[0]=[e(`Caching YAXArrays For some applications like interactive plotting of large datasets it can not be avoided that the same data must be accessed several times. In these cases it can be useful to store recently accessed data in a cache. In YAXArrays this can be easily achieved using the cache
function. For example, if we open a large dataset from a remote source and want to keep data in a cache of size 500MB one can use:
julia using YAXArrays, Zarr
+ds = open_dataset ( "path/to/source" )
+cachesize = 500 #MB
+cache (ds,maxsize = cachesize)
The above will wrap every array in the dataset into its own cache, where the 500MB are distributed equally across datasets. Alternatively individual caches can be applied to single YAXArray
s
julia yax = ds . avariable
+cache (yax,maxsize = 1000 )
`,5)]))}const g=a(n,[["render",h]]);export{o as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.js b/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.js
new file mode 100644
index 00000000..814e2c67
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.js
@@ -0,0 +1,98 @@
+import{_ as a,c as i,a2 as n,o as p}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Chunk YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/chunk.md","filePath":"UserGuide/chunk.md","lastUpdated":null}'),l={name:"UserGuide/chunk.md"};function h(e,s,t,k,r,d){return p(),i("div",null,s[0]||(s[0]=[n(`Chunk YAXArrays Thinking about chunking is important when it comes to analyzing your data, because in most situations this will not fit into memory, hence having the fastest read access to it is crucial for your workflows. For example, for geo-spatial data do you want fast access on time or space, or... think about it.
To determine the chunk size of the array representation on disk, call the setchunks
function prior to saving.
Chunking YAXArrays julia using YAXArrays, Zarr
+a = YAXArray ( rand ( 10 , 20 ))
+a_chunked = setchunks (a, ( 5 , 10 ))
+a_chunked . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
And the saved file is also splitted into Chunks.
julia f = tempname ()
+savecube (a_chunked, f, backend = :zarr )
+Cube (f) . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
Alternatively chunk sizes can be given by dimension name, so the following results in the same chunks:
julia a_chunked = setchunks (a, (Dim_2 = 10 , Dim_1 = 5 ))
+a_chunked . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
Chunking Datasets Setchunks can also be applied to a Dataset
.
Set Chunks by Axis Set chunk size for each axis occuring in a Dataset
. This will be applied to all variables in the dataset:
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 )), z = YAXArray ( rand ( 10 , 20 , 5 )))
+dschunked = setchunks (ds, Dict ( "Dim_1" => 5 , "Dim_2" => 10 , "Dim_3" => 2 ))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:2) (1:5, 11:20, 1:2)
+ (6:10, 1:10, 1:2) (6:10, 11:20, 1:2)
+
+[:, :, 2] =
+ (1:5, 1:10, 3:4) (1:5, 11:20, 3:4)
+ (6:10, 1:10, 3:4) (6:10, 11:20, 3:4)
+
+[:, :, 3] =
+ (1:5, 1:10, 5:5) (1:5, 11:20, 5:5)
+ (6:10, 1:10, 5:5) (6:10, 11:20, 5:5)
Saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points)
+
+Variables:
+y
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+ Variables:
+ x
+
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ → Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+ Variables:
+ z
Set chunking by Variable The following will set the chunk size for each Variable separately and results in exactly the same chunking as the example above
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 )), z = YAXArray ( rand ( 10 , 20 , 5 )))
+dschunked = setchunks (ds,(x = ( 5 , 10 ), y = Dict ( "Dim_1" => 5 ), z = (Dim_1 = 5 , Dim_2 = 10 , Dim_3 = 2 )))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:2) (1:5, 11:20, 1:2)
+ (6:10, 1:10, 1:2) (6:10, 11:20, 1:2)
+
+[:, :, 2] =
+ (1:5, 1:10, 3:4) (1:5, 11:20, 3:4)
+ (6:10, 1:10, 3:4) (6:10, 11:20, 3:4)
+
+[:, :, 3] =
+ (1:5, 1:10, 5:5) (1:5, 11:20, 5:5)
+ (6:10, 1:10, 5:5) (6:10, 11:20, 5:5)
saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points)
+
+Variables:
+y
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+ Variables:
+ x
+
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ → Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+ Variables:
+ z
Set chunking for all variables The following code snippet only works when all member variables of the dataset have the same shape and sets the output chunks for all arrays.
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 , 20 )), z = YAXArray ( rand ( 10 , 20 )))
+dschunked = setchunks (ds,( 5 , 10 ))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:1) (1:5, 11:20, 1:1)
+ (6:10, 1:10, 1:1) (6:10, 11:20, 1:1)
+
+[:, :, 2] =
+ (1:5, 1:10, 2:2) (1:5, 11:20, 2:2)
+ (6:10, 1:10, 2:2) (6:10, 11:20, 2:2)
+
+[:, :, 3] =
+ (1:5, 1:10, 3:3) (1:5, 11:20, 3:3)
+ (6:10, 1:10, 3:3) (6:10, 11:20, 3:3)
saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+
+Variables:
+x, y, z
Suggestions on how to improve or add to these examples is welcome.
`,36)]))}const c=a(l,[["render",h]]);export{g as __pageData,c as default};
diff --git a/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.lean.js b/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.lean.js
new file mode 100644
index 00000000..814e2c67
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_chunk.md.DKasdhoL.lean.js
@@ -0,0 +1,98 @@
+import{_ as a,c as i,a2 as n,o as p}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Chunk YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/chunk.md","filePath":"UserGuide/chunk.md","lastUpdated":null}'),l={name:"UserGuide/chunk.md"};function h(e,s,t,k,r,d){return p(),i("div",null,s[0]||(s[0]=[n(`Chunk YAXArrays Thinking about chunking is important when it comes to analyzing your data, because in most situations this will not fit into memory, hence having the fastest read access to it is crucial for your workflows. For example, for geo-spatial data do you want fast access on time or space, or... think about it.
To determine the chunk size of the array representation on disk, call the setchunks
function prior to saving.
Chunking YAXArrays julia using YAXArrays, Zarr
+a = YAXArray ( rand ( 10 , 20 ))
+a_chunked = setchunks (a, ( 5 , 10 ))
+a_chunked . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
And the saved file is also splitted into Chunks.
julia f = tempname ()
+savecube (a_chunked, f, backend = :zarr )
+Cube (f) . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
Alternatively chunk sizes can be given by dimension name, so the following results in the same chunks:
julia a_chunked = setchunks (a, (Dim_2 = 10 , Dim_1 = 5 ))
+a_chunked . chunks
2×2 DiskArrays.GridChunks{2, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+ (1:5, 1:10) (1:5, 11:20)
+ (6:10, 1:10) (6:10, 11:20)
Chunking Datasets Setchunks can also be applied to a Dataset
.
Set Chunks by Axis Set chunk size for each axis occuring in a Dataset
. This will be applied to all variables in the dataset:
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 )), z = YAXArray ( rand ( 10 , 20 , 5 )))
+dschunked = setchunks (ds, Dict ( "Dim_1" => 5 , "Dim_2" => 10 , "Dim_3" => 2 ))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:2) (1:5, 11:20, 1:2)
+ (6:10, 1:10, 1:2) (6:10, 11:20, 1:2)
+
+[:, :, 2] =
+ (1:5, 1:10, 3:4) (1:5, 11:20, 3:4)
+ (6:10, 1:10, 3:4) (6:10, 11:20, 3:4)
+
+[:, :, 3] =
+ (1:5, 1:10, 5:5) (1:5, 11:20, 5:5)
+ (6:10, 1:10, 5:5) (6:10, 11:20, 5:5)
Saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points)
+
+Variables:
+y
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+ Variables:
+ x
+
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ → Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+ Variables:
+ z
Set chunking by Variable The following will set the chunk size for each Variable separately and results in exactly the same chunking as the example above
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 )), z = YAXArray ( rand ( 10 , 20 , 5 )))
+dschunked = setchunks (ds,(x = ( 5 , 10 ), y = Dict ( "Dim_1" => 5 ), z = (Dim_1 = 5 , Dim_2 = 10 , Dim_3 = 2 )))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:2) (1:5, 11:20, 1:2)
+ (6:10, 1:10, 1:2) (6:10, 11:20, 1:2)
+
+[:, :, 2] =
+ (1:5, 1:10, 3:4) (1:5, 11:20, 3:4)
+ (6:10, 1:10, 3:4) (6:10, 11:20, 3:4)
+
+[:, :, 3] =
+ (1:5, 1:10, 5:5) (1:5, 11:20, 5:5)
+ (6:10, 1:10, 5:5) (6:10, 11:20, 5:5)
saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points)
+
+Variables:
+y
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+ Variables:
+ x
+
+ Additional Axes:
+ (↓ Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ → Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+ Variables:
+ z
Set chunking for all variables The following code snippet only works when all member variables of the dataset have the same shape and sets the output chunks for all arrays.
julia using YAXArrays, Zarr
+ds = Dataset (x = YAXArray ( rand ( 10 , 20 )), y = YAXArray ( rand ( 10 , 20 )), z = YAXArray ( rand ( 10 , 20 )))
+dschunked = setchunks (ds,( 5 , 10 ))
+Cube (dschunked) . chunks
2×2×3 DiskArrays.GridChunks{3, Tuple{DiskArrays.RegularChunks, DiskArrays.RegularChunks, DiskArrays.RegularChunks}}:
+[:, :, 1] =
+ (1:5, 1:10, 1:1) (1:5, 11:20, 1:1)
+ (6:10, 1:10, 1:1) (6:10, 11:20, 1:1)
+
+[:, :, 2] =
+ (1:5, 1:10, 2:2) (1:5, 11:20, 2:2)
+ (6:10, 1:10, 2:2) (6:10, 11:20, 2:2)
+
+[:, :, 3] =
+ (1:5, 1:10, 3:3) (1:5, 11:20, 3:3)
+ (6:10, 1:10, 3:3) (6:10, 11:20, 3:3)
saving...
julia f = tempname ()
+savedataset (dschunked, path = f, driver = :zarr )
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points)
+
+Variables:
+x, y, z
Suggestions on how to improve or add to these examples is welcome.
`,36)]))}const c=a(l,[["render",h]]);export{g as __pageData,c as default};
diff --git a/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.js b/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.js
new file mode 100644
index 00000000..4b64d7ef
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.js
@@ -0,0 +1,28 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const E=JSON.parse('{"title":"Combine YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/combine.md","filePath":"UserGuide/combine.md","lastUpdated":null}'),t={name:"UserGuide/combine.md"};function h(l,s,p,k,r,d){return e(),a("div",null,s[0]||(s[0]=[n(`Combine YAXArrays Data is often scattered across multiple files and corresponding arrays, e.g. one file per time step. This section describes methods on how to combine them into a single YAXArray.
cat
along an existing dimension Here we use cat
to combine two arrays consisting of data from the first and the second half of a year into one single array containing the whole year. We glue the arrays along the first dimension using dims = 1
: The resulting array whole_year
still has one dimension, i.e. time, but with 12 instead of 6 elements.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+first_half = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+second_half = YAXArray ((YAX . time ( 7 : 12 ),), rand ( 6 ))
+whole_year = cat (first_half, second_half, dims = 1 )
┌ 12-element YAXArray{Float64, 1} ┐
+├─────────────────────────────────┴─────────────────────────────── dims ┐
+ ↓ time Sampled{Int64} [1, 2, …, 11, 12] ForwardOrdered Regular Points
+├───────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├───────────────────────────────────────────────────── loaded in memory ┤
+ data size: 96.0 bytes
+└───────────────────────────────────────────────────────────────────────┘
concatenatecubes
to a new dimension Here we use concatenatecubes
to combine two arrays of different variables that have the same dimensions. The resulting array combined
has an additional dimension variable
indicating from which array the element values originates. Note that using a Dataset
instead is a more flexible approach in handling different variables.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+temperature = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+precipitation = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+cubes = [temperature,precipitation]
+var_axis = Variables ([ "temp" , "prep" ])
+combined = concatenatecubes (cubes, var_axis)
┌ 6×2 YAXArray{Float64, 2} ┐
+├──────────────────────────┴──────────────────────────────── dims ┐
+ ↓ time Sampled{Int64} 1:6 ForwardOrdered Regular Points,
+ → Variables Categorical{String} ["temp", "prep"] ReverseOrdered
+├─────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└─────────────────────────────────────────────────────────────────┘
`,10)]))}const g=i(t,[["render",h]]);export{E as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.lean.js b/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.lean.js
new file mode 100644
index 00000000..4b64d7ef
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_combine.md.DX6-a-cs.lean.js
@@ -0,0 +1,28 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const E=JSON.parse('{"title":"Combine YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/combine.md","filePath":"UserGuide/combine.md","lastUpdated":null}'),t={name:"UserGuide/combine.md"};function h(l,s,p,k,r,d){return e(),a("div",null,s[0]||(s[0]=[n(`Combine YAXArrays Data is often scattered across multiple files and corresponding arrays, e.g. one file per time step. This section describes methods on how to combine them into a single YAXArray.
cat
along an existing dimension Here we use cat
to combine two arrays consisting of data from the first and the second half of a year into one single array containing the whole year. We glue the arrays along the first dimension using dims = 1
: The resulting array whole_year
still has one dimension, i.e. time, but with 12 instead of 6 elements.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+first_half = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+second_half = YAXArray ((YAX . time ( 7 : 12 ),), rand ( 6 ))
+whole_year = cat (first_half, second_half, dims = 1 )
┌ 12-element YAXArray{Float64, 1} ┐
+├─────────────────────────────────┴─────────────────────────────── dims ┐
+ ↓ time Sampled{Int64} [1, 2, …, 11, 12] ForwardOrdered Regular Points
+├───────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├───────────────────────────────────────────────────── loaded in memory ┤
+ data size: 96.0 bytes
+└───────────────────────────────────────────────────────────────────────┘
concatenatecubes
to a new dimension Here we use concatenatecubes
to combine two arrays of different variables that have the same dimensions. The resulting array combined
has an additional dimension variable
indicating from which array the element values originates. Note that using a Dataset
instead is a more flexible approach in handling different variables.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+temperature = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+precipitation = YAXArray ((YAX . time ( 1 : 6 ),), rand ( 6 ))
+cubes = [temperature,precipitation]
+var_axis = Variables ([ "temp" , "prep" ])
+combined = concatenatecubes (cubes, var_axis)
┌ 6×2 YAXArray{Float64, 2} ┐
+├──────────────────────────┴──────────────────────────────── dims ┐
+ ↓ time Sampled{Int64} 1:6 ForwardOrdered Regular Points,
+ → Variables Categorical{String} ["temp", "prep"] ReverseOrdered
+├─────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└─────────────────────────────────────────────────────────────────┘
`,10)]))}const g=i(t,[["render",h]]);export{E as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.js b/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.js
new file mode 100644
index 00000000..f18148ad
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.js
@@ -0,0 +1,392 @@
+import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Compute YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/compute.md","filePath":"UserGuide/compute.md","lastUpdated":null}'),p={name:"UserGuide/compute.md"};function l(e,s,h,k,d,r){return t(),a("div",null,s[0]||(s[0]=[n(`Compute YAXArrays This section describes how to create new YAXArrays by performing operations on them.
Use arithmetics to add or multiply numbers to each element of an array
Use map to apply a more complex functions to every element of an array
Use mapslices to reduce a dimension, e.g. to get the mean over all time steps
Use mapCube to apply complex functions on an array that may change any dimensions
Let's start by creating an example dataset:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a = YAXArray (axlist, data, properties)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Modify elements of a YAXArray WARNING
Some arrays, e.g. those saved in a cloud object storage are immutable making any modification of the data impossible.
Arithmetics Add a value to all elements of an array and save it as a new array:
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia a2[ 1 , 2 , 3 ] == a[ 1 , 2 , 3 ] + 5
map
Apply a function on every element of an array individually:
julia offset = 5
+map (a) do x
+ (x + offset) / 2 * 3
+end
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
This keeps all dimensions unchanged. Note, that here we can not access neighboring elements. In this case, we can use mapslices
or mapCube
instead. Each element of the array is processed individually.
The code runs very fast, because map
applies the function lazily. Actual computation will be performed only on demand, e.g. when elements were explicitly requested or further computations were performed.
mapslices
Reduce the time dimension by calculating the average value of all points in time:
julia import Statistics : mean
+mapslices (mean, a, dims = "Time" )
┌ 10×15 YAXArray{Union{Missing, Float64}, 2} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 1.17 KB
+└──────────────────────────────────────────────────────────────────────────────┘
There is no time dimension left, because there is only one value left after averaging all time steps. We can also calculate spatial means resulting in one value per time step:
julia mapslices (mean, a, dims = ( "lat" , "lon" ))
┌ 30-element YAXArray{Union{Missing, Float64}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
mapCube
mapCube
is the most flexible way to apply a function over subsets of an array. Dimensions may be added or removed.
Operations over several YAXArrays Here, we will define a simple function, that will take as input several YAXArrays
. But first, let's load the necessary packages.
julia using YAXArrays, Zarr
+using YAXArrays : YAXArrays as YAX
+using Dates
Define function in space and time
julia f (lo, la, t) = (lo + la + Dates . dayofyear (t))
f (generic function with 1 method)
now, mapCube
requires this function to be wrapped as follows
julia function g (xout, lo, la, t)
+ xout . = f .(lo, la, t)
+end
g (generic function with 1 method)
INFO
Note the .
after f
, this is because we will slice across time, namely, the function is broadcasted along this dimension.
Here, we do create YAXArrays
only with the desired dimensions as
julia julia > lon_yax = YAXArray ( lon ( range ( 1 , 15 )))
┌ 15-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:15 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 120.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > lat_yax = YAXArray ( lat ( range ( 1 , 10 )))
┌ 10-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 80.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
And a time Cube's Axis
julia tspan = Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )
+time_yax = YAXArray (YAX . time (tspan))
┌ 30-element YAXArray{Date, 1} ┐
+├──────────────────────────────┴───────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
note that the following can be extended to arbitrary YAXArrays
with additional data and dimensions.
Let's generate a new cube
using mapCube
and saving the output directly into disk.
julia julia > gen_cube = mapCube (g, (lon_yax, lat_yax, time_yax);
+ indims = ( InDims (), InDims (), InDims ( "time" )),
+ outdims = OutDims ( "time" , overwrite = true , path = "my_gen_cube.zarr" , backend = :zarr ,
+ outtype = Float32)
+ # max_cache=1e9
+ )
┌ 30 × 15 × 10 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points ,
+ → lon Sampled{Int64} 1:15 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "missing_value" => 1.0f32
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 17.58 KB
+└──────────────────────────────────────────────────────────────────────────────┘
"time axis goes first"
Note that currently the time
axis in the output cube goes first.
Check that it is working
julia julia > gen_cube . data[ 1 , :, :]
15×10 Matrix{Union{Missing, Float32}}:
+ 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0
+ 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
+ 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0
+ 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0
+ 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0
+ 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0
+ 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0
+ 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0
+ 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0
+ 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0
+ 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0
+ 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0
+ 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0
+ 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0
+ 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0
but, we can generate a another cube with a different output order
as follows
julia julia > gen_cube = mapCube (g, (lon_yax, lat_yax, time_yax);
+ indims = ( InDims ( "lon" ), InDims (), InDims ()),
+ outdims = OutDims ( "lon" , overwrite = true , path = "my_gen_cube.zarr" , backend = :zarr ,
+ outtype = Float32)
+ # max_cache=1e9
+ )
┌ 15 × 10 × 30 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:15 ForwardOrdered Regular Points ,
+ → lat Sampled{Int64} 1:10 ForwardOrdered Regular Points ,
+ ↗ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "missing_value" => 1.0f32
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 17.58 KB
+└──────────────────────────────────────────────────────────────────────────────┘
INFO
Note that now the broadcasted dimension is lon
.
we can see this by slicing on the last dimension now
julia gen_cube . data[:, :, 1 ]
15×10 Matrix{Union{Missing, Float32}}:
+ 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0
+ 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
+ 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0
+ 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0
+ 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0
+ 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0
+ 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0
+ 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0
+ 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0
+ 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0
+ 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0
+ 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0
+ 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0
+ 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0
+ 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0
which outputs the same as the gen_cube.data[1, :, :]
called above.
OutDims and YAXArray Properties Here, we will consider different scenarios, namely how we deal with different input cubes and how to specify the output ones. We will illustrate this with the following test example and the subsequent function definitions.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+using Zarr
+using Random
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-05" )),
+ lon ( range ( 1 , 4 , length = 4 )),
+ lat ( range ( 1 , 3 , length = 3 )),
+ Variables ([ "a" , "b" ])
+)
+
+Random . seed! ( 123 )
+data = rand ( 1 : 5 , 5 , 4 , 3 , 2 )
+
+properties = Dict ( "description" => "multi dimensional test cube" )
+yax_test = YAXArray (axlist, data, properties)
┌ 5×4×3×2 YAXArray{Int64, 4} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "multi dimensional test cube"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
One InDims to many OutDims In the following function, note how the outputs are defined first and the inputs later.
julia function one_to_many (xout_one, xout_two, xout_flat, xin_one)
+ xout_one . = f1 .(xin_one)
+ xout_two . = f2 .(xin_one)
+ xout_flat . = sum (xin_one)
+ return nothing
+end
+
+f1 (xin) = xin + 1
+f2 (xin) = xin + 2
f2 (generic function with 1 method)
now, we define InDims
and OutDims
:
julia indims_one = InDims ( "Time" )
+# outputs dimension
+properties_one = Dict{String, Any} ( "name" => "plus_one" )
+properties_two = Dict{String, Any} ( "name" => "plus_two" )
+
+outdims_one = OutDims ( "Time" ; properties = properties_one)
+outdims_two = OutDims ( "Time" ; properties = properties_two)
+outdims_flat = OutDims (;) # it will get the default \`layer\` name if open as dataset
OutDims((), :auto, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}(), false, Array, :input, 1)
julia ds = mapCube (one_to_many, yax_test,
+ indims = indims_one,
+ outdims = (outdims_one, outdims_two, outdims_flat));
let's see the second output
┌ 5×4×3×2 YAXArray{Union{Missing, Int64}, 4} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "name" => "plus_two"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Many InDims to many OutDims Let's consider a second test set
julia properties_2d = Dict ( "description" => "2d dimensional test cube" )
+yax_2d = YAXArray (axlist[ 2 : end ], rand ( - 1 : 1 , 4 , 3 , 2 ), properties_2d)
┌ 4×3×2 YAXArray{Int64, 3} ┐
+├──────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ↗ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├─────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "2d dimensional test cube"
+├─────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 192.0 bytes
+└─────────────────────────────────────────────────────────────────────────┘
The function definitions operating in this case are as follows
julia function many_to_many (xout_one, xout_two, xout_flat, xin_one, xin_two, xin_drei)
+ xout_one . = f1 .(xin_one)
+ xout_two . = f2mix .(xin_one, xin_two)
+ xout_flat . = sum (xin_drei) # this will reduce the time dimension if we set outdims = OutDims()
+ return nothing
+end
+f2mix (xin_xyt, xin_xy) = xin_xyt - xin_xy
f2mix (generic function with 1 method)
Specify path in OutDims julia indims_one = InDims ( "Time" )
+indims_2d = InDims () # ? it matches only to the other 2 dimensions and uses the same values for each time step
+properties = Dict{String, Any} ( "name" => "many_to_many_two" )
+outdims_one = OutDims ( "Time" )
+outdims_two = OutDims ( "Time" ; path = "test_mm.zarr" , properties)
+outdims_flat = OutDims ()
OutDims((), :auto, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}(), false, Array, :input, 1)
julia ds = mapCube (many_to_many, (yax_test, yax_2d, yax_test),
+ indims = (indims_one, indims_2d, indims_one),
+ outdims = (outdims_one, outdims_two, outdims_flat));
And we can open the one that was saved directly to disk.
julia ds_mm = open_dataset ( "test_mm.zarr" )
YAXArray Dataset
+Shared Axes:
+ (↓ time Sampled{DateTime} [2022-01-01T00:00:00, …, 2022-01-05T00:00:00] ForwardOrdered Irregular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points)
+
+Variables:
+a, b
Different InDims names Here, the goal is to operate at the pixel level (longitude, latitude), and then apply the corresponding function to the extracted values. Consider the following toy cubes:
julia Random . seed! ( 123 )
+data = rand ( 3.0 : 5.0 , 5 , 4 , 3 )
+
+axlist = ( lon ( 1 : 4 ), lat ( 1 : 3 ), Dim{:depth} ( 1 : 7 ),)
+yax_2d = YAXArray (axlist, rand ( - 3.0 : 0.0 , 4 , 3 , 7 ))
┌ 4×3×7 YAXArray{Float64, 3} ┐
+├────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:3 ForwardOrdered Regular Points,
+ ↗ depth Sampled{Int64} 1:7 ForwardOrdered Regular Points
+├───────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├───────────────────────────────────────── loaded in memory ┤
+ data size: 672.0 bytes
+└───────────────────────────────────────────────────────────┘
and
julia Random . seed! ( 123 )
+data = rand ( 3.0 : 5.0 , 5 , 4 , 3 )
+
+axlist = (YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-05" )),
+ lon ( 1 : 4 ), lat ( 1 : 3 ),)
+
+properties = Dict ( "description" => "multi dimensional test cube" )
+yax_test = YAXArray (axlist, data, properties)
┌ 5×4×3 YAXArray{Float64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Int64} 1:3 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "multi dimensional test cube"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
and the corresponding functions
julia function mix_time_depth (xin_xyt, xin_xyz)
+ s = sum ( abs .(xin_xyz))
+ return xin_xyt .^ 2 .+ s
+end
+
+function time_depth (xout, xin_one, xin_two)
+ xout . = mix_time_depth (xin_one, xin_two)
+ # Note also that there is no dot anymore in the function application!
+ return nothing
+end
time_depth (generic function with 1 method)
with the final mapCube operation as follows
julia ds = mapCube (time_depth, (yax_test, yax_2d),
+ indims = ( InDims ( "Time" ), InDims ( "depth" )), # ? anchor dimensions and then map over the others.
+ outdims = OutDims ( "Time" ))
┌ 5×4×3 YAXArray{Union{Missing, Float64}, 3} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Int64} 1:3 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
TODO: Example passing additional arguments to function.
MovingWindow
Multiple variables outputs, OutDims, in the same YAXArray
Creating a vector array Here we transform a raster array with spatial dimension lat and lon into a vector array having just one spatial dimension i.e. region. First, create the raster array:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using DimensionalData
+using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+raster_arr = YAXArray (axlist, data)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Then, create a Matrix with the same spatial dimensions indicating to which region each point belongs to:
julia regions_mat = map (Iterators . product (raster_arr . lon, raster_arr . lat)) do (lon, lat)
+ 1 <= lon < 10 && 1 <= lat < 5 && return "A"
+ 1 <= lon < 10 && 5 <= lat < 10 && return "B"
+ 10 <= lon < 15 && 1 <= lat < 5 && return "C"
+ return "D"
+end
+regions_mat = DimArray (regions_mat, (raster_arr . lon, raster_arr . lat))
┌ 10×15 DimArray{String, 2} ┐
+├───────────────────────────┴──────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+└──────────────────────────────────────────────────────────────────────────────┘
+ ↓ → 1.0 1.28571 1.57143 1.85714 … 4.14286 4.42857 4.71429 5.0
+ 1.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 2.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 3.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 4.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 5.0 "A" "A" "A" "A" … "A" "A" "A" "B"
+ 6.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 7.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 8.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 9.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 10.0 "C" "C" "C" "C" … "C" "C" "C" "D"
which has the same spatial dimensions as the raster array at any given point in time:
julia DimArray (raster_arr[time = 1 ])
┌ 10×15 DimArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+└──────────────────────────────────────────────────────────────────────────────┘
+ ↓ → 1.0 1.28571 1.57143 … 4.42857 4.71429 5.0
+ 1.0 0.17593 0.417937 0.0723492 0.178603 0.781773 0.875658
+ 2.0 0.701332 0.15394 0.685454 0.372761 0.984803 0.472308
+ 3.0 0.120997 0.829062 0.684389 0.463503 0.840389 0.536399
+ ⋮ ⋱ ⋮
+ 8.0 0.145747 0.432286 0.465103 0.889583 0.514979 0.671662
+ 9.0 0.538981 0.497189 0.167676 0.595405 0.752417 0.93986
+ 10.0 0.824354 0.376135 0.551732 … 0.101524 0.121947 0.508557
Now we calculate the list of corresponding points for each region. This will be re-used for each point in time during the final mapCube
. In addition, this avoids the allocation of unnecessary memory.
julia regions = [ "A" , "B" , "C" , "D" ]
+points_of_regions = map ( enumerate (regions)) do (i,region)
+ region => findall ( isequal (region), regions_mat)
+end |> Dict |> sort
OrderedCollections.OrderedDict{String, Vector{CartesianIndex{2}}} with 4 entries:
+ "A" => [CartesianIndex(1, 1), CartesianIndex(2, 1), CartesianIndex(3, 1), Car…
+ "B" => [CartesianIndex(1, 15), CartesianIndex(2, 15), CartesianIndex(3, 15), …
+ "C" => [CartesianIndex(10, 1), CartesianIndex(10, 2), CartesianIndex(10, 3), …
+ "D" => [CartesianIndex(10, 15)]
Finally, we can transform the entire raster array:
julia vector_array = mapCube (
+ raster_arr,
+ indims = InDims ( "lon" , "lat" ),
+ outdims = OutDims ( Dim{:region} (regions))
+) do xout, xin
+ for (region_pos, points) in enumerate (points_of_regions . vals)
+ # aggregate values of points in the current region at the current date
+ xout[region_pos] = sum ( view (xin, points))
+ end
+end
┌ 4×30 YAXArray{Union{Missing, Float64}, 2} ┐
+├───────────────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ region Categorical{String} ["A", "B", "C", "D"] ForwardOrdered,
+ → time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
This gives us a vector array with only one spatial dimension, i.e. the region. Note that we still have 30 points in time. The transformation was applied for each date separately.
Hereby, xin
is a 10x15 array representing a map at a given time and xout
is a 4 element vector of missing values initially representing the 4 regions at that date. Then, we set each output element by the sum of all corresponding points
Distributed Computation All map methods apply a function on all elements of all non-input dimensions separately. This allows to run each map function call in parallel. For example, we can execute each date of a time series in a different CPU thread during spatial aggregation.
The following code does a time mean over all grid points using multiple CPUs of a local machine:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+using Distributed
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a = YAXArray (axlist, data, properties)
+
+addprocs ( 2 )
+
+@everywhere begin
+ using YAXArrays
+ using Zarr
+ using Statistics
+end
+
+@everywhere function mymean (output, pixel)
+ @show "doing a mean"
+ output[:] . = mean (pixel)
+end
+
+mapCube (mymean, a, indims = InDims ( "time" ), outdims = OutDims ())
In the last example, mapCube
was used to map the mymean
function. mapslices
is a convenient function that can replace mapCube
, where you can omit defining an extra function with the output argument as an input (e.g. mymean
). It is possible to simply use mapslice
julia mapslices (mean ∘ skipmissing, a, dims = "time" )
It is also possible to distribute easily the workload on a cluster, with little modification to the code. To do so, we use the ClusterManagers
package.
julia using Distributed
+using ClusterManagers
+addprocs ( SlurmManager ( 10 ))
`,138)]))}const o=i(p,[["render",l]]);export{g as __pageData,o as default};
diff --git a/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.lean.js b/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.lean.js
new file mode 100644
index 00000000..f18148ad
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_compute.md.CUq5TZYp.lean.js
@@ -0,0 +1,392 @@
+import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Compute YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/compute.md","filePath":"UserGuide/compute.md","lastUpdated":null}'),p={name:"UserGuide/compute.md"};function l(e,s,h,k,d,r){return t(),a("div",null,s[0]||(s[0]=[n(`Compute YAXArrays This section describes how to create new YAXArrays by performing operations on them.
Use arithmetics to add or multiply numbers to each element of an array
Use map to apply a more complex functions to every element of an array
Use mapslices to reduce a dimension, e.g. to get the mean over all time steps
Use mapCube to apply complex functions on an array that may change any dimensions
Let's start by creating an example dataset:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a = YAXArray (axlist, data, properties)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Modify elements of a YAXArray WARNING
Some arrays, e.g. those saved in a cloud object storage are immutable making any modification of the data impossible.
Arithmetics Add a value to all elements of an array and save it as a new array:
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia a2[ 1 , 2 , 3 ] == a[ 1 , 2 , 3 ] + 5
map
Apply a function on every element of an array individually:
julia offset = 5
+map (a) do x
+ (x + offset) / 2 * 3
+end
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
This keeps all dimensions unchanged. Note, that here we can not access neighboring elements. In this case, we can use mapslices
or mapCube
instead. Each element of the array is processed individually.
The code runs very fast, because map
applies the function lazily. Actual computation will be performed only on demand, e.g. when elements were explicitly requested or further computations were performed.
mapslices
Reduce the time dimension by calculating the average value of all points in time:
julia import Statistics : mean
+mapslices (mean, a, dims = "Time" )
┌ 10×15 YAXArray{Union{Missing, Float64}, 2} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 1.17 KB
+└──────────────────────────────────────────────────────────────────────────────┘
There is no time dimension left, because there is only one value left after averaging all time steps. We can also calculate spatial means resulting in one value per time step:
julia mapslices (mean, a, dims = ( "lat" , "lon" ))
┌ 30-element YAXArray{Union{Missing, Float64}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
mapCube
mapCube
is the most flexible way to apply a function over subsets of an array. Dimensions may be added or removed.
Operations over several YAXArrays Here, we will define a simple function, that will take as input several YAXArrays
. But first, let's load the necessary packages.
julia using YAXArrays, Zarr
+using YAXArrays : YAXArrays as YAX
+using Dates
Define function in space and time
julia f (lo, la, t) = (lo + la + Dates . dayofyear (t))
f (generic function with 1 method)
now, mapCube
requires this function to be wrapped as follows
julia function g (xout, lo, la, t)
+ xout . = f .(lo, la, t)
+end
g (generic function with 1 method)
INFO
Note the .
after f
, this is because we will slice across time, namely, the function is broadcasted along this dimension.
Here, we do create YAXArrays
only with the desired dimensions as
julia julia > lon_yax = YAXArray ( lon ( range ( 1 , 15 )))
┌ 15-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:15 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 120.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > lat_yax = YAXArray ( lat ( range ( 1 , 10 )))
┌ 10-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 80.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
And a time Cube's Axis
julia tspan = Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )
+time_yax = YAXArray (YAX . time (tspan))
┌ 30-element YAXArray{Date, 1} ┐
+├──────────────────────────────┴───────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
note that the following can be extended to arbitrary YAXArrays
with additional data and dimensions.
Let's generate a new cube
using mapCube
and saving the output directly into disk.
julia julia > gen_cube = mapCube (g, (lon_yax, lat_yax, time_yax);
+ indims = ( InDims (), InDims (), InDims ( "time" )),
+ outdims = OutDims ( "time" , overwrite = true , path = "my_gen_cube.zarr" , backend = :zarr ,
+ outtype = Float32)
+ # max_cache=1e9
+ )
┌ 30 × 15 × 10 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points ,
+ → lon Sampled{Int64} 1:15 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "missing_value" => 1.0f32
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 17.58 KB
+└──────────────────────────────────────────────────────────────────────────────┘
"time axis goes first"
Note that currently the time
axis in the output cube goes first.
Check that it is working
julia julia > gen_cube . data[ 1 , :, :]
15×10 Matrix{Union{Missing, Float32}}:
+ 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0
+ 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
+ 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0
+ 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0
+ 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0
+ 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0
+ 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0
+ 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0
+ 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0
+ 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0
+ 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0
+ 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0
+ 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0
+ 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0
+ 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0
but, we can generate a another cube with a different output order
as follows
julia julia > gen_cube = mapCube (g, (lon_yax, lat_yax, time_yax);
+ indims = ( InDims ( "lon" ), InDims (), InDims ()),
+ outdims = OutDims ( "lon" , overwrite = true , path = "my_gen_cube.zarr" , backend = :zarr ,
+ outtype = Float32)
+ # max_cache=1e9
+ )
┌ 15 × 10 × 30 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:15 ForwardOrdered Regular Points ,
+ → lat Sampled{Int64} 1:10 ForwardOrdered Regular Points ,
+ ↗ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "missing_value" => 1.0f32
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 17.58 KB
+└──────────────────────────────────────────────────────────────────────────────┘
INFO
Note that now the broadcasted dimension is lon
.
we can see this by slicing on the last dimension now
julia gen_cube . data[:, :, 1 ]
15×10 Matrix{Union{Missing, Float32}}:
+ 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0
+ 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
+ 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0
+ 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0
+ 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0
+ 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0
+ 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0
+ 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0
+ 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0
+ 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0
+ 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0
+ 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0
+ 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0
+ 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0
+ 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0
which outputs the same as the gen_cube.data[1, :, :]
called above.
OutDims and YAXArray Properties Here, we will consider different scenarios, namely how we deal with different input cubes and how to specify the output ones. We will illustrate this with the following test example and the subsequent function definitions.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+using Zarr
+using Random
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-05" )),
+ lon ( range ( 1 , 4 , length = 4 )),
+ lat ( range ( 1 , 3 , length = 3 )),
+ Variables ([ "a" , "b" ])
+)
+
+Random . seed! ( 123 )
+data = rand ( 1 : 5 , 5 , 4 , 3 , 2 )
+
+properties = Dict ( "description" => "multi dimensional test cube" )
+yax_test = YAXArray (axlist, data, properties)
┌ 5×4×3×2 YAXArray{Int64, 4} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "multi dimensional test cube"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
One InDims to many OutDims In the following function, note how the outputs are defined first and the inputs later.
julia function one_to_many (xout_one, xout_two, xout_flat, xin_one)
+ xout_one . = f1 .(xin_one)
+ xout_two . = f2 .(xin_one)
+ xout_flat . = sum (xin_one)
+ return nothing
+end
+
+f1 (xin) = xin + 1
+f2 (xin) = xin + 2
f2 (generic function with 1 method)
now, we define InDims
and OutDims
:
julia indims_one = InDims ( "Time" )
+# outputs dimension
+properties_one = Dict{String, Any} ( "name" => "plus_one" )
+properties_two = Dict{String, Any} ( "name" => "plus_two" )
+
+outdims_one = OutDims ( "Time" ; properties = properties_one)
+outdims_two = OutDims ( "Time" ; properties = properties_two)
+outdims_flat = OutDims (;) # it will get the default \`layer\` name if open as dataset
OutDims((), :auto, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}(), false, Array, :input, 1)
julia ds = mapCube (one_to_many, yax_test,
+ indims = indims_one,
+ outdims = (outdims_one, outdims_two, outdims_flat));
let's see the second output
┌ 5×4×3×2 YAXArray{Union{Missing, Int64}, 4} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 1 entry:
+ "name" => "plus_two"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Many InDims to many OutDims Let's consider a second test set
julia properties_2d = Dict ( "description" => "2d dimensional test cube" )
+yax_2d = YAXArray (axlist[ 2 : end ], rand ( - 1 : 1 , 4 , 3 , 2 ), properties_2d)
┌ 4×3×2 YAXArray{Int64, 3} ┐
+├──────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points,
+ ↗ Variables Categorical{String} ["a", "b"] ForwardOrdered
+├─────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "2d dimensional test cube"
+├─────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 192.0 bytes
+└─────────────────────────────────────────────────────────────────────────┘
The function definitions operating in this case are as follows
julia function many_to_many (xout_one, xout_two, xout_flat, xin_one, xin_two, xin_drei)
+ xout_one . = f1 .(xin_one)
+ xout_two . = f2mix .(xin_one, xin_two)
+ xout_flat . = sum (xin_drei) # this will reduce the time dimension if we set outdims = OutDims()
+ return nothing
+end
+f2mix (xin_xyt, xin_xy) = xin_xyt - xin_xy
f2mix (generic function with 1 method)
Specify path in OutDims julia indims_one = InDims ( "Time" )
+indims_2d = InDims () # ? it matches only to the other 2 dimensions and uses the same values for each time step
+properties = Dict{String, Any} ( "name" => "many_to_many_two" )
+outdims_one = OutDims ( "Time" )
+outdims_two = OutDims ( "Time" ; path = "test_mm.zarr" , properties)
+outdims_flat = OutDims ()
OutDims((), :auto, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}(), false, Array, :input, 1)
julia ds = mapCube (many_to_many, (yax_test, yax_2d, yax_test),
+ indims = (indims_one, indims_2d, indims_one),
+ outdims = (outdims_one, outdims_two, outdims_flat));
And we can open the one that was saved directly to disk.
julia ds_mm = open_dataset ( "test_mm.zarr" )
YAXArray Dataset
+Shared Axes:
+ (↓ time Sampled{DateTime} [2022-01-01T00:00:00, …, 2022-01-05T00:00:00] ForwardOrdered Irregular Points,
+ → lon Sampled{Float64} 1.0:1.0:4.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:1.0:3.0 ForwardOrdered Regular Points)
+
+Variables:
+a, b
Different InDims names Here, the goal is to operate at the pixel level (longitude, latitude), and then apply the corresponding function to the extracted values. Consider the following toy cubes:
julia Random . seed! ( 123 )
+data = rand ( 3.0 : 5.0 , 5 , 4 , 3 )
+
+axlist = ( lon ( 1 : 4 ), lat ( 1 : 3 ), Dim{:depth} ( 1 : 7 ),)
+yax_2d = YAXArray (axlist, rand ( - 3.0 : 0.0 , 4 , 3 , 7 ))
┌ 4×3×7 YAXArray{Float64, 3} ┐
+├────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:3 ForwardOrdered Regular Points,
+ ↗ depth Sampled{Int64} 1:7 ForwardOrdered Regular Points
+├───────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├───────────────────────────────────────── loaded in memory ┤
+ data size: 672.0 bytes
+└───────────────────────────────────────────────────────────┘
and
julia Random . seed! ( 123 )
+data = rand ( 3.0 : 5.0 , 5 , 4 , 3 )
+
+axlist = (YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-05" )),
+ lon ( 1 : 4 ), lat ( 1 : 3 ),)
+
+properties = Dict ( "description" => "multi dimensional test cube" )
+yax_test = YAXArray (axlist, data, properties)
┌ 5×4×3 YAXArray{Float64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Int64} 1:3 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 1 entry:
+ "description" => "multi dimensional test cube"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
and the corresponding functions
julia function mix_time_depth (xin_xyt, xin_xyz)
+ s = sum ( abs .(xin_xyz))
+ return xin_xyt .^ 2 .+ s
+end
+
+function time_depth (xout, xin_one, xin_two)
+ xout . = mix_time_depth (xin_one, xin_two)
+ # Note also that there is no dot anymore in the function application!
+ return nothing
+end
time_depth (generic function with 1 method)
with the final mapCube operation as follows
julia ds = mapCube (time_depth, (yax_test, yax_2d),
+ indims = ( InDims ( "Time" ), InDims ( "depth" )), # ? anchor dimensions and then map over the others.
+ outdims = OutDims ( "Time" ))
┌ 5×4×3 YAXArray{Union{Missing, Float64}, 3} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-05") ForwardOrdered Regular Points,
+ → lon Sampled{Int64} 1:4 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Int64} 1:3 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
TODO: Example passing additional arguments to function.
MovingWindow
Multiple variables outputs, OutDims, in the same YAXArray
Creating a vector array Here we transform a raster array with spatial dimension lat and lon into a vector array having just one spatial dimension i.e. region. First, create the raster array:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using DimensionalData
+using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+raster_arr = YAXArray (axlist, data)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Then, create a Matrix with the same spatial dimensions indicating to which region each point belongs to:
julia regions_mat = map (Iterators . product (raster_arr . lon, raster_arr . lat)) do (lon, lat)
+ 1 <= lon < 10 && 1 <= lat < 5 && return "A"
+ 1 <= lon < 10 && 5 <= lat < 10 && return "B"
+ 10 <= lon < 15 && 1 <= lat < 5 && return "C"
+ return "D"
+end
+regions_mat = DimArray (regions_mat, (raster_arr . lon, raster_arr . lat))
┌ 10×15 DimArray{String, 2} ┐
+├───────────────────────────┴──────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+└──────────────────────────────────────────────────────────────────────────────┘
+ ↓ → 1.0 1.28571 1.57143 1.85714 … 4.14286 4.42857 4.71429 5.0
+ 1.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 2.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 3.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 4.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 5.0 "A" "A" "A" "A" … "A" "A" "A" "B"
+ 6.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 7.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 8.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 9.0 "A" "A" "A" "A" "A" "A" "A" "B"
+ 10.0 "C" "C" "C" "C" … "C" "C" "C" "D"
which has the same spatial dimensions as the raster array at any given point in time:
julia DimArray (raster_arr[time = 1 ])
┌ 10×15 DimArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+└──────────────────────────────────────────────────────────────────────────────┘
+ ↓ → 1.0 1.28571 1.57143 … 4.42857 4.71429 5.0
+ 1.0 0.17593 0.417937 0.0723492 0.178603 0.781773 0.875658
+ 2.0 0.701332 0.15394 0.685454 0.372761 0.984803 0.472308
+ 3.0 0.120997 0.829062 0.684389 0.463503 0.840389 0.536399
+ ⋮ ⋱ ⋮
+ 8.0 0.145747 0.432286 0.465103 0.889583 0.514979 0.671662
+ 9.0 0.538981 0.497189 0.167676 0.595405 0.752417 0.93986
+ 10.0 0.824354 0.376135 0.551732 … 0.101524 0.121947 0.508557
Now we calculate the list of corresponding points for each region. This will be re-used for each point in time during the final mapCube
. In addition, this avoids the allocation of unnecessary memory.
julia regions = [ "A" , "B" , "C" , "D" ]
+points_of_regions = map ( enumerate (regions)) do (i,region)
+ region => findall ( isequal (region), regions_mat)
+end |> Dict |> sort
OrderedCollections.OrderedDict{String, Vector{CartesianIndex{2}}} with 4 entries:
+ "A" => [CartesianIndex(1, 1), CartesianIndex(2, 1), CartesianIndex(3, 1), Car…
+ "B" => [CartesianIndex(1, 15), CartesianIndex(2, 15), CartesianIndex(3, 15), …
+ "C" => [CartesianIndex(10, 1), CartesianIndex(10, 2), CartesianIndex(10, 3), …
+ "D" => [CartesianIndex(10, 15)]
Finally, we can transform the entire raster array:
julia vector_array = mapCube (
+ raster_arr,
+ indims = InDims ( "lon" , "lat" ),
+ outdims = OutDims ( Dim{:region} (regions))
+) do xout, xin
+ for (region_pos, points) in enumerate (points_of_regions . vals)
+ # aggregate values of points in the current region at the current date
+ xout[region_pos] = sum ( view (xin, points))
+ end
+end
┌ 4×30 YAXArray{Union{Missing, Float64}, 2} ┐
+├───────────────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ region Categorical{String} ["A", "B", "C", "D"] ForwardOrdered,
+ → time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 960.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
This gives us a vector array with only one spatial dimension, i.e. the region. Note that we still have 30 points in time. The transformation was applied for each date separately.
Hereby, xin
is a 10x15 array representing a map at a given time and xout
is a 4 element vector of missing values initially representing the 4 regions at that date. Then, we set each output element by the sum of all corresponding points
Distributed Computation All map methods apply a function on all elements of all non-input dimensions separately. This allows to run each map function call in parallel. For example, we can execute each date of a time series in a different CPU thread during spatial aggregation.
The following code does a time mean over all grid points using multiple CPUs of a local machine:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using Dates
+using Distributed
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a = YAXArray (axlist, data, properties)
+
+addprocs ( 2 )
+
+@everywhere begin
+ using YAXArrays
+ using Zarr
+ using Statistics
+end
+
+@everywhere function mymean (output, pixel)
+ @show "doing a mean"
+ output[:] . = mean (pixel)
+end
+
+mapCube (mymean, a, indims = InDims ( "time" ), outdims = OutDims ())
In the last example, mapCube
was used to map the mymean
function. mapslices
is a convenient function that can replace mapCube
, where you can omit defining an extra function with the output argument as an input (e.g. mymean
). It is possible to simply use mapslice
julia mapslices (mean ∘ skipmissing, a, dims = "time" )
It is also possible to distribute easily the workload on a cluster, with little modification to the code. To do so, we use the ClusterManagers
package.
julia using Distributed
+using ClusterManagers
+addprocs ( SlurmManager ( 10 ))
`,138)]))}const o=i(p,[["render",l]]);export{g as __pageData,o as default};
diff --git a/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.js b/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.js
new file mode 100644
index 00000000..05e8a388
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.js
@@ -0,0 +1,46 @@
+import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const c=JSON.parse('{"title":"Convert YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/convert.md","filePath":"UserGuide/convert.md","lastUpdated":null}'),t={name:"UserGuide/convert.md"};function p(l,s,h,r,k,d){return e(),i("div",null,s[0]||(s[0]=[n(`Convert YAXArrays This section describes how to convert variables from types of other Julia packages into YAXArrays and vice versa.
WARNING
YAXArrays is designed to work with large datasets that are way larger than the memory. However, most types are designed to work in memory. Those conversions are only possible if the entire dataset fits into memory. In addition, metadata might be lost during conversion.
Convert Base.Array
Convert Base.Array
to YAXArray
:
julia using YAXArrays
+
+m = rand ( 5 , 10 )
+a = YAXArray (m)
┌ 5×10 YAXArray{Float64, 2} ┐
+├───────────────────────────┴─────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ data size: 400.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
Convert YAXArray
to Base.Array
:
julia m2 = collect (a . data)
5×10 Matrix{Float64}:
+ 0.265797 0.789891 0.611084 0.845983 … 0.918555 0.870826 0.348362
+ 0.665723 0.241882 0.426519 0.581312 0.949935 0.0214057 0.152534
+ 0.83556 0.456765 0.197238 0.645758 0.74732 0.652339 0.935631
+ 0.337926 0.151146 0.673373 0.169284 0.75269 0.166212 0.0358348
+ 0.594514 0.364288 0.78467 0.830391 0.128204 0.174934 0.0210077
Convert Raster
A Raster
as defined in Rasters.jl has a same supertype of a YAXArray
, i.e. AbstractDimArray
, allowing easy conversion between those types:
julia using Rasters
+
+lon, lat = X ( 25 : 1 : 30 ), Y ( 25 : 1 : 30 )
+time = Ti ( 2000 : 2024 )
+ras = Raster ( rand (lon, lat, time))
+a = YAXArray ( dims (ras), ras . data)
Convert DimArray
A DimArray
as defined in DimensionalData.jl has a same supertype of a YAXArray
, i.e. AbstractDimArray
, allowing easy conversion between those types.
Convert DimArray
to YAXArray
:
julia using DimensionalData
+using YAXArrayBase
+
+dim_arr = rand ( X ( 1 : 5 ), Y ( 10.0 : 15.0 ), metadata = Dict{String, Any} ())
+a = yaxconvert (YAXArray, dim_arr)
┌ 5×6 YAXArray{Float64, 2} ┐
+├──────────────────────────┴───────────────────────────────── dims ┐
+ ↓ X Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 10.0:1.0:15.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────┘
Convert YAXArray
to DimArray
:
julia dim_arr2 = yaxconvert (DimArray, a)
┌ 5×6 DimArray{Float64, 2} ┐
+├──────────────────────────┴───────────────────────────────── dims ┐
+ ↓ X Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 10.0:1.0:15.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+└──────────────────────────────────────────────────────────────────┘
+ ↓ → 10.0 11.0 12.0 13.0 14.0 15.0
+ 1 0.862644 0.872575 0.0620649 0.193109 0.475725 0.953391
+ 2 0.203714 0.770949 0.731779 0.71314 0.687891 0.435994
+ 3 0.492817 0.718667 0.0702532 0.926096 0.225542 0.100622
+ 4 0.268675 0.0566881 0.916686 0.973332 0.744521 0.052264
+ 5 0.540514 0.215973 0.617023 0.796375 0.13205 0.366625
INFO
At the moment there is no support to save a DimArray directly into disk as a NetCDF
or a Zarr
file.
`,23)]))}const g=a(t,[["render",p]]);export{c as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.lean.js b/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.lean.js
new file mode 100644
index 00000000..05e8a388
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_convert.md.CkB9umGg.lean.js
@@ -0,0 +1,46 @@
+import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const c=JSON.parse('{"title":"Convert YAXArrays","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/convert.md","filePath":"UserGuide/convert.md","lastUpdated":null}'),t={name:"UserGuide/convert.md"};function p(l,s,h,r,k,d){return e(),i("div",null,s[0]||(s[0]=[n(`Convert YAXArrays This section describes how to convert variables from types of other Julia packages into YAXArrays and vice versa.
WARNING
YAXArrays is designed to work with large datasets that are way larger than the memory. However, most types are designed to work in memory. Those conversions are only possible if the entire dataset fits into memory. In addition, metadata might be lost during conversion.
Convert Base.Array
Convert Base.Array
to YAXArray
:
julia using YAXArrays
+
+m = rand ( 5 , 10 )
+a = YAXArray (m)
┌ 5×10 YAXArray{Float64, 2} ┐
+├───────────────────────────┴─────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ data size: 400.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
Convert YAXArray
to Base.Array
:
julia m2 = collect (a . data)
5×10 Matrix{Float64}:
+ 0.265797 0.789891 0.611084 0.845983 … 0.918555 0.870826 0.348362
+ 0.665723 0.241882 0.426519 0.581312 0.949935 0.0214057 0.152534
+ 0.83556 0.456765 0.197238 0.645758 0.74732 0.652339 0.935631
+ 0.337926 0.151146 0.673373 0.169284 0.75269 0.166212 0.0358348
+ 0.594514 0.364288 0.78467 0.830391 0.128204 0.174934 0.0210077
Convert Raster
A Raster
as defined in Rasters.jl has a same supertype of a YAXArray
, i.e. AbstractDimArray
, allowing easy conversion between those types:
julia using Rasters
+
+lon, lat = X ( 25 : 1 : 30 ), Y ( 25 : 1 : 30 )
+time = Ti ( 2000 : 2024 )
+ras = Raster ( rand (lon, lat, time))
+a = YAXArray ( dims (ras), ras . data)
Convert DimArray
A DimArray
as defined in DimensionalData.jl has a same supertype of a YAXArray
, i.e. AbstractDimArray
, allowing easy conversion between those types.
Convert DimArray
to YAXArray
:
julia using DimensionalData
+using YAXArrayBase
+
+dim_arr = rand ( X ( 1 : 5 ), Y ( 10.0 : 15.0 ), metadata = Dict{String, Any} ())
+a = yaxconvert (YAXArray, dim_arr)
┌ 5×6 YAXArray{Float64, 2} ┐
+├──────────────────────────┴───────────────────────────────── dims ┐
+ ↓ X Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 10.0:1.0:15.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────── loaded in memory ┤
+ data size: 240.0 bytes
+└──────────────────────────────────────────────────────────────────┘
Convert YAXArray
to DimArray
:
julia dim_arr2 = yaxconvert (DimArray, a)
┌ 5×6 DimArray{Float64, 2} ┐
+├──────────────────────────┴───────────────────────────────── dims ┐
+ ↓ X Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 10.0:1.0:15.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+└──────────────────────────────────────────────────────────────────┘
+ ↓ → 10.0 11.0 12.0 13.0 14.0 15.0
+ 1 0.862644 0.872575 0.0620649 0.193109 0.475725 0.953391
+ 2 0.203714 0.770949 0.731779 0.71314 0.687891 0.435994
+ 3 0.492817 0.718667 0.0702532 0.926096 0.225542 0.100622
+ 4 0.268675 0.0566881 0.916686 0.973332 0.744521 0.052264
+ 5 0.540514 0.215973 0.617023 0.796375 0.13205 0.366625
INFO
At the moment there is no support to save a DimArray directly into disk as a NetCDF
or a Zarr
file.
`,23)]))}const g=a(t,[["render",p]]);export{c as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_create.md.Bweykjuq.js b/previews/PR486/assets/UserGuide_create.md.Bweykjuq.js
new file mode 100644
index 00000000..e6cb8731
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_create.md.Bweykjuq.js
@@ -0,0 +1,48 @@
+import{_ as a,c as i,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Create YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/create.md","filePath":"UserGuide/create.md","lastUpdated":null}'),e={name:"UserGuide/create.md"};function p(l,s,h,k,r,d){return t(),i("div",null,s[0]||(s[0]=[n(`Create YAXArrays and Datasets This section describes how to create arrays and datasets by filling values directly.
Create a YAXArray We can create a new YAXArray by filling the values directly:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+a1 = YAXArray ( rand ( 10 , 20 , 5 ))
┌ 10×20×5 YAXArray{Float64, 3} ┐
+├──────────────────────────────┴───────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────── loaded in memory ┤
+ data size: 7.81 KB
+└──────────────────────────────────────────────────────────────────────┘
The dimensions have only generic names, e.g. Dim_1
and only integer values. We can also specify the dimensions with custom names enabling easier access:
julia using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data2 = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a2 = YAXArray (axlist, data2, properties)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
(↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+→ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points)
Create a Dataset julia data3 = rand ( 30 , 10 , 15 )
+a3 = YAXArray (axlist, data3, properties)
+
+arrays = Dict ( :a2 => a2, :a3 => a3)
+ds = Dataset (; properties, arrays ... )
YAXArray Dataset
+Shared Axes:
+ (↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points)
+
+Variables:
+a2, a3
+
+Properties: Dict(:origin => "user guide")
`,16)]))}const o=a(e,[["render",p]]);export{g as __pageData,o as default};
diff --git a/previews/PR486/assets/UserGuide_create.md.Bweykjuq.lean.js b/previews/PR486/assets/UserGuide_create.md.Bweykjuq.lean.js
new file mode 100644
index 00000000..e6cb8731
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_create.md.Bweykjuq.lean.js
@@ -0,0 +1,48 @@
+import{_ as a,c as i,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const g=JSON.parse('{"title":"Create YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/create.md","filePath":"UserGuide/create.md","lastUpdated":null}'),e={name:"UserGuide/create.md"};function p(l,s,h,k,r,d){return t(),i("div",null,s[0]||(s[0]=[n(`Create YAXArrays and Datasets This section describes how to create arrays and datasets by filling values directly.
Create a YAXArray We can create a new YAXArray by filling the values directly:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+a1 = YAXArray ( rand ( 10 , 20 , 5 ))
┌ 10×20×5 YAXArray{Float64, 3} ┐
+├──────────────────────────────┴───────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────── loaded in memory ┤
+ data size: 7.81 KB
+└──────────────────────────────────────────────────────────────────────┘
The dimensions have only generic names, e.g. Dim_1
and only integer values. We can also specify the dimensions with custom names enabling easier access:
julia using Dates
+
+axlist = (
+ YAX . time ( Date ( "2022-01-01" ) : Day ( 1 ) : Date ( "2022-01-30" )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+)
+data2 = rand ( 30 , 10 , 15 )
+properties = Dict ( :origin => "user guide" )
+a2 = YAXArray (axlist, data2, properties)
┌ 30×10×15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 35.16 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Dict{Symbol, String} with 1 entry:
+ :origin => "user guide"
(↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+→ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points)
Create a Dataset julia data3 = rand ( 30 , 10 , 15 )
+a3 = YAXArray (axlist, data3, properties)
+
+arrays = Dict ( :a2 => a2, :a3 => a3)
+ds = Dataset (; properties, arrays ... )
YAXArray Dataset
+Shared Axes:
+ (↓ time Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points)
+
+Variables:
+a2, a3
+
+Properties: Dict(:origin => "user guide")
`,16)]))}const o=a(e,[["render",p]]);export{g as __pageData,o as default};
diff --git a/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.js b/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.js
new file mode 100644
index 00000000..f9181e0b
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.js
@@ -0,0 +1,364 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const t="/YAXArrays.jl/previews/PR486/assets/lnenoem.DldUI1n7.jpeg",o=JSON.parse('{"title":"Frequently Asked Questions (FAQ)","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/faq.md","filePath":"UserGuide/faq.md","lastUpdated":null}'),l={name:"UserGuide/faq.md"};function h(p,s,k,d,r,g){return e(),a("div",null,s[0]||(s[0]=[n(`Frequently Asked Questions (FAQ) The purpose of this section is to do a collection of small convinient pieces of code on how to do simple things.
julia using YAXArrays
+using DimensionalData
julia julia > c = YAXArray ( rand ( 10 , 10 , 5 ))
┌ 10 × 10 × 5 YAXArray{Float64, 3} ┐
+├──────────────────────────────┴───────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 3.91 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > caxes (c) # former way of doing it
( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+→ Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
WARNING
To get the axes of a YAXArray use the dims
function instead of the caxes
function
( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+→ Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
INFO
Also, use DD.rebuild(c, values)
to copy axes from c
and build a new cube but with different values.
rebuild As an example let's consider the following
julia using YAXArrays
+using DimensionalData
+
+c = YAXArray ( ones (Int, 10 , 10 ))
┌ 10×10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────┘
then creating a new c
with the same structure (axes) but different values is done by
julia julia > new_c = rebuild (c, rand ( 10 , 10 ))
┌ 10 × 10 YAXArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
note that the type is now Float64
. Or, we could create a new structure but using the dimensions from yax
explicitly
julia julia > c_c = YAXArray ( dims (c), rand ( 10 , 10 ))
┌ 10 × 10 YAXArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
which achieves the same goal as rebuild
.
Obtain values from axes and data from the cube There are two options to collect values from axes. In this examples the axis ranges from 1 to 10.
These two examples bring the same result
julia collect ( getAxis ( "Dim_1" , c) . val)
+collect (c . axes[ 1 ] . val)
10-element Vector{Int64}:
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
to collect data from a cube works exactly the same as doing it from an array
┌ 10 × 10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} 1:10 ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
How do I concatenate cubes It is possible to concatenate several cubes that shared the same dimensions using the [concatenatecubes
]@ref function.
Let's create two dummy cubes
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+axlist = (
+ YAX . time ( range ( 1 , 20 , length = 20 )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 ))
+ )
+
+data1 = rand ( 20 , 10 , 15 )
+ds1 = YAXArray (axlist, data1)
+
+data2 = rand ( 20 , 10 , 15 )
+ds2 = YAXArray (axlist, data2)
Now we can concatenate ds1
and ds2
:
julia julia > dsfinal = concatenatecubes ([ds1, ds2], Dim{:Variables} ([ "var1" , "var2" ]))
┌ 20 × 10 × 15 × 2 YAXArray{Float64, 4} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points ,
+ ⬔ Variables Categorical{String} ["var1", "var2"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 46.88 KB
+└──────────────────────────────────────────────────────────────────────────────┘
How do I subset a YAXArray ( Cube ) or Dataset? These are the three main datatypes provided by the YAXArrays libray. You can find a description of them here . A Cube is no more than a YAXArray, so, we will not explicitly tell about a Cube.
Subsetting a YAXArray Let's start by creating a dummy YAXArray.
Firstly, load the required libraries
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" option for selecting data, however the intervals notation should be used instead, i.e. \`a .. b\`.
Define the time span of the YAXArray
julia t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
Date("2020-01-01"):Dates.Month(1):Date("2022-12-01")
create YAXArray axes
julia axes = ( Lon ( 1 : 10 ), Lat ( 1 : 10 ), YAX . Time (t))
(↓ Lon 1:10,
+→ Lat 1:10,
+↗ Time Date("2020-01-01"):Dates.Month(1):Date("2022-12-01"))
create the YAXArray
julia y = YAXArray (axes, reshape ( 1 : 3600 , ( 10 , 10 , 36 )))
┌ 10×10×36 YAXArray{Int64, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 28.12 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Now we subset the YAXArray by any dimension.
Subset YAXArray by years
julia ytime = y[Time = Between ( Date ( 2021 , 1 , 1 ), Date ( 2021 , 12 , 31 ))]
┌ 10×10×12 YAXArray{Int64, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2021-01-01"):Dates.Month(1):Date("2021-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subset YAXArray by a specific date
julia ytime2 = y[Time = At ( Date ( "2021-05-01" ))]
┌ 10×10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────┘
Subset YAXArray by a date range
julia ytime3 = y[Time = Date ( "2021-05-01" ) .. Date ( "2021-12-01" )]
┌ 10×10×8 YAXArray{Int64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2021-05-01"):Dates.Month(1):Date("2021-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 6.25 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subset YAXArray by longitude and latitude
julia ylonlat = y[Lon = 1 .. 5 , Lat = 5 .. 10 ]
┌ 5×6×36 YAXArray{Int64, 3} ┐
+├───────────────────────────┴──────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 5:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 8.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subsetting a Dataset In a dataset, we can have several variables (YAXArrays) that share some or all of their dimensions.
Subsetting a Dataset whose variables share all their dimensions This works for YAXArrays. Let's make an example.
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" option for selecting data
+
+t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
+axes = ( Lon ( 1 : 10 ), Lat ( 1 : 10 ), YAX . Time (t))
+
+var1 = YAXArray (axes, reshape ( 1 : 3600 , ( 10 , 10 , 36 )))
+var2 = YAXArray (axes, reshape (( 1 : 3600 ) * 5 , ( 10 , 10 , 36 )))
+
+ds = Dataset (; var1 = var1, var2 = var2)
YAXArray Dataset
+Shared Axes:
+ (↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+
+Variables:
+var1, var2
julia ds_lonlat = ds[Lon = 1 .. 5 , Lat = 5 .. 10 ]
YAXArray Dataset
+Shared Axes:
+ (↓ Lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 5:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+
+Variables:
+var1, var2
Subsetting a Dataset whose variables share some but not all of their dimensions In this case, if we subset by the common dimension/s, this works the same as for YAXArrays, Cubes, and datasets that share all their dimensions.
But we can also subset a variable by the values of another variable with which it shares some dimensions.
Warning
If your data is not loaded into memory, the selection will be too slow. So, you have load into memory, at least, the variable with which you make the selection.
Let's make an example.
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" selector for selecting data
+
+t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
+common_axis = Dim{:points} ( 1 : 100 )
+time_axis = YAX . Time (t)
+
+# Note that longitudes and latitudes are not dimensions, but YAXArrays
+longitudes = YAXArray ((common_axis,), rand ( 1 : 369 , 100 )) # 100 random values taken from 1 to 359
+latitudes = YAXArray ((common_axis,), rand ( 0 : 90 , 100 )) # 100 random values taken from 0 to 90
+temperature = YAXArray ((common_axis, time_axis), rand ( - 40 : 40 , ( 100 , 36 )))
+
+ds = Dataset (; longitudes = longitudes, latitudes = latitudes, temperature = temperature)
YAXArray Dataset
+Shared Axes:
+ (↓ points Sampled{Int64} 1:100 ForwardOrdered Regular Points)
+
+Variables:
+latitudes, longitudes
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
Select all points between 20ºN and 85ºN, and 0ºE to 180ºE
julia ds_subset = ds[points = Where (p -> ds[ "latitudes" ][p] >= 20 && ds[ "latitudes" ][p] <= 80 &&
+ ds[ "longitudes" ][p] >= 0 && ds[ "longitudes" ][p] <= 180
+ ) # Where
+ ] # ds
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ longitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ latitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points,
+ → Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
If your dataset has been read from a file with Cube
it is not loaded into memory, and you have to load the latitudes
and longitudes
YAXArrays into memory:
julia latitudes_yasxa = readcubedata (ds[ "latitudes" ])
+longitudes_yasxa = readcubedata (ds[ "longitudes" ])
+ds_subset = ds[points = Where (p -> latitudes_yasxa[p] >= 20 && latitudes_yasxa[p] <= 80 &&
+ longitudes_yasxa[p] >= 0 && longitudes_yasxa[p] <= 180
+ ) # Where
+ ] # ds
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ longitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points,
+ → Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ latitudes
How do I apply map algebra? Our next step is map algebra computations. This can be done effectively using the 'map' function. For example:
Multiplying cubes with only spatio-temporal dimensions
julia julia > map ((x, y) -> x * y, ds1, ds2)
┌ 20 × 10 × 15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Cubes with more than 3 dimensions
julia julia > map ((x, y) -> x * y, dsfinal[Variables = At ( "var1" )], dsfinal[Variables = At ( "var2" )])
┌ 20 × 10 × 15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
To add some complexity, we will multiply each value for π and then divided for the sum of each time step. We will use the ds1
cube for this purpose.
julia julia > mapslices (ds1, dims = ( "Lon" , "Lat" )) do xin
+ (xin * π ) ./ maximum ( skipmissing (xin))
+ end
┌ 10 × 15 × 20 YAXArray{Union{Missing, Float64}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points ,
+ ↗ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
How do I use the CubeTable function? The function "CubeTable" creates an iterable table and the result is a DataCube. It is therefore very handy for grouping data and computing statistics by class. It uses OnlineStats.jl
to calculate statistics, and weighted statistics can be calculated as well.
Here we will use the ds1
Cube defined previously and we create a mask for data classification.
Cube containing a mask with classes 1, 2 and 3.
julia julia > classes = YAXArray (( getAxis ( "lon" , dsfinal), getAxis ( "lat" , dsfinal)), rand ( 1 : 3 , 10 , 15 ))
┌ 10 × 15 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 1.17 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia using GLMakie
+GLMakie . activate! ()
+# This is how our classification map looks like
+fig, ax, obj = heatmap (classes;
+ colormap = Makie . Categorical ( cgrad ([ :grey15 , :orangered , :snow3 ])))
+cbar = Colorbar (fig[ 1 , 2 ], obj)
+fig
Now we define the input cubes that will be considered for the iterable table
julia t = CubeTable (values = ds1, classes = classes)
Datacube iterator with 1 subtables with fields: (:values, :classes, :time, :lon, :lat)
julia using DataFrames
+using OnlineStats
+## visualization of the CubeTable
+c_tbl = DataFrame (t[ 1 ])
+first (c_tbl, 5 )
In this line we calculate the Mean
for each class
julia julia > fitcube = cubefittable (t, Mean, :values , by = ( :classes ))
┌ 3-element YAXArray{Union{Missing, Float64}, 1} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ classes Sampled{Int64} [1, 2, 3] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 24.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
We can also use more than one criteria for grouping the values. In the next example, the mean is calculated for each class and timestep.
julia julia > fitcube = cubefittable (t, Mean, :values , by = ( :classes , :time ))
┌ 3 × 20 YAXArray{Union{Missing, Float64}, 2} ┐
+├───────────────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ classes Sampled{Int64} [1, 2, 3] ForwardOrdered Irregular Points ,
+ → time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
How do I assign variable names to YAXArrays
in a Dataset
One variable name julia julia > ds = YAXArrays . Dataset (; ( :a => YAXArray ( rand ( 10 )),) ... )
YAXArray Dataset
+Shared Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points )
+
+Variables:
+a
Multiple variable names julia keylist = ( :a , :b , :c )
+varlist = ( YAXArray ( rand ( 10 )), YAXArray ( rand ( 10 , 5 )), YAXArray ( rand ( 2 , 5 )))
julia julia > ds = YAXArrays . Dataset (; (keylist .=> varlist) ... )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
+ Variables:
+ b
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points )
+ Variables:
+ a
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
+ Variables:
+ c
WARNING
You will not be able to save this dataset, first you will need to rename those dimensions
with the same name
but different values.
Ho do I construct a Dataset
from a TimeArray In this section we will use MarketData.jl
and TimeSeries.jl
to simulate some stocks.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using DimensionalData
+using MarketData, TimeSeries
+
+stocks = Dict ( :Stock1 => random_ohlcv (), :Stock2 => random_ohlcv (), :Stock3 => random_ohlcv ())
+d_keys = keys (stocks)
KeySet for a Dict{Symbol, TimeSeries.TimeArray{Float64, 2, DateTime, Matrix{Float64}}} with 3 entries. Keys:
+ :Stock3
+ :Stock1
+ :Stock2
currently there is not direct support to obtain dims
from a TimeArray
, but we can code a function for it
julia getTArrayAxes (ta :: TimeArray ) = (YAX . time ( timestamp (ta)), Variables ( colnames (ta)), );
then, we create the YAXArrays
as
julia yax_list = [ YAXArray ( getTArrayAxes (stocks[k]), values (stocks[k])) for k in d_keys];
and a Dataset
with all stocks
names
julia julia > ds = Dataset (; (d_keys .=> yax_list) ... )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock1
+
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock2
+
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock3
and, it looks like there some small differences in the axes, they are being printed independently although they should be the same. Well, they are at least at the ==
level but not at ===
. We could use the axes from one YAXArray
as reference and rebuild
all the others
julia yax_list = [ rebuild (yax_list[ 1 ], values (stocks[k])) for k in d_keys];
and voilà
julia julia > ds = Dataset (; (d_keys .=> yax_list) ... )
YAXArray Dataset
+Shared Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+
+Variables:
+Stock1, Stock2, Stock3
now they are printed together, showing that is exactly the same axis structure for all variables.
Create a YAXArray
with unions containing Strings
julia test_x = stack (Vector{Union{Int,String}}[[ 1 , "Test" ], [ 2 , "Test2" ]])
+yax_string = YAXArray (test_x)
┌ 2×2 YAXArray{Union{Int64, String}, 2} ┐
+├───────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ summarysize: 121.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
or simply with an Any
type
julia test_bool = [ "Test1" 1 false ; 2 "Test2" true ; 1 2f0 1f2 ]
+yax_bool = YAXArray (test_bool)
┌ 3×3 YAXArray{Any, 2} ┐
+├──────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ summarysize: 172.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
WARNING
Note that although their creation is allowed, it is not possible to save these types into Zarr or NetCDF.
`,149)]))}const E=i(l,[["render",h]]);export{o as __pageData,E as default};
diff --git a/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.lean.js b/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.lean.js
new file mode 100644
index 00000000..f9181e0b
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_faq.md.uhp-zjxe.lean.js
@@ -0,0 +1,364 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const t="/YAXArrays.jl/previews/PR486/assets/lnenoem.DldUI1n7.jpeg",o=JSON.parse('{"title":"Frequently Asked Questions (FAQ)","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/faq.md","filePath":"UserGuide/faq.md","lastUpdated":null}'),l={name:"UserGuide/faq.md"};function h(p,s,k,d,r,g){return e(),a("div",null,s[0]||(s[0]=[n(`Frequently Asked Questions (FAQ) The purpose of this section is to do a collection of small convinient pieces of code on how to do simple things.
julia using YAXArrays
+using DimensionalData
julia julia > c = YAXArray ( rand ( 10 , 10 , 5 ))
┌ 10 × 10 × 5 YAXArray{Float64, 3} ┐
+├──────────────────────────────┴───────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 3.91 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > caxes (c) # former way of doing it
( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+→ Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
WARNING
To get the axes of a YAXArray use the dims
function instead of the caxes
function
( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+→ Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
INFO
Also, use DD.rebuild(c, values)
to copy axes from c
and build a new cube but with different values.
rebuild As an example let's consider the following
julia using YAXArrays
+using DimensionalData
+
+c = YAXArray ( ones (Int, 10 , 10 ))
┌ 10×10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────┘
then creating a new c
with the same structure (axes) but different values is done by
julia julia > new_c = rebuild (c, rand ( 10 , 10 ))
┌ 10 × 10 YAXArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
note that the type is now Float64
. Or, we could create a new structure but using the dimensions from yax
explicitly
julia julia > c_c = YAXArray ( dims (c), rand ( 10 , 10 ))
┌ 10 × 10 YAXArray{Float64, 2} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
which achieves the same goal as rebuild
.
Obtain values from axes and data from the cube There are two options to collect values from axes. In this examples the axis ranges from 1 to 10.
These two examples bring the same result
julia collect ( getAxis ( "Dim_1" , c) . val)
+collect (c . axes[ 1 ] . val)
10-element Vector{Int64}:
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
to collect data from a cube works exactly the same as doing it from an array
┌ 10 × 10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} 1:10 ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
How do I concatenate cubes It is possible to concatenate several cubes that shared the same dimensions using the [concatenatecubes
]@ref function.
Let's create two dummy cubes
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+axlist = (
+ YAX . time ( range ( 1 , 20 , length = 20 )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 ))
+ )
+
+data1 = rand ( 20 , 10 , 15 )
+ds1 = YAXArray (axlist, data1)
+
+data2 = rand ( 20 , 10 , 15 )
+ds2 = YAXArray (axlist, data2)
Now we can concatenate ds1
and ds2
:
julia julia > dsfinal = concatenatecubes ([ds1, ds2], Dim{:Variables} ([ "var1" , "var2" ]))
┌ 20 × 10 × 15 × 2 YAXArray{Float64, 4} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points ,
+ ⬔ Variables Categorical{String} ["var1", "var2"] ForwardOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 46.88 KB
+└──────────────────────────────────────────────────────────────────────────────┘
How do I subset a YAXArray ( Cube ) or Dataset? These are the three main datatypes provided by the YAXArrays libray. You can find a description of them here . A Cube is no more than a YAXArray, so, we will not explicitly tell about a Cube.
Subsetting a YAXArray Let's start by creating a dummy YAXArray.
Firstly, load the required libraries
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" option for selecting data, however the intervals notation should be used instead, i.e. \`a .. b\`.
Define the time span of the YAXArray
julia t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
Date("2020-01-01"):Dates.Month(1):Date("2022-12-01")
create YAXArray axes
julia axes = ( Lon ( 1 : 10 ), Lat ( 1 : 10 ), YAX . Time (t))
(↓ Lon 1:10,
+→ Lat 1:10,
+↗ Time Date("2020-01-01"):Dates.Month(1):Date("2022-12-01"))
create the YAXArray
julia y = YAXArray (axes, reshape ( 1 : 3600 , ( 10 , 10 , 36 )))
┌ 10×10×36 YAXArray{Int64, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 28.12 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Now we subset the YAXArray by any dimension.
Subset YAXArray by years
julia ytime = y[Time = Between ( Date ( 2021 , 1 , 1 ), Date ( 2021 , 12 , 31 ))]
┌ 10×10×12 YAXArray{Int64, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2021-01-01"):Dates.Month(1):Date("2021-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subset YAXArray by a specific date
julia ytime2 = y[Time = At ( Date ( "2021-05-01" ))]
┌ 10×10 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points
+├──────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────── loaded in memory ┤
+ data size: 800.0 bytes
+└──────────────────────────────────────────────────────────┘
Subset YAXArray by a date range
julia ytime3 = y[Time = Date ( "2021-05-01" ) .. Date ( "2021-12-01" )]
┌ 10×10×8 YAXArray{Int64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2021-05-01"):Dates.Month(1):Date("2021-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 6.25 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subset YAXArray by longitude and latitude
julia ylonlat = y[Lon = 1 .. 5 , Lat = 5 .. 10 ]
┌ 5×6×36 YAXArray{Int64, 3} ┐
+├───────────────────────────┴──────────────────────────────────────────── dims ┐
+ ↓ Lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 5:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 8.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Subsetting a Dataset In a dataset, we can have several variables (YAXArrays) that share some or all of their dimensions.
Subsetting a Dataset whose variables share all their dimensions This works for YAXArrays. Let's make an example.
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" option for selecting data
+
+t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
+axes = ( Lon ( 1 : 10 ), Lat ( 1 : 10 ), YAX . Time (t))
+
+var1 = YAXArray (axes, reshape ( 1 : 3600 , ( 10 , 10 , 36 )))
+var2 = YAXArray (axes, reshape (( 1 : 3600 ) * 5 , ( 10 , 10 , 36 )))
+
+ds = Dataset (; var1 = var1, var2 = var2)
YAXArray Dataset
+Shared Axes:
+ (↓ Lon Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+
+Variables:
+var1, var2
julia ds_lonlat = ds[Lon = 1 .. 5 , Lat = 5 .. 10 ]
YAXArray Dataset
+Shared Axes:
+ (↓ Lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → Lat Sampled{Int64} 5:10 ForwardOrdered Regular Points,
+ ↗ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+
+Variables:
+var1, var2
Subsetting a Dataset whose variables share some but not all of their dimensions In this case, if we subset by the common dimension/s, this works the same as for YAXArrays, Cubes, and datasets that share all their dimensions.
But we can also subset a variable by the values of another variable with which it shares some dimensions.
Warning
If your data is not loaded into memory, the selection will be too slow. So, you have load into memory, at least, the variable with which you make the selection.
Let's make an example.
julia using YAXArrays
+using Dates # To generate the dates of the time axis
+using DimensionalData # To use the "Between" selector for selecting data
+
+t = Date ( "2020-01-01" ) : Month ( 1 ) : Date ( "2022-12-31" )
+common_axis = Dim{:points} ( 1 : 100 )
+time_axis = YAX . Time (t)
+
+# Note that longitudes and latitudes are not dimensions, but YAXArrays
+longitudes = YAXArray ((common_axis,), rand ( 1 : 369 , 100 )) # 100 random values taken from 1 to 359
+latitudes = YAXArray ((common_axis,), rand ( 0 : 90 , 100 )) # 100 random values taken from 0 to 90
+temperature = YAXArray ((common_axis, time_axis), rand ( - 40 : 40 , ( 100 , 36 )))
+
+ds = Dataset (; longitudes = longitudes, latitudes = latitudes, temperature = temperature)
YAXArray Dataset
+Shared Axes:
+ (↓ points Sampled{Int64} 1:100 ForwardOrdered Regular Points)
+
+Variables:
+latitudes, longitudes
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
Select all points between 20ºN and 85ºN, and 0ºE to 180ºE
julia ds_subset = ds[points = Where (p -> ds[ "latitudes" ][p] >= 20 && ds[ "latitudes" ][p] <= 80 &&
+ ds[ "longitudes" ][p] >= 0 && ds[ "longitudes" ][p] <= 180
+ ) # Where
+ ] # ds
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ longitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ latitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points,
+ → Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
If your dataset has been read from a file with Cube
it is not loaded into memory, and you have to load the latitudes
and longitudes
YAXArrays into memory:
julia latitudes_yasxa = readcubedata (ds[ "latitudes" ])
+longitudes_yasxa = readcubedata (ds[ "longitudes" ])
+ds_subset = ds[points = Where (p -> latitudes_yasxa[p] >= 20 && latitudes_yasxa[p] <= 80 &&
+ longitudes_yasxa[p] >= 0 && longitudes_yasxa[p] <= 180
+ ) # Where
+ ] # ds
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ longitudes
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points,
+ → Time Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points)
+ Variables:
+ temperature
+
+ Additional Axes:
+ (↓ points Sampled{Int64} [2, 4, …, 96, 98] ForwardOrdered Irregular Points)
+ Variables:
+ latitudes
How do I apply map algebra? Our next step is map algebra computations. This can be done effectively using the 'map' function. For example:
Multiplying cubes with only spatio-temporal dimensions
julia julia > map ((x, y) -> x * y, ds1, ds2)
┌ 20 × 10 × 15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Cubes with more than 3 dimensions
julia julia > map ((x, y) -> x * y, dsfinal[Variables = At ( "var1" )], dsfinal[Variables = At ( "var2" )])
┌ 20 × 10 × 15 YAXArray{Float64, 3} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points ,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
To add some complexity, we will multiply each value for π and then divided for the sum of each time step. We will use the ds1
cube for this purpose.
julia julia > mapslices (ds1, dims = ( "Lon" , "Lat" )) do xin
+ (xin * π ) ./ maximum ( skipmissing (xin))
+ end
┌ 10 × 15 × 20 YAXArray{Union{Missing, Float64}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points ,
+ ↗ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 23.44 KB
+└──────────────────────────────────────────────────────────────────────────────┘
How do I use the CubeTable function? The function "CubeTable" creates an iterable table and the result is a DataCube. It is therefore very handy for grouping data and computing statistics by class. It uses OnlineStats.jl
to calculate statistics, and weighted statistics can be calculated as well.
Here we will use the ds1
Cube defined previously and we create a mask for data classification.
Cube containing a mask with classes 1, 2 and 3.
julia julia > classes = YAXArray (( getAxis ( "lon" , dsfinal), getAxis ( "lat" , dsfinal)), rand ( 1 : 3 , 10 , 15 ))
┌ 10 × 15 YAXArray{Int64, 2} ┐
+├──────────────────────────┴───────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 1.17 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia using GLMakie
+GLMakie . activate! ()
+# This is how our classification map looks like
+fig, ax, obj = heatmap (classes;
+ colormap = Makie . Categorical ( cgrad ([ :grey15 , :orangered , :snow3 ])))
+cbar = Colorbar (fig[ 1 , 2 ], obj)
+fig
Now we define the input cubes that will be considered for the iterable table
julia t = CubeTable (values = ds1, classes = classes)
Datacube iterator with 1 subtables with fields: (:values, :classes, :time, :lon, :lat)
julia using DataFrames
+using OnlineStats
+## visualization of the CubeTable
+c_tbl = DataFrame (t[ 1 ])
+first (c_tbl, 5 )
In this line we calculate the Mean
for each class
julia julia > fitcube = cubefittable (t, Mean, :values , by = ( :classes ))
┌ 3-element YAXArray{Union{Missing, Float64}, 1} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ classes Sampled{Int64} [1, 2, 3] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 24.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
We can also use more than one criteria for grouping the values. In the next example, the mean is calculated for each class and timestep.
julia julia > fitcube = cubefittable (t, Mean, :values , by = ( :classes , :time ))
┌ 3 × 20 YAXArray{Union{Missing, Float64}, 2} ┐
+├───────────────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ classes Sampled{Int64} [1, 2, 3] ForwardOrdered Irregular Points ,
+ → time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 480.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
How do I assign variable names to YAXArrays
in a Dataset
One variable name julia julia > ds = YAXArrays . Dataset (; ( :a => YAXArray ( rand ( 10 )),) ... )
YAXArray Dataset
+Shared Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points )
+
+Variables:
+a
Multiple variable names julia keylist = ( :a , :b , :c )
+varlist = ( YAXArray ( rand ( 10 )), YAXArray ( rand ( 10 , 5 )), YAXArray ( rand ( 2 , 5 )))
julia julia > ds = YAXArrays . Dataset (; (keylist .=> varlist) ... )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
+ Variables:
+ b
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points )
+ Variables:
+ a
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points )
+ Variables:
+ c
WARNING
You will not be able to save this dataset, first you will need to rename those dimensions
with the same name
but different values.
Ho do I construct a Dataset
from a TimeArray In this section we will use MarketData.jl
and TimeSeries.jl
to simulate some stocks.
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+using DimensionalData
+using MarketData, TimeSeries
+
+stocks = Dict ( :Stock1 => random_ohlcv (), :Stock2 => random_ohlcv (), :Stock3 => random_ohlcv ())
+d_keys = keys (stocks)
KeySet for a Dict{Symbol, TimeSeries.TimeArray{Float64, 2, DateTime, Matrix{Float64}}} with 3 entries. Keys:
+ :Stock3
+ :Stock1
+ :Stock2
currently there is not direct support to obtain dims
from a TimeArray
, but we can code a function for it
julia getTArrayAxes (ta :: TimeArray ) = (YAX . time ( timestamp (ta)), Variables ( colnames (ta)), );
then, we create the YAXArrays
as
julia yax_list = [ YAXArray ( getTArrayAxes (stocks[k]), values (stocks[k])) for k in d_keys];
and a Dataset
with all stocks
names
julia julia > ds = Dataset (; (d_keys .=> yax_list) ... )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock1
+
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock2
+
+ Additional Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+ Variables:
+ Stock3
and, it looks like there some small differences in the axes, they are being printed independently although they should be the same. Well, they are at least at the ==
level but not at ===
. We could use the axes from one YAXArray
as reference and rebuild
all the others
julia yax_list = [ rebuild (yax_list[ 1 ], values (stocks[k])) for k in d_keys];
and voilà
julia julia > ds = Dataset (; (d_keys .=> yax_list) ... )
YAXArray Dataset
+Shared Axes:
+ ( ↓ time Sampled{DateTime} [2020-01-01T00:00:00, …, 2020-01-21T19:00:00] ForwardOrdered Irregular Points ,
+ → Variables Categorical{Symbol} [:Open, :High, :Low, :Close, :Volume] Unordered )
+
+Variables:
+Stock1, Stock2, Stock3
now they are printed together, showing that is exactly the same axis structure for all variables.
Create a YAXArray
with unions containing Strings
julia test_x = stack (Vector{Union{Int,String}}[[ 1 , "Test" ], [ 2 , "Test2" ]])
+yax_string = YAXArray (test_x)
┌ 2×2 YAXArray{Union{Int64, String}, 2} ┐
+├───────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ summarysize: 121.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
or simply with an Any
type
julia test_bool = [ "Test1" 1 false ; 2 "Test2" true ; 1 2f0 1f2 ]
+yax_bool = YAXArray (test_bool)
┌ 3×3 YAXArray{Any, 2} ┐
+├──────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ summarysize: 172.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
WARNING
Note that although their creation is allowed, it is not possible to save these types into Zarr or NetCDF.
`,149)]))}const E=i(l,[["render",h]]);export{o as __pageData,E as default};
diff --git a/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.js b/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.js
new file mode 100644
index 00000000..461e1d7a
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.js
@@ -0,0 +1,208 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const t="/YAXArrays.jl/previews/PR486/assets/mmzaksu.BJNzQY3Z.png",y=JSON.parse('{"title":"Group YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/group.md","filePath":"UserGuide/group.md","lastUpdated":null}'),l={name:"UserGuide/group.md"};function p(h,s,k,d,r,g){return e(),a("div",null,s[0]||(s[0]=[n(`Group YAXArrays and Datasets The following examples will use the groupby
function to calculate temporal and spatial averages.
julia using YAXArrays, DimensionalData
+using YAXArrays : YAXArrays as YAX
+using NetCDF
+using Downloads
+using Dates
+using Statistics
[ Info: new driver key :netcdf, updating backendlist.
Seasonal Averages from Time Series of Monthly Means The following reproduces the example in xarray by Joe Hamman .
Where the goal is to calculate the seasonal average. And in order to do this properly, is necessary to calculate the weighted average considering that each month has a different number of days.
Download the data julia url_path = "https://github.com/pydata/xarray-data/raw/master/rasm.nc"
+filename = Downloads . download (url_path, "rasm.nc" )
+ds_o = Cube (filename)
┌ 275×205×36 YAXArray{Float64, 3} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ x Sampled{Int64} 1:275 ForwardOrdered Regular Points,
+ → y Sampled{Int64} 1:205 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 7 entries:
+ "units" => "C"
+ "coordinates" => "yc xc"
+ "name" => "Tair"
+ "long_name" => "Surface air temperature"
+ "type_preferred" => "double"
+ "_FillValue" => 9.96921e36
+ "time_rep" => "instantaneous"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 15.48 MB
+└──────────────────────────────────────────────────────────────────────────────┘
julia _FillValue = ds_o . properties[ "_FillValue" ]
+ds = replace (ds_o[:,:,:], _FillValue => NaN ) # load into memory and replace _FillValue by NaN
┌ 275×205×36 YAXArray{Float64, 3} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ x Sampled{Int64} 1:275 ForwardOrdered Regular Points,
+ → y Sampled{Int64} 1:205 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 7 entries:
+ "units" => "C"
+ "coordinates" => "yc xc"
+ "name" => "Tair"
+ "long_name" => "Surface air temperature"
+ "type_preferred" => "double"
+ "_FillValue" => 9.96921e36
+ "time_rep" => "instantaneous"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 15.48 MB
+└──────────────────────────────────────────────────────────────────────────────┘
GroupBy: seasons function weighted_seasons(ds) ... end julia function weighted_seasons (ds)
+ # calculate weights
+ tempo = dims (ds, :time )
+ month_length = YAXArray ((tempo,), daysinmonth .(tempo))
+ g_tempo = groupby (month_length, YAX . time => seasons (; start = December))
+ sum_days = sum .(g_tempo, dims = :time )
+ weights = map ( ./ , g_tempo, sum_days)
+ # unweighted seasons
+ g_ds = groupby (ds, YAX . time => seasons (; start = December))
+ mean_g = mean .(g_ds, dims = :time )
+ mean_g = dropdims .(mean_g, dims = :time )
+ # weighted seasons
+ g_dsW = broadcast_dims .( * , weights, g_ds)
+ weighted_g = sum .(g_dsW, dims = :time );
+ weighted_g = dropdims .(weighted_g, dims = :time )
+ # differences
+ diff_g = map ( .- , weighted_g, mean_g)
+ seasons_g = lookup (mean_g, :time )
+ return mean_g, weighted_g, diff_g, seasons_g
+end
INFO
In what follows, note how we are referencing the time dimension via YAX.time
. This approach is used to avoid name clashes with time
(Time
) from Base (Dates ). For convenience, we have defined the Dimensions time
and Time
in YAXArrays.jl , which are only accessible when explicitly called.
Now, we continue with the groupby
operations as usual
julia julia > g_ds = groupby (ds, YAX . time => seasons (; start = December))
┌ 4-element DimGroupByArray{YAXArray{Float64,2},1} ┐
+├──────────────────────────────────────────────────┴───────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+├────────────────────────────────────────────────────────────────── group dims ┤
+ ↓ x , → y , ↗ time
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 275 × 205 × 9 YAXArray
+ :Mar_Apr_May 275 × 205 × 9 YAXArray
+ :Jun_Jul_Aug 275 × 205 × 9 YAXArray
+ :Sep_Oct_Nov 275 × 205 × 9 YAXArray
And the mean per season is calculated as follows
julia julia > mean_g = mean .(g_ds, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 3, Array{Float64, 3}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1372 11.3835; NaN NaN … 11.3252 11.5843;;;]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1363 21.018; NaN NaN … 21.4325 21.1762;;;]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2818 27.9432; NaN NaN … 28.619 28.0537;;;]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.7119 21.7158; NaN NaN … 21.9682 21.9404;;;]
dropdims Note that now the time dimension has length one, we can use dropdims
to remove it
julia julia > mean_g = dropdims .(mean_g, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1372 11.3835; NaN NaN … 11.3252 11.5843]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1363 21.018; NaN NaN … 21.4325 21.1762]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2818 27.9432; NaN NaN … 28.619 28.0537]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.7119 21.7158; NaN NaN … 21.9682 21.9404]
seasons Due to the groupby
function we will obtain new grouping names, in this case in the time dimension:
julia seasons_g = lookup (mean_g, :time )
Categorical{Symbol} Unordered
+wrapping: 4-element Vector{Symbol}:
+ :Dec_Jan_Feb
+ :Mar_Apr_May
+ :Jun_Jul_Aug
+ :Sep_Oct_Nov
Next, we will weight this grouping by days/month in each group.
GroupBy: weight Create a YAXArray
for the month length
julia tempo = dims (ds, :time )
+month_length = YAXArray ((tempo,), daysinmonth .(tempo))
┌ 36-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 288.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Now group it by season
julia julia > g_tempo = groupby (month_length, YAX . time => seasons (; start = December))
┌ 4-element DimGroupByArray{YAXArray{Int64,0},1} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+├────────────────────────────────────────────────────────────────── group dims ┤
+ ↓ time
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 9-element YAXArray
+ :Mar_Apr_May 9-element YAXArray
+ :Jun_Jul_Aug 9-element YAXArray
+ :Sep_Oct_Nov 9-element YAXArray
Get the number of days per season
julia julia > sum_days = sum .(g_tempo, dims = :time )
┌ 4-element DimArray{YAXArray{Int64, 1, DimensionalData.DimVector{Int64, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Tuple{}, Vector{Int64}, Symbol, DimensionalData.Dimensions.Lookups.NoMetadata}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb [270]
+ :Mar_Apr_May [276]
+ :Jun_Jul_Aug [276]
+ :Sep_Oct_Nov [273]
weights Weight the seasonal groups by sum_days
julia julia > weights = map ( ./ , g_tempo, sum_days)
┌ 4-element DimArray{YAXArray{Float64, 1, Vector{Float64}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} groupby ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [0.114815, 0.114815, 0.103704, 0.114815, 0.114815, 0.103704, 0.114815, 0.114815, 0.103704]
+ :Mar_Apr_May [0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319]
+ :Jun_Jul_Aug [0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319]
+ :Sep_Oct_Nov [0.10989, 0.113553, 0.10989, 0.10989, 0.113553, 0.10989, 0.10989, 0.113553, 0.10989]
Verify that the sum per season is 1
julia julia > sum .(weights)
┌ 4-element DimArray{Float64, 1} ┐
+├────────────────────────────────┴─────────────────────────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 1.0
+ :Mar_Apr_May 1.0
+ :Jun_Jul_Aug 1.0
+ :Sep_Oct_Nov 1.0
weighted seasons Now, let's weight the seasons
julia julia > g_dsW = broadcast_dims .( * , weights, g_ds)
┌ 4-element DimArray{YAXArray{Float64, 3, Array{Float64, 3}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 1.32149 1.33565; NaN NaN … 1.29564 1.32555; … ; NaN NaN … 1.3188 1.3169; NaN NaN … 1.17863 1.18434;;; NaN NaN … 1.29816 1.34218; NaN NaN … 1.30113 1.35483; … ; NaN NaN … 1.30142 1.31753; NaN NaN … 1.16258 1.17647;;; NaN NaN … 1.34549 1.37878; NaN NaN … 1.36836 1.41634; … ; NaN NaN … 1.34832 1.38364; NaN NaN … 1.17852 1.16713]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 1.87705 1.90365; NaN NaN … 2.30018 2.35432; … ; NaN NaN … 2.41049 2.43254; NaN NaN … 2.65105 2.69085;;; NaN NaN … 1.86457 1.90712; NaN NaN … 2.2894 2.34818; … ; NaN NaN … 2.3866 2.41241; NaN NaN … 2.61197 2.64976;;; NaN NaN … 1.89237 1.8984; NaN NaN … 2.29473 2.312; … ; NaN NaN … 2.36142 2.36126; NaN NaN … 2.56632 2.59085]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 3.21209 3.25153; NaN NaN … 3.23 3.28008; … ; NaN NaN … 3.12575 3.15532; NaN NaN … 3.2434 3.26274;;; NaN NaN … 3.17434 3.21699; NaN NaN … 3.18892 3.24375; … ; NaN NaN … 3.06755 3.1083; NaN NaN … 3.19241 3.22211;;; NaN NaN … 3.1437 3.15644; NaN NaN … 3.16631 3.18583; … ; NaN NaN … 3.03361 3.05846; NaN NaN … 3.16581 3.16824]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 2.97047 3.00388; NaN NaN … 2.77587 2.80759; … ; NaN NaN … 2.60175 2.60918; NaN NaN … 1.4947 1.52419;;; NaN NaN … 2.94534 2.97649; NaN NaN … 2.75891 2.79502; … ; NaN NaN … 2.57695 2.59212; NaN NaN … 1.46506 1.49909;;; NaN NaN … 2.9192 2.93743; NaN NaN … 2.7593 2.77687; … ; NaN NaN … 2.57873 2.63006; NaN NaN … 1.48367 1.50089]
apply a sum
over the time dimension and drop it
julia julia > weighted_g = sum .(g_dsW, dims = :time );
+
+julia > weighted_g = dropdims .(weighted_g, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1181 11.372; NaN NaN … 11.3069 11.5743]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1242 21.0057; NaN NaN … 21.4198 21.1644]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2747 27.9362; NaN NaN … 28.6122 28.0465]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.73 21.7341; NaN NaN … 21.986 21.959]
Calculate the differences
julia julia > diff_g = map ( .- , weighted_g, mean_g)
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.019016 -0.0115514; NaN NaN … -0.0183003 -0.00990356]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.0121037 -0.0123091; NaN NaN … -0.0127077 -0.0117519]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.00709111 -0.00693713; NaN NaN … -0.00684233 -0.00722034]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 0.0180572 0.0182373; NaN NaN … 0.0178074 0.018571]
All the previous steps are equivalent to calling the function defined at the top:
julia mean_g, weighted_g, diff_g, seasons_g = weighted_seasons (ds)
Once all calculations are done we can plot the results with Makie.jl
as follows:
julia using CairoMakie
+# define plot arguments/attributes
+colorrange = ( - 30 , 30 )
+colormap = Reverse ( :Spectral )
+highclip = :red
+lowclip = :grey15
+cb_label = ds_o . properties[ "long_name" ]
"Surface air temperature"
julia with_theme ( theme_ggplot2 ()) do
+ hm_o, hm_d, hm_w = nothing , nothing , nothing
+ # the figure
+ fig = Figure (; size = ( 850 , 500 ))
+ axs = [ Axis (fig[i,j], aspect = DataAspect ()) for i in 1 : 3 , j in 1 : 4 ]
+ for (j, s) in enumerate (seasons_g)
+ hm_o = heatmap! (axs[ 1 ,j], mean_g[time = At (s)]; colorrange, lowclip, highclip, colormap)
+ hm_w = heatmap! (axs[ 2 ,j], weighted_g[time = At (s)]; colorrange, lowclip, highclip, colormap)
+ hm_d = heatmap! (axs[ 3 ,j], diff_g[time = At (s)]; colorrange = ( - 0.1 , 0.1 ), lowclip, highclip,
+ colormap = :diverging_bwr_20_95_c54_n256 )
+ end
+ Colorbar (fig[ 1 : 2 , 5 ], hm_o, label = cb_label)
+ Colorbar (fig[ 3 , 5 ], hm_d, label = "Tair" )
+ hidedecorations! .(axs, grid = false , ticks = false , label = false )
+ # some labels
+ [axs[ 1 ,j] . title = string .(s) for (j,s) in enumerate (seasons_g)]
+ Label (fig[ 0 , 1 : 5 ], "Seasonal Surface Air Temperature" , fontsize = 18 , font = :bold )
+ axs[ 1 , 1 ] . ylabel = "Unweighted"
+ axs[ 2 , 1 ] . ylabel = "Weighted"
+ axs[ 3 , 1 ] . ylabel = "Difference"
+ colgap! (fig . layout, 5 )
+ rowgap! (fig . layout, 5 )
+ fig
+end
which shows a good agreement with the results first published by Joe Hamman .
',66)]))}const N=i(l,[["render",p]]);export{y as __pageData,N as default};
diff --git a/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.lean.js b/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.lean.js
new file mode 100644
index 00000000..461e1d7a
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_group.md.B_BCz8Qu.lean.js
@@ -0,0 +1,208 @@
+import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const t="/YAXArrays.jl/previews/PR486/assets/mmzaksu.BJNzQY3Z.png",y=JSON.parse('{"title":"Group YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/group.md","filePath":"UserGuide/group.md","lastUpdated":null}'),l={name:"UserGuide/group.md"};function p(h,s,k,d,r,g){return e(),a("div",null,s[0]||(s[0]=[n(`Group YAXArrays and Datasets The following examples will use the groupby
function to calculate temporal and spatial averages.
julia using YAXArrays, DimensionalData
+using YAXArrays : YAXArrays as YAX
+using NetCDF
+using Downloads
+using Dates
+using Statistics
[ Info: new driver key :netcdf, updating backendlist.
Seasonal Averages from Time Series of Monthly Means The following reproduces the example in xarray by Joe Hamman .
Where the goal is to calculate the seasonal average. And in order to do this properly, is necessary to calculate the weighted average considering that each month has a different number of days.
Download the data julia url_path = "https://github.com/pydata/xarray-data/raw/master/rasm.nc"
+filename = Downloads . download (url_path, "rasm.nc" )
+ds_o = Cube (filename)
┌ 275×205×36 YAXArray{Float64, 3} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ x Sampled{Int64} 1:275 ForwardOrdered Regular Points,
+ → y Sampled{Int64} 1:205 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 7 entries:
+ "units" => "C"
+ "coordinates" => "yc xc"
+ "name" => "Tair"
+ "long_name" => "Surface air temperature"
+ "type_preferred" => "double"
+ "_FillValue" => 9.96921e36
+ "time_rep" => "instantaneous"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 15.48 MB
+└──────────────────────────────────────────────────────────────────────────────┘
julia _FillValue = ds_o . properties[ "_FillValue" ]
+ds = replace (ds_o[:,:,:], _FillValue => NaN ) # load into memory and replace _FillValue by NaN
┌ 275×205×36 YAXArray{Float64, 3} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ x Sampled{Int64} 1:275 ForwardOrdered Regular Points,
+ → y Sampled{Int64} 1:205 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 7 entries:
+ "units" => "C"
+ "coordinates" => "yc xc"
+ "name" => "Tair"
+ "long_name" => "Surface air temperature"
+ "type_preferred" => "double"
+ "_FillValue" => 9.96921e36
+ "time_rep" => "instantaneous"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 15.48 MB
+└──────────────────────────────────────────────────────────────────────────────┘
GroupBy: seasons function weighted_seasons(ds) ... end julia function weighted_seasons (ds)
+ # calculate weights
+ tempo = dims (ds, :time )
+ month_length = YAXArray ((tempo,), daysinmonth .(tempo))
+ g_tempo = groupby (month_length, YAX . time => seasons (; start = December))
+ sum_days = sum .(g_tempo, dims = :time )
+ weights = map ( ./ , g_tempo, sum_days)
+ # unweighted seasons
+ g_ds = groupby (ds, YAX . time => seasons (; start = December))
+ mean_g = mean .(g_ds, dims = :time )
+ mean_g = dropdims .(mean_g, dims = :time )
+ # weighted seasons
+ g_dsW = broadcast_dims .( * , weights, g_ds)
+ weighted_g = sum .(g_dsW, dims = :time );
+ weighted_g = dropdims .(weighted_g, dims = :time )
+ # differences
+ diff_g = map ( .- , weighted_g, mean_g)
+ seasons_g = lookup (mean_g, :time )
+ return mean_g, weighted_g, diff_g, seasons_g
+end
INFO
In what follows, note how we are referencing the time dimension via YAX.time
. This approach is used to avoid name clashes with time
(Time
) from Base (Dates ). For convenience, we have defined the Dimensions time
and Time
in YAXArrays.jl , which are only accessible when explicitly called.
Now, we continue with the groupby
operations as usual
julia julia > g_ds = groupby (ds, YAX . time => seasons (; start = December))
┌ 4-element DimGroupByArray{YAXArray{Float64,2},1} ┐
+├──────────────────────────────────────────────────┴───────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+├────────────────────────────────────────────────────────────────── group dims ┤
+ ↓ x , → y , ↗ time
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 275 × 205 × 9 YAXArray
+ :Mar_Apr_May 275 × 205 × 9 YAXArray
+ :Jun_Jul_Aug 275 × 205 × 9 YAXArray
+ :Sep_Oct_Nov 275 × 205 × 9 YAXArray
And the mean per season is calculated as follows
julia julia > mean_g = mean .(g_ds, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 3, Array{Float64, 3}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1372 11.3835; NaN NaN … 11.3252 11.5843;;;]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1363 21.018; NaN NaN … 21.4325 21.1762;;;]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2818 27.9432; NaN NaN … 28.619 28.0537;;;]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.7119 21.7158; NaN NaN … 21.9682 21.9404;;;]
dropdims Note that now the time dimension has length one, we can use dropdims
to remove it
julia julia > mean_g = dropdims .(mean_g, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1372 11.3835; NaN NaN … 11.3252 11.5843]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1363 21.018; NaN NaN … 21.4325 21.1762]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2818 27.9432; NaN NaN … 28.619 28.0537]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.7119 21.7158; NaN NaN … 21.9682 21.9404]
seasons Due to the groupby
function we will obtain new grouping names, in this case in the time dimension:
julia seasons_g = lookup (mean_g, :time )
Categorical{Symbol} Unordered
+wrapping: 4-element Vector{Symbol}:
+ :Dec_Jan_Feb
+ :Mar_Apr_May
+ :Jun_Jul_Aug
+ :Sep_Oct_Nov
Next, we will weight this grouping by days/month in each group.
GroupBy: weight Create a YAXArray
for the month length
julia tempo = dims (ds, :time )
+month_length = YAXArray ((tempo,), daysinmonth .(tempo))
┌ 36-element YAXArray{Int64, 1} ┐
+├───────────────────────────────┴──────────────────────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTimeNoLeap} [CFTime.DateTimeNoLeap(1980-09-16T12:00:00), …, CFTime.DateTimeNoLeap(1983-08-17T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 288.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Now group it by season
julia julia > g_tempo = groupby (month_length, YAX . time => seasons (; start = December))
┌ 4-element DimGroupByArray{YAXArray{Int64,0},1} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+├────────────────────────────────────────────────────────────────── group dims ┤
+ ↓ time
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 9-element YAXArray
+ :Mar_Apr_May 9-element YAXArray
+ :Jun_Jul_Aug 9-element YAXArray
+ :Sep_Oct_Nov 9-element YAXArray
Get the number of days per season
julia julia > sum_days = sum .(g_tempo, dims = :time )
┌ 4-element DimArray{YAXArray{Int64, 1, DimensionalData.DimVector{Int64, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Tuple{}, Vector{Int64}, Symbol, DimensionalData.Dimensions.Lookups.NoMetadata}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb [270]
+ :Mar_Apr_May [276]
+ :Jun_Jul_Aug [276]
+ :Sep_Oct_Nov [273]
weights Weight the seasonal groups by sum_days
julia julia > weights = map ( ./ , g_tempo, sum_days)
┌ 4-element DimArray{YAXArray{Float64, 1, Vector{Float64}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, Dict{String, Any}}, 1} groupby ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [0.114815, 0.114815, 0.103704, 0.114815, 0.114815, 0.103704, 0.114815, 0.114815, 0.103704]
+ :Mar_Apr_May [0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319]
+ :Jun_Jul_Aug [0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319, 0.108696, 0.112319, 0.112319]
+ :Sep_Oct_Nov [0.10989, 0.113553, 0.10989, 0.10989, 0.113553, 0.10989, 0.10989, 0.113553, 0.10989]
Verify that the sum per season is 1
julia julia > sum .(weights)
┌ 4-element DimArray{Float64, 1} ┐
+├────────────────────────────────┴─────────────────────────────────────── dims ┐
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb 1.0
+ :Mar_Apr_May 1.0
+ :Jun_Jul_Aug 1.0
+ :Sep_Oct_Nov 1.0
weighted seasons Now, let's weight the seasons
julia julia > g_dsW = broadcast_dims .( * , weights, g_ds)
┌ 4-element DimArray{YAXArray{Float64, 3, Array{Float64, 3}, Tuple{YAXArrays.time{DimensionalData.Dimensions.Lookups.Sampled{CFTime.DateTimeNoLeap, Vector{CFTime.DateTimeNoLeap}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Irregular{Tuple{Nothing, Nothing}}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 1.32149 1.33565; NaN NaN … 1.29564 1.32555; … ; NaN NaN … 1.3188 1.3169; NaN NaN … 1.17863 1.18434;;; NaN NaN … 1.29816 1.34218; NaN NaN … 1.30113 1.35483; … ; NaN NaN … 1.30142 1.31753; NaN NaN … 1.16258 1.17647;;; NaN NaN … 1.34549 1.37878; NaN NaN … 1.36836 1.41634; … ; NaN NaN … 1.34832 1.38364; NaN NaN … 1.17852 1.16713]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 1.87705 1.90365; NaN NaN … 2.30018 2.35432; … ; NaN NaN … 2.41049 2.43254; NaN NaN … 2.65105 2.69085;;; NaN NaN … 1.86457 1.90712; NaN NaN … 2.2894 2.34818; … ; NaN NaN … 2.3866 2.41241; NaN NaN … 2.61197 2.64976;;; NaN NaN … 1.89237 1.8984; NaN NaN … 2.29473 2.312; … ; NaN NaN … 2.36142 2.36126; NaN NaN … 2.56632 2.59085]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 3.21209 3.25153; NaN NaN … 3.23 3.28008; … ; NaN NaN … 3.12575 3.15532; NaN NaN … 3.2434 3.26274;;; NaN NaN … 3.17434 3.21699; NaN NaN … 3.18892 3.24375; … ; NaN NaN … 3.06755 3.1083; NaN NaN … 3.19241 3.22211;;; NaN NaN … 3.1437 3.15644; NaN NaN … 3.16631 3.18583; … ; NaN NaN … 3.03361 3.05846; NaN NaN … 3.16581 3.16824]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … NaN NaN; NaN NaN … NaN NaN;;; … ;;; NaN NaN … 2.97047 3.00388; NaN NaN … 2.77587 2.80759; … ; NaN NaN … 2.60175 2.60918; NaN NaN … 1.4947 1.52419;;; NaN NaN … 2.94534 2.97649; NaN NaN … 2.75891 2.79502; … ; NaN NaN … 2.57695 2.59212; NaN NaN … 1.46506 1.49909;;; NaN NaN … 2.9192 2.93743; NaN NaN … 2.7593 2.77687; … ; NaN NaN … 2.57873 2.63006; NaN NaN … 1.48367 1.50089]
apply a sum
over the time dimension and drop it
julia julia > weighted_g = sum .(g_dsW, dims = :time );
+
+julia > weighted_g = dropdims .(weighted_g, dims = :time )
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 11.1181 11.372; NaN NaN … 11.3069 11.5743]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.1242 21.0057; NaN NaN … 21.4198 21.1644]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 28.2747 27.9362; NaN NaN … 28.6122 28.0465]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 21.73 21.7341; NaN NaN … 21.986 21.959]
Calculate the differences
julia julia > diff_g = map ( .- , weighted_g, mean_g)
┌ 4-element DimArray{YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:x, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}, Dim{:y, DimensionalData.Dimensions.Lookups.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.Lookups.ForwardOrdered, DimensionalData.Dimensions.Lookups.Regular{Int64}, DimensionalData.Dimensions.Lookups.Points, DimensionalData.Dimensions.Lookups.NoMetadata}}}, DimensionalData.Dimensions.Lookups.NoMetadata}, 1} ┐
+├──────────────────────────────────────────────────────────────────────── dims ┤
+ ↓ time Categorical{Symbol} [:Dec_Jan_Feb, :Mar_Apr_May, :Jun_Jul_Aug, :Sep_Oct_Nov] Unordered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{Symbol, Any} with 1 entry:
+ :groupby => :time=>CyclicBins(month; cycle=12, step=3, start=12)…
+└──────────────────────────────────────────────────────────────────────────────┘
+ :Dec_Jan_Feb … [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.019016 -0.0115514; NaN NaN … -0.0183003 -0.00990356]
+ :Mar_Apr_May [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.0121037 -0.0123091; NaN NaN … -0.0127077 -0.0117519]
+ :Jun_Jul_Aug [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … -0.00709111 -0.00693713; NaN NaN … -0.00684233 -0.00722034]
+ :Sep_Oct_Nov [NaN NaN … NaN NaN; NaN NaN … NaN NaN; … ; NaN NaN … 0.0180572 0.0182373; NaN NaN … 0.0178074 0.018571]
All the previous steps are equivalent to calling the function defined at the top:
julia mean_g, weighted_g, diff_g, seasons_g = weighted_seasons (ds)
Once all calculations are done we can plot the results with Makie.jl
as follows:
julia using CairoMakie
+# define plot arguments/attributes
+colorrange = ( - 30 , 30 )
+colormap = Reverse ( :Spectral )
+highclip = :red
+lowclip = :grey15
+cb_label = ds_o . properties[ "long_name" ]
"Surface air temperature"
julia with_theme ( theme_ggplot2 ()) do
+ hm_o, hm_d, hm_w = nothing , nothing , nothing
+ # the figure
+ fig = Figure (; size = ( 850 , 500 ))
+ axs = [ Axis (fig[i,j], aspect = DataAspect ()) for i in 1 : 3 , j in 1 : 4 ]
+ for (j, s) in enumerate (seasons_g)
+ hm_o = heatmap! (axs[ 1 ,j], mean_g[time = At (s)]; colorrange, lowclip, highclip, colormap)
+ hm_w = heatmap! (axs[ 2 ,j], weighted_g[time = At (s)]; colorrange, lowclip, highclip, colormap)
+ hm_d = heatmap! (axs[ 3 ,j], diff_g[time = At (s)]; colorrange = ( - 0.1 , 0.1 ), lowclip, highclip,
+ colormap = :diverging_bwr_20_95_c54_n256 )
+ end
+ Colorbar (fig[ 1 : 2 , 5 ], hm_o, label = cb_label)
+ Colorbar (fig[ 3 , 5 ], hm_d, label = "Tair" )
+ hidedecorations! .(axs, grid = false , ticks = false , label = false )
+ # some labels
+ [axs[ 1 ,j] . title = string .(s) for (j,s) in enumerate (seasons_g)]
+ Label (fig[ 0 , 1 : 5 ], "Seasonal Surface Air Temperature" , fontsize = 18 , font = :bold )
+ axs[ 1 , 1 ] . ylabel = "Unweighted"
+ axs[ 2 , 1 ] . ylabel = "Weighted"
+ axs[ 3 , 1 ] . ylabel = "Difference"
+ colgap! (fig . layout, 5 )
+ rowgap! (fig . layout, 5 )
+ fig
+end
which shows a good agreement with the results first published by Joe Hamman .
',66)]))}const N=i(l,[["render",p]]);export{y as __pageData,N as default};
diff --git a/previews/PR486/assets/UserGuide_read.md.CncWl83I.js b/previews/PR486/assets/UserGuide_read.md.CncWl83I.js
new file mode 100644
index 00000000..78048f36
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_read.md.CncWl83I.js
@@ -0,0 +1,229 @@
+import{_ as d,c as r,j as s,a,G as n,a2 as l,w as e,B as p,o}from"./chunks/framework.piKCME0r.js";const b=JSON.parse('{"title":"Read YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/read.md","filePath":"UserGuide/read.md","lastUpdated":null}'),g={name:"UserGuide/read.md"},E={class:"jldocstring custom-block",open:""};function c(u,i,y,F,m,C){const h=p("Badge"),t=p("PluginTabsTab"),k=p("PluginTabs");return o(),r("div",null,[i[6]||(i[6]=s("h1",{id:"Read-YAXArrays-and-Datasets",tabindex:"-1"},[a("Read YAXArrays and Datasets "),s("a",{class:"header-anchor",href:"#Read-YAXArrays-and-Datasets","aria-label":'Permalink to "Read YAXArrays and Datasets {#Read-YAXArrays-and-Datasets}"'},"")],-1)),i[7]||(i[7]=s("p",null,"This section describes how to read files, URLs, and directories into YAXArrays and datasets.",-1)),i[8]||(i[8]=s("h2",{id:"open-dataset",tabindex:"-1"},[a("open_dataset "),s("a",{class:"header-anchor",href:"#open-dataset","aria-label":'Permalink to "open_dataset"'},"")],-1)),i[9]||(i[9]=s("p",null,[a("The usual method for reading any format is using this function. See its "),s("code",null,"docstring"),a(" for more information.")],-1)),s("details",E,[s("summary",null,[i[0]||(i[0]=s("a",{id:"YAXArrays.Datasets.open_dataset",href:"#YAXArrays.Datasets.open_dataset"},[s("span",{class:"jlbinding"},"YAXArrays.Datasets.open_dataset")],-1)),i[1]||(i[1]=a()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[2]||(i[2]=l('julia open_dataset (g; skip_keys = (), driver = :all )
Open the dataset at g
with the given driver
. The default driver will search for available drivers and tries to detect the useable driver from the filename extension.
Keyword arguments
skip_keys
are passed as symbols, i.e., skip_keys = (:a, :b)
driver=:all
, common options are :netcdf
or :zarr
.
Example:
julia ds = open_dataset (f, driver = :zarr , skip_keys = ( :c ,))
source
',7))]),i[10]||(i[10]=l(`Now, let's explore different examples.
Read Zarr Open a Zarr store as a Dataset
:
julia using YAXArrays
+using Zarr
+path = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
+store = zopen (path, consolidated = true )
+ds = open_dataset (store)
YAXArray Dataset
+Shared Axes:
+None
+Variables:
+height
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points)
+ Variables:
+ tas
+
+Properties: Dict{String, Any}("initialization_index" => 1, "realm" => "atmos", "variable_id" => "tas", "external_variables" => "areacella", "branch_time_in_child" => 60265.0, "data_specs_version" => "01.00.30", "history" => "2019-07-21T06:26:13Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards.", "forcing_index" => 1, "parent_variant_label" => "r1i1p1f1", "table_id" => "3hr"…)
We can set path
to a URL, a local directory, or in this case to a cloud object storage path.
A zarr store may contain multiple arrays. Individual arrays can be accessed using subsetting:
┌ 384×192×251288 YAXArray{Float32, 3} ┐
+├─────────────────────────────────────┴────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 69.02 GB
+└──────────────────────────────────────────────────────────────────────────────┘
Read NetCDF Open a NetCDF file as a Dataset
:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
A NetCDF file may contain multiple arrays. Individual arrays can be accessed using subsetting:
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
Please note that netCDF4 uses HDF5 which is not thread-safe in Julia. Add manual locks in your own code to avoid any data-race:
julia my_lock = ReentrantLock ()
+Threads . @threads for i in 1 : 10
+ @lock my_lock @info ds . tos[ 1 , 1 , 1 ]
+end
[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
This code will ensure that the data is only accessed by one thread at a time, i.e. making it actual single-threaded but thread-safe.
Read GDAL (GeoTIFF, GeoJSON) All GDAL compatible files can be read as a YAXArrays.Dataset
after loading ArchGDAL :
julia using YAXArrays
+using ArchGDAL
+using Downloads : download
+
+path = download ( "https://github.com/yeesian/ArchGDALDatasets/raw/307f8f0e584a39a050c042849004e6a2bd674f99/gdalworkshop/world.tif" , "world.tif" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ X Sampled{Float64} -180.0:0.17578125:179.82421875 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 90.0:-0.17578125:-89.82421875 ReverseOrdered Regular Points)
+
+Variables:
+Blue, Green, Red
+
+Properties: Dict{String, Any}("projection" => "GEOGCS[\\"WGS 84\\",DATUM[\\"WGS_1984\\",SPHEROID[\\"WGS 84\\",6378137,298.257223563,AUTHORITY[\\"EPSG\\",\\"7030\\"]],AUTHORITY[\\"EPSG\\",\\"6326\\"]],PRIMEM[\\"Greenwich\\",0,AUTHORITY[\\"EPSG\\",\\"8901\\"]],UNIT[\\"degree\\",0.0174532925199433,AUTHORITY[\\"EPSG\\",\\"9122\\"]],AXIS[\\"Latitude\\",NORTH],AXIS[\\"Longitude\\",EAST],AUTHORITY[\\"EPSG\\",\\"4326\\"]]")
Load data into memory For datasets or variables that could fit in RAM, you might want to load them completely into memory. This can be done using the readcubedata
function. As an example, let's use the NetCDF workflow; the same should be true for other cases.
readcubedata `,27)),n(k,null,{default:e(()=>[n(t,{label:"single variable"},{default:e(()=>i[3]||(i[3]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"readcubedata"),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"(ds"),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"."),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"tos)")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1)])),_:1}),n(t,{label:"with the `:` operator"},{default:e(()=>i[4]||(i[4]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds"),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"."),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"tos[:, :, :]")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1),s("p",null,"In this case, you should know in advance how many dimensions there are and how long they are, which shouldn't be hard to determine since this information is already displayed when querying such variables.",-1)])),_:1}),n(t,{label:"Complete Dataset"},{default:e(()=>i[5]||(i[5]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds_loaded "),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"="),s("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," readcubedata"),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"(ds)")]),a(`
+`),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds_loaded["),s("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"tos"'),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"] "),s("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# Load the variable of interest; the loaded status is shown for each variable.")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1)])),_:1})]),_:1}),i[11]||(i[11]=l(`Note how the loading status changes from loaded lazily
to loaded in memory
.
open_mfdataset There are situations when we would like to open and concatenate a list of dataset paths along a certain dimension. For example, to concatenate a list of NetCDF
files along a new time
dimension, one can use:
creation of NetCDF files julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+
+dates_1 = [ Date ( 2020 , 1 , 1 ) + Dates . Day (i) for i in 1 : 3 ]
+dates_2 = [ Date ( 2020 , 1 , 4 ) + Dates . Day (i) for i in 1 : 3 ]
+
+a1 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 )), rand ( 5 , 7 ))
+a2 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 )), rand ( 5 , 7 ))
+
+a3 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 ), YAX . time (dates_1)), rand ( 5 , 7 , 3 ))
+a4 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 ), YAX . time (dates_2)), rand ( 5 , 7 , 3 ))
+
+savecube (a1, "a1.nc" )
+savecube (a2, "a2.nc" )
+savecube (a3, "a3.nc" )
+savecube (a4, "a4.nc" )
┌ 5×7×3 YAXArray{Float64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Date} [2020-01-05, …, 2020-01-07] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 840.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
along a new dimension julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+import DimensionalData as DD
+
+files = [ "a1.nc" , "a2.nc" ]
+
+dates_read = [ Date ( 2024 , 1 , 1 ) + Dates . Day (i) for i in 1 : 2 ]
+ds = open_mfdataset (DD . DimArray (files, YAX . time (dates_read)))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Date} [Date("2024-01-02"), Date("2024-01-03")] ForwardOrdered Irregular Points)
+
+Variables:
+layer
and even opening files along a new Time
dimension that already have a time
dimension
julia files = [ "a3.nc" , "a4.nc" ]
+ds = open_mfdataset (DD . DimArray (files, YAX . Time (dates_read)))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{DateTime} [2020-01-02T00:00:00, …, 2020-01-04T00:00:00] ForwardOrdered Irregular Points,
+ ⬔ Time Sampled{Date} [Date("2024-01-02"), Date("2024-01-03")] ForwardOrdered Irregular Points)
+
+Variables:
+layer
Note that opening along a new dimension name without specifying values also works; however, it defaults to 1:length(files)
for the dimension values.
julia files = [ "a1.nc" , "a2.nc" ]
+ds = open_mfdataset (DD . DimArray (files, YAX . time))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Int64} 1:2 ForwardOrdered Regular Points)
+
+Variables:
+layer
along a existing dimension Another use case is when we want to open files along an existing dimension. In this case, open_mfdataset
will concatenate the paths along the specified dimension
julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+import DimensionalData as DD
+
+files = [ "a3.nc" , "a4.nc" ]
+
+ds = open_mfdataset (DD . DimArray (files, YAX . time ()))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{DateTime} [2020-01-02T00:00:00, …, 2020-01-07T00:00:00] ForwardOrdered Irregular Points)
+
+Variables:
+layer
where the contents of the time
dimension are the merged values from both files
time Sampled{DateTime} ForwardOrdered Irregular DimensionalData.Dimensions.Lookups.Points
+wrapping: 6-element Vector{DateTime}:
+ 2020-01-02T00:00:00
+ 2020-01-03T00:00:00
+ 2020-01-04T00:00:00
+ 2020-01-05T00:00:00
+ 2020-01-06T00:00:00
+ 2020-01-07T00:00:00
providing us with a wide range of options to work with.
`,21))])}const D=d(g,[["render",c]]);export{b as __pageData,D as default};
diff --git a/previews/PR486/assets/UserGuide_read.md.CncWl83I.lean.js b/previews/PR486/assets/UserGuide_read.md.CncWl83I.lean.js
new file mode 100644
index 00000000..78048f36
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_read.md.CncWl83I.lean.js
@@ -0,0 +1,229 @@
+import{_ as d,c as r,j as s,a,G as n,a2 as l,w as e,B as p,o}from"./chunks/framework.piKCME0r.js";const b=JSON.parse('{"title":"Read YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/read.md","filePath":"UserGuide/read.md","lastUpdated":null}'),g={name:"UserGuide/read.md"},E={class:"jldocstring custom-block",open:""};function c(u,i,y,F,m,C){const h=p("Badge"),t=p("PluginTabsTab"),k=p("PluginTabs");return o(),r("div",null,[i[6]||(i[6]=s("h1",{id:"Read-YAXArrays-and-Datasets",tabindex:"-1"},[a("Read YAXArrays and Datasets "),s("a",{class:"header-anchor",href:"#Read-YAXArrays-and-Datasets","aria-label":'Permalink to "Read YAXArrays and Datasets {#Read-YAXArrays-and-Datasets}"'},"")],-1)),i[7]||(i[7]=s("p",null,"This section describes how to read files, URLs, and directories into YAXArrays and datasets.",-1)),i[8]||(i[8]=s("h2",{id:"open-dataset",tabindex:"-1"},[a("open_dataset "),s("a",{class:"header-anchor",href:"#open-dataset","aria-label":'Permalink to "open_dataset"'},"")],-1)),i[9]||(i[9]=s("p",null,[a("The usual method for reading any format is using this function. See its "),s("code",null,"docstring"),a(" for more information.")],-1)),s("details",E,[s("summary",null,[i[0]||(i[0]=s("a",{id:"YAXArrays.Datasets.open_dataset",href:"#YAXArrays.Datasets.open_dataset"},[s("span",{class:"jlbinding"},"YAXArrays.Datasets.open_dataset")],-1)),i[1]||(i[1]=a()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[2]||(i[2]=l('julia open_dataset (g; skip_keys = (), driver = :all )
Open the dataset at g
with the given driver
. The default driver will search for available drivers and tries to detect the useable driver from the filename extension.
Keyword arguments
skip_keys
are passed as symbols, i.e., skip_keys = (:a, :b)
driver=:all
, common options are :netcdf
or :zarr
.
Example:
julia ds = open_dataset (f, driver = :zarr , skip_keys = ( :c ,))
source
',7))]),i[10]||(i[10]=l(`Now, let's explore different examples.
Read Zarr Open a Zarr store as a Dataset
:
julia using YAXArrays
+using Zarr
+path = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
+store = zopen (path, consolidated = true )
+ds = open_dataset (store)
YAXArray Dataset
+Shared Axes:
+None
+Variables:
+height
+
+Variables with additional axes:
+ Additional Axes:
+ (↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points)
+ Variables:
+ tas
+
+Properties: Dict{String, Any}("initialization_index" => 1, "realm" => "atmos", "variable_id" => "tas", "external_variables" => "areacella", "branch_time_in_child" => 60265.0, "data_specs_version" => "01.00.30", "history" => "2019-07-21T06:26:13Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards.", "forcing_index" => 1, "parent_variant_label" => "r1i1p1f1", "table_id" => "3hr"…)
We can set path
to a URL, a local directory, or in this case to a cloud object storage path.
A zarr store may contain multiple arrays. Individual arrays can be accessed using subsetting:
┌ 384×192×251288 YAXArray{Float32, 3} ┐
+├─────────────────────────────────────┴────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 69.02 GB
+└──────────────────────────────────────────────────────────────────────────────┘
Read NetCDF Open a NetCDF file as a Dataset
:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
A NetCDF file may contain multiple arrays. Individual arrays can be accessed using subsetting:
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
Please note that netCDF4 uses HDF5 which is not thread-safe in Julia. Add manual locks in your own code to avoid any data-race:
julia my_lock = ReentrantLock ()
+Threads . @threads for i in 1 : 10
+ @lock my_lock @info ds . tos[ 1 , 1 , 1 ]
+end
[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
+[ Info: missing
This code will ensure that the data is only accessed by one thread at a time, i.e. making it actual single-threaded but thread-safe.
Read GDAL (GeoTIFF, GeoJSON) All GDAL compatible files can be read as a YAXArrays.Dataset
after loading ArchGDAL :
julia using YAXArrays
+using ArchGDAL
+using Downloads : download
+
+path = download ( "https://github.com/yeesian/ArchGDALDatasets/raw/307f8f0e584a39a050c042849004e6a2bd674f99/gdalworkshop/world.tif" , "world.tif" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ X Sampled{Float64} -180.0:0.17578125:179.82421875 ForwardOrdered Regular Points,
+ → Y Sampled{Float64} 90.0:-0.17578125:-89.82421875 ReverseOrdered Regular Points)
+
+Variables:
+Blue, Green, Red
+
+Properties: Dict{String, Any}("projection" => "GEOGCS[\\"WGS 84\\",DATUM[\\"WGS_1984\\",SPHEROID[\\"WGS 84\\",6378137,298.257223563,AUTHORITY[\\"EPSG\\",\\"7030\\"]],AUTHORITY[\\"EPSG\\",\\"6326\\"]],PRIMEM[\\"Greenwich\\",0,AUTHORITY[\\"EPSG\\",\\"8901\\"]],UNIT[\\"degree\\",0.0174532925199433,AUTHORITY[\\"EPSG\\",\\"9122\\"]],AXIS[\\"Latitude\\",NORTH],AXIS[\\"Longitude\\",EAST],AUTHORITY[\\"EPSG\\",\\"4326\\"]]")
Load data into memory For datasets or variables that could fit in RAM, you might want to load them completely into memory. This can be done using the readcubedata
function. As an example, let's use the NetCDF workflow; the same should be true for other cases.
readcubedata `,27)),n(k,null,{default:e(()=>[n(t,{label:"single variable"},{default:e(()=>i[3]||(i[3]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}},"readcubedata"),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"(ds"),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"."),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"tos)")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1)])),_:1}),n(t,{label:"with the `:` operator"},{default:e(()=>i[4]||(i[4]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds"),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"."),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"tos[:, :, :]")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1),s("p",null,"In this case, you should know in advance how many dimensions there are and how long they are, which shouldn't be hard to determine since this information is already displayed when querying such variables.",-1)])),_:1}),n(t,{label:"Complete Dataset"},{default:e(()=>i[5]||(i[5]=[s("div",{class:"language-julia vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"julia"),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds_loaded "),s("span",{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}},"="),s("span",{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"}}," readcubedata"),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"(ds)")]),a(`
+`),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"ds_loaded["),s("span",{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"}},'"tos"'),s("span",{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"}},"] "),s("span",{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"}},"# Load the variable of interest; the loaded status is shown for each variable.")])])])],-1),s("div",{class:"language- vp-adaptive-theme"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"}),s("pre",{class:"shiki shiki-themes github-light github-dark vp-code",tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",null,"┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├─────────────────────────────────────────────────┴────────────────────── dims ┐")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,")]),a(`
+`),s("span",{class:"line"},[s("span",null," ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points")]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────────────── metadata ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," Dict{String, Any} with 10 entries:")]),a(`
+`),s("span",{class:"line"},[s("span",null,' "units" => "K"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "missing_value" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "cell_methods" => "time: mean (interval: 30 minutes)"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "name" => "tos"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "long_name" => "Sea Surface Temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_units" => "degC"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "standard_name" => "sea_surface_temperature"')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "_FillValue" => 1.0f20')]),a(`
+`),s("span",{class:"line"},[s("span",null,' "original_name" => "sosstsst"')]),a(`
+`),s("span",{class:"line"},[s("span",null,"├──────────────────────────────────────────────────────────── loaded in memory ┤")]),a(`
+`),s("span",{class:"line"},[s("span",null," data size: 2.8 MB")]),a(`
+`),s("span",{class:"line"},[s("span",null,"└──────────────────────────────────────────────────────────────────────────────┘")])])])],-1)])),_:1})]),_:1}),i[11]||(i[11]=l(`Note how the loading status changes from loaded lazily
to loaded in memory
.
open_mfdataset There are situations when we would like to open and concatenate a list of dataset paths along a certain dimension. For example, to concatenate a list of NetCDF
files along a new time
dimension, one can use:
creation of NetCDF files julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+
+dates_1 = [ Date ( 2020 , 1 , 1 ) + Dates . Day (i) for i in 1 : 3 ]
+dates_2 = [ Date ( 2020 , 1 , 4 ) + Dates . Day (i) for i in 1 : 3 ]
+
+a1 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 )), rand ( 5 , 7 ))
+a2 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 )), rand ( 5 , 7 ))
+
+a3 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 ), YAX . time (dates_1)), rand ( 5 , 7 , 3 ))
+a4 = YAXArray (( lon ( 1 : 5 ), lat ( 1 : 7 ), YAX . time (dates_2)), rand ( 5 , 7 , 3 ))
+
+savecube (a1, "a1.nc" )
+savecube (a2, "a2.nc" )
+savecube (a3, "a3.nc" )
+savecube (a4, "a4.nc" )
┌ 5×7×3 YAXArray{Float64, 3} ┐
+├────────────────────────────┴─────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Date} [2020-01-05, …, 2020-01-07] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 840.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
along a new dimension julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+import DimensionalData as DD
+
+files = [ "a1.nc" , "a2.nc" ]
+
+dates_read = [ Date ( 2024 , 1 , 1 ) + Dates . Day (i) for i in 1 : 2 ]
+ds = open_mfdataset (DD . DimArray (files, YAX . time (dates_read)))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Date} [Date("2024-01-02"), Date("2024-01-03")] ForwardOrdered Irregular Points)
+
+Variables:
+layer
and even opening files along a new Time
dimension that already have a time
dimension
julia files = [ "a3.nc" , "a4.nc" ]
+ds = open_mfdataset (DD . DimArray (files, YAX . Time (dates_read)))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{DateTime} [2020-01-02T00:00:00, …, 2020-01-04T00:00:00] ForwardOrdered Irregular Points,
+ ⬔ Time Sampled{Date} [Date("2024-01-02"), Date("2024-01-03")] ForwardOrdered Irregular Points)
+
+Variables:
+layer
Note that opening along a new dimension name without specifying values also works; however, it defaults to 1:length(files)
for the dimension values.
julia files = [ "a1.nc" , "a2.nc" ]
+ds = open_mfdataset (DD . DimArray (files, YAX . time))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{Int64} 1:2 ForwardOrdered Regular Points)
+
+Variables:
+layer
along a existing dimension Another use case is when we want to open files along an existing dimension. In this case, open_mfdataset
will concatenate the paths along the specified dimension
julia using YAXArrays, NetCDF, Dates
+using YAXArrays : YAXArrays as YAX
+import DimensionalData as DD
+
+files = [ "a3.nc" , "a4.nc" ]
+
+ds = open_mfdataset (DD . DimArray (files, YAX . time ()))
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Int64} 1:1:5 ForwardOrdered Regular Points,
+ → lat Sampled{Int64} 1:1:7 ForwardOrdered Regular Points,
+ ↗ time Sampled{DateTime} [2020-01-02T00:00:00, …, 2020-01-07T00:00:00] ForwardOrdered Irregular Points)
+
+Variables:
+layer
where the contents of the time
dimension are the merged values from both files
time Sampled{DateTime} ForwardOrdered Irregular DimensionalData.Dimensions.Lookups.Points
+wrapping: 6-element Vector{DateTime}:
+ 2020-01-02T00:00:00
+ 2020-01-03T00:00:00
+ 2020-01-04T00:00:00
+ 2020-01-05T00:00:00
+ 2020-01-06T00:00:00
+ 2020-01-07T00:00:00
providing us with a wide range of options to work with.
`,21))])}const D=d(g,[["render",c]]);export{b as __pageData,D as default};
diff --git a/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.js b/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.js
new file mode 100644
index 00000000..48dea775
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.js
@@ -0,0 +1,276 @@
+import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const u=JSON.parse('{"title":"Select YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/select.md","filePath":"UserGuide/select.md","lastUpdated":null}'),t={name:"UserGuide/select.md"};function p(l,s,h,o,d,k){return e(),i("div",null,s[0]||(s[0]=[n(`Select YAXArrays and Datasets The dimensions or axes of an YAXArray
are named making it easier to subset or query certain ranges of an array. Let's open an example Dataset
used to select certain elements:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Select a YAXArray Get the sea surface temperature of the Dataset
:
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
which is the same as:
julia tos = ds . cubes[ :tos ]
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
Select elements Using positional integer indexing:
julia tos[lon = 1 , lat = 1 ]
┌ 24-element YAXArray{Union{Missing, Float32}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Same but using named indexing:
julia tos[lon = At ( 1 ), lat = At ( - 79.5 )]
┌ 24-element YAXArray{Union{Missing, Float32}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Using special types:
julia using CFTime
+time1 = DateTime360Day ( 2001 , 01 , 16 )
+tos[time = At (time1)]
┌ 180×170 YAXArray{Union{Missing, Float32}, 2} ┐
+├──────────────────────────────────────────────┴──────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────────────────┴ metadata ┐
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├───────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 119.53 KB
+└────────────────────────────────────────────────────────────────────────────────┘
Select ranges Here we subset an interval of a dimension using positional integer indexing.
julia tos[lon = 1 : 10 , lat = 1 : 10 ]
┌ 10×10×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:19.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:-70.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Same but using named indexing:
julia tos[lon = At ( 1.0 : 2 : 19 ), lat = At ( - 79.5 : 1 :- 70.5 )]
┌ 10×10×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} [1.0, 3.0, …, 17.0, 19.0] ForwardOrdered Irregular Points,
+ → lat Sampled{Float64} [-79.5, -78.5, …, -71.5, -70.5] ForwardOrdered Irregular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Read more about the At
selector in the package DimensionalData
. Get values within a tolerances:
julia tos[lon = At ( 1 : 10 ; atol = 1 )]
┌ 10×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} [1.0, 1.0, …, 9.0, 9.0] ForwardOrdered Irregular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 159.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Closed and open intervals Although a Between(a,b)
function is available in DimensionalData
, is recommended to use instead the a .. b
notation:
julia tos[lon = 90 .. 180 ]
┌ 45×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
This describes a closed interval in which all points were included. More selectors from DimensionalData are available, such as Touches
, Near
, Where
and Contains
.
julia julia > tos[lon = OpenInterval ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = ClosedInterval ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = Interval{:open,:closed} ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = Interval{:closed,:open} ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
See tutorials for use cases.
Get a dimension Get values, .e.g., axis tick labels, of a dimension that can be used for subseting:
┌ 170-element DimArray{Float64, 1} ┐
+├──────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points
+└─────────────────────────────────────────────────────────────────────┘
+ -79.5 -79.5
+ -78.5 -78.5
+ -77.5 -77.5
+ -76.5 -76.5
+ -75.5 -75.5
+ -74.5 -74.5
+ ⋮
+ 85.5 85.5
+ 86.5 86.5
+ 87.5 87.5
+ 88.5 88.5
+ 89.5 89.5
These values are defined as lookups in the package DimensionalData
:
Sampled{Float64} ForwardOrdered Regular DimensionalData.Dimensions.Lookups.Points
+wrapping: 1.0:2.0:359.0
which is equivalent to:
Sampled{Float64} ForwardOrdered Regular DimensionalData.Dimensions.Lookups.Points
+wrapping: 1.0:2.0:359.0
`,56)]))}const g=a(t,[["render",p]]);export{u as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.lean.js b/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.lean.js
new file mode 100644
index 00000000..48dea775
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_select.md.B1gCBPvb.lean.js
@@ -0,0 +1,276 @@
+import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.piKCME0r.js";const u=JSON.parse('{"title":"Select YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/select.md","filePath":"UserGuide/select.md","lastUpdated":null}'),t={name:"UserGuide/select.md"};function p(l,s,h,o,d,k){return e(),i("div",null,s[0]||(s[0]=[n(`Select YAXArrays and Datasets The dimensions or axes of an YAXArray
are named making it easier to subset or query certain ranges of an array. Let's open an example Dataset
used to select certain elements:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Select a YAXArray Get the sea surface temperature of the Dataset
:
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
which is the same as:
julia tos = ds . cubes[ :tos ]
┌ 180×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 2.8 MB
+└──────────────────────────────────────────────────────────────────────────────┘
Select elements Using positional integer indexing:
julia tos[lon = 1 , lat = 1 ]
┌ 24-element YAXArray{Union{Missing, Float32}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Same but using named indexing:
julia tos[lon = At ( 1 ), lat = At ( - 79.5 )]
┌ 24-element YAXArray{Union{Missing, Float32}, 1} ┐
+├─────────────────────────────────────────────────┴────────────────────── dims ┐
+ ↓ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 96.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Using special types:
julia using CFTime
+time1 = DateTime360Day ( 2001 , 01 , 16 )
+tos[time = At (time1)]
┌ 180×170 YAXArray{Union{Missing, Float32}, 2} ┐
+├──────────────────────────────────────────────┴──────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────────────────┴ metadata ┐
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├───────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 119.53 KB
+└────────────────────────────────────────────────────────────────────────────────┘
Select ranges Here we subset an interval of a dimension using positional integer indexing.
julia tos[lon = 1 : 10 , lat = 1 : 10 ]
┌ 10×10×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 1.0:2.0:19.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:-70.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Same but using named indexing:
julia tos[lon = At ( 1.0 : 2 : 19 ), lat = At ( - 79.5 : 1 :- 70.5 )]
┌ 10×10×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├───────────────────────────────────────────────┴──────────────────────── dims ┐
+ ↓ lon Sampled{Float64} [1.0, 3.0, …, 17.0, 19.0] ForwardOrdered Irregular Points,
+ → lat Sampled{Float64} [-79.5, -78.5, …, -71.5, -70.5] ForwardOrdered Irregular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 9.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Read more about the At
selector in the package DimensionalData
. Get values within a tolerances:
julia tos[lon = At ( 1 : 10 ; atol = 1 )]
┌ 10×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} [1.0, 1.0, …, 9.0, 9.0] ForwardOrdered Irregular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 159.38 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Closed and open intervals Although a Between(a,b)
function is available in DimensionalData
, is recommended to use instead the a .. b
notation:
julia tos[lon = 90 .. 180 ]
┌ 45×170×24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
This describes a closed interval in which all points were included. More selectors from DimensionalData are available, such as Touches
, Near
, Where
and Contains
.
julia julia > tos[lon = OpenInterval ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = ClosedInterval ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = Interval{:open,:closed} ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
julia julia > tos[lon = Interval{:closed,:open} ( 90 , 180 )]
┌ 45 × 170 × 24 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────────┴─────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 91.0:2.0:179.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "missing_value" => 1.0f20
+ "history" => " At 16:37:23 on 01/11/2005: CMOR altered the data in t…
+ "cell_methods" => "time: mean (interval: 30 minutes)"
+ "name" => "tos"
+ "long_name" => "Sea Surface Temperature"
+ "original_units" => "degC"
+ "standard_name" => "sea_surface_temperature"
+ "_FillValue" => 1.0f20
+ "original_name" => "sosstsst"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 717.19 KB
+└──────────────────────────────────────────────────────────────────────────────┘
See tutorials for use cases.
Get a dimension Get values, .e.g., axis tick labels, of a dimension that can be used for subseting:
┌ 170-element DimArray{Float64, 1} ┐
+├──────────────────────────────────┴──────────────────────────── dims ┐
+ ↓ lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points
+└─────────────────────────────────────────────────────────────────────┘
+ -79.5 -79.5
+ -78.5 -78.5
+ -77.5 -77.5
+ -76.5 -76.5
+ -75.5 -75.5
+ -74.5 -74.5
+ ⋮
+ 85.5 85.5
+ 86.5 86.5
+ 87.5 87.5
+ 88.5 88.5
+ 89.5 89.5
These values are defined as lookups in the package DimensionalData
:
Sampled{Float64} ForwardOrdered Regular DimensionalData.Dimensions.Lookups.Points
+wrapping: 1.0:2.0:359.0
which is equivalent to:
Sampled{Float64} ForwardOrdered Regular DimensionalData.Dimensions.Lookups.Points
+wrapping: 1.0:2.0:359.0
`,56)]))}const g=a(t,[["render",p]]);export{u as __pageData,g as default};
diff --git a/previews/PR486/assets/UserGuide_types.md.DuodkEtM.js b/previews/PR486/assets/UserGuide_types.md.DuodkEtM.js
new file mode 100644
index 00000000..897b4c09
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_types.md.DuodkEtM.js
@@ -0,0 +1,2 @@
+import{_ as e,c as a,a2 as i,o as s}from"./chunks/framework.piKCME0r.js";const p=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/types.md","filePath":"UserGuide/types.md","lastUpdated":null}'),d={name:"UserGuide/types.md"};function o(l,t,n,r,c,h){return s(),a("div",null,t[0]||(t[0]=[i(`Types This section describes the data structures used to work with n-dimensional arrays in YAXArrays.
YAXArray An Array
stores a sequence of ordered elements of the same type usually across multiple dimensions or axes. For example, one can measure temperature across all time points of the time dimension or brightness values of a picture across X and Y dimensions. A one dimensional array is called Vector
and a two dimensional array is called a Matrix
. In many Machine Learning libraries, arrays are also called tensors. Arrays are designed to store dense spatial-temporal data stored in a grid, whereas a collection of sparse points is usually stored in data frames or relational databases.
A DimArray
as defined by DimensionalData.jl adds names to the dimensions and their axes ticks for a given Array
. These names can be used to access the data, e.g., by date instead of just by integer position.
A YAXArray
is a subtype of a AbstractDimArray
and adds functions to load and process the named arrays. For example, it can also handle very large arrays stored on disk that are too big to fit in memory. In addition, it provides functions for parallel computation.
Dataset A Dataset
is an ordered dictionary of YAXArrays
that usually share dimensions. For example, it can bundle arrays storing temperature and precipitation that are measured at the same time points and the same locations. One also can store a picture in a Dataset with three arrays containing brightness values for red green and blue, respectively. Internally, those arrays are still separated allowing to chose different element types for each array. Analog to the (NetCDF Data Model)[https://docs.unidata.ucar.edu/netcdf-c/current/netcdf_data_model.html ], a Dataset usually represents variables belonging to the same group.
(Data) Cube A (Data) Cube is just a YAXArray
in which arrays from a dataset are combined together by introducing a new dimension containing labels of which array the corresponding element came from. Unlike a Dataset
, all arrays must have the same element type to be converted into a cube. This data structure is useful when we want to use all variables at once. For example, the arrays temperature and precipitation which are measured at the same locations and dates can be combined into a single cube. A more formal definition of Data Cubes are given in Mahecha et al. 2020
Dimensions A Dimension
or axis as defined by DimensionalData.jl adds tick labels, e.g., to each row or column of an array. It's name is used to access particular subsets of that array.
Lon, Lat, time For convenience, several Dimensions
have been defined in YAXArrays.jl
, but only a few have been exported. The remaining dimensions can be used by calling them explicitly. See the next table for an overview
Dimension exported usage: using YAXArrays: YAXArrays as YAX
lon
✔ lon
or YAX.lon
Lon
✔ Lon
or YAX.Lon
longitude
✔ longitude
or YAX.longitude
Longitude
✔ Longitude
or YAX.Longitude
lat
✔ lat
or YAX.lat
Lat
✔ Lat
or YAX.Lat
latitude
✔ latitude
or YAX.latitude
Latitude
✔ Latitude
or YAX.Latitude
time
✘ YAX.time
Time
✘ YAX.Time
rlat
✘ YAX.rlat
rlon
✘ YAX.rlon
lat_c
✘ YAX.lat_c
lon_c
✘ YAX.lon_c
height
✘ YAX.height
depth
✘ YAX.depth
Variables
✔ Variables
or YAX.Variables
INFO
If the dimension you are looking for is not in that table, you can define your own by doing
julia using DimensionalData : @dim , XDim # If you want it to be a subtype of XDim
+@dim newDim XDim "Your newDim label"
Sometimes, when you want to operate on a specific dimension in your dataset (for example, a dimension named date
), then doing
julia groupby (ds, Dim{ :date } => seasons ())
should do the job.
`,16)]))}const y=e(d,[["render",o]]);export{p as __pageData,y as default};
diff --git a/previews/PR486/assets/UserGuide_types.md.DuodkEtM.lean.js b/previews/PR486/assets/UserGuide_types.md.DuodkEtM.lean.js
new file mode 100644
index 00000000..897b4c09
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_types.md.DuodkEtM.lean.js
@@ -0,0 +1,2 @@
+import{_ as e,c as a,a2 as i,o as s}from"./chunks/framework.piKCME0r.js";const p=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/types.md","filePath":"UserGuide/types.md","lastUpdated":null}'),d={name:"UserGuide/types.md"};function o(l,t,n,r,c,h){return s(),a("div",null,t[0]||(t[0]=[i(`Types This section describes the data structures used to work with n-dimensional arrays in YAXArrays.
YAXArray An Array
stores a sequence of ordered elements of the same type usually across multiple dimensions or axes. For example, one can measure temperature across all time points of the time dimension or brightness values of a picture across X and Y dimensions. A one dimensional array is called Vector
and a two dimensional array is called a Matrix
. In many Machine Learning libraries, arrays are also called tensors. Arrays are designed to store dense spatial-temporal data stored in a grid, whereas a collection of sparse points is usually stored in data frames or relational databases.
A DimArray
as defined by DimensionalData.jl adds names to the dimensions and their axes ticks for a given Array
. These names can be used to access the data, e.g., by date instead of just by integer position.
A YAXArray
is a subtype of a AbstractDimArray
and adds functions to load and process the named arrays. For example, it can also handle very large arrays stored on disk that are too big to fit in memory. In addition, it provides functions for parallel computation.
Dataset A Dataset
is an ordered dictionary of YAXArrays
that usually share dimensions. For example, it can bundle arrays storing temperature and precipitation that are measured at the same time points and the same locations. One also can store a picture in a Dataset with three arrays containing brightness values for red green and blue, respectively. Internally, those arrays are still separated allowing to chose different element types for each array. Analog to the (NetCDF Data Model)[https://docs.unidata.ucar.edu/netcdf-c/current/netcdf_data_model.html ], a Dataset usually represents variables belonging to the same group.
(Data) Cube A (Data) Cube is just a YAXArray
in which arrays from a dataset are combined together by introducing a new dimension containing labels of which array the corresponding element came from. Unlike a Dataset
, all arrays must have the same element type to be converted into a cube. This data structure is useful when we want to use all variables at once. For example, the arrays temperature and precipitation which are measured at the same locations and dates can be combined into a single cube. A more formal definition of Data Cubes are given in Mahecha et al. 2020
Dimensions A Dimension
or axis as defined by DimensionalData.jl adds tick labels, e.g., to each row or column of an array. It's name is used to access particular subsets of that array.
Lon, Lat, time For convenience, several Dimensions
have been defined in YAXArrays.jl
, but only a few have been exported. The remaining dimensions can be used by calling them explicitly. See the next table for an overview
Dimension exported usage: using YAXArrays: YAXArrays as YAX
lon
✔ lon
or YAX.lon
Lon
✔ Lon
or YAX.Lon
longitude
✔ longitude
or YAX.longitude
Longitude
✔ Longitude
or YAX.Longitude
lat
✔ lat
or YAX.lat
Lat
✔ Lat
or YAX.Lat
latitude
✔ latitude
or YAX.latitude
Latitude
✔ Latitude
or YAX.Latitude
time
✘ YAX.time
Time
✘ YAX.Time
rlat
✘ YAX.rlat
rlon
✘ YAX.rlon
lat_c
✘ YAX.lat_c
lon_c
✘ YAX.lon_c
height
✘ YAX.height
depth
✘ YAX.depth
Variables
✔ Variables
or YAX.Variables
INFO
If the dimension you are looking for is not in that table, you can define your own by doing
julia using DimensionalData : @dim , XDim # If you want it to be a subtype of XDim
+@dim newDim XDim "Your newDim label"
Sometimes, when you want to operate on a specific dimension in your dataset (for example, a dimension named date
), then doing
julia groupby (ds, Dim{ :date } => seasons ())
should do the job.
`,16)]))}const y=e(d,[["render",o]]);export{p as __pageData,y as default};
diff --git a/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.js b/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.js
new file mode 100644
index 00000000..52e07ad5
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.js
@@ -0,0 +1,71 @@
+import{_ as e,c as n,a2 as a,j as i,a as l,G as p,B as h,o as k}from"./chunks/framework.piKCME0r.js";const C=JSON.parse('{"title":"Write YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/write.md","filePath":"UserGuide/write.md","lastUpdated":null}'),d={name:"UserGuide/write.md"},r={class:"jldocstring custom-block",open:""};function o(g,s,c,E,y,u){const t=h("Badge");return k(),n("div",null,[s[3]||(s[3]=a(`Write YAXArrays and Datasets Create an example Dataset:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Write Zarr Save a single YAXArray to a directory:
julia using Zarr
+savecube (ds . tos, "tos.zarr" , driver = :zarr )
Save an entire Dataset to a directory:
julia savedataset (ds, path = "ds.zarr" , driver = :zarr )
zarr compression Save a dataset to Zarr format with compression:
julia n = 9 # compression level, number between 0 (no compression) and 9 (max compression)
+compression = Zarr . BloscCompressor (; clevel = n)
+
+savedataset (ds; path = "ds_c.zarr" , driver = :zarr , compressor = compression)
More on Zarr Compressors . Also, if you use this option and don't notice a significant improvement, please feel free to open an issue or start a discussion.
Write NetCDF Save a single YAXArray to a directory:
julia using NetCDF
+savecube (ds . tos, "tos.nc" , driver = :netcdf )
Save an entire Dataset to a directory:
julia savedataset (ds, path = "ds.nc" , driver = :netcdf )
netcdf compression Save a dataset to NetCDF format with compression:
julia n = 7 # compression level, number between 0 (no compression) and 9 (max compression)
+savedataset (ds, path = "ds_c.nc" , driver = :netcdf , compress = n)
Comparing it to the default saved file
julia ds_info = stat ( "ds.nc" )
+ds_c_info = stat ( "ds_c.nc" )
+println ( "File size: " , "default: " , ds_info . size, " bytes" , ", compress: " , ds_c_info . size, " bytes" )
File size: default: 2963860 bytes, compress: 1159916 bytes
Overwrite a Dataset If a path already exists, an error will be thrown. Set overwrite=true
to delete the existing dataset
julia savedataset (ds, path = "ds.zarr" , driver = :zarr , overwrite = true )
DANGER
Again, setting overwrite
will delete all your previous saved data.
Look at the doc string for more information
`,29)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"YAXArrays.Datasets.savedataset",href:"#YAXArrays.Datasets.savedataset"},[i("span",{class:"jlbinding"},"YAXArrays.Datasets.savedataset")],-1)),s[1]||(s[1]=l()),p(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('julia savedataset (ds :: Dataset ; path = "" , persist = nothing , overwrite = false , append = false , skeleton = false , backend = :all , driver = backend, max_cache = 5e8 , writefac = 4.0 )
Saves a Dataset into a file at path
with the format given by driver
, i.e., driver=:netcdf
or driver=:zarr
.
Warning
overwrite=true
, deletes ALL your data and it will create a new file.
source
',4))]),s[4]||(s[4]=a(`Append to a Dataset New variables can be added to an existing dataset using the append=true
keyword.
julia ds2 = Dataset (z = YAXArray ( rand ( 10 , 20 , 5 )))
+savedataset (ds2, path = "ds.zarr" , backend = :zarr , append = true )
julia julia > open_dataset ( "ds.zarr" , driver = :zarr )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points )
+ Variables:
+ tos
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} 1:1:10 ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} 1:1:20 ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} 1:1:5 ForwardOrdered Regular Points )
+ Variables:
+ z
+
+Properties: Dict{String, Any}("cmor_version" => 0.96, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "Conventions" => "CF-1.0", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Save Skeleton Sometimes one merely wants to create a datacube "Skeleton" on disk and gradually fill it with data. Here we make use of FillArrays
to create a YAXArray
and write only the axis data and array metadata to disk, while no actual array data is copied:
julia using YAXArrays, Zarr, FillArrays
create the Zeros
array
julia julia > a = YAXArray ( Zeros (Union{Missing, Float32}, 5 , 4 , 5 ))
┌ 5 × 4 × 5 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(4) ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 400.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Now, save to disk with
julia r = savecube (a, "skeleton.zarr" , layername = "skeleton" , driver = :zarr , skeleton = true , overwrite = true )
WARNING
overwrite=true
will delete your previous .zarr
file before creating a new one.
Note also that if layername="skeleton"
is not provided then the default name
for the cube variable will be layer
.
Now, we check that all the values are missing
julia all (ismissing, r[:,:,:])
If using FillArrays
is not possible, using the zeros
function works as well, though it does allocate the array in memory.
INFO
The skeleton
argument is also available for savedataset
.
Using the toy array defined above we can do
julia ds = Dataset (skeleton = a) # skeleton will the variable name
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(4) ForwardOrdered Regular Points,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+
+Variables:
+skeleton
julia ds_s = savedataset (ds, path = "skeleton.zarr" , driver = :zarr , skeleton = true , overwrite = true )
Update values of dataset
Now, we show how to start updating the array values. In order to do it we need to open the dataset first with writing w
rights as follows:
julia ds_open = zopen ( "skeleton.zarr" , "w" )
+ds_array = ds_open[ "skeleton" ]
ZArray{Float32} of size 5 x 4 x 5
and then we simply update values by indexing them where necessary
julia ds_array[:,:, 1 ] = rand (Float32, 5 , 4 ) # this will update values directly into disk!
5×4 Matrix{Float32}:
+ 0.746259 0.259455 0.831968 0.275265
+ 0.547738 0.35762 0.158741 0.991508
+ 0.716952 0.95965 0.599987 0.337016
+ 0.506947 0.923876 0.0940127 0.54942
+ 0.847062 0.298617 0.182371 0.921
we can verify is this working by loading again directly from disk
julia ds_open = open_dataset ( "skeleton.zarr" )
+ds_array = ds_open[ "skeleton" ]
+ds_array . data[:,:, 1 ]
5×4 Matrix{Union{Missing, Float32}}:
+ 0.746259 0.259455 0.831968 0.275265
+ 0.547738 0.35762 0.158741 0.991508
+ 0.716952 0.95965 0.599987 0.337016
+ 0.506947 0.923876 0.0940127 0.54942
+ 0.847062 0.298617 0.182371 0.921
indeed, those entries had been updated.
`,35))])}const v=e(d,[["render",o]]);export{C as __pageData,v as default};
diff --git a/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.lean.js b/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.lean.js
new file mode 100644
index 00000000..52e07ad5
--- /dev/null
+++ b/previews/PR486/assets/UserGuide_write.md.Dt-jU2T_.lean.js
@@ -0,0 +1,71 @@
+import{_ as e,c as n,a2 as a,j as i,a as l,G as p,B as h,o as k}from"./chunks/framework.piKCME0r.js";const C=JSON.parse('{"title":"Write YAXArrays and Datasets","description":"","frontmatter":{},"headers":[],"relativePath":"UserGuide/write.md","filePath":"UserGuide/write.md","lastUpdated":null}'),d={name:"UserGuide/write.md"},r={class:"jldocstring custom-block",open:""};function o(g,s,c,E,y,u){const t=h("Badge");return k(),n("div",null,[s[3]||(s[3]=a(`Write YAXArrays and Datasets Create an example Dataset:
julia using YAXArrays
+using NetCDF
+using Downloads : download
+
+path = download ( "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc" , "example.nc" )
+ds = open_dataset (path)
YAXArray Dataset
+Shared Axes:
+ (↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points)
+
+Variables:
+tos
+
+Properties: Dict{String, Any}("cmor_version" => 0.96f0, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "Conventions" => "CF-1.0", "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Write Zarr Save a single YAXArray to a directory:
julia using Zarr
+savecube (ds . tos, "tos.zarr" , driver = :zarr )
Save an entire Dataset to a directory:
julia savedataset (ds, path = "ds.zarr" , driver = :zarr )
zarr compression Save a dataset to Zarr format with compression:
julia n = 9 # compression level, number between 0 (no compression) and 9 (max compression)
+compression = Zarr . BloscCompressor (; clevel = n)
+
+savedataset (ds; path = "ds_c.zarr" , driver = :zarr , compressor = compression)
More on Zarr Compressors . Also, if you use this option and don't notice a significant improvement, please feel free to open an issue or start a discussion.
Write NetCDF Save a single YAXArray to a directory:
julia using NetCDF
+savecube (ds . tos, "tos.nc" , driver = :netcdf )
Save an entire Dataset to a directory:
julia savedataset (ds, path = "ds.nc" , driver = :netcdf )
netcdf compression Save a dataset to NetCDF format with compression:
julia n = 7 # compression level, number between 0 (no compression) and 9 (max compression)
+savedataset (ds, path = "ds_c.nc" , driver = :netcdf , compress = n)
Comparing it to the default saved file
julia ds_info = stat ( "ds.nc" )
+ds_c_info = stat ( "ds_c.nc" )
+println ( "File size: " , "default: " , ds_info . size, " bytes" , ", compress: " , ds_c_info . size, " bytes" )
File size: default: 2963860 bytes, compress: 1159916 bytes
Overwrite a Dataset If a path already exists, an error will be thrown. Set overwrite=true
to delete the existing dataset
julia savedataset (ds, path = "ds.zarr" , driver = :zarr , overwrite = true )
DANGER
Again, setting overwrite
will delete all your previous saved data.
Look at the doc string for more information
`,29)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"YAXArrays.Datasets.savedataset",href:"#YAXArrays.Datasets.savedataset"},[i("span",{class:"jlbinding"},"YAXArrays.Datasets.savedataset")],-1)),s[1]||(s[1]=l()),p(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('julia savedataset (ds :: Dataset ; path = "" , persist = nothing , overwrite = false , append = false , skeleton = false , backend = :all , driver = backend, max_cache = 5e8 , writefac = 4.0 )
Saves a Dataset into a file at path
with the format given by driver
, i.e., driver=:netcdf
or driver=:zarr
.
Warning
overwrite=true
, deletes ALL your data and it will create a new file.
source
',4))]),s[4]||(s[4]=a(`Append to a Dataset New variables can be added to an existing dataset using the append=true
keyword.
julia ds2 = Dataset (z = YAXArray ( rand ( 10 , 20 , 5 )))
+savedataset (ds2, path = "ds.zarr" , backend = :zarr , append = true )
julia julia > open_dataset ( "ds.zarr" , driver = :zarr )
YAXArray Dataset
+Shared Axes:
+None
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ lon Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points ,
+ ↗ time Sampled{CFTime.DateTime360Day} [CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points )
+ Variables:
+ tos
+
+ Additional Axes:
+ ( ↓ Dim_1 Sampled{Int64} 1:1:10 ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} 1:1:20 ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} 1:1:5 ForwardOrdered Regular Points )
+ Variables:
+ z
+
+Properties: Dict{String, Any}("cmor_version" => 0.96, "references" => "Dufresne et al, Journal of Climate, 2015, vol XX, p 136", "realization" => 1, "contact" => "Sebastien Denvil, sebastien.denvil@ipsl.jussieu.fr", "Conventions" => "CF-1.0", "history" => "YYYY/MM/JJ: data generated; YYYY/MM/JJ+1 data transformed At 16:37:23 on 01/11/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirements", "table_id" => "Table O1 (13 November 2004)", "source" => "IPSL-CM4_v1 (2003) : atmosphere : LMDZ (IPSL-CM4_IPCC, 96x71x19) ; ocean ORCA2 (ipsl_cm4_v1_8, 2x2L31); sea ice LIM (ipsl_cm4_v", "title" => "IPSL model output prepared for IPCC Fourth Assessment SRES A2 experiment", "experiment_id" => "SRES A2 experiment"…)
Save Skeleton Sometimes one merely wants to create a datacube "Skeleton" on disk and gradually fill it with data. Here we make use of FillArrays
to create a YAXArray
and write only the axis data and array metadata to disk, while no actual array data is copied:
julia using YAXArrays, Zarr, FillArrays
create the Zeros
array
julia julia > a = YAXArray ( Zeros (Union{Missing, Float32}, 5 , 4 , 5 ))
┌ 5 × 4 × 5 YAXArray{Union{Missing, Float32}, 3} ┐
+├────────────────────────────────────────────┴─────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points ,
+ → Dim_2 Sampled{Int64} Base.OneTo(4) ForwardOrdered Regular Points ,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 400.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
Now, save to disk with
julia r = savecube (a, "skeleton.zarr" , layername = "skeleton" , driver = :zarr , skeleton = true , overwrite = true )
WARNING
overwrite=true
will delete your previous .zarr
file before creating a new one.
Note also that if layername="skeleton"
is not provided then the default name
for the cube variable will be layer
.
Now, we check that all the values are missing
julia all (ismissing, r[:,:,:])
If using FillArrays
is not possible, using the zeros
function works as well, though it does allocate the array in memory.
INFO
The skeleton
argument is also available for savedataset
.
Using the toy array defined above we can do
julia ds = Dataset (skeleton = a) # skeleton will the variable name
YAXArray Dataset
+Shared Axes:
+ (↓ Dim_1 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(4) ForwardOrdered Regular Points,
+ ↗ Dim_3 Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points)
+
+Variables:
+skeleton
julia ds_s = savedataset (ds, path = "skeleton.zarr" , driver = :zarr , skeleton = true , overwrite = true )
Update values of dataset
Now, we show how to start updating the array values. In order to do it we need to open the dataset first with writing w
rights as follows:
julia ds_open = zopen ( "skeleton.zarr" , "w" )
+ds_array = ds_open[ "skeleton" ]
ZArray{Float32} of size 5 x 4 x 5
and then we simply update values by indexing them where necessary
julia ds_array[:,:, 1 ] = rand (Float32, 5 , 4 ) # this will update values directly into disk!
5×4 Matrix{Float32}:
+ 0.746259 0.259455 0.831968 0.275265
+ 0.547738 0.35762 0.158741 0.991508
+ 0.716952 0.95965 0.599987 0.337016
+ 0.506947 0.923876 0.0940127 0.54942
+ 0.847062 0.298617 0.182371 0.921
we can verify is this working by loading again directly from disk
julia ds_open = open_dataset ( "skeleton.zarr" )
+ds_array = ds_open[ "skeleton" ]
+ds_array . data[:,:, 1 ]
5×4 Matrix{Union{Missing, Float32}}:
+ 0.746259 0.259455 0.831968 0.275265
+ 0.547738 0.35762 0.158741 0.991508
+ 0.716952 0.95965 0.599987 0.337016
+ 0.506947 0.923876 0.0940127 0.54942
+ 0.847062 0.298617 0.182371 0.921
indeed, those entries had been updated.
`,35))])}const v=e(d,[["render",o]]);export{C as __pageData,v as default};
diff --git a/previews/PR486/assets/api.md.CRtEnxW2.js b/previews/PR486/assets/api.md.CRtEnxW2.js
new file mode 100644
index 00000000..b4fa9c86
--- /dev/null
+++ b/previews/PR486/assets/api.md.CRtEnxW2.js
@@ -0,0 +1,5 @@
+import{_ as n,c as o,j as e,a,G as i,a2 as l,B as r,o as p}from"./chunks/framework.piKCME0r.js";const us=JSON.parse('{"title":"API Reference","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),d={name:"api.md"},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""};function ns(os,s,rs,ps,ds,hs){const t=r("Badge");return p(),o("div",null,[s[157]||(s[157]=e("h1",{id:"API-Reference",tabindex:"-1"},[a("API Reference "),e("a",{class:"header-anchor",href:"#API-Reference","aria-label":'Permalink to "API Reference {#API-Reference}"'},"")],-1)),s[158]||(s[158]=e("p",null,"This section describes all available functions of this package.",-1)),s[159]||(s[159]=e("h2",{id:"Public-API",tabindex:"-1"},[a("Public API "),e("a",{class:"header-anchor",href:"#Public-API","aria-label":'Permalink to "Public API {#Public-API}"'},"")],-1)),e("details",h,[e("summary",null,[s[0]||(s[0]=e("a",{id:"YAXArrays.getAxis-Tuple{Any, Any}",href:"#YAXArrays.getAxis-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.getAxis")],-1)),s[1]||(s[1]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[2]||(s[2]=l('Given an Axis description and a cube, returns the corresponding axis of the cube. The Axis description can be:
source
',4))]),e("details",c,[e("summary",null,[s[3]||(s[3]=e("a",{id:"YAXArrays.Cubes",href:"#YAXArrays.Cubes"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes")],-1)),s[4]||(s[4]=a()),i(t,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),s[5]||(s[5]=e("p",null,"The functions provided by YAXArrays are supposed to work on different types of cubes. This module defines the interface for all Data types that",-1)),s[6]||(s[6]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L1-L4",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",u,[e("summary",null,[s[7]||(s[7]=e("a",{id:"YAXArrays.Cubes.YAXArray",href:"#YAXArrays.Cubes.YAXArray"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.YAXArray")],-1)),s[8]||(s[8]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[9]||(s[9]=l('An array labelled with named axes that have values associated with them. It can wrap normal arrays or, more typically DiskArrays.
Fields
axes
: Tuple
of Dimensions containing the Axes of the Cube
data
: length(axes)-dimensional array which holds the data, this can be a lazy DiskArray
properties
: Metadata properties describing the content of the data
chunks
: Representation of the chunking of the data
cleaner
: Cleaner objects to track which objects to tidy up when the YAXArray goes out of scope
source
',5))]),e("details",k,[e("summary",null,[s[10]||(s[10]=e("a",{id:"YAXArrays.Cubes.caxes",href:"#YAXArrays.Cubes.caxes"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.caxes")],-1)),s[11]||(s[11]=a()),i(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[12]||(s[12]=e("p",null,"Returns the axes of a Cube",-1)),s[13]||(s[13]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L27",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",b,[e("summary",null,[s[14]||(s[14]=e("a",{id:"YAXArrays.Cubes.caxes-Tuple{DimensionalData.Dimensions.Dimension}",href:"#YAXArrays.Cubes.caxes-Tuple{DimensionalData.Dimensions.Dimension}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.caxes")],-1)),s[15]||(s[15]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=l('Embeds Cube inside a new Cube
source
',3))]),e("details",y,[e("summary",null,[s[17]||(s[17]=e("a",{id:"YAXArrays.Cubes.concatenatecubes-Tuple{Any, DimensionalData.Dimensions.Dimension}",href:"#YAXArrays.Cubes.concatenatecubes-Tuple{Any, DimensionalData.Dimensions.Dimension}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.concatenatecubes")],-1)),s[18]||(s[18]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=l('julia function concatenateCubes (cubelist, cataxis :: CategoricalAxis )
Concatenates a vector of datacubes that have identical axes to a new single cube along the new axis cataxis
source
',3))]),e("details",g,[e("summary",null,[s[20]||(s[20]=e("a",{id:"YAXArrays.Cubes.readcubedata-Tuple{Any}",href:"#YAXArrays.Cubes.readcubedata-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.readcubedata")],-1)),s[21]||(s[21]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=l('Given any array implementing the YAXArray interface it returns an in-memory YAXArray
from it.
source
',3))]),e("details",f,[e("summary",null,[s[23]||(s[23]=e("a",{id:"YAXArrays.Cubes.setchunks-Tuple{YAXArray, Any}",href:"#YAXArrays.Cubes.setchunks-Tuple{YAXArray, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.setchunks")],-1)),s[24]||(s[24]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=l('julia setchunks (c :: YAXArray ,chunks)
Resets the chunks of a YAXArray and returns a new YAXArray. Note that this will not change the chunking of the underlying data itself, it will just make the data "look" like it had a different chunking. If you need a persistent on-disk representation of this chunking, use savecube
on the resulting array. The chunks
argument can take one of the following forms:
a DiskArrays.GridChunks
object
a tuple specifying the chunk size along each dimension
an AbstractDict or NamedTuple mapping one or more axis names to chunk sizes
source
',4))]),e("details",A,[e("summary",null,[s[26]||(s[26]=e("a",{id:"YAXArrays.Cubes.subsetcube",href:"#YAXArrays.Cubes.subsetcube"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.subsetcube")],-1)),s[27]||(s[27]=a()),i(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[28]||(s[28]=e("p",null,"This function calculates a subset of a cube's data",-1)),s[29]||(s[29]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L22-L24",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",m,[e("summary",null,[s[30]||(s[30]=e("a",{id:"YAXArrays.DAT.InDims",href:"#YAXArrays.DAT.InDims"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.InDims")],-1)),s[31]||(s[31]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=l('julia InDims (axisdesc ... ; ... )
Creates a description of an Input Data Cube for cube operations. Takes a single or multiple axis descriptions as first arguments. Alternatively a MovingWindow(@ref) struct can be passed to include neighbour slices of one or more axes in the computation. Axes can be specified by their name (String), through an Axis type, or by passing a concrete axis.
Keyword arguments
artype
how shall the array be represented in the inner function. Defaults to Array
, alternatives are DataFrame
or AsAxisArray
filter
define some filter to skip the computation, e.g. when all values are missing. Defaults to AllMissing()
, possible values are AnyMissing()
, AnyOcean()
, StdZero()
, NValid(n)
(for at least n non-missing elements). It is also possible to provide a custom one-argument function that takes the array and returns true
if the compuation shall be skipped and false
otherwise.
window_oob_value
if one of the input dimensions is a MowingWindow, this value will be used to fill out-of-bounds areas
source
',5))]),e("details",E,[e("summary",null,[s[33]||(s[33]=e("a",{id:"YAXArrays.DAT.MovingWindow",href:"#YAXArrays.DAT.MovingWindow"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.MovingWindow")],-1)),s[34]||(s[34]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=l('julia MovingWindow (desc, pre, after)
Constructs a MovingWindow
object to be passed to an InDims
constructor to define that the axis in desc
shall participate in the inner function (i.e. shall be looped over), but inside the inner function pre
values before and after
values after the center value will be passed as well.
For example passing MovingWindow("Time", 2, 0)
will loop over the time axis and always pass the current time step plus the 2 previous steps. So in the inner function the array will have an additional dimension of size 3.
source
',4))]),e("details",j,[e("summary",null,[s[36]||(s[36]=e("a",{id:"YAXArrays.DAT.OutDims-Tuple",href:"#YAXArrays.DAT.OutDims-Tuple"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.OutDims")],-1)),s[37]||(s[37]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[38]||(s[38]=l('julia OutDims (axisdesc; ... )
Creates a description of an Output Data Cube for cube operations. Takes a single or a Vector/Tuple of axes as first argument. Axes can be specified by their name (String), through an Axis type, or by passing a concrete axis.
axisdesc
: List of input axis names
backend
: specifies the dataset backend to write data to, must be either :auto or a key in YAXArrayBase.backendlist
update
: specifies wether the function operates inplace or if an output is returned
artype
: specifies the Array type inside the inner function that is mapped over
chunksize
: A Dict specifying the chunksizes for the output dimensions of the cube, or :input
to copy chunksizes from input cube axes or :max
to not chunk the inner dimensions
outtype
: force the output type to a specific type, defaults to Any
which means that the element type of the first input cube is used
source
',4))]),e("details",C,[e("summary",null,[s[39]||(s[39]=e("a",{id:"YAXArrays.DAT.CubeTable-Tuple{}",href:"#YAXArrays.DAT.CubeTable-Tuple{}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.CubeTable")],-1)),s[40]||(s[40]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=l('Function to turn a DataCube object into an iterable table. Takes a list of as arguments, specified as a name=cube
expression. For example CubeTable(data=cube1,country=cube2)
would generate a Table with the entries data
and country
, where data
contains the values of cube1
and country
the values of cube2
. The cubes are matched and broadcasted along their axes like in mapCube
.
source
',3))]),e("details",D,[e("summary",null,[s[42]||(s[42]=e("a",{id:"YAXArrays.DAT.cubefittable-Tuple{Any, Any, Any}",href:"#YAXArrays.DAT.cubefittable-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.cubefittable")],-1)),s[43]||(s[43]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[44]||(s[44]=l('julia cubefittable (tab,o,fitsym;post = getpostfunction (o),kwargs ... )
Executes fittable
on the CubeTable
tab
with the (Weighted-)OnlineStat o
, looping through the values specified by fitsym
. Finally, writes the results from the TableAggregator
to an output data cube.
source
',3))]),e("details",v,[e("summary",null,[s[45]||(s[45]=e("a",{id:"YAXArrays.DAT.fittable-Tuple{YAXArrays.DAT.CubeIterator, Any, Any}",href:"#YAXArrays.DAT.fittable-Tuple{YAXArrays.DAT.CubeIterator, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.fittable")],-1)),s[46]||(s[46]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[47]||(s[47]=l('julia fittable (tab,o,fitsym;by = (),weight = nothing )
Loops through an iterable table tab
and thereby fitting an OnlineStat o
with the values specified through fitsym
. Optionally one can specify a field (or tuple) to group by. Any groupby specifier can either be a symbol denoting the entry to group by or an anynymous function calculating the group from a table row.
For example the following would caluclate a weighted mean over a cube weighted by grid cell area and grouped by country and month:
julia fittable (iter,WeightedMean, :tair ,weight = (i -> abs ( cosd (i . lat))),by = (i -> month (i . time), :country ))
source
',5))]),e("details",T,[e("summary",null,[s[48]||(s[48]=e("a",{id:"YAXArrays.DAT.mapCube-Tuple{Function, Dataset, Vararg{Any}}",href:"#YAXArrays.DAT.mapCube-Tuple{Function, Dataset, Vararg{Any}}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.mapCube")],-1)),s[49]||(s[49]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[50]||(s[50]=l('julia mapCube (fun, cube, addargs ... ;kwargs ... )
Map a given function fun
over slices of all cubes of the dataset ds
. Use InDims to discribe the input dimensions and OutDims to describe the output dimensions of the function.
For Datasets, only one output cube can be specified. In contrast to the mapCube function for cubes, additional arguments for the inner function should be set as keyword arguments.
For the specific keyword arguments see the docstring of the mapCube function for cubes.
source
',5))]),e("details",F,[e("summary",null,[s[51]||(s[51]=e("a",{id:"YAXArrays.DAT.mapCube-Tuple{Function, Tuple, Vararg{Any}}",href:"#YAXArrays.DAT.mapCube-Tuple{Function, Tuple, Vararg{Any}}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.mapCube")],-1)),s[52]||(s[52]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[53]||(s[53]=l('julia mapCube (fun, cube, addargs ... ;kwargs ... )
Map a given function fun
over slices of the data cube cube
. The additional arguments addargs
will be forwarded to the inner function fun
. Use InDims to discribe the input dimensions and OutDims to describe the output dimensions of the function.
Keyword arguments
max_cache=YAXDefaults.max_cache
Float64 maximum size of blocks that are read into memory in bits e.g. max_cache=5.0e8
. Or String. e.g. max_cache="10MB"
or max_cache=1GB
defaults to approx 10Mb.
indims::InDims
List of input cube descriptors of type InDims
for each input data cube.
outdims::OutDims
List of output cube descriptors of type OutDims
for each output cube.
inplace
does the function write to an output array inplace or return a single value> defaults to true
ispar
boolean to determine if parallelisation should be applied, defaults to true
if workers are available.
showprog
boolean indicating if a ProgressMeter shall be shown
include_loopvars
boolean to indicate if the varoables looped over should be added as function arguments
nthreads
number of threads for the computation, defaults to Threads.nthreads for every worker.
loopchunksize
determines the chunk sizes of variables which are looped over, a dict
kwargs
additional keyword arguments are passed to the inner function
The first argument is always the function to be applied, the second is the input cube or a tuple of input cubes if needed.
source
',6))]),e("details",X,[e("summary",null,[s[54]||(s[54]=e("a",{id:"YAXArrays.Datasets.Dataset",href:"#YAXArrays.Datasets.Dataset"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Dataset")],-1)),s[55]||(s[55]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=e("p",null,[a("Dataset object which stores an "),e("code",null,"OrderedDict"),a(" of YAXArrays with Symbol keys. A dictionary of CubeAxes and a Dictionary of general properties. A dictionary can hold cubes with differing axes. But it will share the common axes between the subcubes.")],-1)),s[57]||(s[57]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L18-L22",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Y,[e("summary",null,[s[58]||(s[58]=e("a",{id:"YAXArrays.Datasets.Dataset-Tuple{}",href:"#YAXArrays.Datasets.Dataset-Tuple{}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Dataset")],-1)),s[59]||(s[59]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[60]||(s[60]=l('julia Dataset (; properties = Dict{String,Any}, cubes ... )
Construct a YAXArray Dataset with global attributes properties
a and a list of named YAXArrays cubes...
source
',3))]),e("details",x,[e("summary",null,[s[61]||(s[61]=e("a",{id:"YAXArrays.Datasets.Cube-Tuple{Dataset}",href:"#YAXArrays.Datasets.Cube-Tuple{Dataset}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Cube")],-1)),s[62]||(s[62]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[63]||(s[63]=l('julia Cube (ds :: Dataset ; joinname = "Variables" )
Construct a single YAXArray from the dataset ds
by concatenating the cubes in the datset on the joinname
dimension.
source
',3))]),e("details",w,[e("summary",null,[s[64]||(s[64]=e("a",{id:"YAXArrays.Datasets.open_dataset-Tuple{Any}",href:"#YAXArrays.Datasets.open_dataset-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.open_dataset")],-1)),s[65]||(s[65]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[66]||(s[66]=l('julia open_dataset (g; skip_keys = (), driver = :all )
Open the dataset at g
with the given driver
. The default driver will search for available drivers and tries to detect the useable driver from the filename extension.
Keyword arguments
skip_keys
are passed as symbols, i.e., skip_keys = (:a, :b)
driver=:all
, common options are :netcdf
or :zarr
.
Example:
julia ds = open_dataset (f, driver = :zarr , skip_keys = ( :c ,))
source
',7))]),e("details",L,[e("summary",null,[s[67]||(s[67]=e("a",{id:'YAXArrays.Datasets.open_mfdataset-Tuple{DimensionalData.DimVector{var"#s34", D, R, A} where {var"#s34"<:AbstractString, D<:Tuple, R<:Tuple, A<:AbstractVector{var"#s34"}}}',href:'#YAXArrays.Datasets.open_mfdataset-Tuple{DimensionalData.DimVector{var"#s34", D, R, A} where {var"#s34"<:AbstractString, D<:Tuple, R<:Tuple, A<:AbstractVector{var"#s34"}}}'},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.open_mfdataset")],-1)),s[68]||(s[68]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[69]||(s[69]=l(`julia open_mfdataset (files :: DD.DimVector{<:AbstractString} ; kwargs ... )
Opens and concatenates a list of dataset paths along the dimension specified in files
. This method can be used when the generic glob-based version of open_mfdataset fails or is too slow. For example, to concatenate a list of annual NetCDF files along the time
dimension, one can use:
julia files = [ "1990.nc" , "1991.nc" , "1992.nc" ]
+open_mfdataset (DD . DimArray (files, YAX . time ()))
alternatively, if the dimension to concatenate along does not exist yet, the dimension provided in the input arg is used:
julia files = [ "a.nc" , "b.nc" , "c.nc" ]
+open_mfdataset (DD . DimArray (files, DD . Dim{:NewDim} ([ "a" , "b" , "c" ])))
source
`,6))]),e("details",M,[e("summary",null,[s[70]||(s[70]=e("a",{id:"YAXArrays.Datasets.savecube-Tuple{Any, AbstractString}",href:"#YAXArrays.Datasets.savecube-Tuple{Any, AbstractString}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.savecube")],-1)),s[71]||(s[71]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[72]||(s[72]=l('julia savecube (cube,name :: String )
Save a YAXArray
to the path
.
Extended Help
The keyword arguments are:
name
:
datasetaxis="Variables"
special treatment of a categorical axis that gets written into separate zarr arrays
max_cache
: The number of bits that are used as cache for the data handling.
backend
: The backend, that is used to save the data. Falls back to searching the backend according to the extension of the path.
driver
: The same setting as backend
.
overwrite::Bool=false
overwrite cube if it already exists
source
',6))]),e("details",B,[e("summary",null,[s[73]||(s[73]=e("a",{id:"YAXArrays.Datasets.savedataset-Tuple{Dataset}",href:"#YAXArrays.Datasets.savedataset-Tuple{Dataset}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.savedataset")],-1)),s[74]||(s[74]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[75]||(s[75]=l('julia savedataset (ds :: Dataset ; path = "" , persist = nothing , overwrite = false , append = false , skeleton = false , backend = :all , driver = backend, max_cache = 5e8 , writefac = 4.0 )
Saves a Dataset into a file at path
with the format given by driver
, i.e., driver=:netcdf
or driver=:zarr
.
Warning
overwrite=true
, deletes ALL your data and it will create a new file.
source
',4))]),e("details",O,[e("summary",null,[s[76]||(s[76]=e("a",{id:"YAXArrays.Datasets.to_dataset-Tuple{Any}",href:"#YAXArrays.Datasets.to_dataset-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.to_dataset")],-1)),s[77]||(s[77]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[78]||(s[78]=l('julia to_dataset (c;datasetaxis = "Variables" , layername = "layer" )
Convert a Data Cube into a Dataset. It is possible to treat one of the Cube's axes as a datasetaxis
i.e. the cube will be split into different parts that become variables in the Dataset. If no such axis is specified or found, there will only be a single variable in the dataset with the name layername
.
source
',3))]),s[160]||(s[160]=e("h2",{id:"Internal-API",tabindex:"-1"},[a("Internal API "),e("a",{class:"header-anchor",href:"#Internal-API","aria-label":'Permalink to "Internal API {#Internal-API}"'},"")],-1)),e("details",I,[e("summary",null,[s[79]||(s[79]=e("a",{id:"YAXArrays.YAXDefaults",href:"#YAXArrays.YAXDefaults"},[e("span",{class:"jlbinding"},"YAXArrays.YAXDefaults")],-1)),s[80]||(s[80]=a()),i(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[81]||(s[81]=l('Default configuration for YAXArrays, has the following fields:
workdir[]::String = "./"
The default location for temporary cubes.
recal[]::Bool = false
set to true if you want @loadOrGenerate
to always recalculate the results.
chunksize[]::Any = :input
Set the default output chunksize.
max_cache[]::Float64 = 1e8
The maximum cache used by mapCube.
cubedir[]::""
the default location for Cube()
without an argument.
subsetextensions::Array{Any} = []
List of registered functions, that convert subsetting input into dimension boundaries.
source
',3))]),e("details",J,[e("summary",null,[s[82]||(s[82]=e("a",{id:"YAXArrays.findAxis-Tuple{Any, Any}",href:"#YAXArrays.findAxis-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.findAxis")],-1)),s[83]||(s[83]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[84]||(s[84]=l('Internal function
Extended Help
Given an Axis description and a cube return the index of the Axis.
The Axis description can be:
source
',7))]),e("details",P,[e("summary",null,[s[85]||(s[85]=e("a",{id:"YAXArrays.getOutAxis-NTuple{5, Any}",href:"#YAXArrays.getOutAxis-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.getOutAxis")],-1)),s[86]||(s[86]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[87]||(s[87]=l('source
',2))]),e("details",q,[e("summary",null,[s[88]||(s[88]=e("a",{id:"YAXArrays.get_descriptor-Tuple{String}",href:"#YAXArrays.get_descriptor-Tuple{String}"},[e("span",{class:"jlbinding"},"YAXArrays.get_descriptor")],-1)),s[89]||(s[89]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[90]||(s[90]=l('Get the descriptor of an Axis. This is used to dispatch on the descriptor.
source
',3))]),e("details",z,[e("summary",null,[s[91]||(s[91]=e("a",{id:"YAXArrays.match_axis-Tuple{YAXArrays.ByName, Any}",href:"#YAXArrays.match_axis-Tuple{YAXArrays.ByName, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.match_axis")],-1)),s[92]||(s[92]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[93]||(s[93]=l(`Internal function
Extended Help
Match the Axis based on the AxisDescriptor.
+This is used to find different axes and to make certain axis description the same.
+For example to disregard differences of captialisation.
source
`,5))]),e("details",N,[e("summary",null,[s[94]||(s[94]=e("a",{id:"YAXArrays.Cubes.CleanMe",href:"#YAXArrays.Cubes.CleanMe"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.CleanMe")],-1)),s[95]||(s[95]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[96]||(s[96]=l('julia mutable struct CleanMe
Struct which describes data paths and their persistency. Non-persistend paths/files are removed at finalize step
source
',3))]),e("details",S,[e("summary",null,[s[97]||(s[97]=e("a",{id:"YAXArrays.Cubes.clean-Tuple{YAXArrays.Cubes.CleanMe}",href:"#YAXArrays.Cubes.clean-Tuple{YAXArrays.Cubes.CleanMe}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.clean")],-1)),s[98]||(s[98]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[99]||(s[99]=l('finalizer function for CleanMe struct. The main process removes all directories/files which are not persistent.
source
',3))]),e("details",R,[e("summary",null,[s[100]||(s[100]=e("a",{id:"YAXArrays.Cubes.copydata-Tuple{Any, Any, Any}",href:"#YAXArrays.Cubes.copydata-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.copydata")],-1)),s[101]||(s[101]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[102]||(s[102]=l('julia copydata (outar, inar, copybuf)
Internal function which copies the data from the input inar
into the output outar
at the copybuf
positions.
source
',3))]),e("details",V,[e("summary",null,[s[103]||(s[103]=e("a",{id:"YAXArrays.Cubes.optifunc-NTuple{7, Any}",href:"#YAXArrays.Cubes.optifunc-NTuple{7, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.optifunc")],-1)),s[104]||(s[104]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[105]||(s[105]=l('julia optifunc (s, maxbuf, incs, outcs, insize, outsize, writefac)
Internal
This function is going to be minimized to detect the best possible chunk setting for the rechunking of the data.
source
',4))]),e("details",G,[e("summary",null,[s[106]||(s[106]=e("a",{id:"YAXArrays.DAT.DATConfig",href:"#YAXArrays.DAT.DATConfig"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.DATConfig")],-1)),s[107]||(s[107]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[108]||(s[108]=l('Configuration object of a DAT process. This holds all necessary information to perform the calculations. It contains the following fields:
incubes::NTuple{NIN, YAXArrays.DAT.InputCube} where NIN
: The input data cubes
outcubes::NTuple{NOUT, YAXArrays.DAT.OutputCube} where NOUT
: The output data cubes
allInAxes::Vector
: List of all axes of the input cubes
LoopAxes::Vector
: List of axes that are looped through
ispar::Bool
: Flag whether the computation is parallelized
loopcachesize::Vector{Int64}
:
allow_irregular_chunks::Bool
:
max_cache::Any
: Maximal size of the in memory cache
fu::Any
: Inner function which is computed
inplace::Bool
: Flag whether the computation happens in place
include_loopvars::Bool
:
ntr::Any
:
do_gc::Bool
: Flag if GC should be called explicitly. Probably necessary for many runs in Julia 1.9
addargs::Any
: Additional arguments for the inner function
kwargs::Any
: Additional keyword arguments for the inner function
source
',3))]),e("details",W,[e("summary",null,[s[109]||(s[109]=e("a",{id:"YAXArrays.DAT.InputCube",href:"#YAXArrays.DAT.InputCube"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.InputCube")],-1)),s[110]||(s[110]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[111]||(s[111]=l('Internal representation of an input cube for DAT operations
cube
: The input data
desc
: The input description given by the user/registration
axesSmall
: List of axes that were actually selected through the description
icolon
colonperm
loopinds
: Indices of loop axes that this cube does not contain, i.e. broadcasts
cachesize
: Number of elements to keep in cache along each axis
window
iwindow
windowloopinds
iall
source
',3))]),e("details",U,[e("summary",null,[s[112]||(s[112]=e("a",{id:"YAXArrays.DAT.OutputCube",href:"#YAXArrays.DAT.OutputCube"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.OutputCube")],-1)),s[113]||(s[113]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[114]||(s[114]=l('Internal representation of an output cube for DAT operations
Fields
cube
: The actual outcube cube, once it is generated
cube_unpermuted
: The unpermuted output cube
desc
: The description of the output axes as given by users or registration
axesSmall
: The list of output axes determined through the description
allAxes
: List of all the axes of the cube
loopinds
: Index of the loop axes that are broadcasted for this output cube
innerchunks
outtype
: Elementtype of the outputcube
source
',4))]),e("details",K,[e("summary",null,[s[115]||(s[115]=e("a",{id:"YAXArrays.DAT.YAXColumn",href:"#YAXArrays.DAT.YAXColumn"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.YAXColumn")],-1)),s[116]||(s[116]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[117]||(s[117]=l('A struct representing a single column of a YAXArray partitioned Table # Fields
source
',4))]),e("details",$,[e("summary",null,[s[118]||(s[118]=e("a",{id:"YAXArrays.DAT.cmpcachmisses-Tuple{Any, Any}",href:"#YAXArrays.DAT.cmpcachmisses-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.cmpcachmisses")],-1)),s[119]||(s[119]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[120]||(s[120]=e("p",null,"Function that compares two cache miss specifiers by their importance",-1)),s[121]||(s[121]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L958-L960",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",H,[e("summary",null,[s[122]||(s[122]=e("a",{id:"YAXArrays.DAT.getFrontPerm-Tuple{Any, Any}",href:"#YAXArrays.DAT.getFrontPerm-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getFrontPerm")],-1)),s[123]||(s[123]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[124]||(s[124]=e("p",null,"Calculate an axis permutation that brings the wanted dimensions to the front",-1)),s[125]||(s[125]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L1203",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Z,[e("summary",null,[s[126]||(s[126]=e("a",{id:"YAXArrays.DAT.getLoopCacheSize-NTuple{5, Any}",href:"#YAXArrays.DAT.getLoopCacheSize-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getLoopCacheSize")],-1)),s[127]||(s[127]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e("p",null,"Calculate optimal Cache size to DAT operation",-1)),s[129]||(s[129]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L1057",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Q,[e("summary",null,[s[130]||(s[130]=e("a",{id:"YAXArrays.DAT.getOuttype-Tuple{Int64, Any}",href:"#YAXArrays.DAT.getOuttype-Tuple{Int64, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getOuttype")],-1)),s[131]||(s[131]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[132]||(s[132]=l('julia getOuttype (outtype, cdata)
Internal function
Get the element type for the output cube
source
',4))]),e("details",_,[e("summary",null,[s[133]||(s[133]=e("a",{id:"YAXArrays.DAT.getloopchunks-Tuple{YAXArrays.DAT.DATConfig}",href:"#YAXArrays.DAT.getloopchunks-Tuple{YAXArrays.DAT.DATConfig}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getloopchunks")],-1)),s[134]||(s[134]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[135]||(s[135]=l('julia getloopchunks (dc :: DATConfig )
Internal function
Returns the chunks that can be looped over toghether for all dimensions. \nThis computation of the size of the chunks is handled by [`DiskArrays.approx_chunksize`](@ref)
source
',4))]),e("details",ss,[e("summary",null,[s[136]||(s[136]=e("a",{id:"YAXArrays.DAT.permuteloopaxes-Tuple{Any}",href:"#YAXArrays.DAT.permuteloopaxes-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.permuteloopaxes")],-1)),s[137]||(s[137]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[138]||(s[138]=l('Internal function
Permute the dimensions of the cube, so that the axes that are looped through are in the first positions. This is necessary for a faster looping through the data.
source
',4))]),e("details",es,[e("summary",null,[s[139]||(s[139]=e("a",{id:"YAXArrays.Cubes.setchunks-Tuple{Dataset, Any}",href:"#YAXArrays.Cubes.setchunks-Tuple{Dataset, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.setchunks")],-1)),s[140]||(s[140]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[141]||(s[141]=l('julia setchunks (c :: Dataset ,chunks)
Resets the chunks of all or a subset YAXArrays in the dataset and returns a new Dataset. Note that this will not change the chunking of the underlying data itself, it will just make the data "look" like it had a different chunking. If you need a persistent on-disk representation of this chunking, use savedataset
on the resulting array. The chunks
argument can take one of the following forms:
a NamedTuple or AbstractDict mapping from variable name to a description of the desired variable chunks
a NamedTuple or AbstractDict mapping from dimension name to a description of the desired variable chunks
a description of the desired variable chunks applied to all members of the Dataset
where a description of the desired variable chunks can take one of the following forms:
a DiskArrays.GridChunks
object
a tuple specifying the chunk size along each dimension
an AbstractDict or NamedTuple mapping one or more axis names to chunk sizes
source
',6))]),e("details",as,[e("summary",null,[s[142]||(s[142]=e("a",{id:"YAXArrays.Datasets.collectfromhandle-Tuple{Any, Any, Any}",href:"#YAXArrays.Datasets.collectfromhandle-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.collectfromhandle")],-1)),s[143]||(s[143]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[144]||(s[144]=e("p",null,"Extracts a YAXArray from a dataset handle that was just created from a arrayinfo",-1)),s[145]||(s[145]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L561-L563",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",ts,[e("summary",null,[s[146]||(s[146]=e("a",{id:"YAXArrays.Datasets.createdataset-Tuple{Any, Any}",href:"#YAXArrays.Datasets.createdataset-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.createdataset")],-1)),s[147]||(s[147]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[148]||(s[148]=l('julia function createdataset (DS :: Type ,axlist; kwargs ... )
Creates a new dataset with axes specified in axlist
. Each axis must be a subtype of CubeAxis
. A new empty Zarr array will be created and can serve as a sink for mapCube
operations.
Keyword arguments
path=""
location where the new cube is stored
T=Union{Float32,Missing}
data type of the target cube
chunksize = ntuple(i->length(axlist[i]),length(axlist))
chunk sizes of the array
chunkoffset = ntuple(i->0,length(axlist))
offsets of the chunks
persist::Bool=true
shall the disk data be garbage-collected when the cube goes out of scope?
overwrite::Bool=false
overwrite cube if it already exists
properties=Dict{String,Any}()
additional cube properties
globalproperties=Dict{String,Any}
global attributes to be added to the dataset
fillvalue= T>:Missing ? defaultfillval(Base.nonmissingtype(T)) : nothing
fill value
datasetaxis="Variables"
special treatment of a categorical axis that gets written into separate zarr arrays
layername="layer"
Fallback name of the variable stored in the dataset if no datasetaxis
is found
source
',5))]),e("details",is,[e("summary",null,[s[149]||(s[149]=e("a",{id:"YAXArrays.Datasets.getarrayinfo-Tuple{Any, Any}",href:"#YAXArrays.Datasets.getarrayinfo-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.getarrayinfo")],-1)),s[150]||(s[150]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[151]||(s[151]=e("p",null,"Extract necessary information to create a YAXArrayBase dataset from a name and YAXArray pair",-1)),s[152]||(s[152]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L530-L532",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",ls,[e("summary",null,[s[153]||(s[153]=e("a",{id:"YAXArrays.Datasets.testrange-Tuple{Any}",href:"#YAXArrays.Datasets.testrange-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.testrange")],-1)),s[154]||(s[154]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=e("p",null,"Test if data in x can be approximated by a step range",-1)),s[156]||(s[156]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L312",target:"_blank",rel:"noreferrer"},"source")],-1))])])}const ks=n(d,[["render",ns]]);export{us as __pageData,ks as default};
diff --git a/previews/PR486/assets/api.md.CRtEnxW2.lean.js b/previews/PR486/assets/api.md.CRtEnxW2.lean.js
new file mode 100644
index 00000000..b4fa9c86
--- /dev/null
+++ b/previews/PR486/assets/api.md.CRtEnxW2.lean.js
@@ -0,0 +1,5 @@
+import{_ as n,c as o,j as e,a,G as i,a2 as l,B as r,o as p}from"./chunks/framework.piKCME0r.js";const us=JSON.parse('{"title":"API Reference","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),d={name:"api.md"},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""};function ns(os,s,rs,ps,ds,hs){const t=r("Badge");return p(),o("div",null,[s[157]||(s[157]=e("h1",{id:"API-Reference",tabindex:"-1"},[a("API Reference "),e("a",{class:"header-anchor",href:"#API-Reference","aria-label":'Permalink to "API Reference {#API-Reference}"'},"")],-1)),s[158]||(s[158]=e("p",null,"This section describes all available functions of this package.",-1)),s[159]||(s[159]=e("h2",{id:"Public-API",tabindex:"-1"},[a("Public API "),e("a",{class:"header-anchor",href:"#Public-API","aria-label":'Permalink to "Public API {#Public-API}"'},"")],-1)),e("details",h,[e("summary",null,[s[0]||(s[0]=e("a",{id:"YAXArrays.getAxis-Tuple{Any, Any}",href:"#YAXArrays.getAxis-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.getAxis")],-1)),s[1]||(s[1]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[2]||(s[2]=l('Given an Axis description and a cube, returns the corresponding axis of the cube. The Axis description can be:
source
',4))]),e("details",c,[e("summary",null,[s[3]||(s[3]=e("a",{id:"YAXArrays.Cubes",href:"#YAXArrays.Cubes"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes")],-1)),s[4]||(s[4]=a()),i(t,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),s[5]||(s[5]=e("p",null,"The functions provided by YAXArrays are supposed to work on different types of cubes. This module defines the interface for all Data types that",-1)),s[6]||(s[6]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L1-L4",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",u,[e("summary",null,[s[7]||(s[7]=e("a",{id:"YAXArrays.Cubes.YAXArray",href:"#YAXArrays.Cubes.YAXArray"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.YAXArray")],-1)),s[8]||(s[8]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[9]||(s[9]=l('An array labelled with named axes that have values associated with them. It can wrap normal arrays or, more typically DiskArrays.
Fields
axes
: Tuple
of Dimensions containing the Axes of the Cube
data
: length(axes)-dimensional array which holds the data, this can be a lazy DiskArray
properties
: Metadata properties describing the content of the data
chunks
: Representation of the chunking of the data
cleaner
: Cleaner objects to track which objects to tidy up when the YAXArray goes out of scope
source
',5))]),e("details",k,[e("summary",null,[s[10]||(s[10]=e("a",{id:"YAXArrays.Cubes.caxes",href:"#YAXArrays.Cubes.caxes"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.caxes")],-1)),s[11]||(s[11]=a()),i(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[12]||(s[12]=e("p",null,"Returns the axes of a Cube",-1)),s[13]||(s[13]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L27",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",b,[e("summary",null,[s[14]||(s[14]=e("a",{id:"YAXArrays.Cubes.caxes-Tuple{DimensionalData.Dimensions.Dimension}",href:"#YAXArrays.Cubes.caxes-Tuple{DimensionalData.Dimensions.Dimension}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.caxes")],-1)),s[15]||(s[15]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=l('Embeds Cube inside a new Cube
source
',3))]),e("details",y,[e("summary",null,[s[17]||(s[17]=e("a",{id:"YAXArrays.Cubes.concatenatecubes-Tuple{Any, DimensionalData.Dimensions.Dimension}",href:"#YAXArrays.Cubes.concatenatecubes-Tuple{Any, DimensionalData.Dimensions.Dimension}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.concatenatecubes")],-1)),s[18]||(s[18]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=l('julia function concatenateCubes (cubelist, cataxis :: CategoricalAxis )
Concatenates a vector of datacubes that have identical axes to a new single cube along the new axis cataxis
source
',3))]),e("details",g,[e("summary",null,[s[20]||(s[20]=e("a",{id:"YAXArrays.Cubes.readcubedata-Tuple{Any}",href:"#YAXArrays.Cubes.readcubedata-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.readcubedata")],-1)),s[21]||(s[21]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=l('Given any array implementing the YAXArray interface it returns an in-memory YAXArray
from it.
source
',3))]),e("details",f,[e("summary",null,[s[23]||(s[23]=e("a",{id:"YAXArrays.Cubes.setchunks-Tuple{YAXArray, Any}",href:"#YAXArrays.Cubes.setchunks-Tuple{YAXArray, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.setchunks")],-1)),s[24]||(s[24]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=l('julia setchunks (c :: YAXArray ,chunks)
Resets the chunks of a YAXArray and returns a new YAXArray. Note that this will not change the chunking of the underlying data itself, it will just make the data "look" like it had a different chunking. If you need a persistent on-disk representation of this chunking, use savecube
on the resulting array. The chunks
argument can take one of the following forms:
a DiskArrays.GridChunks
object
a tuple specifying the chunk size along each dimension
an AbstractDict or NamedTuple mapping one or more axis names to chunk sizes
source
',4))]),e("details",A,[e("summary",null,[s[26]||(s[26]=e("a",{id:"YAXArrays.Cubes.subsetcube",href:"#YAXArrays.Cubes.subsetcube"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.subsetcube")],-1)),s[27]||(s[27]=a()),i(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[28]||(s[28]=e("p",null,"This function calculates a subset of a cube's data",-1)),s[29]||(s[29]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/Cubes/Cubes.jl#L22-L24",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",m,[e("summary",null,[s[30]||(s[30]=e("a",{id:"YAXArrays.DAT.InDims",href:"#YAXArrays.DAT.InDims"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.InDims")],-1)),s[31]||(s[31]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=l('julia InDims (axisdesc ... ; ... )
Creates a description of an Input Data Cube for cube operations. Takes a single or multiple axis descriptions as first arguments. Alternatively a MovingWindow(@ref) struct can be passed to include neighbour slices of one or more axes in the computation. Axes can be specified by their name (String), through an Axis type, or by passing a concrete axis.
Keyword arguments
artype
how shall the array be represented in the inner function. Defaults to Array
, alternatives are DataFrame
or AsAxisArray
filter
define some filter to skip the computation, e.g. when all values are missing. Defaults to AllMissing()
, possible values are AnyMissing()
, AnyOcean()
, StdZero()
, NValid(n)
(for at least n non-missing elements). It is also possible to provide a custom one-argument function that takes the array and returns true
if the compuation shall be skipped and false
otherwise.
window_oob_value
if one of the input dimensions is a MowingWindow, this value will be used to fill out-of-bounds areas
source
',5))]),e("details",E,[e("summary",null,[s[33]||(s[33]=e("a",{id:"YAXArrays.DAT.MovingWindow",href:"#YAXArrays.DAT.MovingWindow"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.MovingWindow")],-1)),s[34]||(s[34]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=l('julia MovingWindow (desc, pre, after)
Constructs a MovingWindow
object to be passed to an InDims
constructor to define that the axis in desc
shall participate in the inner function (i.e. shall be looped over), but inside the inner function pre
values before and after
values after the center value will be passed as well.
For example passing MovingWindow("Time", 2, 0)
will loop over the time axis and always pass the current time step plus the 2 previous steps. So in the inner function the array will have an additional dimension of size 3.
source
',4))]),e("details",j,[e("summary",null,[s[36]||(s[36]=e("a",{id:"YAXArrays.DAT.OutDims-Tuple",href:"#YAXArrays.DAT.OutDims-Tuple"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.OutDims")],-1)),s[37]||(s[37]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[38]||(s[38]=l('julia OutDims (axisdesc; ... )
Creates a description of an Output Data Cube for cube operations. Takes a single or a Vector/Tuple of axes as first argument. Axes can be specified by their name (String), through an Axis type, or by passing a concrete axis.
axisdesc
: List of input axis names
backend
: specifies the dataset backend to write data to, must be either :auto or a key in YAXArrayBase.backendlist
update
: specifies wether the function operates inplace or if an output is returned
artype
: specifies the Array type inside the inner function that is mapped over
chunksize
: A Dict specifying the chunksizes for the output dimensions of the cube, or :input
to copy chunksizes from input cube axes or :max
to not chunk the inner dimensions
outtype
: force the output type to a specific type, defaults to Any
which means that the element type of the first input cube is used
source
',4))]),e("details",C,[e("summary",null,[s[39]||(s[39]=e("a",{id:"YAXArrays.DAT.CubeTable-Tuple{}",href:"#YAXArrays.DAT.CubeTable-Tuple{}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.CubeTable")],-1)),s[40]||(s[40]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=l('Function to turn a DataCube object into an iterable table. Takes a list of as arguments, specified as a name=cube
expression. For example CubeTable(data=cube1,country=cube2)
would generate a Table with the entries data
and country
, where data
contains the values of cube1
and country
the values of cube2
. The cubes are matched and broadcasted along their axes like in mapCube
.
source
',3))]),e("details",D,[e("summary",null,[s[42]||(s[42]=e("a",{id:"YAXArrays.DAT.cubefittable-Tuple{Any, Any, Any}",href:"#YAXArrays.DAT.cubefittable-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.cubefittable")],-1)),s[43]||(s[43]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[44]||(s[44]=l('julia cubefittable (tab,o,fitsym;post = getpostfunction (o),kwargs ... )
Executes fittable
on the CubeTable
tab
with the (Weighted-)OnlineStat o
, looping through the values specified by fitsym
. Finally, writes the results from the TableAggregator
to an output data cube.
source
',3))]),e("details",v,[e("summary",null,[s[45]||(s[45]=e("a",{id:"YAXArrays.DAT.fittable-Tuple{YAXArrays.DAT.CubeIterator, Any, Any}",href:"#YAXArrays.DAT.fittable-Tuple{YAXArrays.DAT.CubeIterator, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.fittable")],-1)),s[46]||(s[46]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[47]||(s[47]=l('julia fittable (tab,o,fitsym;by = (),weight = nothing )
Loops through an iterable table tab
and thereby fitting an OnlineStat o
with the values specified through fitsym
. Optionally one can specify a field (or tuple) to group by. Any groupby specifier can either be a symbol denoting the entry to group by or an anynymous function calculating the group from a table row.
For example the following would caluclate a weighted mean over a cube weighted by grid cell area and grouped by country and month:
julia fittable (iter,WeightedMean, :tair ,weight = (i -> abs ( cosd (i . lat))),by = (i -> month (i . time), :country ))
source
',5))]),e("details",T,[e("summary",null,[s[48]||(s[48]=e("a",{id:"YAXArrays.DAT.mapCube-Tuple{Function, Dataset, Vararg{Any}}",href:"#YAXArrays.DAT.mapCube-Tuple{Function, Dataset, Vararg{Any}}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.mapCube")],-1)),s[49]||(s[49]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[50]||(s[50]=l('julia mapCube (fun, cube, addargs ... ;kwargs ... )
Map a given function fun
over slices of all cubes of the dataset ds
. Use InDims to discribe the input dimensions and OutDims to describe the output dimensions of the function.
For Datasets, only one output cube can be specified. In contrast to the mapCube function for cubes, additional arguments for the inner function should be set as keyword arguments.
For the specific keyword arguments see the docstring of the mapCube function for cubes.
source
',5))]),e("details",F,[e("summary",null,[s[51]||(s[51]=e("a",{id:"YAXArrays.DAT.mapCube-Tuple{Function, Tuple, Vararg{Any}}",href:"#YAXArrays.DAT.mapCube-Tuple{Function, Tuple, Vararg{Any}}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.mapCube")],-1)),s[52]||(s[52]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[53]||(s[53]=l('julia mapCube (fun, cube, addargs ... ;kwargs ... )
Map a given function fun
over slices of the data cube cube
. The additional arguments addargs
will be forwarded to the inner function fun
. Use InDims to discribe the input dimensions and OutDims to describe the output dimensions of the function.
Keyword arguments
max_cache=YAXDefaults.max_cache
Float64 maximum size of blocks that are read into memory in bits e.g. max_cache=5.0e8
. Or String. e.g. max_cache="10MB"
or max_cache=1GB
defaults to approx 10Mb.
indims::InDims
List of input cube descriptors of type InDims
for each input data cube.
outdims::OutDims
List of output cube descriptors of type OutDims
for each output cube.
inplace
does the function write to an output array inplace or return a single value> defaults to true
ispar
boolean to determine if parallelisation should be applied, defaults to true
if workers are available.
showprog
boolean indicating if a ProgressMeter shall be shown
include_loopvars
boolean to indicate if the varoables looped over should be added as function arguments
nthreads
number of threads for the computation, defaults to Threads.nthreads for every worker.
loopchunksize
determines the chunk sizes of variables which are looped over, a dict
kwargs
additional keyword arguments are passed to the inner function
The first argument is always the function to be applied, the second is the input cube or a tuple of input cubes if needed.
source
',6))]),e("details",X,[e("summary",null,[s[54]||(s[54]=e("a",{id:"YAXArrays.Datasets.Dataset",href:"#YAXArrays.Datasets.Dataset"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Dataset")],-1)),s[55]||(s[55]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=e("p",null,[a("Dataset object which stores an "),e("code",null,"OrderedDict"),a(" of YAXArrays with Symbol keys. A dictionary of CubeAxes and a Dictionary of general properties. A dictionary can hold cubes with differing axes. But it will share the common axes between the subcubes.")],-1)),s[57]||(s[57]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L18-L22",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Y,[e("summary",null,[s[58]||(s[58]=e("a",{id:"YAXArrays.Datasets.Dataset-Tuple{}",href:"#YAXArrays.Datasets.Dataset-Tuple{}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Dataset")],-1)),s[59]||(s[59]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[60]||(s[60]=l('julia Dataset (; properties = Dict{String,Any}, cubes ... )
Construct a YAXArray Dataset with global attributes properties
a and a list of named YAXArrays cubes...
source
',3))]),e("details",x,[e("summary",null,[s[61]||(s[61]=e("a",{id:"YAXArrays.Datasets.Cube-Tuple{Dataset}",href:"#YAXArrays.Datasets.Cube-Tuple{Dataset}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.Cube")],-1)),s[62]||(s[62]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[63]||(s[63]=l('julia Cube (ds :: Dataset ; joinname = "Variables" )
Construct a single YAXArray from the dataset ds
by concatenating the cubes in the datset on the joinname
dimension.
source
',3))]),e("details",w,[e("summary",null,[s[64]||(s[64]=e("a",{id:"YAXArrays.Datasets.open_dataset-Tuple{Any}",href:"#YAXArrays.Datasets.open_dataset-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.open_dataset")],-1)),s[65]||(s[65]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[66]||(s[66]=l('julia open_dataset (g; skip_keys = (), driver = :all )
Open the dataset at g
with the given driver
. The default driver will search for available drivers and tries to detect the useable driver from the filename extension.
Keyword arguments
skip_keys
are passed as symbols, i.e., skip_keys = (:a, :b)
driver=:all
, common options are :netcdf
or :zarr
.
Example:
julia ds = open_dataset (f, driver = :zarr , skip_keys = ( :c ,))
source
',7))]),e("details",L,[e("summary",null,[s[67]||(s[67]=e("a",{id:'YAXArrays.Datasets.open_mfdataset-Tuple{DimensionalData.DimVector{var"#s34", D, R, A} where {var"#s34"<:AbstractString, D<:Tuple, R<:Tuple, A<:AbstractVector{var"#s34"}}}',href:'#YAXArrays.Datasets.open_mfdataset-Tuple{DimensionalData.DimVector{var"#s34", D, R, A} where {var"#s34"<:AbstractString, D<:Tuple, R<:Tuple, A<:AbstractVector{var"#s34"}}}'},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.open_mfdataset")],-1)),s[68]||(s[68]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[69]||(s[69]=l(`julia open_mfdataset (files :: DD.DimVector{<:AbstractString} ; kwargs ... )
Opens and concatenates a list of dataset paths along the dimension specified in files
. This method can be used when the generic glob-based version of open_mfdataset fails or is too slow. For example, to concatenate a list of annual NetCDF files along the time
dimension, one can use:
julia files = [ "1990.nc" , "1991.nc" , "1992.nc" ]
+open_mfdataset (DD . DimArray (files, YAX . time ()))
alternatively, if the dimension to concatenate along does not exist yet, the dimension provided in the input arg is used:
julia files = [ "a.nc" , "b.nc" , "c.nc" ]
+open_mfdataset (DD . DimArray (files, DD . Dim{:NewDim} ([ "a" , "b" , "c" ])))
source
`,6))]),e("details",M,[e("summary",null,[s[70]||(s[70]=e("a",{id:"YAXArrays.Datasets.savecube-Tuple{Any, AbstractString}",href:"#YAXArrays.Datasets.savecube-Tuple{Any, AbstractString}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.savecube")],-1)),s[71]||(s[71]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[72]||(s[72]=l('julia savecube (cube,name :: String )
Save a YAXArray
to the path
.
Extended Help
The keyword arguments are:
name
:
datasetaxis="Variables"
special treatment of a categorical axis that gets written into separate zarr arrays
max_cache
: The number of bits that are used as cache for the data handling.
backend
: The backend, that is used to save the data. Falls back to searching the backend according to the extension of the path.
driver
: The same setting as backend
.
overwrite::Bool=false
overwrite cube if it already exists
source
',6))]),e("details",B,[e("summary",null,[s[73]||(s[73]=e("a",{id:"YAXArrays.Datasets.savedataset-Tuple{Dataset}",href:"#YAXArrays.Datasets.savedataset-Tuple{Dataset}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.savedataset")],-1)),s[74]||(s[74]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[75]||(s[75]=l('julia savedataset (ds :: Dataset ; path = "" , persist = nothing , overwrite = false , append = false , skeleton = false , backend = :all , driver = backend, max_cache = 5e8 , writefac = 4.0 )
Saves a Dataset into a file at path
with the format given by driver
, i.e., driver=:netcdf
or driver=:zarr
.
Warning
overwrite=true
, deletes ALL your data and it will create a new file.
source
',4))]),e("details",O,[e("summary",null,[s[76]||(s[76]=e("a",{id:"YAXArrays.Datasets.to_dataset-Tuple{Any}",href:"#YAXArrays.Datasets.to_dataset-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.to_dataset")],-1)),s[77]||(s[77]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[78]||(s[78]=l('julia to_dataset (c;datasetaxis = "Variables" , layername = "layer" )
Convert a Data Cube into a Dataset. It is possible to treat one of the Cube's axes as a datasetaxis
i.e. the cube will be split into different parts that become variables in the Dataset. If no such axis is specified or found, there will only be a single variable in the dataset with the name layername
.
source
',3))]),s[160]||(s[160]=e("h2",{id:"Internal-API",tabindex:"-1"},[a("Internal API "),e("a",{class:"header-anchor",href:"#Internal-API","aria-label":'Permalink to "Internal API {#Internal-API}"'},"")],-1)),e("details",I,[e("summary",null,[s[79]||(s[79]=e("a",{id:"YAXArrays.YAXDefaults",href:"#YAXArrays.YAXDefaults"},[e("span",{class:"jlbinding"},"YAXArrays.YAXDefaults")],-1)),s[80]||(s[80]=a()),i(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[81]||(s[81]=l('Default configuration for YAXArrays, has the following fields:
workdir[]::String = "./"
The default location for temporary cubes.
recal[]::Bool = false
set to true if you want @loadOrGenerate
to always recalculate the results.
chunksize[]::Any = :input
Set the default output chunksize.
max_cache[]::Float64 = 1e8
The maximum cache used by mapCube.
cubedir[]::""
the default location for Cube()
without an argument.
subsetextensions::Array{Any} = []
List of registered functions, that convert subsetting input into dimension boundaries.
source
',3))]),e("details",J,[e("summary",null,[s[82]||(s[82]=e("a",{id:"YAXArrays.findAxis-Tuple{Any, Any}",href:"#YAXArrays.findAxis-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.findAxis")],-1)),s[83]||(s[83]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[84]||(s[84]=l('Internal function
Extended Help
Given an Axis description and a cube return the index of the Axis.
The Axis description can be:
source
',7))]),e("details",P,[e("summary",null,[s[85]||(s[85]=e("a",{id:"YAXArrays.getOutAxis-NTuple{5, Any}",href:"#YAXArrays.getOutAxis-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.getOutAxis")],-1)),s[86]||(s[86]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[87]||(s[87]=l('source
',2))]),e("details",q,[e("summary",null,[s[88]||(s[88]=e("a",{id:"YAXArrays.get_descriptor-Tuple{String}",href:"#YAXArrays.get_descriptor-Tuple{String}"},[e("span",{class:"jlbinding"},"YAXArrays.get_descriptor")],-1)),s[89]||(s[89]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[90]||(s[90]=l('Get the descriptor of an Axis. This is used to dispatch on the descriptor.
source
',3))]),e("details",z,[e("summary",null,[s[91]||(s[91]=e("a",{id:"YAXArrays.match_axis-Tuple{YAXArrays.ByName, Any}",href:"#YAXArrays.match_axis-Tuple{YAXArrays.ByName, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.match_axis")],-1)),s[92]||(s[92]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[93]||(s[93]=l(`Internal function
Extended Help
Match the Axis based on the AxisDescriptor.
+This is used to find different axes and to make certain axis description the same.
+For example to disregard differences of captialisation.
source
`,5))]),e("details",N,[e("summary",null,[s[94]||(s[94]=e("a",{id:"YAXArrays.Cubes.CleanMe",href:"#YAXArrays.Cubes.CleanMe"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.CleanMe")],-1)),s[95]||(s[95]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[96]||(s[96]=l('julia mutable struct CleanMe
Struct which describes data paths and their persistency. Non-persistend paths/files are removed at finalize step
source
',3))]),e("details",S,[e("summary",null,[s[97]||(s[97]=e("a",{id:"YAXArrays.Cubes.clean-Tuple{YAXArrays.Cubes.CleanMe}",href:"#YAXArrays.Cubes.clean-Tuple{YAXArrays.Cubes.CleanMe}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.clean")],-1)),s[98]||(s[98]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[99]||(s[99]=l('finalizer function for CleanMe struct. The main process removes all directories/files which are not persistent.
source
',3))]),e("details",R,[e("summary",null,[s[100]||(s[100]=e("a",{id:"YAXArrays.Cubes.copydata-Tuple{Any, Any, Any}",href:"#YAXArrays.Cubes.copydata-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.copydata")],-1)),s[101]||(s[101]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[102]||(s[102]=l('julia copydata (outar, inar, copybuf)
Internal function which copies the data from the input inar
into the output outar
at the copybuf
positions.
source
',3))]),e("details",V,[e("summary",null,[s[103]||(s[103]=e("a",{id:"YAXArrays.Cubes.optifunc-NTuple{7, Any}",href:"#YAXArrays.Cubes.optifunc-NTuple{7, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.optifunc")],-1)),s[104]||(s[104]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[105]||(s[105]=l('julia optifunc (s, maxbuf, incs, outcs, insize, outsize, writefac)
Internal
This function is going to be minimized to detect the best possible chunk setting for the rechunking of the data.
source
',4))]),e("details",G,[e("summary",null,[s[106]||(s[106]=e("a",{id:"YAXArrays.DAT.DATConfig",href:"#YAXArrays.DAT.DATConfig"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.DATConfig")],-1)),s[107]||(s[107]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[108]||(s[108]=l('Configuration object of a DAT process. This holds all necessary information to perform the calculations. It contains the following fields:
incubes::NTuple{NIN, YAXArrays.DAT.InputCube} where NIN
: The input data cubes
outcubes::NTuple{NOUT, YAXArrays.DAT.OutputCube} where NOUT
: The output data cubes
allInAxes::Vector
: List of all axes of the input cubes
LoopAxes::Vector
: List of axes that are looped through
ispar::Bool
: Flag whether the computation is parallelized
loopcachesize::Vector{Int64}
:
allow_irregular_chunks::Bool
:
max_cache::Any
: Maximal size of the in memory cache
fu::Any
: Inner function which is computed
inplace::Bool
: Flag whether the computation happens in place
include_loopvars::Bool
:
ntr::Any
:
do_gc::Bool
: Flag if GC should be called explicitly. Probably necessary for many runs in Julia 1.9
addargs::Any
: Additional arguments for the inner function
kwargs::Any
: Additional keyword arguments for the inner function
source
',3))]),e("details",W,[e("summary",null,[s[109]||(s[109]=e("a",{id:"YAXArrays.DAT.InputCube",href:"#YAXArrays.DAT.InputCube"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.InputCube")],-1)),s[110]||(s[110]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[111]||(s[111]=l('Internal representation of an input cube for DAT operations
cube
: The input data
desc
: The input description given by the user/registration
axesSmall
: List of axes that were actually selected through the description
icolon
colonperm
loopinds
: Indices of loop axes that this cube does not contain, i.e. broadcasts
cachesize
: Number of elements to keep in cache along each axis
window
iwindow
windowloopinds
iall
source
',3))]),e("details",U,[e("summary",null,[s[112]||(s[112]=e("a",{id:"YAXArrays.DAT.OutputCube",href:"#YAXArrays.DAT.OutputCube"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.OutputCube")],-1)),s[113]||(s[113]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[114]||(s[114]=l('Internal representation of an output cube for DAT operations
Fields
cube
: The actual outcube cube, once it is generated
cube_unpermuted
: The unpermuted output cube
desc
: The description of the output axes as given by users or registration
axesSmall
: The list of output axes determined through the description
allAxes
: List of all the axes of the cube
loopinds
: Index of the loop axes that are broadcasted for this output cube
innerchunks
outtype
: Elementtype of the outputcube
source
',4))]),e("details",K,[e("summary",null,[s[115]||(s[115]=e("a",{id:"YAXArrays.DAT.YAXColumn",href:"#YAXArrays.DAT.YAXColumn"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.YAXColumn")],-1)),s[116]||(s[116]=a()),i(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[117]||(s[117]=l('A struct representing a single column of a YAXArray partitioned Table # Fields
source
',4))]),e("details",$,[e("summary",null,[s[118]||(s[118]=e("a",{id:"YAXArrays.DAT.cmpcachmisses-Tuple{Any, Any}",href:"#YAXArrays.DAT.cmpcachmisses-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.cmpcachmisses")],-1)),s[119]||(s[119]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[120]||(s[120]=e("p",null,"Function that compares two cache miss specifiers by their importance",-1)),s[121]||(s[121]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L958-L960",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",H,[e("summary",null,[s[122]||(s[122]=e("a",{id:"YAXArrays.DAT.getFrontPerm-Tuple{Any, Any}",href:"#YAXArrays.DAT.getFrontPerm-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getFrontPerm")],-1)),s[123]||(s[123]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[124]||(s[124]=e("p",null,"Calculate an axis permutation that brings the wanted dimensions to the front",-1)),s[125]||(s[125]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L1203",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Z,[e("summary",null,[s[126]||(s[126]=e("a",{id:"YAXArrays.DAT.getLoopCacheSize-NTuple{5, Any}",href:"#YAXArrays.DAT.getLoopCacheSize-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getLoopCacheSize")],-1)),s[127]||(s[127]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e("p",null,"Calculate optimal Cache size to DAT operation",-1)),s[129]||(s[129]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DAT/DAT.jl#L1057",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",Q,[e("summary",null,[s[130]||(s[130]=e("a",{id:"YAXArrays.DAT.getOuttype-Tuple{Int64, Any}",href:"#YAXArrays.DAT.getOuttype-Tuple{Int64, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getOuttype")],-1)),s[131]||(s[131]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[132]||(s[132]=l('julia getOuttype (outtype, cdata)
Internal function
Get the element type for the output cube
source
',4))]),e("details",_,[e("summary",null,[s[133]||(s[133]=e("a",{id:"YAXArrays.DAT.getloopchunks-Tuple{YAXArrays.DAT.DATConfig}",href:"#YAXArrays.DAT.getloopchunks-Tuple{YAXArrays.DAT.DATConfig}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.getloopchunks")],-1)),s[134]||(s[134]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[135]||(s[135]=l('julia getloopchunks (dc :: DATConfig )
Internal function
Returns the chunks that can be looped over toghether for all dimensions. \nThis computation of the size of the chunks is handled by [`DiskArrays.approx_chunksize`](@ref)
source
',4))]),e("details",ss,[e("summary",null,[s[136]||(s[136]=e("a",{id:"YAXArrays.DAT.permuteloopaxes-Tuple{Any}",href:"#YAXArrays.DAT.permuteloopaxes-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.DAT.permuteloopaxes")],-1)),s[137]||(s[137]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[138]||(s[138]=l('Internal function
Permute the dimensions of the cube, so that the axes that are looped through are in the first positions. This is necessary for a faster looping through the data.
source
',4))]),e("details",es,[e("summary",null,[s[139]||(s[139]=e("a",{id:"YAXArrays.Cubes.setchunks-Tuple{Dataset, Any}",href:"#YAXArrays.Cubes.setchunks-Tuple{Dataset, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Cubes.setchunks")],-1)),s[140]||(s[140]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[141]||(s[141]=l('julia setchunks (c :: Dataset ,chunks)
Resets the chunks of all or a subset YAXArrays in the dataset and returns a new Dataset. Note that this will not change the chunking of the underlying data itself, it will just make the data "look" like it had a different chunking. If you need a persistent on-disk representation of this chunking, use savedataset
on the resulting array. The chunks
argument can take one of the following forms:
a NamedTuple or AbstractDict mapping from variable name to a description of the desired variable chunks
a NamedTuple or AbstractDict mapping from dimension name to a description of the desired variable chunks
a description of the desired variable chunks applied to all members of the Dataset
where a description of the desired variable chunks can take one of the following forms:
a DiskArrays.GridChunks
object
a tuple specifying the chunk size along each dimension
an AbstractDict or NamedTuple mapping one or more axis names to chunk sizes
source
',6))]),e("details",as,[e("summary",null,[s[142]||(s[142]=e("a",{id:"YAXArrays.Datasets.collectfromhandle-Tuple{Any, Any, Any}",href:"#YAXArrays.Datasets.collectfromhandle-Tuple{Any, Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.collectfromhandle")],-1)),s[143]||(s[143]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[144]||(s[144]=e("p",null,"Extracts a YAXArray from a dataset handle that was just created from a arrayinfo",-1)),s[145]||(s[145]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L561-L563",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",ts,[e("summary",null,[s[146]||(s[146]=e("a",{id:"YAXArrays.Datasets.createdataset-Tuple{Any, Any}",href:"#YAXArrays.Datasets.createdataset-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.createdataset")],-1)),s[147]||(s[147]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[148]||(s[148]=l('julia function createdataset (DS :: Type ,axlist; kwargs ... )
Creates a new dataset with axes specified in axlist
. Each axis must be a subtype of CubeAxis
. A new empty Zarr array will be created and can serve as a sink for mapCube
operations.
Keyword arguments
path=""
location where the new cube is stored
T=Union{Float32,Missing}
data type of the target cube
chunksize = ntuple(i->length(axlist[i]),length(axlist))
chunk sizes of the array
chunkoffset = ntuple(i->0,length(axlist))
offsets of the chunks
persist::Bool=true
shall the disk data be garbage-collected when the cube goes out of scope?
overwrite::Bool=false
overwrite cube if it already exists
properties=Dict{String,Any}()
additional cube properties
globalproperties=Dict{String,Any}
global attributes to be added to the dataset
fillvalue= T>:Missing ? defaultfillval(Base.nonmissingtype(T)) : nothing
fill value
datasetaxis="Variables"
special treatment of a categorical axis that gets written into separate zarr arrays
layername="layer"
Fallback name of the variable stored in the dataset if no datasetaxis
is found
source
',5))]),e("details",is,[e("summary",null,[s[149]||(s[149]=e("a",{id:"YAXArrays.Datasets.getarrayinfo-Tuple{Any, Any}",href:"#YAXArrays.Datasets.getarrayinfo-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.getarrayinfo")],-1)),s[150]||(s[150]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[151]||(s[151]=e("p",null,"Extract necessary information to create a YAXArrayBase dataset from a name and YAXArray pair",-1)),s[152]||(s[152]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L530-L532",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",ls,[e("summary",null,[s[153]||(s[153]=e("a",{id:"YAXArrays.Datasets.testrange-Tuple{Any}",href:"#YAXArrays.Datasets.testrange-Tuple{Any}"},[e("span",{class:"jlbinding"},"YAXArrays.Datasets.testrange")],-1)),s[154]||(s[154]=a()),i(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=e("p",null,"Test if data in x can be approximated by a step range",-1)),s[156]||(s[156]=e("p",null,[e("a",{href:"https://github.com/JuliaDataCubes/YAXArrays.jl/blob/dc38fbff028e43cf42daaf13dd96f95cfec895e6/src/DatasetAPI/Datasets.jl#L312",target:"_blank",rel:"noreferrer"},"source")],-1))])])}const ks=n(d,[["render",ns]]);export{us as __pageData,ks as default};
diff --git a/previews/PR486/assets/app.sPp5m4iP.js b/previews/PR486/assets/app.sPp5m4iP.js
new file mode 100644
index 00000000..d40e0028
--- /dev/null
+++ b/previews/PR486/assets/app.sPp5m4iP.js
@@ -0,0 +1 @@
+import{R as p}from"./chunks/theme.ChQEK1xa.js";import{R as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as P,u as R,v as w,s as y,ag as C,ah as b,ai as E,a5 as S}from"./chunks/framework.piKCME0r.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp};
diff --git a/previews/PR486/assets/chunks/@localSearchIndexroot.DSCdH7hL.js b/previews/PR486/assets/chunks/@localSearchIndexroot.DSCdH7hL.js
new file mode 100644
index 00000000..44295709
--- /dev/null
+++ b/previews/PR486/assets/chunks/@localSearchIndexroot.DSCdH7hL.js
@@ -0,0 +1 @@
+const e='{"documentCount":116,"nextId":116,"documentIds":{"0":"/YAXArrays.jl/previews/PR486/UserGuide/cache.html#Caching-YAXArrays","1":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Chunk-YAXArrays","2":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Chunking-YAXArrays","3":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Chunking-Datasets","4":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Set-Chunks-by-Axis","5":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Set-chunking-by-Variable","6":"/YAXArrays.jl/previews/PR486/UserGuide/chunk.html#Set-chunking-for-all-variables","7":"/YAXArrays.jl/previews/PR486/UserGuide/combine.html#Combine-YAXArrays","8":"/YAXArrays.jl/previews/PR486/UserGuide/combine.html#cat-along-an-existing-dimension","9":"/YAXArrays.jl/previews/PR486/UserGuide/combine.html#concatenatecubes-to-a-new-dimension","10":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Compute-YAXArrays","11":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Modify-elements-of-a-YAXArray","12":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#arithmetics","13":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#map","14":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#mapslices","15":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#mapCube","16":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Operations-over-several-YAXArrays","17":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#OutDims-and-YAXArray-Properties","18":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#One-InDims-to-many-OutDims","19":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Many-InDims-to-many-OutDims","20":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Specify-path-in-OutDims","21":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Different-InDims-names","22":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Creating-a-vector-array","23":"/YAXArrays.jl/previews/PR486/UserGuide/compute.html#Distributed-Computation","24":"/YAXArrays.jl/previews/PR486/UserGuide/convert.html#Convert-YAXArrays","25":"/YAXArrays.jl/previews/PR486/UserGuide/convert.html#Convert-Base.Array","26":"/YAXArrays.jl/previews/PR486/UserGuide/convert.html#Convert-Raster","27":"/YAXArrays.jl/previews/PR486/UserGuide/convert.html#Convert-DimArray","28":"/YAXArrays.jl/previews/PR486/UserGuide/create.html#Create-YAXArrays-and-Datasets","29":"/YAXArrays.jl/previews/PR486/UserGuide/create.html#Create-a-YAXArray","30":"/YAXArrays.jl/previews/PR486/UserGuide/create.html#Create-a-Dataset","31":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Frequently-Asked-Questions-(FAQ)","32":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Extract-the-axes-names-from-a-Cube","33":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#rebuild","34":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Obtain-values-from-axes-and-data-from-the-cube","35":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#How-do-I-concatenate-cubes","36":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#How-do-I-subset-a-YAXArray-(-Cube-)-or-Dataset?","37":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Subsetting-a-YAXArray","38":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Subsetting-a-Dataset","39":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Subsetting-a-Dataset-whose-variables-share-all-their-dimensions","40":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Subsetting-a-Dataset-whose-variables-share-some-but-not-all-of-their-dimensions","41":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#How-do-I-apply-map-algebra?","42":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#How-do-I-use-the-CubeTable-function?","43":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#How-do-I-assign-variable-names-to-YAXArrays-in-a-Dataset","44":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#One-variable-name","45":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Multiple-variable-names","46":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Ho-do-I-construct-a-Dataset-from-a-TimeArray","47":"/YAXArrays.jl/previews/PR486/UserGuide/faq.html#Create-a-YAXArray-with-unions-containing-Strings","48":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#Group-YAXArrays-and-Datasets","49":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#Seasonal-Averages-from-Time-Series-of-Monthly-Means","50":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#Download-the-data","51":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#GroupBy:-seasons","52":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#dropdims","53":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#seasons","54":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#GroupBy:-weight","55":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#weights","56":"/YAXArrays.jl/previews/PR486/UserGuide/group.html#weighted-seasons","57":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#Read-YAXArrays-and-Datasets","58":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#open-dataset","59":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#Read-Zarr","60":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#Read-NetCDF","61":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#Read-GDAL-(GeoTIFF,-GeoJSON)","62":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#Load-data-into-memory","63":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#readcubedata","64":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#open-mfdataset","65":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#along-a-new-dimension","66":"/YAXArrays.jl/previews/PR486/UserGuide/read.html#along-a-existing-dimension","67":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Select-YAXArrays-and-Datasets","68":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Select-a-YAXArray","69":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Select-elements","70":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Select-ranges","71":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Closed-and-open-intervals","72":"/YAXArrays.jl/previews/PR486/UserGuide/select.html#Get-a-dimension","73":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#types","74":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#yaxarray","75":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#dataset","76":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#(Data)-Cube","77":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#dimensions","78":"/YAXArrays.jl/previews/PR486/UserGuide/types.html#Lon,-Lat,-time","79":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Write-YAXArrays-and-Datasets","80":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Write-Zarr","81":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#zarr-compression","82":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Write-NetCDF","83":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#netcdf-compression","84":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Overwrite-a-Dataset","85":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Append-to-a-Dataset","86":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Save-Skeleton","87":"/YAXArrays.jl/previews/PR486/UserGuide/write.html#Update-values-of-dataset","88":"/YAXArrays.jl/previews/PR486/api.html#API-Reference","89":"/YAXArrays.jl/previews/PR486/api.html#Public-API","90":"/YAXArrays.jl/previews/PR486/api.html#Internal-API","91":"/YAXArrays.jl/previews/PR486/development/contribute.html#Contribute-to-YAXArrays.jl","92":"/YAXArrays.jl/previews/PR486/development/contribute.html#Contribute-to-Documentation","93":"/YAXArrays.jl/previews/PR486/development/contribute.html#Build-docs-locally","94":"/YAXArrays.jl/previews/PR486/get_started.html#Getting-Started","95":"/YAXArrays.jl/previews/PR486/get_started.html#installation","96":"/YAXArrays.jl/previews/PR486/get_started.html#quickstart","97":"/YAXArrays.jl/previews/PR486/get_started.html#updates","98":"/YAXArrays.jl/previews/PR486/#How-to-Install-YAXArrays.jl?","99":"/YAXArrays.jl/previews/PR486/#Want-interoperability?","100":"/YAXArrays.jl/previews/PR486/tutorials/mean_seasonal_cycle.html#Mean-Seasonal-Cycle-for-a-single-pixel","101":"/YAXArrays.jl/previews/PR486/tutorials/mean_seasonal_cycle.html#Define-the-cube","102":"/YAXArrays.jl/previews/PR486/tutorials/mean_seasonal_cycle.html#Plot-results:-mean-seasonal-cycle","103":"/YAXArrays.jl/previews/PR486/tutorials/other_tutorials.html#Other-tutorials","104":"/YAXArrays.jl/previews/PR486/tutorials/other_tutorials.html#General-overview-of-the-functionality-of-YAXArrays","105":"/YAXArrays.jl/previews/PR486/tutorials/other_tutorials.html#Table-style-iteration-over-YAXArrays","106":"/YAXArrays.jl/previews/PR486/tutorials/other_tutorials.html#Combining-multiple-tiff-files-into-a-zarr-based-datacube","107":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#Plotting-maps","108":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#Heatmap-plot","109":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#Wintri-Projection","110":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#Moll-projection","111":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#3D-sphere-plot","112":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#algebraofgraphics-jl","113":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#faceting","114":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#Time-series","115":"/YAXArrays.jl/previews/PR486/tutorials/plottingmaps.html#analysis"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,86],"1":[2,1,58],"2":[2,2,57],"3":[2,2,9],"4":[4,4,76],"5":[4,4,76],"6":[5,4,81],"7":[2,1,31],"8":[5,2,82],"9":[5,2,92],"10":[2,1,119],"11":[5,2,30],"12":[1,2,72],"13":[1,2,120],"14":[1,2,88],"15":[1,2,22],"16":[4,3,211],"17":[4,3,100],"18":[5,7,128],"19":[5,7,98],"20":[4,7,90],"21":[3,3,150],"22":[4,3,245],"23":[2,2,138],"24":[2,1,52],"25":[3,2,85],"26":[2,2,41],"27":[2,2,122],"28":[4,1,14],"29":[3,4,109],"30":[3,4,45],"31":[5,1,19],"32":[7,5,77],"33":[1,11,90],"34":[8,5,76],"35":[5,5,90],"36":[10,5,33],"37":[3,14,142],"38":[3,14,18],"39":[9,14,69],"40":[13,14,158],"41":[7,5,113],"42":[8,5,168],"43":[11,5,1],"44":[3,15,24],"45":[3,15,59],"46":[8,5,139],"47":[7,5,79],"48":[4,1,32],"49":[8,4,35],"50":[3,4,131],"51":[2,4,170],"52":[1,6,101],"53":[1,6,48],"54":[2,4,111],"55":[1,6,84],"56":[2,6,348],"57":[4,1,14],"58":[2,4,75],"59":[2,6,187],"60":[2,6,251],"61":[5,6,90],"62":[4,6,42],"63":[1,10,142],"64":[2,4,94],"65":[4,6,87],"66":[4,6,93],"67":[4,1,165],"68":[3,4,105],"69":[2,4,115],"70":[2,4,129],"71":[4,4,143],"72":[3,4,71],"73":[1,1,16],"74":[1,1,113],"75":[1,1,78],"76":[3,1,70],"77":[1,1,32],"78":[3,2,100],"79":[4,1,146],"80":[2,4,19],"81":[2,5,52],"82":[2,4,20],"83":[2,5,44],"84":[3,4,73],"85":[4,4,157],"86":[2,4,154],"87":[4,4,93],"88":[2,1,10],"89":[2,2,597],"90":[2,2,463],"91":[4,1,15],"92":[3,4,40],"93":[3,5,75],"94":[2,1,1],"95":[1,2,34],"96":[1,2,199],"97":[1,2,49],"98":[6,1,37],"99":[3,1,21],"100":[7,1,73],"101":[3,7,133],"102":[5,7,48],"103":[2,1,49],"104":[6,2,12],"105":[5,2,38],"106":[9,2,1],"107":[2,1,136],"108":[2,2,21],"109":[2,1,47],"110":[2,2,34],"111":[3,2,45],"112":[2,2,158],"113":[1,4,170],"114":[2,4,136],"115":[1,4,39]},"averageFieldLength":[3.4137931034482767,3.9224137931034453,93.04310344827586],"storedFields":{"0":{"title":"Caching YAXArrays","titles":[]},"1":{"title":"Chunk YAXArrays","titles":[]},"2":{"title":"Chunking YAXArrays","titles":["Chunk YAXArrays"]},"3":{"title":"Chunking Datasets","titles":["Chunk YAXArrays"]},"4":{"title":"Set Chunks by Axis","titles":["Chunk YAXArrays","Chunking Datasets"]},"5":{"title":"Set chunking by Variable","titles":["Chunk YAXArrays","Chunking Datasets"]},"6":{"title":"Set chunking for all variables","titles":["Chunk YAXArrays","Chunking Datasets"]},"7":{"title":"Combine YAXArrays","titles":[]},"8":{"title":"cat along an existing dimension","titles":["Combine YAXArrays"]},"9":{"title":"concatenatecubes to a new dimension","titles":["Combine YAXArrays"]},"10":{"title":"Compute YAXArrays","titles":[]},"11":{"title":"Modify elements of a YAXArray","titles":["Compute YAXArrays"]},"12":{"title":"Arithmetics","titles":["Compute YAXArrays"]},"13":{"title":"map","titles":["Compute YAXArrays"]},"14":{"title":"mapslices","titles":["Compute YAXArrays"]},"15":{"title":"mapCube","titles":["Compute YAXArrays"]},"16":{"title":"Operations over several YAXArrays","titles":["Compute YAXArrays","mapCube"]},"17":{"title":"OutDims and YAXArray Properties","titles":["Compute YAXArrays","mapCube"]},"18":{"title":"One InDims to many OutDims","titles":["Compute YAXArrays","mapCube","OutDims and YAXArray Properties"]},"19":{"title":"Many InDims to many OutDims","titles":["Compute YAXArrays","mapCube","OutDims and YAXArray Properties"]},"20":{"title":"Specify path in OutDims","titles":["Compute YAXArrays","mapCube","OutDims and YAXArray Properties"]},"21":{"title":"Different InDims names","titles":["Compute YAXArrays","mapCube"]},"22":{"title":"Creating a vector array","titles":["Compute YAXArrays","mapCube"]},"23":{"title":"Distributed Computation","titles":["Compute YAXArrays"]},"24":{"title":"Convert YAXArrays","titles":[]},"25":{"title":"Convert Base.Array","titles":["Convert YAXArrays"]},"26":{"title":"Convert Raster","titles":["Convert YAXArrays"]},"27":{"title":"Convert DimArray","titles":["Convert YAXArrays"]},"28":{"title":"Create YAXArrays and Datasets","titles":[]},"29":{"title":"Create a YAXArray","titles":["Create YAXArrays and Datasets"]},"30":{"title":"Create a Dataset","titles":["Create YAXArrays and Datasets"]},"31":{"title":"Frequently Asked Questions (FAQ)","titles":[]},"32":{"title":"Extract the axes names from a Cube","titles":["Frequently Asked Questions (FAQ)"]},"33":{"title":"rebuild","titles":["Frequently Asked Questions (FAQ)","Extract the axes names from a Cube"]},"34":{"title":"Obtain values from axes and data from the cube","titles":["Frequently Asked Questions (FAQ)"]},"35":{"title":"How do I concatenate cubes","titles":["Frequently Asked Questions (FAQ)"]},"36":{"title":"How do I subset a YAXArray ( Cube ) or Dataset?","titles":["Frequently Asked Questions (FAQ)"]},"37":{"title":"Subsetting a YAXArray","titles":["Frequently Asked Questions (FAQ)","How do I subset a YAXArray ( Cube ) or Dataset?"]},"38":{"title":"Subsetting a Dataset","titles":["Frequently Asked Questions (FAQ)","How do I subset a YAXArray ( Cube ) or Dataset?"]},"39":{"title":"Subsetting a Dataset whose variables share all their dimensions","titles":["Frequently Asked Questions (FAQ)","How do I subset a YAXArray ( Cube ) or Dataset?","Subsetting a Dataset"]},"40":{"title":"Subsetting a Dataset whose variables share some but not all of their dimensions","titles":["Frequently Asked Questions (FAQ)","How do I subset a YAXArray ( Cube ) or Dataset?","Subsetting a Dataset"]},"41":{"title":"How do I apply map algebra?","titles":["Frequently Asked Questions (FAQ)"]},"42":{"title":"How do I use the CubeTable function?","titles":["Frequently Asked Questions (FAQ)"]},"43":{"title":"How do I assign variable names to YAXArrays in a Dataset","titles":["Frequently Asked Questions (FAQ)"]},"44":{"title":"One variable name","titles":["Frequently Asked Questions (FAQ)","How do I assign variable names to YAXArrays in a Dataset"]},"45":{"title":"Multiple variable names","titles":["Frequently Asked Questions (FAQ)","How do I assign variable names to YAXArrays in a Dataset"]},"46":{"title":"Ho do I construct a Dataset from a TimeArray","titles":["Frequently Asked Questions (FAQ)"]},"47":{"title":"Create a YAXArray with unions containing Strings","titles":["Frequently Asked Questions (FAQ)"]},"48":{"title":"Group YAXArrays and Datasets","titles":[]},"49":{"title":"Seasonal Averages from Time Series of Monthly Means","titles":["Group YAXArrays and Datasets"]},"50":{"title":"Download the data","titles":["Group YAXArrays and Datasets"]},"51":{"title":"GroupBy: seasons","titles":["Group YAXArrays and Datasets"]},"52":{"title":"dropdims","titles":["Group YAXArrays and Datasets","GroupBy: seasons"]},"53":{"title":"seasons","titles":["Group YAXArrays and Datasets","GroupBy: seasons"]},"54":{"title":"GroupBy: weight","titles":["Group YAXArrays and Datasets"]},"55":{"title":"weights","titles":["Group YAXArrays and Datasets","GroupBy: weight"]},"56":{"title":"weighted seasons","titles":["Group YAXArrays and Datasets","GroupBy: weight"]},"57":{"title":"Read YAXArrays and Datasets","titles":[]},"58":{"title":"open_dataset","titles":["Read YAXArrays and Datasets"]},"59":{"title":"Read Zarr","titles":["Read YAXArrays and Datasets","open_dataset"]},"60":{"title":"Read NetCDF","titles":["Read YAXArrays and Datasets","open_dataset"]},"61":{"title":"Read GDAL (GeoTIFF, GeoJSON)","titles":["Read YAXArrays and Datasets","open_dataset"]},"62":{"title":"Load data into memory","titles":["Read YAXArrays and Datasets","open_dataset"]},"63":{"title":"readcubedata","titles":["Read YAXArrays and Datasets","open_dataset","Load data into memory"]},"64":{"title":"open_mfdataset","titles":["Read YAXArrays and Datasets"]},"65":{"title":"along a new dimension","titles":["Read YAXArrays and Datasets","open_mfdataset"]},"66":{"title":"along a existing dimension","titles":["Read YAXArrays and Datasets","open_mfdataset"]},"67":{"title":"Select YAXArrays and Datasets","titles":[]},"68":{"title":"Select a YAXArray","titles":["Select YAXArrays and Datasets"]},"69":{"title":"Select elements","titles":["Select YAXArrays and Datasets"]},"70":{"title":"Select ranges","titles":["Select YAXArrays and Datasets"]},"71":{"title":"Closed and open intervals","titles":["Select YAXArrays and Datasets"]},"72":{"title":"Get a dimension","titles":["Select YAXArrays and Datasets"]},"73":{"title":"Types","titles":[]},"74":{"title":"YAXArray","titles":["Types"]},"75":{"title":"Dataset","titles":["Types"]},"76":{"title":"(Data) Cube","titles":["Types"]},"77":{"title":"Dimensions","titles":["Types"]},"78":{"title":"Lon, Lat, time","titles":["Types","Dimensions"]},"79":{"title":"Write YAXArrays and Datasets","titles":[]},"80":{"title":"Write Zarr","titles":["Write YAXArrays and Datasets"]},"81":{"title":"zarr compression","titles":["Write YAXArrays and Datasets","Write Zarr"]},"82":{"title":"Write NetCDF","titles":["Write YAXArrays and Datasets"]},"83":{"title":"netcdf compression","titles":["Write YAXArrays and Datasets","Write NetCDF"]},"84":{"title":"Overwrite a Dataset","titles":["Write YAXArrays and Datasets"]},"85":{"title":"Append to a Dataset","titles":["Write YAXArrays and Datasets"]},"86":{"title":"Save Skeleton","titles":["Write YAXArrays and Datasets"]},"87":{"title":"Update values of dataset","titles":["Write YAXArrays and Datasets"]},"88":{"title":"API Reference","titles":[]},"89":{"title":"Public API","titles":["API Reference"]},"90":{"title":"Internal API","titles":["API Reference"]},"91":{"title":"Contribute to YAXArrays.jl","titles":[]},"92":{"title":"Contribute to Documentation","titles":["Contribute to YAXArrays.jl"]},"93":{"title":"Build docs locally","titles":["Contribute to YAXArrays.jl","Contribute to Documentation"]},"94":{"title":"Getting Started","titles":[]},"95":{"title":"Installation","titles":["Getting Started"]},"96":{"title":"Quickstart","titles":["Getting Started"]},"97":{"title":"Updates","titles":["Getting Started"]},"98":{"title":"How to Install YAXArrays.jl?","titles":[]},"99":{"title":"Want interoperability?","titles":[]},"100":{"title":"Mean Seasonal Cycle for a single pixel","titles":[]},"101":{"title":"Define the cube","titles":["Mean Seasonal Cycle for a single pixel"]},"102":{"title":"Plot results: mean seasonal cycle","titles":["Mean Seasonal Cycle for a single pixel"]},"103":{"title":"Other tutorials","titles":[]},"104":{"title":"General overview of the functionality of YAXArrays","titles":["Other tutorials"]},"105":{"title":"Table-style iteration over YAXArrays","titles":["Other tutorials"]},"106":{"title":"Combining multiple tiff files into a zarr based datacube","titles":["Other tutorials"]},"107":{"title":"Plotting maps","titles":[]},"108":{"title":"Heatmap plot","titles":["Plotting maps"]},"109":{"title":"Wintri Projection","titles":[]},"110":{"title":"Moll projection","titles":["Wintri Projection"]},"111":{"title":"3D sphere plot","titles":["Wintri Projection"]},"112":{"title":"AlgebraOfGraphics.jl","titles":["Wintri Projection"]},"113":{"title":"Faceting","titles":["Wintri Projection","AlgebraOfGraphics.jl"]},"114":{"title":"Time series","titles":["Wintri Projection","AlgebraOfGraphics.jl"]},"115":{"title":"Analysis","titles":["Wintri Projection","AlgebraOfGraphics.jl"]}},"dirtCount":0,"index":[["δlon",{"2":{"109":1}}],["✘",{"2":{"78":8}}],["✔",{"2":{"78":9}}],["├──────────────────────┴────────────────────────────────────────",{"2":{"47":1}}],["├──────────────────────────┴─────────────────────────",{"2":{"37":1}}],["├──────────────────────────┴────────────────────────────────────",{"2":{"96":1}}],["├──────────────────────────┴─────────────────────────────────────",{"2":{"33":1}}],["├──────────────────────────┴─────────────────────────────────────────────",{"2":{"34":1,"42":1}}],["├──────────────────────────┴────────────────────────────────────────",{"2":{"19":1}}],["├──────────────────────────┴─────────────────────────────────",{"2":{"27":2}}],["├──────────────────────────┴────────────────────────────────",{"2":{"9":1}}],["├───────────────────────────┴───────────────────────────────────",{"2":{"25":1}}],["├───────────────────────────┴────────────────────────────────────────────",{"2":{"22":1,"37":1}}],["├─────────────────────────────┴──────────────────────────────────────────",{"2":{"37":2,"114":1}}],["├──────────────────────────────┴─────────────────────────────────",{"2":{"29":1}}],["├──────────────────────────────┴─────────────────────────────────────────",{"2":{"16":1,"32":1}}],["├────────────────────────────────┴───────────────────────────────────────",{"2":{"55":1,"113":1}}],["├───────────────────────────────────┴────────────────────────────────────",{"2":{"101":1}}],["├─────────────────────────────────────┴──────────────────────────────────",{"2":{"59":1}}],["├───────────────────────────────────────┴───────────────────────",{"2":{"47":1}}],["├────────────────────────────────────────",{"2":{"37":1}}],["├───────────────────────────────────────────┴────────────────────────────",{"2":{"22":1,"42":1}}],["├──────────────────────────────────────────────┴────────────────",{"2":{"69":1}}],["├────────────────────────────────────────────────┴───────────────────────",{"2":{"42":1,"54":1,"70":1,"71":5}}],["├────────────────────────────────────────────────",{"2":{"27":1,"37":1}}],["├─────────────────────────────────────────────────",{"2":{"21":1}}],["├─────────────────────────────────────────────────┴──────────────────────",{"2":{"14":1,"60":1,"63":3,"68":2,"69":2}}],["├──────────────────────────────────────────────────┴─────────────────────",{"2":{"51":1}}],["├────────────────────────────────────────────────────",{"2":{"29":1,"33":1}}],["├────────────────────────────────────────────────────────",{"2":{"27":2}}],["├───────────────────────────────────────────────────────────",{"2":{"25":1,"47":2,"96":1}}],["├────────────────────────────────────────────────────────────",{"2":{"10":1,"12":1,"13":1,"14":2,"16":3,"17":1,"18":1,"21":2,"22":2,"29":2,"32":1,"33":3,"34":1,"37":4,"41":3,"42":3,"50":1,"54":1,"63":3,"86":1,"96":1,"101":1,"114":1}}],["├─────────────────────────────────────────────────────────────────",{"2":{"69":1}}],["├──────────────────────────────────────────────────────────────────",{"2":{"51":1,"54":1}}],["├─────────────────────────────────────────────────────────────────────┴",{"2":{"69":1}}],["├────────────────────────────────────────────────────────────────────────",{"2":{"51":1,"52":1,"54":1,"55":1,"56":3}}],["├────────────────────────────────────────────────────────────────────",{"2":{"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"21":2,"22":3,"29":1,"32":1,"33":2,"34":1,"35":1,"37":4,"41":3,"42":3,"50":2,"51":2,"52":1,"54":3,"55":2,"56":3,"59":1,"60":1,"63":3,"64":1,"68":2,"69":2,"70":3,"71":5,"86":1,"96":1,"101":1,"113":1,"114":1}}],["├───────────────────────────────────────────────────────────────",{"2":{"16":2,"19":1,"35":1,"50":1,"59":1,"60":1,"64":1,"68":2,"69":2,"70":3,"71":5,"113":1}}],["├─────────────────────────────────────────────────────────────",{"2":{"8":1}}],["├───────────────────────────────────────────────────────",{"2":{"9":1,"19":1}}],["├─────────────────────────────────────────────────────",{"2":{"8":1}}],["├───────────────────────────────────────────────────",{"2":{"25":1,"47":2,"96":1}}],["├──────────────────────────────────────────────────",{"2":{"9":1}}],["├───────────────────────────────────────────────┴────────────────────────",{"2":{"16":2,"41":1,"70":2}}],["├────────────────────────────────────────────┴───────────────────────────",{"2":{"14":1,"18":1,"21":1,"86":1}}],["├─────────────────────────────────────────",{"2":{"21":1}}],["├──────────────────────────────────┴────────────────────────────",{"2":{"72":1}}],["├─────────────────────────────────┴──────────────────────────────────────",{"2":{"35":1,"50":2,"96":1}}],["├─────────────────────────────────┴───────────────────────────────",{"2":{"8":1}}],["├───────────────────────────────┴────────────────────────────────────────",{"2":{"10":1,"12":1,"13":1,"16":2,"22":1,"29":1,"41":2,"54":1}}],["├────────────────────────────┴────────────────────────",{"2":{"21":1}}],["├────────────────────────────┴───────────────────────────────────────────",{"2":{"17":1,"21":1,"22":1,"33":2,"37":1,"64":1}}],["π",{"2":{"41":2,"100":1,"102":1}}],[">var",{"2":{"101":1}}],[">dates",{"2":{"101":1}}],[">month",{"2":{"89":1}}],[">abs",{"2":{"89":1}}],[">=",{"2":{"40":4}}],[">",{"2":{"40":2,"41":2,"101":1}}],["└──────────────────────────────────────────────────────────┘",{"2":{"37":1}}],["└───────────────────────────────────────────────────────────┘",{"2":{"21":1}}],["└──────────────────────────────────────────────────────────────────┘",{"2":{"27":2}}],["└──────────────────────────────────────────────────────────────────────┘",{"2":{"29":1,"33":1}}],["└────────────────────────────────────────────────────────────────────────────────┘",{"2":{"69":1}}],["└──────────────────────────────────────────────────────────────────────────────┘",{"2":{"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"21":2,"22":4,"29":1,"32":1,"33":2,"34":1,"35":1,"37":4,"41":3,"42":3,"50":2,"51":2,"52":1,"54":3,"55":2,"56":3,"59":1,"60":1,"63":3,"64":1,"68":2,"69":2,"70":3,"71":5,"86":1,"96":1,"101":1,"113":1,"114":1}}],["└─────────────────────────────────────────────────────────────────────────┘",{"2":{"19":1}}],["└───────────────────────────────────────────────────────────────────────┘",{"2":{"8":1}}],["└─────────────────────────────────────────────────────────────────────┘",{"2":{"25":1,"47":2,"72":1,"96":1}}],["└─────────────────────────────────────────────────────────────────┘",{"2":{"9":1}}],["`diskarrays",{"2":{"90":1}}],["`a",{"2":{"37":1}}],["`layer`",{"2":{"18":1}}],["quickstart",{"0":{"96":1}}],["query",{"2":{"67":1}}],["querying",{"2":{"63":1}}],["questions",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1}}],["quot",{"2":{"16":2,"42":2,"86":4,"89":8,"90":12,"112":2}}],["jj+1",{"2":{"60":1,"67":1,"79":1,"85":1}}],["jj",{"2":{"60":1,"67":1,"79":1,"85":1}}],["joinname",{"2":{"89":1}}],["joinname=",{"2":{"89":1}}],["job",{"2":{"78":1}}],["journal",{"2":{"60":1,"67":1,"79":1,"85":1}}],["joe",{"2":{"49":1,"56":1}}],["j",{"2":{"56":8}}],["jan",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["jl",{"0":{"91":1,"98":1,"112":1},"1":{"92":1,"93":1,"113":1,"114":1,"115":1},"2":{"26":1,"27":1,"42":1,"46":2,"50":1,"51":1,"56":1,"74":1,"77":1,"78":1,"91":1,"93":2,"95":1,"96":2,"97":3,"98":2,"105":1,"112":2,"115":1}}],["jussieu",{"2":{"60":1,"67":1,"79":1,"85":1}}],["just",{"2":{"22":1,"74":1,"76":1,"89":1,"90":2}}],["jul",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["juliaδlon",{"2":{"109":1}}],["juliax",{"2":{"100":1}}],["juliaplt",{"2":{"112":1,"113":4,"114":1}}],["juliapkg>",{"2":{"95":1,"97":1,"98":1}}],["juliapermuteloopaxes",{"2":{"90":1}}],["juliaproperties",{"2":{"19":1}}],["juliacopydata",{"2":{"90":1}}],["juliacollect",{"2":{"34":1,"72":1}}],["juliaclean",{"2":{"90":1}}],["juliacube",{"2":{"89":1}}],["juliacubefittable",{"2":{"89":1}}],["juliacubetable",{"2":{"89":1}}],["juliacaxes",{"2":{"89":1}}],["julian",{"2":{"81":1,"83":1}}],["juliaspecs",{"2":{"115":1}}],["juliastore",{"2":{"112":1}}],["juliasavecube",{"2":{"89":1}}],["juliasavedataset",{"2":{"80":1,"82":1,"84":2,"89":1}}],["juliasetchunks",{"2":{"89":1,"90":1}}],["juliaseasons",{"2":{"53":1}}],["juliaglmakie",{"2":{"108":1}}],["juliagroupby",{"2":{"78":1}}],["juliagetloopchunks",{"2":{"90":1}}],["juliagetouttype",{"2":{"90":1}}],["juliagetoutaxis",{"2":{"90":1}}],["juliaget",{"2":{"90":1}}],["juliagetaxis",{"2":{"89":1}}],["juliagettarrayaxes",{"2":{"46":1}}],["juliagen",{"2":{"16":1}}],["julialon",{"2":{"107":1}}],["julialookup",{"2":{"72":1}}],["julialatitudes",{"2":{"40":1}}],["juliaoptifunc",{"2":{"90":1}}],["juliaopen",{"2":{"58":1,"89":2}}],["juliaoutdims",{"2":{"89":1}}],["juliaoffset",{"2":{"13":1}}],["juliawith",{"2":{"56":1}}],["julia>",{"2":{"56":1,"93":1,"98":2,"101":2}}],["juliaurl",{"2":{"50":1}}],["juliausing",{"2":{"0":1,"2":1,"4":1,"5":1,"6":1,"8":1,"9":1,"10":1,"16":1,"17":1,"22":1,"23":2,"25":1,"26":1,"27":1,"29":2,"32":1,"33":1,"35":1,"37":1,"39":1,"40":1,"42":2,"46":1,"48":1,"56":1,"59":1,"60":1,"61":1,"64":1,"65":1,"66":1,"67":1,"69":1,"71":1,"78":1,"79":1,"80":1,"82":1,"86":1,"96":1,"99":4,"100":1,"107":1,"111":1,"112":1,"113":1}}],["juliakeylist",{"2":{"45":1}}],["juliaylonlat",{"2":{"37":1}}],["juliaytime3",{"2":{"37":1}}],["juliaytime2",{"2":{"37":1}}],["juliaytime",{"2":{"37":1}}],["juliay",{"2":{"37":1}}],["juliayaxcolumn",{"2":{"90":1}}],["juliayaxarray",{"2":{"89":1}}],["juliayax",{"2":{"0":1,"46":2}}],["juliato",{"2":{"89":1}}],["juliatos",{"2":{"68":2,"69":2,"70":3,"71":1,"72":1}}],["juliatempo",{"2":{"54":1}}],["juliatest",{"2":{"47":2}}],["juliat",{"2":{"37":1,"42":1,"100":1}}],["juliatspan",{"2":{"16":1}}],["juliamutable",{"2":{"90":1}}],["juliamatch",{"2":{"90":1}}],["juliamapcube",{"2":{"89":2}}],["juliamapslices",{"2":{"14":1,"23":1}}],["juliamovingwindow",{"2":{"89":1}}],["juliamy",{"2":{"60":1}}],["juliamean",{"2":{"56":1}}],["juliam2",{"2":{"25":1}}],["julia",{"2":{"24":1,"50":1,"60":1,"90":1,"93":1,"95":2,"96":1,"97":2,"98":2}}],["juliavector",{"2":{"22":1}}],["juliadata",{"2":{"112":1}}],["juliadataset",{"2":{"89":1}}],["juliadata3",{"2":{"30":1}}],["juliadim",{"2":{"27":1,"112":1,"113":1,"114":1}}],["juliadimarray",{"2":{"22":1}}],["juliads2",{"2":{"85":1}}],["juliads",{"2":{"18":2,"20":2,"21":1,"39":1,"40":1,"58":1,"59":1,"60":1,"63":2,"83":1,"86":2,"87":3,"89":1}}],["juliar",{"2":{"86":1}}],["juliareadcubedata",{"2":{"63":1,"89":1}}],["juliaregions",{"2":{"22":2}}],["juliaras2",{"2":{"26":1}}],["juliarandom",{"2":{"21":2}}],["juliaindims",{"2":{"18":1,"20":1,"89":1}}],["juliaimport",{"2":{"14":1,"95":1}}],["juliajulia>",{"2":{"16":5,"32":3,"33":2,"34":1,"35":1,"41":3,"42":3,"44":1,"45":1,"46":2,"51":2,"52":1,"54":2,"55":2,"56":3,"66":1,"71":4,"85":1,"86":1,"98":1,"101":2,"107":3}}],["juliaall",{"2":{"86":1}}],["juliaaxes",{"2":{"37":1}}],["juliaa2",{"2":{"12":2,"29":2,"96":1}}],["juliaa",{"2":{"2":1,"11":3}}],["juliafig",{"2":{"100":1,"102":1,"109":1,"110":1}}],["juliafindaxis",{"2":{"90":1}}],["juliafittable",{"2":{"89":2}}],["juliafiles",{"2":{"65":2,"89":2}}],["juliafunction",{"2":{"16":1,"18":1,"19":1,"21":1,"51":1,"89":1,"90":1,"101":1}}],["juliaf",{"2":{"2":1,"4":1,"5":1,"6":1,"16":1}}],["jun",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["∘",{"2":{"23":1}}],["|>",{"2":{"22":2,"112":1,"114":1}}],["⋱",{"2":{"22":1}}],["⋮",{"2":{"22":2,"72":1,"101":1}}],["^2",{"2":{"21":1}}],["⬔",{"2":{"17":1,"18":1,"35":1,"65":1,"96":1}}],["921",{"2":{"87":2}}],["923876",{"2":{"87":2}}],["926096",{"2":{"27":1}}],["991508",{"2":{"87":2}}],["957463",{"2":{"96":1}}],["952795",{"2":{"96":1}}],["958973",{"2":{"96":1}}],["95",{"2":{"56":1}}],["959705",{"2":{"96":1}}],["95965",{"2":{"87":2}}],["959",{"2":{"56":1}}],["953391",{"2":{"27":1}}],["97",{"2":{"113":1}}],["97643",{"2":{"96":1}}],["97649",{"2":{"56":1}}],["973442",{"2":{"96":1}}],["973332",{"2":{"27":1}}],["97047",{"2":{"56":1}}],["94534",{"2":{"56":1}}],["9404",{"2":{"51":1,"52":1}}],["9432",{"2":{"51":1,"52":1}}],["949935",{"2":{"25":1}}],["982108",{"2":{"96":1}}],["986",{"2":{"56":1}}],["98",{"2":{"40":6}}],["984803",{"2":{"22":1}}],["900",{"2":{"113":1}}],["908084",{"2":{"96":1}}],["903079",{"2":{"96":1}}],["90365",{"2":{"56":1}}],["90712",{"2":{"56":1}}],["90",{"2":{"40":2,"61":1,"71":5,"112":2,"113":2}}],["9122",{"2":{"61":1}}],["9192",{"2":{"56":1}}],["91",{"2":{"32":1,"71":5}}],["916686",{"2":{"27":1}}],["918555",{"2":{"25":1}}],["9375",{"2":{"59":2,"107":1,"113":1,"114":1}}],["93743",{"2":{"56":1}}],["9362",{"2":{"56":1}}],["935631",{"2":{"25":1}}],["93986",{"2":{"22":1}}],["9",{"2":{"16":14,"22":2,"34":1,"37":1,"50":2,"54":4,"70":4,"81":2,"83":1,"90":1}}],["96x71x19",{"2":{"60":1,"67":1,"79":1,"85":1}}],["96f0",{"2":{"60":1,"67":1,"79":1}}],["9682",{"2":{"51":1,"52":1}}],["96921e36",{"2":{"50":2}}],["960",{"2":{"17":1,"18":1,"22":1}}],["96",{"2":{"8":1,"9":1,"40":6,"69":2,"85":1}}],["8×1×24",{"2":{"114":1}}],["8901",{"2":{"61":1}}],["89",{"2":{"59":4,"60":2,"61":1,"63":3,"67":1,"68":2,"69":1,"70":1,"71":5,"72":3,"79":1,"85":1,"107":2,"113":2}}],["8984",{"2":{"56":1}}],["89237",{"2":{"56":1}}],["86",{"2":{"72":2}}],["86457",{"2":{"56":1}}],["862644",{"2":{"27":1}}],["85",{"2":{"72":2,"109":1,"110":1}}],["850",{"2":{"56":1}}],["85ºn",{"2":{"40":1}}],["85714",{"2":{"22":1}}],["88",{"2":{"35":1,"59":4,"72":2,"96":1,"107":2,"113":2}}],["889583",{"2":{"22":1}}],["81",{"2":{"29":1}}],["833498",{"2":{"96":1}}],["831968",{"2":{"87":2}}],["830391",{"2":{"25":1}}],["83556",{"2":{"25":1}}],["879677",{"2":{"96":1}}],["87",{"2":{"72":2}}],["87705",{"2":{"56":1}}],["872575",{"2":{"27":1}}],["870826",{"2":{"25":1}}],["875658",{"2":{"22":1}}],["847062",{"2":{"87":2}}],["840",{"2":{"64":1}}],["840389",{"2":{"22":1}}],["84",{"2":{"61":2}}],["845983",{"2":{"25":1}}],["828388",{"2":{"96":1}}],["825496",{"2":{"96":1}}],["827727",{"2":{"96":1}}],["82421875",{"2":{"61":2}}],["824354",{"2":{"22":1}}],["829062",{"2":{"22":1}}],["8",{"2":{"16":12,"22":2,"34":1,"37":1,"60":2,"63":3,"67":1,"68":2,"79":1,"85":1,"101":1}}],["80871",{"2":{"96":1}}],["80759",{"2":{"56":1}}],["800",{"2":{"33":3,"34":1,"37":1,"114":1}}],["80",{"2":{"16":1,"40":2}}],["v",{"2":{"60":1,"67":1,"79":1,"85":1}}],["v1",{"2":{"60":2,"67":2,"79":2,"85":2,"95":1}}],["v20190710",{"2":{"59":1,"107":2,"112":1}}],["vol",{"2":{"60":1,"67":1,"79":1,"85":1}}],["volume",{"2":{"46":4}}],["voilà",{"2":{"46":1}}],["visit",{"2":{"115":1}}],["visual",{"2":{"112":2,"113":4,"114":1,"115":1}}],["visualizations",{"2":{"112":1}}],["visualization",{"2":{"42":1}}],["video",{"2":{"103":1}}],["videos",{"2":{"103":1}}],["via",{"2":{"51":1}}],["vice",{"2":{"24":1}}],["view",{"2":{"22":1,"96":1}}],["version",{"2":{"59":1,"60":1,"67":1,"79":1,"85":1,"89":1,"97":2,"98":1,"107":1}}],["versa",{"2":{"24":1}}],["verify",{"2":{"55":1,"87":1}}],["very",{"2":{"13":1,"42":1,"74":1}}],["vector",{"0":{"22":1},"2":{"22":4,"34":1,"47":1,"51":1,"53":1,"54":3,"55":2,"56":1,"66":1,"74":1,"89":2,"90":3}}],["val",{"2":{"34":2,"72":1}}],["vals",{"2":{"22":1}}],["value",{"2":{"12":1,"14":3,"16":2,"41":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"89":4,"90":1,"112":2,"113":6,"114":1,"115":1}}],["values=ds1",{"2":{"42":1}}],["values",{"0":{"34":1,"87":1},"2":{"9":1,"20":1,"21":1,"22":2,"28":1,"29":2,"32":2,"33":1,"34":1,"40":3,"42":4,"45":1,"46":2,"65":2,"66":1,"70":1,"72":2,"74":1,"75":1,"86":1,"87":3,"89":9,"96":1,"107":1}}],["varoables",{"2":{"89":1}}],["variant",{"2":{"59":1,"107":1}}],["variable",{"0":{"5":1,"43":1,"44":1,"45":1},"1":{"44":1,"45":1},"2":{"5":1,"9":1,"40":3,"59":1,"63":2,"86":2,"89":1,"90":6,"96":1,"100":1,"101":1,"102":1,"107":1}}],["variables=at",{"2":{"41":2,"96":1}}],["variables",{"0":{"6":1,"39":1,"40":1},"2":{"4":5,"5":4,"6":2,"9":4,"17":2,"18":1,"19":1,"20":1,"21":1,"24":1,"30":1,"35":2,"38":1,"39":2,"40":11,"44":1,"45":4,"46":11,"59":4,"60":1,"61":1,"62":1,"63":1,"65":3,"66":1,"67":1,"75":1,"76":1,"78":3,"79":1,"85":4,"86":1,"89":5,"90":1,"96":2,"107":4}}],["varlist",{"2":{"45":2}}],["var2=var2",{"2":{"39":1}}],["var2",{"2":{"35":2,"39":3,"41":1}}],["var1=var1",{"2":{"39":1}}],["var1",{"2":{"35":2,"39":3,"41":1}}],["var",{"2":{"9":2,"100":2,"101":2,"102":2}}],["uv",{"2":{"111":1}}],["u",{"2":{"101":1}}],["up",{"2":{"89":1}}],["updates",{"0":{"97":1}}],["updated",{"2":{"87":1}}],["update",{"0":{"87":1},"2":{"87":2,"89":1}}],["updating",{"2":{"48":1,"87":1}}],["ucar",{"2":{"60":1,"67":1,"75":1,"79":1}}],["urls",{"2":{"57":1}}],["url",{"2":{"50":1,"59":1}}],["unreleased",{"2":{"98":1}}],["unpermuted",{"2":{"90":2}}],["unpractical",{"2":{"50":1}}],["underlying",{"2":{"89":1,"90":1,"97":1}}],["unlike",{"2":{"76":1}}],["unweighted",{"2":{"51":1,"56":1}}],["unique",{"2":{"101":1}}],["unidata",{"2":{"60":1,"67":1,"75":1,"79":1}}],["unit",{"2":{"61":1}}],["unitrange",{"2":{"51":2,"52":2,"56":6}}],["units",{"2":{"50":2,"59":1,"60":2,"63":6,"68":4,"69":6,"70":6,"71":10,"113":1,"114":1}}],["unions",{"0":{"47":1}}],["union",{"2":{"14":2,"16":4,"18":2,"20":1,"21":1,"22":1,"41":1,"42":2,"47":2,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"86":2,"87":1}}],["unordered",{"2":{"46":4,"51":2,"52":1,"53":1,"54":2,"55":2,"56":3}}],["unnecessary",{"2":{"22":1}}],["unchanged",{"2":{"13":1}}],["usage",{"2":{"78":1}}],["usually",{"2":{"59":1,"74":2,"75":2,"113":1,"114":1}}],["usual",{"2":{"51":1,"58":1}}],["us",{"2":{"22":1,"66":1}}],["useable",{"2":{"58":1,"89":1}}],["used",{"2":{"22":1,"23":1,"37":1,"51":1,"67":1,"72":1,"73":1,"74":1,"77":1,"78":1,"89":6,"90":3,"112":1}}],["uses",{"2":{"20":1,"42":1,"60":1}}],["userguide",{"2":{"92":2}}],["users",{"2":{"90":1}}],["user",{"2":{"10":2,"12":1,"13":1,"23":1,"29":3,"30":1,"90":1}}],["use",{"0":{"42":1},"2":{"0":1,"8":1,"9":1,"10":4,"13":1,"23":2,"32":2,"37":1,"39":1,"40":1,"41":1,"42":2,"46":2,"48":1,"50":1,"52":1,"62":1,"64":1,"66":1,"71":2,"76":1,"81":1,"86":1,"89":4,"90":1,"98":1,"103":1,"105":1,"107":2}}],["useful",{"2":{"0":1,"76":1}}],["using",{"2":{"0":1,"8":2,"9":2,"10":2,"16":3,"17":4,"22":3,"23":8,"27":1,"29":1,"32":1,"33":2,"35":2,"37":2,"39":2,"40":2,"41":1,"42":1,"46":3,"48":5,"58":1,"59":2,"60":3,"61":2,"62":1,"64":1,"65":1,"66":1,"67":2,"69":3,"70":2,"78":1,"79":2,"85":1,"86":3,"96":1,"97":1,"98":1,"100":2,"101":2,"107":3,"111":1,"112":6}}],["+proj=moll",{"2":{"110":1}}],["+",{"2":{"12":2,"13":1,"16":2,"18":2,"21":1,"64":2,"65":1,"100":1,"109":1,"112":1,"115":1}}],["kwargs",{"2":{"89":5,"90":2}}],["know",{"2":{"63":1}}],["k",{"2":{"46":5,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["keyword",{"2":{"58":1,"85":1,"89":7,"90":2}}],["key",{"2":{"48":1,"89":1}}],["keys=",{"2":{"58":1,"89":1}}],["keyset",{"2":{"46":1}}],["keys",{"2":{"46":7,"58":3,"89":4}}],["keylist",{"2":{"45":1}}],["keeps",{"2":{"13":1}}],["keep",{"2":{"0":1,"90":1,"112":1}}],["kb",{"2":{"10":1,"12":1,"13":1,"14":1,"16":2,"22":1,"29":2,"32":1,"35":1,"37":4,"41":3,"42":1,"69":1,"70":3,"71":5,"96":1,"101":1}}],["↗",{"2":{"10":1,"12":1,"13":1,"16":2,"17":1,"18":1,"19":1,"20":1,"21":3,"22":1,"29":3,"30":1,"32":3,"35":1,"37":5,"39":2,"41":3,"50":2,"51":1,"59":2,"60":2,"63":3,"64":1,"65":3,"66":1,"67":1,"68":2,"70":3,"71":5,"79":1,"85":2,"86":2,"96":1,"107":1,"113":1,"114":1}}],["0e8",{"2":{"89":1}}],["04",{"2":{"114":1}}],["0436",{"2":{"96":1}}],["04t00",{"2":{"65":1,"66":1,"114":1}}],["0465",{"2":{"56":1}}],["029247418895843032",{"2":{"101":1}}],["022312156353890087",{"2":{"101":1}}],["02345835017256051",{"2":{"101":1}}],["0247931",{"2":{"96":1}}],["02t00",{"2":{"65":1,"66":2}}],["02",{"2":{"59":1,"65":2}}],["0210077",{"2":{"25":1}}],["0214057",{"2":{"25":1}}],["0f20",{"2":{"59":1,"60":2,"63":6,"68":4,"69":6,"70":6,"71":10,"113":1,"114":1}}],["0f32",{"2":{"16":2}}],["039451611552802975",{"2":{"101":1}}],["03528277758302477",{"2":{"101":1}}],["0358348",{"2":{"25":1}}],["03t00",{"2":{"66":1}}],["03",{"2":{"65":2}}],["03361",{"2":{"56":1}}],["06417594925348342",{"2":{"101":1}}],["06159722707791853",{"2":{"101":1}}],["06t00",{"2":{"66":1}}],["062270000476910094",{"2":{"101":1}}],["0625",{"2":{"59":2,"107":1,"113":1}}],["0620649",{"2":{"27":1}}],["06755",{"2":{"56":1}}],["08158557886952912",{"2":{"101":1}}],["08058305464254185",{"2":{"101":1}}],["0833026",{"2":{"96":1}}],["08",{"2":{"50":2,"54":1}}],["09689360224777122",{"2":{"101":1}}],["0962708",{"2":{"96":1}}],["0940127",{"2":{"87":2}}],["09",{"2":{"50":2,"54":1}}],["0ºe",{"2":{"40":1}}],["0750790675265741",{"2":{"101":1}}],["07t00",{"2":{"66":2}}],["07",{"2":{"59":2,"64":1,"107":1,"113":1,"114":1}}],["0702532",{"2":{"27":1}}],["0723492",{"2":{"22":1}}],["00722034",{"2":{"56":1}}],["00709111",{"2":{"56":1}}],["00684233",{"2":{"56":1}}],["00693713",{"2":{"56":1}}],["00990356",{"2":{"56":1}}],["0057",{"2":{"56":1}}],["00388",{"2":{"56":1}}],["00",{"2":{"20":4,"46":16,"50":8,"54":4,"59":9,"60":8,"63":12,"65":4,"66":16,"67":4,"68":8,"69":8,"70":12,"71":20,"79":4,"85":4,"107":5,"113":6,"114":4}}],["05742042630154354",{"2":{"101":1}}],["0571978",{"2":{"96":1}}],["05611581504766607",{"2":{"101":1}}],["0566881",{"2":{"27":1}}],["05846",{"2":{"56":1}}],["0537",{"2":{"51":1,"52":1}}],["052264",{"2":{"27":1}}],["05t00",{"2":{"20":1,"66":1}}],["05",{"2":{"17":2,"18":1,"21":3,"37":3,"64":1}}],["01t21",{"2":{"113":2}}],["01t03",{"2":{"59":2,"107":1,"113":1,"114":1}}],["01t00",{"2":{"20":1,"46":4,"59":2,"107":1}}],["0174532925199433",{"2":{"61":1}}],["0178074",{"2":{"56":1}}],["0114824",{"2":{"96":1}}],["0117519",{"2":{"56":1}}],["0115514",{"2":{"56":1}}],["0127077",{"2":{"56":1}}],["0123091",{"2":{"56":1}}],["0121037",{"2":{"56":1}}],["019016",{"2":{"56":1}}],["018571",{"2":{"56":1}}],["0182373",{"2":{"56":1}}],["0180572",{"2":{"56":1}}],["0183003",{"2":{"56":1}}],["018",{"2":{"51":1,"52":1}}],["01",{"2":{"10":6,"12":3,"13":3,"14":3,"16":12,"17":6,"18":3,"20":2,"21":9,"22":9,"23":3,"29":9,"30":3,"37":22,"39":8,"40":11,"46":8,"59":5,"60":4,"63":6,"64":2,"65":6,"66":8,"67":2,"68":4,"69":6,"70":6,"71":10,"79":2,"85":2,"100":2,"101":4,"107":5,"113":5,"114":5}}],["0",{"2":{"8":1,"9":1,"10":6,"11":2,"12":6,"13":6,"14":7,"16":303,"17":7,"18":7,"19":7,"20":6,"21":10,"22":75,"25":36,"27":45,"29":12,"30":6,"33":3,"34":1,"35":9,"37":1,"40":4,"41":27,"42":11,"47":2,"54":2,"55":40,"56":19,"59":7,"60":10,"61":6,"63":12,"64":1,"67":6,"68":8,"69":6,"70":14,"71":20,"72":7,"79":6,"81":1,"83":1,"84":1,"85":6,"86":1,"87":40,"89":2,"90":1,"96":80,"97":1,"100":2,"101":19,"102":1,"107":4,"109":2,"110":2,"111":2,"112":1,"113":4,"114":5}}],["┤",{"2":{"8":2,"9":2,"10":2,"12":2,"13":2,"14":4,"16":10,"17":2,"18":2,"19":2,"21":6,"22":5,"25":2,"27":3,"29":4,"32":2,"33":6,"34":2,"35":2,"37":10,"41":6,"42":6,"47":4,"50":4,"51":4,"52":2,"54":6,"55":3,"56":6,"59":2,"60":2,"63":6,"64":2,"68":4,"69":5,"70":6,"71":10,"86":2,"96":4,"101":2,"113":2,"114":2}}],["┐",{"2":{"8":2,"9":2,"10":2,"12":2,"13":2,"14":4,"16":10,"17":2,"18":2,"19":2,"21":6,"22":8,"25":2,"27":4,"29":4,"32":2,"33":6,"34":2,"35":2,"37":10,"41":6,"42":6,"47":4,"50":4,"51":3,"52":1,"54":5,"55":3,"56":3,"59":2,"60":2,"63":6,"64":2,"68":4,"69":7,"70":6,"71":10,"72":2,"86":2,"96":4,"101":2,"113":2,"114":2}}],["┌",{"2":{"8":1,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"21":3,"22":4,"25":1,"27":2,"29":2,"32":1,"33":3,"34":1,"35":1,"37":5,"41":3,"42":3,"47":2,"50":2,"51":2,"52":1,"54":3,"55":2,"56":3,"59":1,"60":1,"63":3,"64":1,"68":2,"69":3,"70":3,"71":5,"72":1,"86":1,"96":2,"101":1,"113":1,"114":1}}],["768",{"2":{"114":1}}],["76",{"2":{"72":2}}],["700",{"2":{"115":1}}],["70",{"2":{"70":3}}],["7030",{"2":{"61":1}}],["701332",{"2":{"22":1}}],["730",{"2":{"102":1}}],["7341",{"2":{"56":1}}],["73",{"2":{"56":1}}],["731779",{"2":{"27":1}}],["790617",{"2":{"96":1}}],["79472",{"2":{"96":1}}],["79",{"2":{"60":2,"63":3,"67":1,"68":2,"69":2,"70":4,"71":5,"72":3,"79":1,"85":1}}],["79502",{"2":{"56":1}}],["796375",{"2":{"27":1}}],["757781",{"2":{"96":1}}],["75",{"2":{"72":2}}],["7593",{"2":{"56":1}}],["75891",{"2":{"56":1}}],["75269",{"2":{"25":1}}],["752417",{"2":{"22":1}}],["776172",{"2":{"96":1}}],["77687",{"2":{"56":1}}],["77",{"2":{"72":2}}],["77587",{"2":{"56":1}}],["770949",{"2":{"27":1}}],["743343",{"2":{"96":1}}],["748725",{"2":{"96":1}}],["746259",{"2":{"87":2}}],["74",{"2":{"72":2}}],["744521",{"2":{"27":1}}],["74732",{"2":{"25":1}}],["716721",{"2":{"96":1}}],["716952",{"2":{"87":2}}],["717",{"2":{"71":5}}],["71",{"2":{"70":1}}],["7158",{"2":{"51":1,"52":1}}],["7119",{"2":{"51":1,"52":1}}],["718667",{"2":{"27":1}}],["71314",{"2":{"27":1}}],["71429",{"2":{"22":2}}],["78064",{"2":{"96":1}}],["783779",{"2":{"96":1}}],["787476",{"2":{"96":1}}],["78",{"2":{"70":1,"72":2}}],["78467",{"2":{"25":1}}],["789891",{"2":{"25":1}}],["781773",{"2":{"22":1}}],["7",{"2":{"8":1,"16":10,"21":3,"22":1,"29":1,"34":1,"50":2,"59":1,"64":9,"65":3,"66":1,"83":1,"107":1,"113":1}}],["→",{"2":{"4":1,"5":1,"6":1,"9":1,"10":1,"12":1,"13":1,"14":1,"16":2,"17":1,"18":1,"19":1,"20":1,"21":3,"22":6,"25":1,"27":3,"29":3,"30":1,"32":3,"33":3,"34":1,"35":1,"37":6,"39":2,"40":2,"41":3,"42":2,"45":2,"46":4,"47":2,"50":2,"51":1,"59":2,"60":2,"61":1,"63":3,"64":1,"65":3,"66":1,"67":1,"68":2,"69":1,"70":3,"71":5,"79":1,"85":2,"86":2,"96":2,"107":1,"113":1,"114":1}}],["↓",{"2":{"4":3,"5":3,"6":1,"8":1,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"20":1,"21":3,"22":6,"25":1,"27":3,"29":3,"30":1,"32":3,"33":3,"34":1,"35":1,"37":6,"39":2,"40":8,"41":3,"42":3,"44":1,"45":3,"46":4,"47":2,"50":2,"51":3,"52":1,"54":4,"55":2,"56":3,"59":2,"60":2,"61":1,"63":3,"64":1,"65":3,"66":1,"67":1,"68":2,"69":3,"70":3,"71":5,"72":1,"79":1,"85":2,"86":2,"96":2,"101":2,"107":1,"113":1,"114":1}}],["45×170×24",{"2":{"71":5}}],["456765",{"2":{"25":1}}],["415137",{"2":{"96":1}}],["4198",{"2":{"56":1}}],["41241",{"2":{"56":1}}],["41049",{"2":{"56":1}}],["41634",{"2":{"56":1}}],["417937",{"2":{"22":1}}],["487093",{"2":{"96":1}}],["487315",{"2":{"96":1}}],["48367",{"2":{"56":1}}],["48",{"2":{"50":2,"96":1}}],["480",{"2":{"21":2,"42":1}}],["44",{"2":{"37":1,"41":3}}],["496429",{"2":{"96":1}}],["499743",{"2":{"96":1}}],["49909",{"2":{"56":1}}],["4947",{"2":{"56":1}}],["492817",{"2":{"27":1}}],["497189",{"2":{"22":1}}],["4326",{"2":{"61":1}}],["43254",{"2":{"56":1}}],["4325",{"2":{"51":1,"52":1}}],["432286",{"2":{"22":1}}],["435994",{"2":{"27":1}}],["475725",{"2":{"27":1}}],["472308",{"2":{"22":1}}],["40",{"2":{"40":2}}],["400",{"2":{"25":1,"86":1,"100":1,"102":1,"112":1,"113":2,"114":1,"115":1}}],["40878677319295353",{"2":{"11":1}}],["4×30",{"2":{"22":1}}],["4×3×7",{"2":{"21":1}}],["4×3×2",{"2":{"19":1}}],["4675308904227747",{"2":{"114":1}}],["46506",{"2":{"56":1}}],["465103",{"2":{"22":1}}],["46",{"2":{"35":1,"96":1}}],["463503",{"2":{"22":1}}],["426519",{"2":{"25":1}}],["42857",{"2":{"22":2}}],["42",{"2":{"11":3}}],["4",{"2":{"4":4,"5":4,"16":4,"17":4,"18":2,"19":2,"20":1,"21":8,"22":9,"27":1,"34":1,"35":1,"40":6,"51":2,"52":1,"53":1,"54":2,"55":2,"56":4,"64":1,"86":3,"87":2,"96":3,"100":1,"102":1}}],["3d",{"0":{"111":1}}],["3hr",{"2":{"59":2,"107":3,"112":1}}],["34818",{"2":{"56":1}}],["34832",{"2":{"56":1}}],["348362",{"2":{"25":1}}],["34549",{"2":{"56":1}}],["34218",{"2":{"56":1}}],["337016",{"2":{"87":2}}],["337926",{"2":{"25":1}}],["33565",{"2":{"56":1}}],["320869",{"2":{"96":1}}],["320052",{"2":{"96":1}}],["32555",{"2":{"56":1}}],["3252",{"2":{"51":1,"52":1}}],["32149",{"2":{"56":1}}],["3×3",{"2":{"47":1}}],["3×20",{"2":{"42":1}}],["384×192×7",{"2":{"113":1}}],["384×192×251288",{"2":{"59":1}}],["3866",{"2":{"56":1}}],["38364",{"2":{"56":1}}],["3835",{"2":{"51":1,"52":1}}],["38",{"2":{"37":1,"70":3}}],["312",{"2":{"56":1}}],["31753",{"2":{"56":1}}],["3169",{"2":{"56":1}}],["3188",{"2":{"56":1}}],["31",{"2":{"37":2,"39":1,"40":1,"100":1,"101":2}}],["360",{"2":{"112":1,"113":1}}],["3600",{"2":{"37":1,"39":2}}],["366",{"2":{"102":1}}],["366625",{"2":{"27":1}}],["365×1",{"2":{"101":1}}],["365",{"2":{"101":1,"102":4}}],["36126",{"2":{"56":1}}],["36142",{"2":{"56":1}}],["36836",{"2":{"56":1}}],["369",{"2":{"40":1}}],["36",{"2":{"37":1,"39":2,"40":1,"54":1}}],["364288",{"2":{"25":1}}],["374138",{"2":{"96":1}}],["37",{"2":{"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1}}],["372",{"2":{"56":1}}],["372761",{"2":{"22":1}}],["37878",{"2":{"56":1}}],["376135",{"2":{"22":1}}],["35762",{"2":{"87":2}}],["35700351866494",{"2":{"59":4,"107":2,"113":2}}],["35432",{"2":{"56":1}}],["35483",{"2":{"56":1}}],["359",{"2":{"40":1,"59":2,"60":2,"63":3,"67":1,"68":2,"69":1,"72":2,"79":1,"85":1,"107":1,"113":1}}],["35",{"2":{"10":1,"12":1,"13":1,"22":1,"29":1}}],["303359",{"2":{"96":1}}],["309666",{"2":{"96":1}}],["307f8f0e584a39a050c042849004e6a2bd674f99",{"2":{"61":1}}],["3069",{"2":{"56":1}}],["30018",{"2":{"56":1}}],["30142",{"2":{"56":1}}],["30113",{"2":{"56":1}}],["30×15×10",{"2":{"16":1}}],["30×10×15",{"2":{"10":1,"12":1,"13":1,"22":1,"29":1}}],["30",{"2":{"10":3,"12":1,"13":1,"14":2,"16":5,"22":5,"23":2,"26":2,"29":4,"30":2,"56":2,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"107":1}}],["39",{"2":{"10":1,"16":3,"18":1,"19":1,"33":1,"35":1,"37":1,"39":1,"40":1,"41":2,"56":1,"58":1,"62":1,"63":1,"67":1,"77":1,"81":1,"89":2,"92":4,"101":3,"112":4,"113":2,"114":1}}],["3",{"2":{"4":8,"5":8,"6":10,"10":1,"11":3,"12":3,"13":2,"16":4,"17":3,"18":1,"19":3,"20":1,"21":14,"22":6,"27":1,"29":3,"32":5,"34":1,"37":4,"41":4,"42":5,"46":1,"47":2,"50":2,"51":2,"56":31,"59":1,"60":1,"63":3,"64":5,"68":2,"70":4,"71":5,"85":1,"86":3,"89":1,"96":3,"100":2,"113":1,"114":1}}],["zoom",{"2":{"111":1}}],["zopen",{"2":{"59":1,"87":1,"107":1,"112":1}}],["zeros",{"2":{"86":3,"101":1}}],["z",{"2":{"4":2,"5":3,"6":2,"85":2}}],["zarray",{"2":{"87":1}}],["zarr",{"0":{"59":1,"80":1,"81":1,"106":1},"1":{"81":1},"2":{"0":1,"2":2,"4":2,"5":2,"6":2,"16":5,"17":1,"20":2,"23":1,"27":1,"47":1,"58":2,"59":3,"80":5,"81":5,"84":3,"85":4,"86":6,"87":2,"89":4,"90":2,"99":2,"107":1,"112":1}}],["xticklabelalign",{"2":{"100":1,"102":1}}],["xticklabelrotation",{"2":{"100":1,"102":1}}],["xlabel=",{"2":{"100":1,"102":1}}],["xdim",{"2":{"78":3}}],["xx",{"2":{"60":1,"67":1,"79":1,"85":1}}],["xc",{"2":{"50":2}}],["xarray",{"2":{"49":1,"50":1}}],["x26",{"2":{"22":12,"40":12}}],["x3c",{"2":{"22":12,"40":4,"89":1}}],["xyz",{"2":{"21":2}}],["xy",{"2":{"19":2}}],["xyt",{"2":{"19":2,"21":2}}],["xin",{"2":{"18":8,"19":11,"21":8,"22":3,"41":3}}],["xout",{"2":{"16":2,"18":6,"19":6,"21":2,"22":3}}],["x",{"2":{"4":2,"5":3,"6":2,"13":2,"26":1,"27":3,"41":4,"47":2,"50":2,"51":2,"52":1,"56":3,"61":1,"74":1,"87":2,"90":1,"96":3,"100":1,"101":6}}],["ndata",{"2":{"109":2,"110":1,"111":1}}],["ndays",{"2":{"101":4}}],["nlon",{"2":{"109":2,"110":1}}],["npy",{"2":{"100":2,"101":2}}],["nin",{"2":{"90":2}}],["ntr",{"2":{"90":1}}],["ntuple",{"2":{"90":4}}],["nthreads",{"2":{"89":2}}],["nvalid",{"2":{"89":1}}],["n",{"2":{"73":1,"89":3}}],["n256",{"2":{"56":1}}],["nan",{"2":{"50":2,"51":48,"52":48,"56":384}}],["name=cube",{"2":{"89":1}}],["named",{"2":{"67":1,"69":1,"70":1,"74":1,"78":1,"89":2,"97":1}}],["namedtuple",{"2":{"18":1,"20":1,"89":1,"90":3}}],["names",{"0":{"21":1,"32":1,"43":1,"45":1},"1":{"33":1,"44":1,"45":1},"2":{"29":2,"46":1,"53":1,"74":2,"89":2,"90":1}}],["namely",{"2":{"16":1,"17":1}}],["name",{"0":{"44":1},"2":{"2":1,"18":4,"20":1,"45":1,"50":4,"51":1,"56":1,"59":3,"60":4,"63":12,"65":1,"68":8,"69":12,"70":12,"71":20,"77":1,"86":2,"89":6,"90":5,"96":1,"113":3,"114":3}}],["nc",{"2":{"50":2,"60":2,"64":4,"65":6,"66":2,"67":2,"79":2,"82":2,"83":3,"89":6}}],["number",{"2":{"49":1,"54":1,"81":1,"83":1,"89":2,"90":1,"101":1}}],["numbers",{"2":{"10":1,"96":1}}],["nout",{"2":{"90":2}}],["normal",{"2":{"89":1,"111":1}}],["north",{"2":{"61":1}}],["nometadata",{"2":{"51":3,"52":2,"54":3,"55":1,"56":10}}],["november",{"2":{"60":1,"67":1,"79":1,"85":1}}],["nov",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["nonnumeric",{"2":{"113":3,"114":1,"115":1}}],["nonmissingtype",{"2":{"90":1}}],["none",{"2":{"40":2,"45":1,"46":1,"59":1,"85":1,"107":1}}],["non",{"2":{"23":1,"89":1,"90":1,"100":1}}],["now",{"2":{"16":3,"18":1,"22":1,"33":1,"35":1,"37":1,"42":1,"46":1,"51":1,"52":1,"54":1,"56":1,"58":1,"86":2,"87":1,"93":1,"112":2}}],["no",{"2":{"14":1,"21":1,"27":1,"36":1,"81":1,"83":1,"86":1,"89":1,"90":1}}],["notice",{"2":{"81":1}}],["notation",{"2":{"37":1,"71":1}}],["nothing",{"2":{"18":1,"19":1,"21":1,"51":2,"54":4,"55":2,"56":5,"90":1}}],["note",{"2":{"9":1,"13":1,"16":4,"18":1,"21":1,"22":1,"33":1,"40":1,"47":1,"51":1,"52":1,"60":1,"63":1,"65":1,"86":1,"89":1,"90":1,"112":1}}],["not",{"0":{"40":1},"2":{"0":1,"1":1,"13":1,"36":1,"40":3,"45":1,"46":2,"47":1,"50":1,"60":1,"78":1,"86":2,"89":3,"90":3,"112":1}}],["neighbour",{"2":{"89":1}}],["neighboring",{"2":{"13":1}}],["near",{"2":{"59":2,"71":1,"107":1,"113":2,"114":2}}],["needed",{"2":{"89":1}}],["need",{"2":{"45":1,"87":1,"89":1,"90":1,"92":1}}],["next",{"2":{"41":1,"42":1,"53":1,"78":1,"93":2}}],["netcdf4",{"2":{"60":1}}],["netcdf",{"0":{"60":1,"82":1,"83":1},"1":{"83":1},"2":{"27":1,"47":1,"48":2,"58":1,"60":4,"62":1,"64":3,"65":1,"66":1,"67":2,"75":3,"79":2,"82":3,"83":2,"84":1,"89":3,"99":2}}],["necessary",{"2":{"16":1,"49":1,"50":1,"87":1,"90":4}}],["newdim",{"2":{"78":2,"89":1}}],["new",{"0":{"9":1,"65":1},"2":{"10":1,"12":1,"16":1,"29":1,"32":1,"33":3,"48":1,"53":1,"64":1,"65":2,"76":1,"84":1,"85":1,"86":1,"89":5,"90":4,"92":6,"101":1}}],["bit",{"2":{"114":1}}],["bits",{"2":{"89":2}}],["big",{"2":{"74":1}}],["black",{"2":{"102":1}}],["blocks",{"2":{"89":1}}],["blosccompressor",{"2":{"81":1}}],["blue",{"2":{"61":1,"75":1}}],["boundaries",{"2":{"90":1}}],["bounds",{"2":{"89":1}}],["both",{"2":{"66":1}}],["bold",{"2":{"56":1}}],["bool=true",{"2":{"90":1}}],["bool=false",{"2":{"89":1,"90":1}}],["boolean",{"2":{"89":3}}],["bool",{"2":{"47":3,"90":6}}],["bwr",{"2":{"56":1}}],["b`",{"2":{"37":1}}],["broad",{"2":{"104":1}}],["broadcasts",{"2":{"90":1}}],["broadcast",{"2":{"51":1,"56":1}}],["broadcasted",{"2":{"16":2,"89":1,"90":1}}],["brown",{"2":{"102":1}}],["browser",{"2":{"93":1}}],["brightness",{"2":{"74":1,"75":1}}],["brings",{"2":{"90":1}}],["bring",{"2":{"34":1}}],["branch",{"2":{"59":1,"107":1}}],["built",{"2":{"112":1}}],["build",{"0":{"93":1},"2":{"32":1,"93":1}}],["bug",{"2":{"91":1}}],["bundle",{"2":{"75":1}}],["but",{"0":{"40":1},"2":{"8":1,"16":2,"32":1,"33":2,"40":2,"45":1,"46":2,"60":1,"69":1,"70":1,"78":1,"89":2}}],["b",{"2":{"17":2,"18":1,"19":1,"20":1,"22":13,"45":2,"58":1,"71":2,"89":3}}],["basic",{"2":{"115":1}}],["based",{"0":{"106":1},"2":{"89":1,"90":1}}],["base",{"0":{"25":1},"2":{"4":4,"5":4,"6":2,"18":1,"20":1,"25":4,"29":3,"32":9,"33":6,"44":1,"45":5,"47":4,"51":1,"86":6,"90":1,"96":2}}],["backgroundcolor=",{"2":{"111":1}}],["back",{"2":{"89":1}}],["backend",{"2":{"89":6}}],["backendlist",{"2":{"48":1,"89":1}}],["backend=",{"2":{"2":1,"16":2,"84":1,"85":1,"89":1}}],["by=",{"2":{"42":2,"89":2}}],["bytes",{"2":{"8":1,"9":1,"14":1,"16":3,"17":1,"18":1,"19":1,"21":3,"22":1,"25":1,"27":1,"33":3,"34":1,"37":1,"42":2,"47":2,"54":1,"64":1,"69":2,"83":4,"86":1,"96":1,"114":1}}],["by",{"0":{"4":1,"5":1},"2":{"2":1,"10":2,"14":1,"16":1,"22":1,"28":1,"29":1,"33":1,"36":1,"37":6,"40":2,"42":1,"49":1,"50":1,"53":1,"54":1,"55":1,"56":1,"59":1,"60":1,"74":3,"76":1,"77":1,"78":2,"84":1,"87":2,"89":12,"90":6,"92":1,"93":1,"95":1,"101":1,"113":1,"114":1}}],["beware",{"2":{"103":1}}],["best",{"2":{"90":1,"105":1}}],["become",{"2":{"89":1}}],["because",{"2":{"1":1,"13":1,"14":1,"16":1}}],["before",{"2":{"86":1,"89":1,"93":1}}],["belonging",{"2":{"75":1}}],["belongs",{"2":{"22":1}}],["being",{"2":{"46":1,"112":1}}],["been",{"2":{"40":1,"78":2,"87":1}}],["between",{"2":{"26":1,"27":1,"37":1,"39":1,"40":2,"71":1,"81":1,"83":1,"89":1}}],["begin",{"2":{"23":1}}],["be",{"2":{"0":5,"2":1,"3":1,"4":1,"13":1,"15":1,"16":2,"22":1,"24":1,"37":1,"40":1,"41":1,"42":2,"45":1,"46":1,"50":1,"59":2,"60":1,"61":1,"62":2,"63":1,"72":1,"74":1,"76":2,"78":2,"84":1,"85":1,"86":1,"89":23,"90":9,"92":1,"97":1,"98":1,"103":1,"107":1,"115":1}}],["623962",{"2":{"96":1}}],["622774",{"2":{"96":1}}],["666534",{"2":{"96":1}}],["665274",{"2":{"96":1}}],["665723",{"2":{"25":1}}],["6326",{"2":{"61":1}}],["6378137",{"2":{"61":1}}],["63006",{"2":{"56":1}}],["69",{"2":{"59":1}}],["69085",{"2":{"56":1}}],["600",{"2":{"100":1,"102":1,"108":1,"109":1,"110":1,"112":1,"113":1}}],["60764",{"2":{"96":1}}],["60265",{"2":{"59":1,"107":1}}],["60918",{"2":{"56":1}}],["60175",{"2":{"56":1}}],["650",{"2":{"113":2}}],["65105",{"2":{"56":1}}],["652339",{"2":{"25":1}}],["645512",{"2":{"96":1}}],["645758",{"2":{"25":1}}],["64976",{"2":{"56":1}}],["642",{"2":{"50":1}}],["6122",{"2":{"56":1}}],["61197",{"2":{"56":1}}],["611084",{"2":{"25":1}}],["619",{"2":{"51":1,"52":1}}],["617023",{"2":{"27":1}}],["673373",{"2":{"25":1}}],["671662",{"2":{"22":1}}],["672",{"2":{"21":1}}],["683599",{"2":{"96":1}}],["687891",{"2":{"27":1}}],["684389",{"2":{"22":1}}],["685454",{"2":{"22":1}}],["6×2",{"2":{"9":1}}],["6",{"2":{"2":6,"4":6,"5":6,"6":6,"8":4,"9":5,"16":8,"22":1,"34":1,"37":1,"59":1,"66":1,"107":1}}],["1e8",{"2":{"90":1}}],["1f2",{"2":{"47":1}}],["191898",{"2":{"96":1}}],["1992",{"2":{"89":1}}],["1991",{"2":{"89":1}}],["1990",{"2":{"89":1}}],["198806",{"2":{"96":1}}],["1984",{"2":{"61":1}}],["1983",{"2":{"50":2,"54":1}}],["1980",{"2":{"50":2,"54":1}}],["193109",{"2":{"27":1}}],["197238",{"2":{"25":1}}],["19241",{"2":{"56":1}}],["192",{"2":{"19":1,"109":1}}],["19",{"2":{"16":16,"70":3,"71":5}}],["182371",{"2":{"87":2}}],["18583",{"2":{"56":1}}],["18892",{"2":{"56":1}}],["18434",{"2":{"56":1}}],["180×170",{"2":{"69":1}}],["180×170×24",{"2":{"60":1,"63":3,"68":2}}],["180",{"2":{"40":2,"61":1,"71":5,"109":1}}],["180ºe",{"2":{"40":1}}],["18",{"2":{"16":18}}],["14715175267308206",{"2":{"101":1}}],["1437",{"2":{"56":1}}],["145747",{"2":{"22":1}}],["14286",{"2":{"22":1}}],["14",{"2":{"16":20,"27":1}}],["137114",{"2":{"96":1}}],["1372",{"2":{"51":1,"52":1}}],["136",{"2":{"60":1,"67":1,"79":1,"85":1}}],["1363",{"2":{"51":1,"52":1}}],["13z",{"2":{"59":2,"107":1,"113":1,"114":1}}],["13205",{"2":{"27":1}}],["13",{"2":{"16":20,"27":1,"60":1,"67":1,"79":1,"85":1}}],["170",{"2":{"72":1}}],["179919",{"2":{"96":1}}],["179",{"2":{"61":1,"71":5}}],["17578125",{"2":{"61":2}}],["17593",{"2":{"22":1}}],["17434",{"2":{"56":1}}],["174934",{"2":{"25":1}}],["17852",{"2":{"56":1}}],["17863",{"2":{"56":1}}],["178603",{"2":{"22":1}}],["17647",{"2":{"56":1}}],["1762",{"2":{"51":1,"52":1}}],["17t00",{"2":{"50":2,"54":1}}],["172",{"2":{"47":1}}],["17",{"2":{"14":1,"16":22,"42":1,"70":1}}],["16t00",{"2":{"60":4,"63":6,"67":2,"68":4,"69":4,"70":6,"71":10,"79":2,"85":2}}],["16t12",{"2":{"50":2,"54":1}}],["1644",{"2":{"56":1}}],["16824",{"2":{"56":1}}],["16581",{"2":{"56":1}}],["16631",{"2":{"56":1}}],["166212",{"2":{"25":1}}],["16713",{"2":{"56":1}}],["167676",{"2":{"22":1}}],["16258",{"2":{"56":1}}],["169284",{"2":{"25":1}}],["16",{"2":{"10":1,"12":1,"13":1,"16":20,"22":1,"29":1,"60":2,"63":3,"67":1,"68":2,"69":4,"70":3,"71":5,"79":1,"85":1}}],["156",{"2":{"114":1}}],["15644",{"2":{"56":1}}],["157",{"2":{"114":1}}],["150",{"2":{"114":2}}],["155874",{"2":{"96":1}}],["15532",{"2":{"56":1}}],["158741",{"2":{"87":2}}],["159",{"2":{"70":1}}],["151146",{"2":{"25":1}}],["152534",{"2":{"25":1}}],["15394",{"2":{"22":1}}],["15×10×30",{"2":{"16":1}}],["15×10",{"2":{"16":2}}],["15",{"2":{"10":1,"16":25,"22":6,"23":1,"27":4,"29":1,"30":1,"35":2,"42":1,"50":2,"96":1}}],["128",{"2":{"111":1}}],["128204",{"2":{"25":1}}],["1242",{"2":{"56":1}}],["12575",{"2":{"56":1}}],["121",{"2":{"47":1}}],["121947",{"2":{"22":1}}],["12370988510072528",{"2":{"101":1}}],["123",{"2":{"17":1,"21":2}}],["1200",{"2":{"108":1,"109":1,"110":1}}],["120997",{"2":{"22":1}}],["120",{"2":{"16":1}}],["12",{"2":{"8":4,"16":20,"27":1,"37":10,"39":3,"40":4,"60":2,"63":3,"67":1,"68":2,"69":2,"70":3,"71":5,"79":1,"85":1,"100":1,"101":2}}],["1=5",{"2":{"2":1}}],["11391077060238619",{"2":{"101":1}}],["113553",{"2":{"55":3}}],["111379",{"2":{"96":1}}],["1159916",{"2":{"83":1}}],["119",{"2":{"69":1}}],["1181",{"2":{"56":1}}],["112319",{"2":{"55":12}}],["114815",{"2":{"55":6}}],["11",{"2":{"2":6,"4":6,"5":6,"6":6,"8":1,"16":18,"27":1,"51":4,"52":4,"56":4,"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1}}],["1",{"2":{"2":12,"4":19,"5":20,"6":22,"8":5,"9":3,"10":8,"11":3,"12":7,"13":5,"14":6,"16":24,"17":10,"18":9,"19":8,"20":5,"21":17,"22":34,"23":3,"25":1,"26":2,"27":6,"29":15,"30":4,"32":3,"33":3,"34":8,"35":8,"37":23,"39":10,"40":8,"41":15,"42":14,"44":1,"45":3,"46":1,"47":5,"50":4,"51":4,"52":2,"54":6,"55":10,"56":54,"59":4,"60":12,"63":12,"64":17,"65":17,"66":4,"67":4,"68":8,"69":13,"70":18,"71":15,"72":4,"79":4,"85":11,"86":2,"87":2,"90":1,"96":11,"100":2,"101":5,"102":5,"107":3,"109":4,"110":2,"111":5,"113":2,"114":2}}],["10291543325743235",{"2":{"101":1}}],["1095",{"2":{"101":1}}],["10989",{"2":{"55":6}}],["10mb",{"2":{"89":2}}],["1083",{"2":{"56":1}}],["108696",{"2":{"55":6}}],["103704",{"2":{"55":3}}],["10×170×24",{"2":{"70":1}}],["10×10×24",{"2":{"70":2}}],["10×10×8",{"2":{"37":1}}],["10×10×12",{"2":{"37":1}}],["10×10×36",{"2":{"37":1}}],["10×10×5",{"2":{"32":1}}],["10×10",{"2":{"33":3,"34":1,"37":1}}],["10×15×20",{"2":{"41":1}}],["10×15",{"2":{"14":1,"22":2,"42":1,"96":1}}],["10×20×5",{"2":{"29":1}}],["100",{"2":{"40":7,"113":1}}],["100622",{"2":{"27":1}}],["1000",{"2":{"0":1,"109":1,"110":1}}],["10x15",{"2":{"22":1}}],["101524",{"2":{"22":1}}],["10",{"2":{"2":14,"4":16,"5":18,"6":17,"10":3,"12":1,"13":1,"14":1,"16":21,"22":15,"23":3,"25":2,"27":4,"29":6,"30":2,"32":8,"33":12,"34":5,"35":4,"37":16,"39":10,"41":3,"42":2,"44":2,"45":4,"59":1,"60":2,"63":3,"68":2,"69":3,"70":6,"71":5,"85":2,"95":1,"96":3,"113":1,"114":1}}],["garbage",{"2":{"90":1}}],["gc",{"2":{"90":2}}],["gt",{"2":{"89":1,"90":3,"93":1}}],["gdalworkshop",{"2":{"61":1}}],["gdal",{"0":{"61":1},"2":{"61":1}}],["gb",{"2":{"59":1}}],["gn",{"2":{"59":1,"107":2,"112":1}}],["gs",{"2":{"59":1,"107":2,"112":1}}],["ggplot2",{"2":{"56":1,"112":1}}],["github",{"2":{"50":2,"61":1,"91":1}}],["gives",{"2":{"22":1}}],["given",{"2":{"2":1,"22":2,"58":1,"74":1,"76":1,"84":1,"89":6,"90":3,"96":1}}],["glob",{"2":{"89":1}}],["globalproperties=dict",{"2":{"90":1}}],["global",{"2":{"89":1,"90":1}}],["glmakie",{"2":{"42":2,"99":1,"107":2,"111":3,"112":3}}],["glue",{"2":{"8":1}}],["graphics",{"2":{"112":2}}],["grammar",{"2":{"112":1}}],["gradient",{"2":{"108":1,"109":1,"110":1,"111":1}}],["gradually",{"2":{"86":1}}],["grey25",{"2":{"111":1}}],["grey15",{"2":{"42":1,"56":1}}],["greenwich",{"2":{"61":1}}],["green",{"2":{"61":1,"75":1}}],["grouped",{"2":{"89":1}}],["groups",{"2":{"55":1}}],["groupby",{"0":{"51":1,"54":1},"1":{"52":1,"53":1,"55":1,"56":1},"2":{"48":1,"50":1,"51":6,"52":1,"53":1,"54":3,"55":3,"56":3,"89":1,"101":1}}],["group",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1},"2":{"51":1,"53":1,"54":2,"75":1,"89":3}}],["grouping",{"2":{"42":2,"53":2}}],["grid=false",{"2":{"56":1}}],["grid",{"2":{"23":1,"74":1,"89":1}}],["gridchunks",{"2":{"2":3,"4":1,"5":1,"6":1,"89":1,"90":1}}],["go",{"2":{"93":2}}],["going",{"2":{"90":1}}],["good",{"2":{"56":1}}],["goal",{"2":{"21":1,"33":1,"49":1}}],["goes",{"2":{"16":2,"89":1,"90":1}}],["guide",{"2":{"10":2,"12":1,"13":1,"23":1,"29":3,"30":1}}],["gen",{"2":{"16":6}}],["general",{"0":{"104":1},"2":{"89":1,"98":1}}],["generated",{"2":{"60":1,"67":1,"79":1,"85":1,"90":1}}],["generate",{"2":{"16":2,"37":1,"39":1,"40":1,"89":1,"93":1}}],["generic",{"2":{"16":2,"18":1,"19":1,"21":1,"29":1,"89":1}}],["getting",{"0":{"94":1},"1":{"95":1,"96":1,"97":1}}],["gettarrayaxes",{"2":{"46":1}}],["getarrayinfo",{"2":{"90":1}}],["getaxis",{"2":{"34":1,"42":2,"89":1}}],["getloopchunks",{"2":{"90":1}}],["getloopcachesize",{"2":{"90":1}}],["getouttype",{"2":{"90":1}}],["getoutaxis",{"2":{"90":1}}],["getfrontperm",{"2":{"90":1}}],["gets",{"2":{"89":1,"90":1}}],["get",{"0":{"72":1},"2":{"10":1,"18":1,"32":1,"54":1,"68":1,"70":1,"72":1,"90":3,"96":1,"101":1,"107":1}}],["geoaxis",{"2":{"109":1,"110":1}}],["geometrybasics",{"2":{"107":1,"111":1,"112":1}}],["geomakie",{"2":{"99":1,"107":1,"109":2,"110":1}}],["geogcs",{"2":{"61":1}}],["geojson",{"0":{"61":1}}],["geotiff",{"0":{"61":1}}],["geo",{"2":{"1":1}}],["g",{"2":{"7":1,"10":1,"11":1,"13":1,"16":4,"23":1,"29":1,"51":26,"52":2,"53":2,"54":2,"55":1,"56":18,"58":2,"72":1,"74":1,"77":1,"89":5,"107":2,"112":2}}],["2π",{"2":{"100":1}}],["2×3",{"2":{"96":1}}],["2×2×3",{"2":{"4":1,"5":1,"6":1}}],["2×2",{"2":{"2":3,"47":1}}],["2x2l31",{"2":{"60":1,"67":1,"79":1,"85":1}}],["2963860",{"2":{"83":1}}],["298617",{"2":{"87":2}}],["298",{"2":{"61":1}}],["29816",{"2":{"56":1}}],["29473",{"2":{"56":1}}],["29564",{"2":{"56":1}}],["274902",{"2":{"96":1}}],["2747",{"2":{"56":1}}],["273",{"2":{"54":1}}],["276",{"2":{"54":2}}],["270",{"2":{"54":1}}],["27",{"2":{"51":1,"52":1,"56":1}}],["275265",{"2":{"87":2}}],["275×205×9",{"2":{"51":4}}],["275×205×36",{"2":{"50":2}}],["275",{"2":{"50":2}}],["2f0",{"2":{"47":1}}],["28422753251364",{"2":{"59":4,"107":2,"113":2}}],["28008",{"2":{"56":1}}],["2894",{"2":{"56":1}}],["288",{"2":{"54":1}}],["2818",{"2":{"51":1,"52":1}}],["28",{"2":{"37":1,"51":3,"52":3,"56":3}}],["28571",{"2":{"22":2}}],["2857142857142857",{"2":{"10":1,"12":1,"13":1,"14":1,"22":3,"29":2,"30":1,"35":1,"41":3,"42":1,"96":1}}],["2d",{"2":{"19":5,"20":3,"21":2}}],["26274",{"2":{"56":1}}],["268675",{"2":{"27":1}}],["265797",{"2":{"25":1}}],["26",{"2":{"16":2,"59":2,"107":1,"113":1,"114":1}}],["253383",{"2":{"96":1}}],["259455",{"2":{"87":2}}],["257223563",{"2":{"61":1}}],["25153",{"2":{"56":1}}],["25",{"2":{"16":4,"26":2,"37":1,"100":1}}],["24375",{"2":{"56":1}}],["2434",{"2":{"56":1}}],["241882",{"2":{"25":1}}],["24",{"2":{"16":6,"42":1,"69":2}}],["240",{"2":{"14":1,"16":1,"27":1}}],["233118",{"2":{"96":1}}],["23",{"2":{"16":8,"41":3,"56":1,"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1}}],["22990067443344916",{"2":{"101":1}}],["224959",{"2":{"96":1}}],["22211",{"2":{"56":1}}],["225542",{"2":{"27":1}}],["22",{"2":{"16":10}}],["211397",{"2":{"96":1}}],["21t06",{"2":{"59":2,"107":1,"113":1,"114":1}}],["21t19",{"2":{"46":4}}],["2101",{"2":{"59":2,"107":1}}],["21699",{"2":{"56":1}}],["21209",{"2":{"56":1}}],["215973",{"2":{"27":1}}],["21",{"2":{"16":12,"51":8,"52":8,"56":8}}],["2=10",{"2":{"2":1}}],["2",{"2":{"2":3,"4":8,"5":9,"6":10,"8":1,"9":1,"11":3,"12":2,"13":1,"14":1,"17":1,"18":2,"19":2,"20":1,"22":9,"23":1,"25":2,"27":3,"29":1,"32":3,"33":6,"34":3,"37":1,"40":6,"42":6,"45":4,"46":1,"47":8,"51":1,"52":1,"56":40,"59":3,"60":3,"63":6,"64":2,"65":2,"67":1,"68":4,"69":2,"70":2,"71":5,"72":2,"79":1,"85":2,"86":2,"89":2,"96":5,"107":3,"109":2,"111":1,"112":1,"113":1,"114":1}}],["207967",{"2":{"96":1}}],["209357",{"2":{"96":1}}],["2003",{"2":{"60":1,"67":1,"79":1,"85":1}}],["2004",{"2":{"60":1,"67":1,"79":1,"85":1}}],["2005",{"2":{"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1}}],["2002",{"2":{"60":3,"63":3,"67":2,"68":2,"69":2,"70":3,"71":5,"79":2,"85":1}}],["2001",{"2":{"60":3,"63":3,"67":2,"68":2,"69":3,"70":3,"71":5,"79":2,"85":1}}],["2000",{"2":{"26":1}}],["2019",{"2":{"59":2,"107":1,"113":1,"114":1}}],["2015",{"2":{"59":2,"60":1,"67":1,"79":1,"85":1,"107":2,"113":4,"114":4}}],["205",{"2":{"50":2}}],["20×10×15",{"2":{"41":2}}],["20×10×15×2",{"2":{"35":1,"96":1}}],["20ºn",{"2":{"40":1}}],["203714",{"2":{"27":1}}],["2023",{"2":{"100":1,"101":2}}],["2021",{"2":{"37":9,"100":1,"101":2,"102":1}}],["2020",{"2":{"37":5,"39":3,"40":4,"46":8,"64":4,"65":2,"66":8,"76":1}}],["2024",{"2":{"26":1,"65":5}}],["2022",{"2":{"10":4,"12":2,"13":2,"14":2,"16":8,"17":4,"18":2,"20":2,"21":6,"22":6,"23":2,"29":6,"30":2,"37":5,"39":3,"40":4,"102":1}}],["20",{"2":{"2":7,"4":10,"5":10,"6":10,"16":14,"29":2,"35":4,"40":2,"41":3,"42":1,"56":1,"85":2,"96":3}}],["5625",{"2":{"114":1}}],["56632",{"2":{"56":1}}],["55",{"2":{"101":1,"115":1}}],["551487",{"2":{"96":1}}],["551732",{"2":{"22":1}}],["55245",{"2":{"96":1}}],["552582",{"2":{"96":1}}],["514759",{"2":{"96":1}}],["514979",{"2":{"22":1}}],["5173",{"2":{"93":1}}],["542756",{"2":{"96":1}}],["547668",{"2":{"96":1}}],["547738",{"2":{"87":2}}],["54942",{"2":{"87":2}}],["540514",{"2":{"27":1}}],["5743",{"2":{"56":1}}],["57873",{"2":{"56":1}}],["57695",{"2":{"56":1}}],["57143",{"2":{"22":2}}],["52419",{"2":{"56":1}}],["59",{"2":{"113":1}}],["598769",{"2":{"96":1}}],["599987",{"2":{"87":2}}],["59212",{"2":{"56":1}}],["59085",{"2":{"56":1}}],["594514",{"2":{"25":1}}],["595405",{"2":{"22":1}}],["5×4",{"2":{"87":2}}],["5×4×5",{"2":{"86":1}}],["5×4×3",{"2":{"21":2}}],["5×4×3×2",{"2":{"17":1,"18":1}}],["5×7×3",{"2":{"64":1}}],["5×6×36",{"2":{"37":1}}],["5×6",{"2":{"27":2}}],["5×10",{"2":{"25":2}}],["507229",{"2":{"96":1}}],["506947",{"2":{"87":2}}],["508557",{"2":{"22":1}}],["500909",{"2":{"96":1}}],["50089",{"2":{"56":1}}],["500",{"2":{"0":1,"56":1,"111":2}}],["500mb",{"2":{"0":2}}],["53",{"2":{"69":1}}],["538981",{"2":{"22":1}}],["536399",{"2":{"22":1}}],["5843",{"2":{"51":1,"52":1}}],["581312",{"2":{"25":1}}],["58",{"2":{"16":2}}],["5",{"2":{"2":7,"4":16,"5":18,"6":7,"10":2,"12":3,"13":2,"14":1,"16":6,"17":2,"21":4,"22":10,"23":1,"25":2,"27":4,"29":5,"30":1,"32":4,"34":1,"35":2,"37":3,"39":4,"41":3,"42":2,"45":4,"56":5,"60":4,"63":6,"64":9,"65":3,"66":1,"67":2,"68":4,"69":3,"70":10,"71":10,"72":24,"79":2,"85":4,"86":6,"87":3,"96":2,"97":1,"102":2,"111":2}}],["rotate",{"2":{"111":1}}],["row",{"2":{"77":1,"89":1}}],["rowgap",{"2":{"56":1}}],["right",{"2":{"100":1,"102":1}}],["rights",{"2":{"87":1}}],["r",{"2":{"86":1,"112":1}}],["rlon",{"2":{"78":2}}],["rlat",{"2":{"78":2}}],["r1i1p1f1",{"2":{"59":2,"107":3,"112":1}}],["running",{"2":{"93":1}}],["run",{"2":{"23":1,"93":3,"98":2}}],["runs",{"2":{"13":1,"90":1}}],["ram",{"2":{"62":1}}],["race",{"2":{"60":1}}],["rafaqz",{"2":{"50":1}}],["raw",{"2":{"50":1,"61":1}}],["rasm",{"2":{"50":2}}],["ras",{"2":{"26":3}}],["rasters",{"2":{"26":2}}],["raster",{"0":{"26":1},"2":{"22":11,"26":3}}],["ranges",{"0":{"70":1},"2":{"34":1,"67":1}}],["range",{"2":{"10":2,"16":2,"17":2,"22":2,"23":2,"29":2,"35":3,"37":1,"66":1,"90":1,"96":3,"100":1}}],["randn",{"2":{"100":1}}],["random",{"2":{"17":2,"40":2,"46":3,"96":1}}],["rand",{"2":{"2":1,"4":3,"5":3,"6":3,"8":2,"9":2,"10":1,"17":1,"19":1,"21":3,"22":1,"23":1,"25":1,"26":1,"27":1,"29":2,"30":1,"32":1,"33":2,"35":2,"40":3,"42":1,"44":1,"45":3,"64":4,"85":1,"87":1,"96":2}}],["remaining",{"2":{"78":1}}],["removes",{"2":{"90":1}}],["remove",{"2":{"52":1}}],["removed",{"2":{"15":1,"90":1}}],["remote",{"2":{"0":1}}],["relational",{"2":{"74":1}}],["related",{"2":{"50":1}}],["rect",{"2":{"112":1,"113":2}}],["recommend",{"2":{"97":1}}],["recommended",{"2":{"71":1}}],["rechunking",{"2":{"90":1}}],["recalculate",{"2":{"90":1}}],["recal",{"2":{"90":1}}],["recently",{"2":{"0":1}}],["reentrantlock",{"2":{"60":1}}],["rewrote",{"2":{"59":1,"60":1,"67":1,"79":1,"85":1,"107":1}}],["realization",{"2":{"60":1,"67":1,"79":1,"85":1}}],["realm",{"2":{"59":1,"107":1}}],["reading",{"2":{"58":1}}],["readcubedata",{"0":{"63":1},"2":{"40":2,"62":1,"63":1,"89":1,"112":1,"113":1,"114":1}}],["read",{"0":{"57":1,"59":1,"60":1,"61":1},"1":{"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1},"2":{"1":1,"40":1,"57":1,"61":1,"65":3,"70":1,"89":1,"112":1,"113":1}}],["red",{"2":{"56":1,"61":1,"75":1}}],["reduce",{"2":{"10":1,"14":1,"19":1}}],["reverse",{"2":{"56":1}}],["reverseordered",{"2":{"9":1,"61":1,"96":1}}],["rename",{"2":{"45":1}}],["resets",{"2":{"89":1,"90":1}}],["respectively",{"2":{"75":1}}],["reshape",{"2":{"37":1,"39":2}}],["result",{"2":{"34":1,"42":1}}],["resulting",{"2":{"8":1,"9":1,"14":1,"89":1,"90":1}}],["results",{"0":{"102":1},"2":{"2":1,"5":1,"56":2,"89":1,"90":1}}],["referencing",{"2":{"51":1}}],["references",{"2":{"60":1,"67":1,"79":1,"85":1}}],["reference",{"0":{"88":1},"1":{"89":1,"90":1},"2":{"46":1}}],["ref",{"2":{"35":1,"89":1,"90":1}}],["rebuild",{"0":{"33":1},"2":{"32":1,"33":2,"46":2,"50":1}}],["repeat",{"2":{"100":1}}],["repl",{"2":{"95":1,"98":1}}],["replace",{"2":{"23":1,"50":2,"111":1}}],["repository",{"2":{"91":1,"103":1}}],["reports",{"2":{"91":1}}],["rep",{"2":{"50":2}}],["reproduces",{"2":{"49":1}}],["represented",{"2":{"89":1,"105":1}}],["represents",{"2":{"75":1}}],["representing",{"2":{"22":2,"90":1}}],["representation",{"2":{"1":1,"89":2,"90":3}}],["re",{"2":{"22":1}}],["registry",{"2":{"98":1}}],["registration",{"2":{"90":2}}],["registered",{"2":{"90":1,"98":1}}],["regions",{"2":{"22":8}}],["region",{"2":{"22":12}}],["regular",{"2":{"4":4,"5":4,"6":2,"8":1,"9":1,"10":3,"12":3,"13":3,"14":3,"16":9,"17":3,"18":3,"19":2,"20":2,"21":9,"22":8,"25":2,"27":4,"29":9,"30":3,"32":9,"33":6,"34":2,"35":3,"37":14,"39":6,"40":4,"41":9,"42":3,"44":1,"45":5,"47":4,"50":4,"51":2,"52":2,"56":6,"59":2,"60":4,"61":2,"63":6,"64":2,"65":7,"66":2,"67":2,"68":4,"69":2,"70":3,"71":10,"72":3,"79":2,"85":5,"86":6,"96":5,"101":1,"107":1,"113":1,"114":1}}],["regularchunks",{"2":{"2":6,"4":3,"5":3,"6":3}}],["returned",{"2":{"89":1}}],["returns",{"2":{"89":5,"90":2}}],["return",{"2":{"18":1,"19":1,"21":2,"22":4,"51":1,"89":1,"90":1,"101":1}}],["requests",{"2":{"91":1}}],["requested",{"2":{"13":1}}],["requirements",{"2":{"60":1,"67":1,"79":1,"85":1}}],["required",{"2":{"37":1}}],["requires",{"2":{"16":1}}],["http",{"2":{"93":1}}],["https",{"2":{"50":2,"60":1,"61":1,"67":1,"75":1,"79":1}}],["html",{"2":{"75":1}}],["hdf5",{"2":{"60":1}}],["hr",{"2":{"59":1,"107":2,"112":1}}],["history",{"2":{"59":2,"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1,"107":1,"113":1,"114":1}}],["hidedecorations",{"2":{"56":1}}],["highclip",{"2":{"56":4}}],["high",{"2":{"46":4,"112":1}}],["hm",{"2":{"56":8}}],["hold",{"2":{"89":1}}],["holds",{"2":{"89":1,"90":1}}],["ho",{"0":{"46":1}}],["however",{"2":{"24":1,"37":1,"65":1}}],["how",{"0":{"35":1,"36":1,"41":1,"42":1,"43":1,"98":1},"1":{"37":1,"38":1,"39":1,"40":1,"44":1,"45":1},"2":{"6":1,"7":1,"10":1,"17":2,"18":1,"24":1,"28":1,"31":1,"42":1,"51":1,"57":1,"63":3,"87":1,"89":1,"103":1,"105":1}}],["happens",{"2":{"90":1}}],["had",{"2":{"87":1,"89":1,"90":1}}],["hard",{"2":{"63":1}}],["hamman",{"2":{"49":1,"56":1}}],["handled",{"2":{"90":1}}],["handle",{"2":{"74":1,"90":1}}],["handling",{"2":{"9":1,"89":1}}],["handy",{"2":{"42":1}}],["has",{"2":{"8":1,"9":1,"22":1,"26":1,"27":1,"40":1,"49":1,"52":1,"90":1}}],["half",{"2":{"8":5}}],["have",{"2":{"6":1,"9":1,"22":1,"29":1,"38":1,"40":2,"51":1,"65":1,"76":1,"78":2,"89":3}}],["having",{"2":{"1":1,"22":1}}],["help",{"2":{"89":1,"90":2}}],["height",{"2":{"59":2,"78":2,"107":1,"112":1,"113":1,"114":1}}],["heatmap",{"0":{"108":1},"2":{"42":1,"56":3,"108":1,"112":1}}],["hereby",{"2":{"22":1}}],["here",{"2":{"8":1,"9":1,"13":1,"16":2,"17":1,"21":1,"22":1,"36":1,"42":1,"70":1,"86":1,"92":2}}],["hence",{"2":{"1":1}}],["yet",{"2":{"89":1}}],["yeesian",{"2":{"61":1}}],["years",{"2":{"37":1,"100":1,"101":1}}],["year",{"2":{"8":4,"102":1}}],["yyyy",{"2":{"60":2,"67":2,"79":2,"85":2}}],["ylabel=",{"2":{"100":1,"102":1}}],["ylabel",{"2":{"56":3}}],["yc",{"2":{"50":2}}],["yasxa",{"2":{"40":6}}],["yaxcolumn",{"2":{"90":1}}],["yaxconvert",{"2":{"27":2}}],["yaxdefaults",{"2":{"90":1}}],["yaxarraybase",{"2":{"27":1,"89":1,"90":1}}],["yaxarray",{"0":{"11":1,"17":1,"29":1,"36":1,"37":1,"47":1,"68":1,"74":1},"1":{"18":1,"19":1,"20":1,"37":1,"38":1,"39":1,"40":1},"2":{"2":1,"4":4,"5":4,"6":4,"7":1,"8":3,"9":3,"10":2,"12":1,"13":1,"14":2,"16":8,"17":2,"18":1,"19":2,"20":1,"21":6,"22":3,"23":1,"25":4,"26":2,"27":5,"29":5,"30":2,"32":3,"33":5,"34":1,"35":3,"36":1,"37":15,"39":4,"40":6,"41":3,"42":4,"44":2,"45":4,"46":4,"47":4,"50":2,"51":7,"52":1,"54":9,"55":1,"56":3,"59":2,"60":2,"61":1,"63":3,"64":5,"65":3,"66":1,"67":2,"68":2,"69":3,"70":3,"71":5,"74":1,"76":1,"79":1,"80":1,"82":1,"85":2,"86":4,"89":10,"90":3,"96":5,"101":2,"105":1,"107":1,"113":1,"114":1}}],["yaxarrays",{"0":{"0":1,"1":1,"2":1,"7":1,"10":1,"16":1,"24":1,"28":1,"43":1,"48":1,"57":1,"67":1,"79":1,"91":1,"98":1,"104":1,"105":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"8":1,"9":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"25":1,"26":1,"27":1,"29":1,"30":1,"44":1,"45":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"68":1,"69":1,"70":1,"71":1,"72":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"92":1,"93":1},"2":{"0":3,"2":1,"4":1,"5":1,"6":1,"8":3,"9":3,"10":4,"16":6,"17":3,"22":3,"23":4,"24":2,"25":1,"29":3,"32":1,"33":1,"35":3,"36":1,"37":1,"38":1,"39":2,"40":4,"44":1,"45":1,"46":4,"48":3,"51":2,"54":2,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":2,"64":3,"65":3,"66":3,"67":1,"73":1,"75":1,"78":3,"79":1,"84":1,"86":1,"89":28,"90":28,"91":1,"93":1,"95":3,"96":5,"97":2,"98":4,"101":3,"103":1,"104":1,"107":1,"112":1}}],["yax",{"2":{"0":1,"8":3,"9":3,"10":2,"16":11,"17":3,"18":1,"19":1,"20":3,"21":5,"22":2,"23":2,"29":2,"33":1,"35":2,"37":1,"39":1,"40":1,"46":5,"47":2,"48":1,"51":4,"54":1,"64":3,"65":4,"66":2,"78":18,"89":1,"96":2,"101":2}}],["y",{"2":{"4":2,"5":3,"6":2,"26":1,"27":3,"37":4,"41":4,"50":2,"51":2,"52":1,"56":3,"61":1,"74":1,"96":3}}],["you",{"2":{"1":1,"23":1,"36":1,"40":3,"45":2,"62":1,"63":1,"78":4,"81":1,"89":1,"90":2,"92":1,"93":2,"95":2,"97":1,"98":3,"103":3,"105":2,"112":1}}],["yourself",{"2":{"93":1}}],["your",{"2":{"1":2,"40":2,"60":1,"78":3,"84":2,"86":1,"89":1,"92":4,"93":4}}],["circshift",{"2":{"109":1}}],["ct1",{"2":{"107":4,"108":1}}],["cycle",{"0":{"100":1,"102":1},"1":{"101":1,"102":1},"2":{"101":4}}],["cycle=12",{"2":{"51":2,"52":1,"54":2,"55":2,"56":3}}],["cdata",{"2":{"90":1}}],["center",{"2":{"89":1,"100":1,"102":1}}],["certain",{"2":{"64":1,"67":2,"90":1}}],["cell",{"2":{"59":2,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"89":1,"113":2,"114":2}}],["cf",{"2":{"59":2,"60":2,"67":2,"79":2,"85":2,"107":2}}],["cftime",{"2":{"50":6,"51":2,"54":7,"55":2,"56":2,"60":6,"63":9,"67":3,"68":6,"69":7,"70":9,"71":15,"79":3,"85":3}}],["cmpcachmisses",{"2":{"90":1}}],["cm4",{"2":{"60":4,"67":4,"79":4,"85":4}}],["cmip",{"2":{"59":1,"107":1}}],["cmip6",{"2":{"59":3,"107":6,"112":3}}],["cmor",{"2":{"59":2,"60":3,"63":3,"67":2,"68":2,"69":3,"70":3,"71":5,"79":2,"85":2,"107":1,"113":1,"114":1}}],["c54",{"2":{"56":1}}],["cb",{"2":{"56":1}}],["cbar",{"2":{"42":1}}],["cgrad",{"2":{"42":1}}],["cl",{"2":{"109":1,"110":1}}],["cl=lines",{"2":{"109":1,"110":1}}],["clean",{"2":{"90":1}}],["cleanme",{"2":{"90":4}}],["cleaner",{"2":{"89":2}}],["clevel=n",{"2":{"81":1}}],["climate",{"2":{"60":1,"67":1,"79":1,"85":1}}],["clashes",{"2":{"51":1}}],["classes=classes",{"2":{"42":1}}],["classes",{"2":{"42":8}}],["classification",{"2":{"42":2}}],["class",{"2":{"42":3}}],["closedinterval",{"2":{"71":1}}],["closed",{"0":{"71":1},"2":{"71":3}}],["close",{"2":{"46":4}}],["cloud",{"2":{"11":1,"59":1}}],["clustermanagers",{"2":{"23":2}}],["cluster",{"2":{"23":1}}],["cpus",{"2":{"23":1}}],["cpu",{"2":{"23":1}}],["c",{"2":{"22":11,"32":5,"33":7,"34":3,"42":2,"45":2,"50":2,"58":1,"75":1,"78":4,"81":1,"83":4,"89":6,"90":3,"101":4,"107":2,"112":2,"113":1,"114":1}}],["cumbersome",{"2":{"112":1}}],["custom",{"2":{"29":1,"89":1}}],["current",{"2":{"22":2,"75":1,"89":1,"102":1,"112":1}}],["currently",{"2":{"16":1,"46":1,"50":1,"103":1}}],["cubeaxis",{"2":{"90":1}}],["cubeaxes",{"2":{"89":1}}],["cubedir",{"2":{"90":1}}],["cube2",{"2":{"89":1}}],["cube1",{"2":{"89":1}}],["cubelist",{"2":{"89":1}}],["cubefittable",{"2":{"42":2,"89":1}}],["cubetable",{"0":{"42":1},"2":{"42":3,"89":3}}],["cubes",{"0":{"35":1},"2":{"9":2,"17":1,"21":1,"35":2,"40":1,"41":2,"42":1,"68":1,"76":1,"89":18,"90":9}}],["cube",{"0":{"32":1,"34":1,"36":1,"76":1,"101":1},"1":{"33":1,"37":1,"38":1,"39":1,"40":1},"2":{"2":1,"4":1,"5":1,"6":1,"16":11,"17":2,"19":2,"21":2,"32":1,"34":1,"36":2,"40":1,"41":1,"42":2,"50":1,"76":3,"86":1,"89":34,"90":19,"105":1}}],["chose",{"2":{"75":1}}],["child",{"2":{"59":1,"107":1}}],["check",{"2":{"16":1,"86":1,"97":1}}],["changed",{"2":{"97":1,"103":1}}],["changes",{"2":{"63":1}}],["change",{"2":{"10":1,"89":1,"90":1}}],["chunkoffset",{"2":{"90":1}}],["chunksize`",{"2":{"90":1}}],["chunksizes",{"2":{"89":2}}],["chunksize",{"2":{"89":1,"90":3}}],["chunks",{"0":{"4":1},"2":{"2":5,"4":1,"5":1,"6":2,"89":4,"90":11}}],["chunked",{"2":{"2":5}}],["chunking",{"0":{"2":1,"3":1,"5":1,"6":1},"1":{"4":1,"5":1,"6":1},"2":{"1":1,"5":1,"89":4,"90":3}}],["chunk",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1},"2":{"1":1,"2":1,"4":1,"5":1,"89":4,"90":4}}],["criteria",{"2":{"42":1}}],["creation",{"2":{"47":1,"64":1}}],["creating",{"0":{"22":1},"2":{"10":1,"33":1,"37":1,"86":1,"92":1,"112":1}}],["createdataset",{"2":{"90":2}}],["created",{"2":{"90":2}}],["creates",{"2":{"42":1,"89":2,"90":1}}],["create",{"0":{"28":1,"29":1,"30":1,"47":1},"1":{"29":1,"30":1},"2":{"10":1,"16":1,"22":2,"28":1,"29":1,"33":1,"35":1,"37":2,"42":1,"46":1,"54":1,"79":1,"84":1,"86":3,"89":1,"90":1,"96":1,"100":1,"112":1}}],["crucial",{"2":{"1":1}}],["coastlines",{"2":{"109":3,"110":1}}],["cosd",{"2":{"89":1}}],["country",{"2":{"89":4}}],["country=cube2",{"2":{"89":1}}],["could",{"2":{"33":1,"46":1,"62":1}}],["copies",{"2":{"90":1}}],["copied",{"2":{"86":1}}],["copybuf",{"2":{"90":2}}],["copydata",{"2":{"90":1}}],["copy",{"2":{"32":1,"89":1,"93":1}}],["coordinates",{"2":{"50":2,"59":1,"113":1,"114":1}}],["college",{"2":{"103":1}}],["collected",{"2":{"90":1}}],["collectfromhandle",{"2":{"90":1}}],["collection",{"2":{"31":1,"74":1}}],["collect",{"2":{"25":1,"34":3,"101":1}}],["colonperm",{"2":{"90":1}}],["colorblind",{"2":{"114":1}}],["colorbar",{"2":{"42":1,"56":2}}],["color=",{"2":{"102":3,"112":2,"113":2,"114":1,"115":1}}],["color",{"2":{"100":1,"109":1,"110":1,"111":1,"112":1,"113":3,"114":1}}],["colormap=",{"2":{"56":1}}],["colormap=makie",{"2":{"42":1}}],["colormap",{"2":{"56":3,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["colorrange=",{"2":{"56":1}}],["colorrange",{"2":{"56":3}}],["column",{"2":{"77":1,"90":1}}],["colgap",{"2":{"56":1}}],["colnames",{"2":{"46":1}}],["configuration",{"2":{"90":2}}],["concatenating",{"2":{"89":1}}],["concatenates",{"2":{"89":2}}],["concatenate",{"0":{"35":1},"2":{"35":2,"64":2,"66":1,"89":2}}],["concatenatecubes",{"0":{"9":1},"2":{"9":2,"35":2,"89":2}}],["concrete",{"2":{"89":2}}],["contributing",{"2":{"92":1}}],["contribute",{"0":{"91":1,"92":1},"1":{"92":1,"93":2}}],["contrast",{"2":{"89":1}}],["content",{"2":{"89":1}}],["contents",{"2":{"66":1}}],["contact",{"2":{"60":1,"67":1,"79":1,"85":1}}],["contains",{"2":{"71":1,"89":1,"90":1}}],["contain",{"2":{"59":1,"60":1,"90":1}}],["containing",{"0":{"47":1},"2":{"8":1,"42":1,"75":1,"76":1,"89":1}}],["continue",{"2":{"51":1,"112":1}}],["consolidated=true",{"2":{"59":1,"107":1,"112":1}}],["constructor",{"2":{"89":1}}],["constructs",{"2":{"89":1}}],["construct",{"0":{"46":1},"2":{"89":2,"112":1}}],["consistent",{"2":{"59":1,"107":1}}],["consisting",{"2":{"8":1}}],["considering",{"2":{"49":1}}],["considered",{"2":{"42":1}}],["consider",{"2":{"17":1,"19":1,"21":1,"33":1,"113":1}}],["convinient",{"2":{"31":1}}],["conventions",{"2":{"60":1,"67":1,"79":1,"85":1}}],["convenience",{"2":{"51":1,"78":1}}],["convenient",{"2":{"23":1}}],["conversion",{"2":{"24":1,"26":1,"27":1}}],["conversions",{"2":{"24":1}}],["converted",{"2":{"76":1}}],["convert",{"0":{"24":1,"25":1,"26":1,"27":1},"1":{"25":1,"26":1,"27":1},"2":{"24":1,"25":2,"27":2,"89":1,"90":1}}],["corresponding",{"2":{"7":1,"21":2,"22":2,"76":1,"89":1}}],["combining",{"0":{"106":1}}],["combined",{"2":{"9":2,"76":2}}],["combine",{"0":{"7":1},"1":{"8":1,"9":1},"2":{"7":1,"8":1,"9":1,"105":1}}],["command",{"2":{"98":2}}],["comment",{"2":{"59":1,"113":1,"114":1}}],["common",{"2":{"40":5,"58":1,"89":2}}],["com",{"2":{"50":2,"61":1}}],["compiler",{"2":{"97":1}}],["compuation",{"2":{"89":1}}],["computing",{"2":{"42":1}}],["computations",{"2":{"13":1,"41":1}}],["computation",{"0":{"23":1},"2":{"13":1,"74":1,"89":3,"90":3}}],["computed",{"2":{"90":1}}],["compute",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1},"2":{"101":1}}],["compares",{"2":{"90":1}}],["comparing",{"2":{"83":1}}],["compatible",{"2":{"61":1}}],["compress",{"2":{"83":2}}],["compress=n",{"2":{"83":1}}],["compressors",{"2":{"81":1}}],["compressor=compression",{"2":{"81":1}}],["compression",{"0":{"81":1,"83":1},"2":{"81":5,"83":4}}],["completely",{"2":{"62":1}}],["complexity",{"2":{"41":1}}],["complex",{"2":{"10":2,"96":1,"112":1}}],["comply",{"2":{"60":1,"67":1,"79":1,"85":1}}],["comes",{"2":{"1":1}}],["code",{"2":{"6":1,"13":1,"23":2,"31":1,"46":1,"60":2,"112":1}}],["captialisation",{"2":{"90":1}}],["cameracontrols",{"2":{"111":1}}],["came",{"2":{"76":1}}],["cairomakie",{"2":{"56":1,"100":2}}],["caxes",{"2":{"32":2,"89":2}}],["car",{"2":{"22":1}}],["cartesianindex",{"2":{"22":11}}],["caluclate",{"2":{"89":1}}],["calculations",{"2":{"56":1,"90":1}}],["calculating",{"2":{"14":1,"89":1}}],["calculates",{"2":{"89":1}}],["calculated",{"2":{"42":2,"51":1}}],["calculate",{"2":{"14":1,"22":1,"42":2,"48":1,"49":2,"51":1,"56":1,"90":2,"101":1}}],["calling",{"2":{"56":1,"78":1}}],["called",{"2":{"16":1,"51":1,"74":3,"90":1}}],["call",{"2":{"1":1,"23":1}}],["case",{"2":{"13":1,"19":1,"40":1,"53":1,"59":1,"63":1,"66":2}}],["cases",{"2":{"0":1,"62":1,"71":1,"103":1}}],["cataxis",{"2":{"89":2}}],["categoricalaxis",{"2":{"89":1}}],["categorical",{"2":{"9":1,"17":1,"18":1,"19":1,"22":1,"35":1,"42":1,"46":4,"51":2,"52":1,"53":1,"54":2,"55":2,"56":3,"89":1,"90":1,"96":1}}],["cat",{"0":{"8":1},"2":{"8":2}}],["cache=1gb",{"2":{"89":1}}],["cache=1e9",{"2":{"16":2}}],["cache=",{"2":{"89":1}}],["cache=5",{"2":{"89":1}}],["cache=5e8",{"2":{"84":1,"89":1}}],["cache=yaxdefaults",{"2":{"89":1}}],["caches",{"2":{"0":1}}],["cachesize",{"2":{"0":2,"90":1}}],["cache",{"2":{"0":6,"89":3,"90":7}}],["caching",{"0":{"0":1}}],["can",{"2":{"0":5,"2":1,"3":1,"13":2,"14":1,"16":3,"20":1,"22":1,"23":3,"29":2,"35":1,"36":1,"38":1,"40":1,"41":1,"42":2,"46":1,"52":1,"56":1,"59":2,"60":1,"61":1,"62":1,"64":1,"72":1,"74":3,"75":2,"76":1,"78":2,"85":1,"86":1,"87":1,"89":13,"90":6,"92":1,"95":2,"98":2,"103":2,"115":1}}],["msc",{"2":{"101":3,"102":2}}],["mscarray",{"2":{"101":2}}],["md",{"2":{"92":2}}],["mfdataset",{"0":{"64":1},"1":{"65":1,"66":1},"2":{"65":3,"66":2,"89":5}}],["mpi",{"2":{"59":1,"107":2,"112":1}}],["m",{"2":{"25":2}}],["miss",{"2":{"90":1}}],["missing",{"2":{"14":2,"16":6,"18":1,"21":1,"22":2,"41":1,"42":2,"60":12,"63":6,"68":4,"69":6,"70":6,"71":10,"86":3,"87":1,"89":2,"90":2,"111":1}}],["mind",{"2":{"112":1}}],["minimal",{"2":{"112":1}}],["minimized",{"2":{"90":1}}],["minutes",{"2":{"60":1,"63":3,"68":2,"69":3,"70":3,"71":5}}],["might",{"2":{"24":1,"62":1,"103":1}}],["mix",{"2":{"21":2}}],["mm",{"2":{"20":3,"60":2,"67":2,"79":2,"85":2}}],["mymean",{"2":{"23":4}}],["my",{"2":{"16":2,"60":1}}],["magma",{"2":{"113":1}}],["mahecha",{"2":{"76":1}}],["manager",{"2":{"95":1}}],["manual",{"2":{"60":1}}],["many",{"0":{"18":1,"19":2},"2":{"18":2,"19":2,"20":4,"63":1,"74":1,"90":1}}],["marker=",{"2":{"112":1,"113":2}}],["marketdata",{"2":{"46":2}}],["mar",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["master",{"2":{"50":1,"98":1}}],["mask",{"2":{"42":2}}],["makie",{"2":{"56":1,"112":1,"113":1}}],["making",{"2":{"11":1,"60":1,"67":1,"112":1}}],["make",{"2":{"39":1,"40":2,"86":1,"89":1,"90":2,"93":1}}],["main",{"2":{"36":1,"90":1}}],["machine",{"2":{"23":1,"74":1}}],["matching",{"2":{"96":1}}],["match",{"2":{"90":2}}],["matched",{"2":{"89":1}}],["matches",{"2":{"20":1}}],["mat",{"2":{"22":4}}],["matrix",{"2":{"16":2,"22":1,"25":1,"46":1,"52":1,"56":2,"74":1,"87":2,"101":1}}],["maximal",{"2":{"90":1}}],["maximum",{"2":{"41":1,"89":1,"90":1}}],["maxbuf",{"2":{"90":1}}],["max",{"2":{"16":2,"81":1,"83":1,"84":1,"89":8,"90":2}}],["maxsize",{"2":{"0":2}}],["may",{"2":{"10":1,"15":1,"51":4,"52":2,"53":1,"54":4,"55":4,"56":6,"59":1,"60":1,"97":1}}],["maps",{"0":{"107":1},"1":{"108":1}}],["mapslice",{"2":{"23":1}}],["mapslices",{"0":{"14":1},"2":{"10":1,"13":1,"14":1,"23":1,"41":1,"101":1}}],["mapped",{"2":{"89":1}}],["mapping",{"2":{"89":1,"90":3,"112":2,"113":4,"114":1,"115":1}}],["mapcube",{"0":{"15":1},"1":{"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1},"2":{"10":1,"13":1,"15":1,"16":4,"18":1,"20":1,"21":2,"22":2,"23":3,"89":5,"90":2}}],["map",{"0":{"13":1,"41":1},"2":{"10":1,"13":2,"21":1,"22":3,"23":3,"41":4,"42":1,"51":2,"55":1,"56":1,"89":2,"96":1,"101":2}}],["moll",{"0":{"110":1}}],["mowingwindow",{"2":{"89":1}}],["module",{"2":{"89":1}}],["model",{"2":{"60":1,"67":1,"75":2,"79":1,"85":1}}],["modification",{"2":{"11":1,"23":1}}],["modify",{"0":{"11":1}}],["monthday",{"2":{"101":4}}],["monthly",{"0":{"49":1}}],["month",{"2":{"37":7,"39":3,"40":4,"49":1,"51":4,"52":1,"53":1,"54":5,"55":2,"56":3,"89":1,"101":2}}],["moment",{"2":{"27":1}}],["movingwindow",{"2":{"21":1,"89":4}}],["more",{"2":{"9":1,"10":1,"36":1,"41":1,"42":1,"58":1,"70":1,"71":1,"76":1,"81":1,"84":1,"89":3,"90":1,"96":1,"113":1,"114":1,"115":1}}],["most",{"2":{"1":1,"15":1,"24":1,"113":1}}],["mesh",{"2":{"111":2}}],["merely",{"2":{"86":1}}],["merged",{"2":{"66":1}}],["measured",{"2":{"75":1,"76":1}}],["measure",{"2":{"74":1}}],["measures",{"2":{"59":1,"113":1,"114":1}}],["means",{"0":{"49":1},"2":{"14":1,"89":1}}],["mean",{"0":{"100":1,"102":1},"1":{"101":1,"102":1},"2":{"10":1,"14":3,"23":4,"42":4,"51":10,"52":2,"53":1,"56":2,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"89":1,"101":5,"113":1,"114":1}}],["meter",{"2":{"59":1,"113":1,"114":1}}],["method",{"2":{"16":2,"18":1,"19":1,"21":1,"58":1,"89":1}}],["methods",{"2":{"7":1,"23":1,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["metadata",{"2":{"8":1,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"21":3,"22":3,"24":1,"25":1,"27":3,"29":2,"32":1,"33":3,"34":1,"35":1,"37":5,"41":3,"42":3,"47":2,"50":2,"51":2,"52":1,"54":3,"55":2,"56":3,"59":1,"60":1,"63":3,"64":1,"68":2,"69":3,"70":3,"71":5,"86":2,"89":1,"96":3,"101":1,"113":1,"114":1}}],["members",{"2":{"90":1}}],["member",{"2":{"6":1}}],["memory",{"0":{"62":1},"1":{"63":1},"2":{"1":1,"8":1,"10":1,"12":1,"13":1,"14":2,"16":3,"17":1,"18":1,"19":1,"21":3,"22":3,"24":3,"25":1,"27":1,"29":2,"32":1,"33":3,"34":1,"37":5,"40":4,"41":3,"42":3,"47":2,"50":3,"54":1,"62":1,"63":4,"74":1,"86":2,"89":2,"90":1,"96":2,"101":1,"112":1,"113":1,"114":1}}],["multi",{"2":{"17":2,"21":2}}],["multiplying",{"2":{"41":1}}],["multiply",{"2":{"10":1,"41":1}}],["multiple",{"0":{"45":1,"106":1},"2":{"7":1,"21":1,"23":1,"59":1,"60":1,"74":1,"89":1}}],["must",{"2":{"0":1,"76":1,"89":1,"90":1}}],["mb",{"2":{"0":1,"50":2,"60":1,"63":3,"68":2,"113":1}}],["pkg",{"2":{"95":2,"98":2,"99":8}}],["pkg>",{"2":{"93":1,"98":1}}],["purple",{"2":{"100":1}}],["purpose",{"2":{"31":1,"41":1}}],["pull",{"2":{"91":1}}],["public",{"0":{"89":1}}],["published",{"2":{"56":1}}],["pydata",{"2":{"50":1}}],["p",{"2":{"40":10,"60":1,"67":1,"79":1,"85":1}}],["picture",{"2":{"74":1,"75":1}}],["pieces",{"2":{"31":1}}],["pixel",{"0":{"100":1},"1":{"101":1,"102":1},"2":{"21":1,"23":2}}],["post=getpostfunction",{"2":{"89":1}}],["positions",{"2":{"90":2}}],["position",{"2":{"74":1}}],["positional",{"2":{"69":1,"70":1}}],["possible",{"2":{"23":2,"24":1,"35":1,"47":1,"86":1,"89":3,"90":1}}],["pos",{"2":{"22":2}}],["point3f",{"2":{"111":1}}],["point",{"2":{"22":3,"59":1,"96":1,"112":1,"113":1,"114":1}}],["points",{"2":{"4":4,"5":4,"6":2,"8":1,"9":1,"10":3,"12":3,"13":3,"14":4,"16":9,"17":3,"18":3,"19":2,"20":3,"21":9,"22":16,"23":1,"25":2,"27":4,"29":9,"30":3,"32":9,"33":6,"34":2,"35":3,"37":14,"39":6,"40":21,"41":9,"42":5,"44":1,"45":5,"46":4,"47":4,"50":6,"51":3,"52":2,"54":3,"55":1,"56":7,"59":6,"60":6,"61":2,"63":9,"64":3,"65":10,"66":4,"67":3,"68":6,"69":4,"70":9,"71":16,"72":3,"74":2,"75":1,"79":3,"85":6,"86":6,"96":5,"101":1,"107":3,"113":3,"114":3}}],["plasma",{"2":{"112":1}}],["place",{"2":{"90":1}}],["plt",{"2":{"108":1,"112":1,"113":4,"114":1}}],["please",{"2":{"60":1,"81":1}}],["plots",{"2":{"112":1}}],["plot",{"0":{"102":1,"108":1,"111":1},"2":{"56":2,"112":1,"113":1,"114":1}}],["plotting",{"0":{"107":1},"1":{"108":1},"2":{"0":1,"99":1,"112":1}}],["plus",{"2":{"18":3,"50":1,"89":1}}],["palette",{"2":{"114":1}}],["paste",{"2":{"93":1}}],["pass",{"2":{"89":1}}],["passed",{"2":{"58":1,"89":5}}],["passing",{"2":{"21":1,"89":3}}],["pair",{"2":{"90":1}}],["pairs",{"2":{"18":1,"20":1}}],["partitioned",{"2":{"90":1}}],["participate",{"2":{"89":1}}],["particular",{"2":{"77":1}}],["parts",{"2":{"89":1}}],["parent",{"2":{"59":1,"107":1}}],["parallelized",{"2":{"90":1}}],["parallelisation",{"2":{"89":1}}],["parallel",{"2":{"23":1,"74":1}}],["package",{"2":{"23":1,"70":1,"72":1,"88":1,"95":1,"99":1}}],["packages",{"2":{"16":1,"24":1}}],["paths",{"2":{"64":1,"66":1,"89":1,"90":2}}],["path=",{"2":{"16":2,"59":1,"80":1,"81":1,"82":1,"83":1,"84":2,"85":1,"86":1,"89":1,"90":1}}],["path=f",{"2":{"4":1,"5":1,"6":1}}],["path",{"0":{"20":1},"2":{"0":1,"20":1,"50":2,"59":3,"60":2,"61":2,"67":2,"79":2,"84":2,"89":3,"93":1}}],["pr",{"2":{"93":1}}],["println",{"2":{"83":1}}],["printed",{"2":{"46":2}}],["primem",{"2":{"61":1}}],["prior",{"2":{"1":1}}],["props",{"2":{"96":2}}],["properly",{"2":{"49":1}}],["properties=dict",{"2":{"90":1}}],["properties=properties",{"2":{"18":2}}],["properties",{"0":{"17":1},"1":{"18":1,"19":1,"20":1},"2":{"10":2,"17":2,"18":2,"19":1,"20":2,"21":2,"23":2,"29":3,"30":3,"50":1,"56":1,"59":1,"60":1,"61":1,"67":1,"79":1,"85":1,"89":5,"90":1,"107":1}}],["probably",{"2":{"90":1}}],["process",{"2":{"74":1,"90":2}}],["processed",{"2":{"13":1}}],["provide",{"2":{"89":1}}],["provides",{"2":{"74":1,"104":1,"112":1}}],["provided",{"2":{"36":1,"86":1,"89":2}}],["providing",{"2":{"66":1}}],["projection",{"0":{"109":1,"110":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"61":1}}],["progressmeter",{"2":{"89":1}}],["progress",{"2":{"50":1,"103":1,"105":1}}],["product",{"2":{"22":1}}],["pressed",{"2":{"98":1}}],["pressing",{"2":{"95":1}}],["pre",{"2":{"89":2}}],["previous",{"2":{"56":1,"84":1,"86":1,"89":1}}],["previously",{"2":{"42":1}}],["preferred",{"2":{"50":2}}],["prepared",{"2":{"60":1,"67":1,"79":1,"85":1}}],["prep",{"2":{"9":2}}],["precipitation",{"2":{"9":2,"75":1,"76":1,"96":2}}],["permute",{"2":{"90":1}}],["permuteloopaxes",{"2":{"90":1}}],["permutation",{"2":{"90":1}}],["persist",{"2":{"90":1}}],["persistend",{"2":{"90":1}}],["persistency",{"2":{"90":1}}],["persistent",{"2":{"89":1,"90":2}}],["persist=nothing",{"2":{"84":1,"89":1}}],["perform",{"2":{"90":1}}],["performed",{"2":{"13":2}}],["performing",{"2":{"10":1}}],["per",{"2":{"7":1,"14":1,"51":1,"54":1,"55":1,"112":1}}],["=interval",{"2":{"71":2}}],["===",{"2":{"46":1}}],["==",{"2":{"12":1,"46":1,"101":1}}],["=>nan",{"2":{"111":1}}],["=>",{"2":{"10":2,"12":1,"13":1,"16":2,"17":2,"18":3,"19":2,"20":1,"21":2,"22":5,"23":1,"29":3,"30":3,"44":1,"45":1,"46":5,"50":15,"51":5,"52":1,"54":3,"55":2,"56":3,"59":20,"60":20,"61":1,"63":30,"67":10,"68":20,"69":30,"70":30,"71":50,"78":1,"79":10,"85":10,"96":6,"107":10,"113":17,"114":12,"115":2}}],["=>2",{"2":{"4":1}}],["=>10",{"2":{"4":1}}],["=>5",{"2":{"4":1,"5":1}}],["=",{"2":{"0":5,"2":4,"4":9,"5":15,"6":9,"8":5,"9":5,"10":4,"11":1,"12":1,"13":1,"16":14,"17":4,"18":14,"19":7,"20":11,"21":12,"22":16,"23":5,"25":3,"26":5,"27":4,"29":5,"30":4,"32":1,"33":3,"35":6,"37":7,"39":6,"40":17,"42":7,"44":1,"45":3,"46":7,"47":4,"50":5,"51":16,"52":1,"53":1,"54":4,"55":1,"56":22,"58":3,"59":2,"60":3,"61":2,"63":1,"64":6,"65":7,"66":2,"67":2,"68":2,"69":6,"70":6,"71":3,"79":2,"81":2,"83":3,"85":2,"86":4,"87":5,"89":8,"90":7,"96":5,"100":10,"101":11,"102":5,"107":8,"108":5,"109":7,"110":5,"111":6,"112":10,"113":14,"114":6,"115":2}}],["dc",{"2":{"90":2}}],["dkrz",{"2":{"59":1,"107":2,"112":1}}],["dufresne",{"2":{"60":1,"67":1,"79":1,"85":1}}],["due",{"2":{"53":1}}],["dummy",{"2":{"35":1,"37":1,"100":1,"101":1}}],["during",{"2":{"22":1,"23":1,"24":1}}],["dd",{"2":{"32":1,"65":4,"66":2,"89":4,"101":1}}],["d",{"2":{"22":5,"46":5,"56":3,"101":1,"107":3,"109":5,"110":1}}],["draw",{"2":{"112":2,"113":4,"114":1,"115":1}}],["drop",{"2":{"56":1}}],["dropdims",{"0":{"52":1},"2":{"51":2,"52":2,"56":1}}],["drivers",{"2":{"58":1,"89":1}}],["driver",{"2":{"48":1,"58":3,"84":1,"89":5}}],["driver=backend",{"2":{"84":1,"89":1}}],["driver=",{"2":{"4":1,"5":1,"6":1,"58":3,"80":2,"81":1,"82":2,"83":1,"84":3,"85":1,"86":2,"89":5}}],["drei",{"2":{"19":2}}],["dash",{"2":{"102":1}}],["danger",{"2":{"84":1}}],["daysinmonth",{"2":{"51":1,"54":1}}],["days",{"2":{"49":1,"51":2,"53":1,"54":2,"55":2}}],["dayofyear",{"2":{"16":1}}],["day",{"2":{"10":2,"12":1,"13":1,"14":1,"16":4,"17":2,"18":1,"21":3,"22":3,"23":1,"29":3,"30":1,"64":2,"65":1,"100":1,"101":4,"102":1}}],["datconfig",{"2":{"90":2}}],["datset",{"2":{"89":1}}],["dat",{"2":{"89":8,"90":16}}],["datum",{"2":{"61":1}}],["datetime360day",{"2":{"60":6,"63":9,"67":3,"68":6,"69":7,"70":9,"71":15,"79":3,"85":3}}],["datetimenoleap",{"2":{"50":6,"51":2,"54":7,"55":2,"56":2}}],["datetime",{"2":{"20":1,"46":5,"59":2,"65":1,"66":3,"107":1,"113":2,"114":2}}],["date",{"2":{"10":5,"12":3,"13":3,"14":3,"16":12,"17":5,"18":3,"21":8,"22":11,"23":3,"29":8,"30":3,"37":24,"39":8,"40":11,"64":3,"65":7,"74":1,"78":2,"100":2,"101":5,"107":1}}],["datesid",{"2":{"101":2}}],["dates",{"2":{"10":2,"12":1,"13":1,"14":1,"16":5,"17":2,"18":1,"21":2,"22":3,"23":1,"29":3,"30":1,"37":8,"39":4,"40":5,"48":1,"51":1,"64":7,"65":5,"66":1,"76":1,"100":1,"101":2,"107":1,"112":1,"113":1}}],["data=cube1",{"2":{"89":1}}],["databases",{"2":{"74":1}}],["dataframe",{"2":{"42":1,"89":1}}],["dataframes",{"2":{"42":1}}],["datacubes",{"2":{"89":1}}],["datacube",{"0":{"106":1},"2":{"42":2,"86":1,"89":1}}],["datatypes",{"2":{"36":1}}],["data1",{"2":{"35":2}}],["data3",{"2":{"30":1}}],["data2",{"2":{"29":2,"35":2}}],["datasetaxis",{"2":{"89":2,"90":1}}],["datasetaxis=",{"2":{"89":1,"90":1}}],["dataset",{"0":{"30":1,"36":1,"38":1,"39":1,"40":1,"43":1,"46":1,"58":1,"75":1,"84":1,"85":1,"87":1},"1":{"37":1,"38":1,"39":2,"40":2,"44":1,"45":1,"59":1,"60":1,"61":1,"62":1,"63":1},"2":{"0":3,"3":1,"4":4,"5":2,"6":3,"9":1,"10":1,"18":1,"20":2,"24":1,"30":2,"38":1,"39":3,"40":5,"44":2,"45":3,"46":5,"58":4,"59":3,"60":3,"61":3,"64":1,"65":3,"66":1,"67":3,"68":1,"75":3,"76":2,"78":1,"79":3,"80":1,"81":1,"82":1,"83":1,"84":3,"85":4,"86":2,"87":2,"89":20,"90":9,"107":2,"112":2,"113":1}}],["datasets",{"0":{"3":1,"28":1,"48":1,"57":1,"67":1,"79":1},"1":{"4":1,"5":1,"6":1,"29":1,"30":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"68":1,"69":1,"70":1,"71":1,"72":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"0":2,"24":1,"28":1,"40":1,"57":1,"58":1,"62":1,"84":1,"89":9,"90":4,"105":1}}],["data",{"0":{"34":1,"50":1,"62":1,"76":1},"1":{"63":1},"2":{"0":3,"1":2,"7":1,"8":2,"9":1,"10":3,"11":1,"12":1,"13":1,"14":2,"16":9,"17":3,"18":1,"19":1,"21":6,"22":4,"23":2,"25":2,"26":1,"27":1,"29":2,"32":1,"33":3,"34":2,"35":1,"37":6,"39":1,"40":2,"41":3,"42":5,"50":4,"54":1,"59":3,"60":7,"63":6,"64":1,"67":3,"68":4,"69":6,"70":6,"71":10,"73":1,"74":3,"75":2,"76":3,"79":3,"84":2,"85":3,"86":4,"87":1,"89":20,"90":12,"96":6,"97":1,"100":2,"101":2,"105":4,"107":5,"109":1,"112":4,"113":7,"114":2,"115":2}}],["dev",{"2":{"93":1}}],["dependencies",{"2":{"93":1}}],["depth",{"2":{"21":8,"78":2}}],["deletes",{"2":{"84":1,"89":1}}],["delete",{"2":{"84":2,"86":1}}],["denoting",{"2":{"89":1}}],["dense",{"2":{"74":1}}],["denvil",{"2":{"60":2,"67":2,"79":2,"85":2}}],["degree",{"2":{"61":1}}],["degc",{"2":{"60":1,"63":3,"68":2,"69":3,"70":3,"71":5}}],["detect",{"2":{"58":1,"89":1,"90":1}}],["determined",{"2":{"90":1}}],["determines",{"2":{"89":1}}],["determine",{"2":{"1":1,"63":1,"89":1}}],["declarative",{"2":{"112":1}}],["dec",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["defaultfillval",{"2":{"90":1}}],["defaults",{"2":{"65":1,"89":7}}],["default",{"2":{"18":1,"58":1,"83":3,"86":1,"89":1,"90":4}}],["definition",{"2":{"76":1}}],["definitions",{"2":{"17":1,"19":1}}],["defining",{"2":{"23":1}}],["defines",{"2":{"89":1}}],["defined",{"2":{"18":1,"26":1,"27":1,"42":1,"51":1,"56":1,"72":1,"74":1,"77":1,"78":1,"86":1,"96":1}}],["define",{"0":{"101":1},"2":{"16":2,"18":1,"37":1,"42":1,"56":1,"78":1,"89":2,"100":1}}],["deal",{"2":{"17":1}}],["dest",{"2":{"110":1}}],["desc",{"2":{"89":3,"90":3}}],["descriptor",{"2":{"90":4}}],["descriptors",{"2":{"89":2}}],["descriptions",{"2":{"89":1}}],["description",{"2":{"17":2,"19":2,"21":2,"36":1,"89":4,"90":11}}],["described",{"2":{"105":1}}],["describe",{"2":{"89":2}}],["describes",{"2":{"7":1,"10":1,"24":1,"28":1,"57":1,"71":1,"73":1,"88":1,"90":1}}],["describing",{"2":{"89":1}}],["designed",{"2":{"24":2,"74":1}}],["desired",{"2":{"16":1,"90":4}}],["demand",{"2":{"13":1}}],["diverging",{"2":{"56":1}}],["divided",{"2":{"41":1}}],["differing",{"2":{"89":1}}],["difference",{"2":{"56":1}}],["differences",{"2":{"46":1,"51":1,"56":1,"90":1}}],["different",{"0":{"21":1},"2":{"9":2,"16":1,"17":2,"23":1,"32":1,"33":1,"45":1,"49":1,"58":1,"75":1,"89":3,"90":2,"103":1}}],["diff",{"2":{"51":2,"56":3}}],["directory",{"2":{"59":1,"80":2,"82":2}}],["directories",{"2":{"57":1,"90":1}}],["direct",{"2":{"46":1}}],["directly",{"2":{"16":1,"20":1,"27":1,"28":1,"29":1,"87":2}}],["dictionary",{"2":{"75":1,"89":3}}],["dict",{"2":{"4":1,"5":1,"8":1,"9":1,"10":2,"12":1,"13":1,"14":2,"16":5,"17":2,"18":3,"19":2,"20":1,"21":4,"22":4,"23":1,"25":1,"27":3,"29":4,"30":2,"32":1,"33":3,"34":1,"35":1,"37":5,"41":3,"42":3,"46":2,"47":2,"50":2,"51":3,"52":2,"54":4,"55":3,"56":3,"59":2,"60":2,"61":1,"63":3,"64":1,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1,"86":1,"89":3,"96":3,"101":1,"107":1,"113":1,"114":1}}],["dime",{"2":{"59":1,"113":1,"114":1}}],["dimensionaldata",{"2":{"22":1,"27":2,"32":1,"33":1,"37":1,"39":1,"40":1,"46":1,"48":1,"50":1,"51":15,"52":10,"54":12,"55":5,"56":38,"65":1,"66":2,"70":1,"71":2,"72":3,"74":1,"77":1,"78":1,"97":3,"99":1,"101":1,"107":1,"112":1}}],["dimensional",{"2":{"17":2,"19":2,"21":2,"73":1,"74":2,"89":1}}],["dimensions",{"0":{"39":1,"40":1,"77":1},"1":{"78":1},"2":{"9":1,"10":1,"13":1,"15":1,"16":2,"20":1,"21":1,"22":2,"23":1,"29":2,"33":1,"35":1,"38":1,"40":3,"41":2,"45":1,"51":16,"52":10,"54":11,"55":5,"56":38,"63":1,"66":1,"67":1,"72":2,"74":3,"75":1,"78":2,"89":8,"90":3,"96":3,"97":1}}],["dimension",{"0":{"8":1,"9":1,"65":1,"66":1,"72":1},"2":{"2":1,"8":2,"9":1,"10":1,"14":2,"16":3,"18":1,"19":1,"22":3,"37":1,"40":1,"51":1,"52":1,"53":1,"56":1,"64":2,"65":4,"66":3,"70":1,"72":1,"74":1,"76":1,"77":1,"78":4,"89":7,"90":3,"96":1}}],["dimvector",{"2":{"54":1,"89":1}}],["dimgroupbyarray",{"2":{"51":1,"54":1}}],["dimarray",{"0":{"27":1},"2":{"22":3,"27":6,"51":1,"52":1,"54":1,"55":2,"56":3,"65":3,"66":1,"72":1,"74":1,"89":2}}],["dims=2",{"2":{"101":1}}],["dims=",{"2":{"14":2,"23":1,"41":1,"51":5,"52":1,"54":1,"56":1}}],["dims",{"2":{"8":3,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"21":3,"22":4,"25":1,"26":1,"27":2,"29":2,"32":3,"33":4,"34":1,"35":1,"37":5,"41":3,"42":3,"46":1,"47":2,"50":2,"51":6,"52":1,"54":5,"55":2,"56":5,"59":1,"60":1,"63":3,"64":1,"68":2,"69":3,"70":3,"71":5,"72":1,"86":1,"96":2,"101":1,"113":1,"114":1}}],["dim",{"2":{"2":2,"4":7,"5":8,"6":2,"21":1,"22":1,"25":2,"27":2,"29":4,"32":9,"33":6,"34":3,"35":1,"40":1,"44":1,"45":5,"47":4,"51":2,"52":2,"56":6,"78":3,"85":3,"86":6,"89":1,"96":2,"112":2,"113":6,"114":1,"115":1}}],["disregard",{"2":{"90":1}}],["dispatch",{"2":{"90":1}}],["displayed",{"2":{"63":1}}],["discribe",{"2":{"89":2}}],["discussion",{"2":{"81":1}}],["distribute",{"2":{"23":1}}],["distributed",{"0":{"23":1},"2":{"0":1,"23":2}}],["diskarray",{"2":{"89":1}}],["diskarrays",{"2":{"2":9,"4":4,"5":4,"6":4,"89":2,"90":1}}],["disk",{"2":{"1":1,"16":1,"20":1,"27":1,"74":1,"86":3,"87":2,"89":1,"90":2}}],["dodgerblue",{"2":{"102":1}}],["documentation",{"0":{"92":1},"1":{"93":1}}],["doc",{"2":{"84":1}}],["docs",{"0":{"93":1},"2":{"75":1,"92":2,"93":6,"97":1,"112":1}}],["docstring",{"2":{"58":1,"89":1}}],["don",{"2":{"81":1}}],["done",{"2":{"33":1,"41":1,"56":1,"62":1,"92":2,"115":1}}],["double",{"2":{"50":2}}],["download",{"0":{"50":1},"2":{"50":1,"60":2,"61":2,"67":2,"79":2}}],["downloads",{"2":{"48":1,"50":1,"60":1,"61":1,"67":1,"79":1}}],["doing",{"2":{"23":1,"32":1,"34":1,"78":2,"93":1}}],["does",{"2":{"23":1,"86":1,"89":2,"90":1}}],["dot",{"2":{"21":1,"102":1}}],["do",{"0":{"35":1,"36":1,"41":1,"42":1,"43":1,"46":1},"1":{"37":1,"38":1,"39":1,"40":1,"44":1,"45":1},"2":{"1":1,"13":1,"16":1,"22":3,"23":1,"31":2,"41":1,"49":1,"56":1,"78":1,"86":1,"87":1,"90":1,"93":1,"95":1}}],["dsw",{"2":{"51":2,"56":2}}],["dsfinal",{"2":{"35":1,"41":2,"42":2}}],["ds2",{"2":{"35":3,"41":1,"85":1}}],["ds1",{"2":{"35":3,"41":3,"42":1}}],["dschunked",{"2":{"4":3,"5":3,"6":3}}],["ds",{"2":{"0":3,"4":2,"5":2,"6":2,"30":1,"39":2,"40":12,"44":1,"45":1,"46":2,"50":4,"51":10,"54":1,"56":3,"59":1,"60":2,"61":1,"63":3,"65":3,"66":2,"67":1,"68":2,"78":1,"79":1,"80":3,"81":2,"82":3,"83":7,"84":3,"85":2,"86":1,"87":5,"89":4,"90":1,"111":2}}],["written",{"2":{"89":1,"90":1}}],["writing",{"2":{"87":1}}],["writefac",{"2":{"90":1}}],["writefac=4",{"2":{"84":1,"89":1}}],["writes",{"2":{"89":1}}],["write",{"0":{"79":1,"80":1,"82":1},"1":{"80":1,"81":2,"82":1,"83":2,"84":1,"85":1,"86":1,"87":1},"2":{"86":1,"89":2}}],["wrapping",{"2":{"53":1,"66":1,"72":2}}],["wrapped",{"2":{"16":1}}],["wrap",{"2":{"0":1,"89":1}}],["would",{"2":{"64":1,"89":2}}],["world",{"2":{"61":2}}],["workarounds",{"2":{"112":1}}],["workdir",{"2":{"90":1}}],["worker",{"2":{"89":1}}],["workers",{"2":{"89":1}}],["workflow",{"2":{"62":1}}],["workflows",{"2":{"1":1}}],["work",{"2":{"24":2,"50":1,"66":1,"73":1,"89":1,"103":2,"105":1,"113":1}}],["workload",{"2":{"23":1}}],["working",{"2":{"16":1,"87":1}}],["works",{"2":{"6":1,"34":1,"39":1,"40":1,"65":1,"86":1}}],["wgs",{"2":{"61":3}}],["www",{"2":{"60":1,"67":1,"79":1}}],["w",{"2":{"56":2,"87":2}}],["was",{"2":{"20":1,"22":1,"23":1,"90":1}}],["way",{"2":{"15":1,"24":1,"32":1}}],["warning",{"2":{"11":1,"24":1,"32":1,"40":1,"45":1,"47":1,"50":1,"84":1,"86":1,"89":1,"112":1}}],["wanted",{"2":{"90":1}}],["wants",{"2":{"86":1}}],["want",{"0":{"99":1},"2":{"0":1,"1":1,"62":1,"66":1,"76":1,"78":2,"90":1,"93":1,"98":1,"105":1}}],["white",{"2":{"109":1,"110":1}}],["while",{"2":{"86":1}}],["which",{"2":{"9":1,"16":1,"22":2,"33":1,"40":2,"51":1,"56":1,"60":1,"63":1,"68":1,"71":1,"72":1,"76":3,"89":5,"90":4,"105":1}}],["what",{"2":{"51":1}}],["whose",{"0":{"39":1,"40":1}}],["whole",{"2":{"8":3}}],["whether",{"2":{"90":2}}],["when",{"2":{"1":1,"6":1,"13":1,"51":1,"63":1,"64":1,"66":1,"76":1,"78":1,"89":3,"90":1}}],["whereas",{"2":{"74":1}}],["where",{"2":{"0":1,"23":1,"40":4,"49":1,"66":1,"71":1,"87":1,"89":1,"90":4}}],["width",{"2":{"112":1}}],["wide",{"2":{"66":1}}],["wintri",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1}}],["windowloopinds",{"2":{"90":1}}],["window",{"2":{"89":1,"90":1}}],["within",{"2":{"70":1}}],["without",{"2":{"65":1,"90":1}}],["with",{"0":{"47":1},"2":{"4":1,"5":1,"8":1,"10":1,"12":1,"13":1,"16":7,"17":3,"18":2,"19":2,"21":3,"22":4,"23":2,"24":1,"29":3,"32":1,"33":1,"40":6,"41":2,"42":3,"45":2,"46":3,"47":1,"50":2,"51":4,"52":1,"54":2,"55":2,"56":5,"58":1,"59":3,"60":2,"63":3,"66":2,"67":1,"68":2,"69":3,"70":3,"71":5,"73":1,"75":1,"79":1,"81":1,"83":1,"84":1,"85":2,"86":2,"87":1,"89":11,"90":1,"92":1,"96":4,"97":3,"103":1,"105":1,"107":2,"109":1,"112":2,"113":1,"114":1}}],["will",{"2":{"0":1,"1":1,"4":1,"5":1,"13":1,"16":3,"17":2,"18":1,"19":1,"22":1,"36":1,"40":1,"41":2,"42":2,"45":2,"46":1,"48":1,"53":2,"58":1,"60":1,"66":1,"84":3,"86":3,"87":1,"89":12,"90":3,"105":1}}],["wether",{"2":{"89":1}}],["weight=",{"2":{"89":1}}],["weight=nothing",{"2":{"89":1}}],["weight",{"0":{"54":1},"1":{"55":1,"56":1},"2":{"53":1,"55":1,"56":1}}],["weights",{"0":{"55":1},"2":{"51":3,"55":2,"56":1}}],["weightedmean",{"2":{"89":1}}],["weighted",{"0":{"56":1},"2":{"42":1,"49":1,"51":8,"56":8,"89":3}}],["well",{"2":{"42":1,"46":1,"86":1,"89":1}}],["welcome",{"2":{"6":1,"91":1}}],["were",{"2":{"13":2,"71":1,"90":1,"100":1}}],["we",{"2":{"0":1,"8":2,"9":1,"13":2,"14":1,"16":5,"17":3,"18":1,"19":1,"20":1,"22":5,"23":2,"29":2,"33":1,"35":1,"36":1,"37":1,"38":1,"40":2,"41":2,"42":5,"46":4,"51":3,"52":1,"53":2,"56":1,"59":1,"64":1,"66":1,"70":1,"76":1,"86":3,"87":4,"97":2,"100":1,"107":1,"112":1}}],["oob",{"2":{"89":1}}],["o1",{"2":{"60":2,"67":2,"79":2,"85":1}}],["ocean",{"2":{"60":1,"67":1,"79":1,"85":1}}],["oct",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["occuring",{"2":{"4":1}}],["o",{"2":{"50":3,"56":4,"89":5}}],["ohlcv",{"2":{"46":3}}],["ouput",{"2":{"93":1}}],["our",{"2":{"41":1,"42":1,"101":1,"113":1}}],["outcube",{"2":{"90":1}}],["outcubes",{"2":{"90":1}}],["outcs",{"2":{"90":1}}],["outsize",{"2":{"90":1}}],["outar",{"2":{"90":2}}],["out",{"2":{"50":1,"89":2,"90":1}}],["outtype",{"2":{"16":2,"89":1,"90":2}}],["outdims=outdims",{"2":{"22":1,"23":1}}],["outdims",{"0":{"17":1,"18":1,"19":1,"20":1},"1":{"18":1,"19":1,"20":1},"2":{"16":4,"18":12,"19":2,"20":11,"21":3,"89":6}}],["outputcube",{"2":{"90":3}}],["outputs",{"2":{"16":1,"18":2,"21":1}}],["output",{"2":{"6":1,"16":3,"17":1,"18":1,"22":1,"23":3,"60":1,"67":1,"79":1,"85":1,"89":11,"90":9}}],["optimal",{"2":{"90":1}}],["optifunc",{"2":{"90":1}}],["optionally",{"2":{"89":1}}],["option",{"2":{"37":1,"39":1,"81":1}}],["options",{"2":{"34":1,"58":1,"66":1,"89":1}}],["operates",{"2":{"89":1}}],["operate",{"2":{"21":1,"78":1}}],["operation",{"2":{"21":1,"90":1}}],["operations",{"0":{"16":1},"2":{"10":1,"51":1,"89":2,"90":3,"112":1}}],["operating",{"2":{"19":1}}],["opens",{"2":{"89":1}}],["openinterval",{"2":{"71":1}}],["opening",{"2":{"65":2}}],["open",{"0":{"58":1,"64":1,"71":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"65":1,"66":1},"2":{"0":2,"18":1,"20":2,"46":4,"58":3,"59":2,"60":2,"61":1,"64":1,"65":3,"66":3,"67":2,"71":2,"79":1,"81":1,"85":1,"87":6,"89":7,"107":1,"112":1}}],["obj",{"2":{"42":2,"100":1,"102":1}}],["objects",{"2":{"89":2}}],["object",{"2":{"11":1,"59":1,"89":5,"90":3}}],["obtain",{"0":{"34":1},"2":{"46":1,"53":1}}],["omit",{"2":{"23":1}}],["otherwise",{"2":{"89":1}}],["others",{"2":{"21":1,"46":1}}],["other",{"0":{"103":1},"1":{"104":1,"105":1,"106":1},"2":{"20":1,"24":1,"62":1,"103":1,"105":1,"112":1}}],["overwrite=false",{"2":{"84":1,"89":1}}],["overwrite=true",{"2":{"16":2,"84":3,"86":3,"89":1}}],["overwrite",{"0":{"84":1},"2":{"84":1,"89":2,"90":2}}],["overview",{"0":{"104":1},"2":{"78":1,"103":1,"104":1}}],["over",{"0":{"16":1,"105":1},"2":{"10":1,"15":1,"21":1,"23":1,"56":1,"89":8,"90":1,"105":1}}],["orca2",{"2":{"60":1,"67":1,"79":1,"85":1}}],["orangered",{"2":{"42":1}}],["ordered",{"2":{"74":1,"75":1}}],["ordereddict",{"2":{"22":1,"89":1}}],["orderedcollections",{"2":{"22":1}}],["order",{"2":{"16":1,"49":1,"87":1}}],["original",{"2":{"60":2,"63":6,"68":4,"69":6,"70":6,"71":10}}],["originates",{"2":{"9":1}}],["origin",{"2":{"10":2,"12":1,"13":1,"23":1,"29":3,"30":1,"96":2}}],["or",{"0":{"36":1},"1":{"37":1,"38":1,"39":1,"40":1},"2":{"1":2,"6":1,"10":1,"13":2,"15":1,"27":1,"33":1,"38":1,"47":2,"58":1,"59":1,"62":1,"67":2,"74":3,"77":2,"78":9,"81":1,"84":1,"89":24,"90":7,"95":1,"96":2,"98":1,"113":1}}],["once",{"2":{"56":1,"76":1,"90":1,"92":1}}],["onlinestat",{"2":{"89":2}}],["onlinestats",{"2":{"42":2}}],["only",{"2":{"6":1,"13":1,"14":1,"16":1,"20":1,"22":1,"24":1,"29":2,"41":1,"51":1,"60":1,"78":1,"86":1,"89":2}}],["on",{"2":{"1":2,"6":1,"7":1,"10":2,"13":2,"16":1,"23":2,"31":1,"60":2,"63":3,"67":1,"68":2,"69":3,"70":3,"71":5,"74":1,"78":1,"79":1,"81":1,"85":1,"86":1,"89":5,"90":4,"112":2}}],["ones",{"2":{"17":1,"33":1}}],["oneto",{"2":{"4":4,"5":4,"6":2,"25":2,"29":3,"32":9,"33":6,"44":1,"45":5,"47":4,"86":6,"96":2}}],["one",{"0":{"18":1,"44":1},"2":{"0":1,"7":1,"8":2,"14":2,"18":15,"19":5,"20":6,"21":2,"22":2,"42":1,"46":1,"52":1,"60":1,"64":1,"74":2,"75":1,"86":2,"89":9,"90":3,"103":1,"112":1}}],["own",{"2":{"0":1,"60":1,"78":1}}],["offsets",{"2":{"90":1}}],["offset",{"2":{"13":1}}],["often",{"2":{"7":1}}],["of",{"0":{"11":1,"40":1,"49":1,"87":1,"104":2},"2":{"0":2,"1":1,"6":1,"8":3,"9":1,"10":2,"11":1,"12":1,"13":2,"14":1,"15":1,"22":7,"23":3,"24":1,"26":1,"27":1,"31":3,"32":3,"36":1,"37":2,"38":1,"39":1,"40":2,"41":1,"42":1,"49":1,"50":1,"54":1,"60":1,"63":1,"64":3,"66":2,"67":3,"68":1,"70":1,"72":1,"74":7,"75":1,"76":2,"77":2,"78":1,"79":1,"85":1,"86":1,"87":1,"88":1,"89":53,"90":42,"96":1,"97":2,"101":2,"102":1,"103":1,"104":1,"112":2,"114":1}}],["eo",{"2":{"103":1}}],["esdltutorials",{"2":{"103":1}}],["esm1",{"2":{"59":1,"107":2,"112":1}}],["eltype",{"2":{"96":1}}],["elementtype",{"2":{"90":1}}],["element",{"2":{"8":1,"9":1,"10":2,"13":2,"14":1,"16":3,"22":2,"34":1,"42":1,"51":2,"52":1,"53":1,"54":7,"55":2,"56":3,"66":1,"69":2,"72":1,"75":1,"76":2,"89":1,"90":1,"101":1}}],["elements",{"0":{"11":1,"69":1},"2":{"8":1,"12":1,"13":2,"23":1,"67":1,"74":1,"89":1,"90":1}}],["empty",{"2":{"90":1}}],["embeds",{"2":{"89":1}}],["either",{"2":{"89":2}}],["error",{"2":{"84":1}}],["even",{"2":{"65":1}}],["everywhere",{"2":{"23":2}}],["every",{"2":{"0":1,"10":1,"13":1,"89":1}}],["epsg",{"2":{"61":5}}],["et",{"2":{"60":1,"67":1,"76":1,"79":1,"85":1}}],["edu",{"2":{"60":1,"67":1,"75":1,"79":1}}],["equivalent",{"2":{"56":1,"72":1}}],["equally",{"2":{"0":1}}],["effectively",{"2":{"41":1}}],["env",{"2":{"93":1}}],["ensure",{"2":{"60":1}}],["enabling",{"2":{"29":1}}],["enter",{"2":{"95":1}}],["entire",{"2":{"22":1,"24":1,"80":1,"82":1}}],["entries",{"2":{"22":1,"46":1,"50":2,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"87":1,"89":1,"96":1,"113":1,"114":1}}],["entry",{"2":{"10":1,"12":1,"13":1,"16":2,"17":1,"18":1,"19":1,"21":1,"29":2,"51":2,"52":1,"54":2,"55":2,"56":3,"89":1,"92":3}}],["enumerate",{"2":{"22":2,"56":2}}],["end",{"2":{"13":1,"16":1,"18":1,"19":2,"21":2,"22":4,"23":2,"41":1,"51":2,"56":2,"60":1,"101":2,"111":1}}],["exist",{"2":{"89":1}}],["exists",{"2":{"84":1,"89":1,"90":1}}],["existing",{"0":{"8":1,"66":1},"2":{"66":1,"84":1,"85":1}}],["expression",{"2":{"89":1}}],["exported",{"2":{"78":2}}],["experiment",{"2":{"60":3,"67":3,"79":3,"85":3}}],["explore",{"2":{"58":1}}],["explicitly",{"2":{"13":1,"33":1,"36":1,"51":1,"78":1,"90":1}}],["executes",{"2":{"89":1}}],["execute",{"2":{"23":1}}],["external",{"2":{"59":1,"107":1}}],["extension",{"2":{"58":1,"89":2}}],["extended",{"2":{"16":1,"89":1,"90":2}}],["extracts",{"2":{"90":1}}],["extract",{"0":{"32":1},"1":{"33":1},"2":{"90":1}}],["extracted",{"2":{"21":1}}],["extra",{"2":{"23":1}}],["exactly",{"2":{"5":1,"34":1,"46":1}}],["examples",{"2":{"6":1,"34":2,"48":1,"58":1,"60":1,"67":1,"79":1,"92":1}}],["example",{"2":{"0":1,"1":1,"5":1,"10":1,"17":1,"21":1,"23":2,"33":1,"39":1,"40":1,"41":1,"42":1,"49":1,"58":1,"60":1,"62":1,"64":1,"67":2,"74":2,"75":1,"76":1,"78":1,"79":2,"89":5,"90":1,"92":2,"96":2,"113":1,"115":1}}],["e",{"2":{"7":1,"8":1,"10":1,"11":1,"13":1,"22":2,"23":1,"26":1,"27":1,"29":1,"37":1,"58":1,"60":1,"72":1,"74":1,"77":1,"84":1,"89":7,"90":1,"93":1,"96":1}}],["east",{"2":{"61":1}}],["easier",{"2":{"29":1,"67":1}}],["easily",{"2":{"0":1,"23":1}}],["easy",{"2":{"26":1,"27":1,"112":1}}],["each",{"2":{"4":1,"5":1,"10":1,"13":1,"20":1,"22":5,"23":2,"41":2,"42":2,"49":1,"53":1,"63":1,"75":1,"77":1,"89":3,"90":3,"96":1}}],["features",{"2":{"104":1}}],["feel",{"2":{"81":1}}],["few",{"2":{"78":1}}],["feb",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["frame",{"2":{"105":1}}],["frames",{"2":{"74":1}}],["front",{"2":{"90":1}}],["from",{"0":{"32":1,"34":2,"46":1,"49":1},"1":{"33":1},"2":{"0":1,"8":1,"9":1,"24":1,"32":1,"33":1,"34":4,"40":3,"46":2,"51":1,"58":1,"63":1,"66":1,"71":1,"76":2,"87":1,"89":6,"90":6,"96":1,"101":1,"112":1,"113":1}}],["free",{"2":{"81":1}}],["frequently",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1}}],["fr",{"2":{"60":1,"67":1,"79":1,"85":1}}],["faceting",{"0":{"113":1},"2":{"113":1}}],["fallback",{"2":{"90":1}}],["falls",{"2":{"89":1}}],["false",{"2":{"18":1,"20":1,"47":1,"89":1,"90":1}}],["fails",{"2":{"89":1}}],["faq",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1}}],["faster",{"2":{"90":1}}],["fastest",{"2":{"1":1}}],["fast",{"2":{"1":1,"13":1}}],["f2mix",{"2":{"19":3}}],["f2",{"2":{"18":3}}],["f1",{"2":{"18":2,"19":1}}],["fu",{"2":{"90":1}}],["funtion",{"2":{"101":1}}],["fun",{"2":{"89":5}}],["functionality",{"0":{"104":1}}],["functions",{"2":{"10":2,"21":1,"74":2,"88":1,"89":1,"90":1,"113":1}}],["function",{"0":{"42":1},"2":{"0":1,"1":1,"13":2,"15":1,"16":6,"17":1,"18":2,"19":2,"21":5,"23":6,"32":2,"35":1,"41":1,"42":1,"46":1,"48":1,"51":1,"53":1,"56":1,"58":1,"62":1,"71":1,"86":1,"89":22,"90":12}}],["future",{"2":{"50":1}}],["further",{"2":{"13":1,"103":1}}],["flag",{"2":{"90":3}}],["flat",{"2":{"18":4,"19":2,"20":2}}],["float32",{"2":{"16":6,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"86":2,"87":4,"90":1,"113":1,"114":1}}],["float64",{"2":{"8":1,"9":1,"10":3,"12":3,"13":3,"14":4,"17":2,"18":2,"19":2,"20":2,"21":3,"22":9,"25":2,"27":4,"29":6,"30":2,"32":1,"33":3,"35":4,"41":12,"42":5,"46":2,"50":2,"51":3,"52":2,"55":3,"56":6,"59":4,"60":4,"61":2,"63":6,"64":1,"67":2,"68":4,"69":2,"70":6,"71":10,"72":4,"79":2,"85":2,"89":1,"90":1,"96":7,"101":2,"107":2,"113":2,"114":2}}],["flexible",{"2":{"9":1,"15":1}}],["focus",{"2":{"112":1}}],["folder",{"2":{"93":1}}],["follow",{"2":{"93":1,"103":1}}],["follows",{"2":{"16":2,"19":1,"21":1,"51":2,"56":1,"87":1}}],["following",{"2":{"2":1,"5":1,"6":1,"16":1,"17":1,"18":1,"21":1,"23":1,"33":1,"48":1,"49":1,"50":1,"89":2,"90":4,"98":2,"99":1,"103":1}}],["found",{"2":{"89":1,"90":1}}],["fourth",{"2":{"60":2,"67":2,"79":2,"85":2}}],["fontsize=24",{"2":{"108":1}}],["fontsize=18",{"2":{"56":1}}],["font=",{"2":{"56":1}}],["forwarded",{"2":{"89":1}}],["forwardordered",{"2":{"4":4,"5":4,"6":2,"8":1,"9":1,"10":3,"12":3,"13":3,"14":3,"16":9,"17":4,"18":4,"19":3,"20":3,"21":9,"22":9,"25":2,"27":4,"29":9,"30":3,"32":9,"33":6,"34":2,"35":4,"37":14,"39":6,"40":10,"41":9,"42":5,"44":1,"45":5,"46":4,"47":4,"50":6,"51":3,"52":2,"54":3,"55":1,"56":7,"59":6,"60":6,"61":1,"63":9,"64":3,"65":10,"66":4,"67":3,"68":6,"69":4,"70":9,"71":15,"72":3,"79":3,"85":6,"86":6,"96":5,"101":1,"107":3,"113":3,"114":3}}],["force",{"2":{"89":1}}],["forcing",{"2":{"59":1,"107":1}}],["forms",{"2":{"89":1,"90":2}}],["formal",{"2":{"76":1}}],["format",{"2":{"58":1,"81":1,"83":1,"84":1,"89":1,"101":1}}],["former",{"2":{"32":1}}],["for",{"0":{"6":1,"100":1},"1":{"101":1,"102":1},"2":{"0":2,"1":3,"4":1,"5":1,"6":1,"20":1,"22":4,"23":1,"37":1,"39":2,"40":2,"41":4,"42":6,"46":5,"50":1,"51":1,"54":1,"56":3,"58":3,"60":2,"62":2,"63":1,"64":3,"65":2,"67":1,"71":1,"72":1,"74":4,"75":3,"76":1,"78":4,"79":1,"84":1,"85":1,"86":2,"89":20,"90":16,"99":1,"100":1,"101":2,"103":1,"112":3,"113":2,"114":1,"115":2}}],["f",{"2":{"2":2,"16":3,"58":1,"89":1}}],["field",{"2":{"89":1}}],["fields",{"2":{"42":1,"89":1,"90":4}}],["figure=",{"2":{"102":1,"113":3,"114":1,"115":1}}],["figure",{"2":{"56":2,"100":1,"102":1,"108":1,"109":1,"110":1,"111":1}}],["fig",{"2":{"42":3,"56":8,"100":1,"102":1,"108":2,"109":2,"110":2,"111":3}}],["filterig",{"2":{"101":1}}],["filter",{"2":{"89":2}}],["fillarrays",{"2":{"86":3}}],["fill",{"2":{"86":1,"89":1,"90":1}}],["fillvalue=",{"2":{"90":1}}],["fillvalue",{"2":{"50":6,"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["filling",{"2":{"28":1,"29":1}}],["filename",{"2":{"50":2,"58":1,"89":1}}],["files",{"0":{"106":1},"2":{"7":1,"57":1,"61":1,"64":2,"65":6,"66":4,"89":5,"90":2,"93":1}}],["file",{"2":{"2":1,"7":1,"27":1,"40":1,"60":2,"83":3,"84":2,"86":1,"89":2,"92":4}}],["findaxis",{"2":{"90":1}}],["findall",{"2":{"22":1,"101":1}}],["find",{"2":{"36":1,"90":1,"103":1}}],["finalizer",{"2":{"90":1}}],["finalize",{"2":{"90":1}}],["finally",{"2":{"22":1,"89":1}}],["final",{"2":{"21":1,"22":1}}],["firstly",{"2":{"37":1}}],["first",{"2":{"8":4,"16":3,"18":1,"22":1,"42":1,"45":1,"56":1,"87":1,"89":4,"90":1,"92":1,"96":1,"107":1,"112":2,"113":1}}],["fitting",{"2":{"89":1}}],["fittable",{"2":{"89":2}}],["fitcube",{"2":{"42":2}}],["fitsym",{"2":{"89":4}}],["fits",{"2":{"24":1}}],["fit",{"2":{"1":1,"62":1,"74":1}}],["t=union",{"2":{"90":1}}],["typing",{"2":{"95":1}}],["typically",{"2":{"89":1}}],["type",{"2":{"33":1,"47":1,"50":2,"74":1,"76":1,"89":8,"90":3,"96":1,"97":1,"112":1}}],["types",{"0":{"73":1},"1":{"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"24":2,"26":1,"27":1,"47":1,"69":1,"75":1,"89":2,"97":1}}],["tutorial",{"2":{"103":2,"104":1,"105":1}}],["tutorials",{"0":{"103":1},"1":{"104":1,"105":1,"106":1},"2":{"71":1,"103":3}}],["turn",{"2":{"89":1}}],["tuple",{"2":{"2":3,"4":1,"5":1,"6":1,"18":1,"20":1,"51":2,"52":1,"54":5,"55":2,"56":4,"89":5,"90":1}}],["tbl",{"2":{"42":2}}],["target",{"2":{"90":1}}],["tab",{"2":{"89":4}}],["tableau",{"2":{"114":1}}],["tableaggregator",{"2":{"89":1}}],["tables",{"2":{"105":1}}],["table",{"0":{"105":1},"2":{"42":2,"59":1,"60":2,"67":2,"78":2,"79":2,"85":2,"89":4,"90":1,"107":1}}],["tas",{"2":{"59":5,"107":5,"112":2,"113":5,"114":2,"115":1}}],["tair",{"2":{"50":2,"56":1,"89":1}}],["ta",{"2":{"46":3}}],["takes",{"2":{"89":4}}],["taken",{"2":{"40":2}}],["take",{"2":{"16":1,"89":1,"90":2,"93":1}}],["tip",{"2":{"97":1}}],["tidy",{"2":{"89":1}}],["ticks",{"2":{"74":1}}],["ticks=false",{"2":{"56":1}}],["tick",{"2":{"72":1,"77":1,"96":1}}],["tiff",{"0":{"106":1}}],["tif",{"2":{"61":2,"99":1}}],["title",{"2":{"56":1,"60":1,"67":1,"79":1,"85":1,"92":1}}],["ti",{"2":{"26":1}}],["time1",{"2":{"69":2}}],["timearray",{"0":{"46":1},"2":{"46":3}}],["time=1",{"2":{"96":1,"112":1}}],["time=>cyclicbins",{"2":{"51":2,"52":1,"54":2,"55":2,"56":3}}],["time=datetime",{"2":{"113":1,"114":1}}],["time=date",{"2":{"37":1}}],["time=at",{"2":{"37":1,"56":3}}],["time=between",{"2":{"37":1}}],["time",{"0":{"49":1,"78":1,"114":1},"2":{"1":1,"7":1,"8":4,"9":3,"10":3,"12":1,"13":1,"14":7,"16":14,"17":2,"18":4,"19":1,"20":5,"21":10,"22":8,"23":5,"26":2,"29":3,"30":1,"35":2,"37":8,"39":4,"40":7,"41":4,"42":3,"46":5,"50":4,"51":21,"52":3,"53":2,"54":9,"55":3,"56":7,"59":4,"60":4,"63":6,"64":4,"65":9,"66":5,"67":1,"68":4,"69":6,"70":6,"71":10,"74":2,"75":1,"78":4,"79":1,"85":1,"89":6,"96":4,"100":1,"101":4,"107":4,"112":1,"113":10,"114":4}}],["timestamp",{"2":{"46":1}}],["timestep",{"2":{"42":1}}],["timeseries",{"2":{"46":3}}],["times",{"2":{"0":1}}],["treat",{"2":{"89":1}}],["treatment",{"2":{"89":1,"90":1}}],["treated",{"2":{"59":1,"113":1,"114":1}}],["translate",{"2":{"109":1,"110":1}}],["transformed",{"2":{"60":1,"67":1,"79":1,"85":1}}],["transformations",{"2":{"109":1}}],["transformation",{"2":{"22":1}}],["transform",{"2":{"22":2}}],["track",{"2":{"89":1}}],["tries",{"2":{"58":1,"89":1}}],["true",{"2":{"12":1,"47":1,"62":1,"86":1,"89":3,"90":1}}],["tesselation",{"2":{"111":1}}],["testrange",{"2":{"90":1}}],["test1",{"2":{"47":1}}],["test2",{"2":{"47":2}}],["test",{"2":{"17":4,"18":1,"19":3,"20":4,"21":4,"47":3,"90":1,"107":1}}],["terminal",{"2":{"93":1}}],["text",{"2":{"92":1}}],["tensors",{"2":{"74":1}}],["tell",{"2":{"36":1}}],["temporary",{"2":{"90":1}}],["temporal",{"2":{"41":1,"48":1,"74":1}}],["tempo",{"2":{"51":6,"54":4,"55":1}}],["temp",{"2":{"9":2}}],["temperature=temperature",{"2":{"40":1}}],["temperature",{"2":{"9":2,"40":4,"50":2,"56":2,"59":3,"60":2,"63":6,"68":5,"69":6,"70":6,"71":10,"74":1,"75":1,"76":1,"96":4,"113":3,"114":3}}],["tempname",{"2":{"2":1,"4":1,"5":1,"6":1}}],["tspan",{"2":{"16":1}}],["t",{"2":{"16":4,"37":1,"39":2,"40":2,"42":3,"60":1,"63":4,"68":2,"69":3,"70":3,"71":5,"81":1,"89":1,"90":2,"100":1,"101":1,"113":1}}],["two",{"2":{"8":1,"9":1,"18":8,"19":4,"20":3,"21":2,"34":2,"35":1,"74":1,"90":1}}],["toghether",{"2":{"90":1}}],["together",{"2":{"46":1,"76":1}}],["touches",{"2":{"71":1}}],["tolerances",{"2":{"70":1}}],["tos",{"2":{"60":5,"63":6,"67":2,"68":4,"69":4,"70":3,"71":9,"72":2,"79":2,"80":2,"82":2,"85":1}}],["top",{"2":{"56":1,"112":1}}],["too",{"2":{"40":1,"74":1,"89":1}}],["todo",{"2":{"21":1,"101":1}}],["toy",{"2":{"21":1,"86":1}}],["to",{"0":{"9":1,"18":1,"19":1,"43":1,"85":1,"91":1,"92":1,"98":1},"1":{"44":1,"45":1,"92":1,"93":2},"2":{"0":4,"1":4,"3":1,"4":1,"6":2,"7":1,"8":1,"9":1,"10":8,"12":1,"15":1,"16":2,"17":1,"18":2,"19":1,"20":4,"21":3,"22":2,"23":6,"24":3,"25":2,"27":3,"28":1,"31":2,"32":2,"34":3,"35":1,"37":2,"39":2,"40":6,"41":1,"42":1,"45":2,"46":2,"47":1,"48":1,"49":3,"50":2,"51":1,"52":1,"53":1,"56":1,"57":1,"58":1,"59":3,"60":2,"62":1,"63":2,"64":2,"65":1,"66":2,"67":3,"71":1,"72":1,"73":1,"74":5,"75":3,"76":2,"77":2,"78":2,"79":1,"80":2,"81":2,"82":2,"83":2,"84":1,"85":2,"86":4,"87":3,"89":48,"90":19,"92":2,"93":3,"97":2,"98":1,"103":1,"105":3,"107":2,"112":3}}],["though",{"2":{"86":1}}],["those",{"2":{"11":1,"24":1,"26":1,"27":1,"45":1,"75":1,"87":1}}],["through",{"2":{"89":5,"90":5,"95":1}}],["thrown",{"2":{"84":1}}],["three",{"2":{"36":1,"75":1,"100":1}}],["threaded",{"2":{"60":1}}],["threads",{"2":{"60":2,"89":2}}],["thread",{"2":{"23":1,"60":3}}],["than",{"2":{"24":1,"36":1,"41":1,"42":1}}],["that",{"2":{"0":1,"9":2,"10":1,"13":1,"16":5,"20":1,"21":1,"22":2,"23":1,"24":1,"33":1,"35":1,"38":1,"40":2,"42":1,"46":1,"47":1,"49":1,"52":1,"55":1,"60":2,"62":1,"65":2,"72":1,"74":1,"75":2,"77":1,"78":1,"86":2,"89":13,"90":13,"103":1,"105":1,"112":2}}],["things",{"2":{"31":1}}],["think",{"2":{"1":1}}],["thinking",{"2":{"1":1}}],["this",{"2":{"0":1,"1":1,"4":1,"7":1,"10":1,"13":2,"16":4,"17":1,"19":2,"22":3,"23":1,"24":1,"28":1,"31":1,"34":1,"39":1,"40":2,"41":2,"42":2,"45":1,"46":1,"49":1,"51":1,"53":2,"57":1,"58":1,"59":1,"60":1,"62":1,"63":2,"66":1,"71":1,"73":1,"76":1,"81":1,"87":2,"88":2,"89":7,"90":10,"92":1,"93":2,"104":1,"105":1,"112":2,"113":1,"114":1}}],["they",{"2":{"46":4,"63":1}}],["their",{"0":{"39":1,"40":1},"2":{"38":1,"40":1,"47":1,"74":1,"89":3,"90":2}}],["then",{"2":{"21":2,"22":2,"33":1,"41":1,"46":1,"78":1,"86":1,"87":1,"93":2,"95":1}}],["thereby",{"2":{"89":1}}],["therefore",{"2":{"42":1,"97":1}}],["there",{"2":{"14":2,"21":1,"27":1,"34":1,"46":2,"63":1,"64":1,"89":1,"112":1}}],["theme",{"2":{"56":2}}],["them",{"2":{"7":1,"10":1,"36":1,"62":1,"78":1,"87":1,"89":1,"113":1}}],["these",{"2":{"0":1,"6":1,"34":1,"36":1,"47":1,"72":1,"74":1}}],["the",{"0":{"32":1,"34":1,"42":1,"50":1,"101":1,"104":1},"1":{"33":1},"2":{"0":5,"1":4,"2":3,"4":1,"5":4,"6":4,"8":6,"9":3,"10":1,"11":1,"13":3,"14":2,"15":1,"16":12,"17":3,"18":5,"19":2,"20":3,"21":10,"22":14,"23":7,"24":2,"27":1,"29":3,"31":1,"32":3,"33":5,"34":3,"35":2,"36":2,"37":9,"39":3,"40":10,"41":3,"42":10,"45":1,"46":7,"48":2,"49":5,"50":2,"51":4,"52":1,"53":2,"54":2,"55":2,"56":9,"58":6,"60":2,"62":3,"63":6,"65":1,"66":5,"67":1,"68":5,"69":3,"70":5,"71":6,"72":1,"73":1,"74":5,"75":4,"76":4,"78":4,"83":1,"84":3,"85":1,"86":10,"87":2,"89":122,"90":83,"91":1,"92":1,"93":6,"95":2,"96":6,"97":8,"98":5,"99":1,"100":1,"101":4,"103":6,"104":1,"105":5,"107":1,"112":4}}],["smooth",{"2":{"115":1}}],["small",{"2":{"31":1,"46":1}}],["switched",{"2":{"97":1}}],["syntax",{"2":{"97":1,"103":1,"112":1}}],["system",{"2":{"93":1}}],["symbols",{"2":{"58":1,"89":1}}],["symbol",{"2":{"10":1,"12":1,"13":1,"18":1,"20":1,"29":2,"46":5,"51":4,"52":2,"53":2,"54":5,"55":4,"56":6,"89":3,"90":1}}],["src",{"2":{"92":1}}],["sres",{"2":{"60":2,"67":2,"79":2,"85":2}}],["skeleton=a",{"2":{"86":1}}],["skeleton=true",{"2":{"86":2}}],["skeleton=false",{"2":{"84":1,"89":1}}],["skeleton",{"0":{"86":1},"2":{"86":8,"87":4}}],["skipped",{"2":{"89":1}}],["skip",{"2":{"58":4,"89":5}}],["skipmissing",{"2":{"23":1,"41":1}}],["ssp585",{"2":{"59":1,"107":2,"112":1}}],["snow3",{"2":{"42":1}}],["snippet",{"2":{"6":1}}],["slightly",{"2":{"103":1}}],["slicing",{"2":{"16":1}}],["slices",{"2":{"89":3}}],["slice",{"2":{"16":1,"107":4,"108":1}}],["slow",{"2":{"40":1,"89":1}}],["slurmmanager",{"2":{"23":1}}],["shinclude",{"2":{"93":1}}],["shdocs>",{"2":{"93":1}}],["shnpm",{"2":{"93":2}}],["shouldn",{"2":{"63":1}}],["should",{"2":{"37":1,"46":1,"50":1,"62":1,"63":1,"78":1,"89":3,"90":1,"92":1,"93":1,"98":1,"113":1}}],["showprog",{"2":{"89":1}}],["shown",{"2":{"63":1,"89":1}}],["shows",{"2":{"56":1}}],["showing",{"2":{"46":1}}],["show",{"2":{"23":1,"87":1,"111":1}}],["shading=false",{"2":{"109":1,"110":1,"111":1}}],["shall",{"2":{"89":5,"90":1}}],["shares",{"2":{"40":1}}],["share",{"0":{"39":1,"40":1},"2":{"38":1,"40":1,"75":1,"89":1}}],["shared",{"2":{"4":1,"5":1,"6":1,"20":1,"30":1,"35":1,"39":2,"40":3,"44":1,"45":1,"46":2,"59":1,"60":1,"61":1,"65":3,"66":1,"67":1,"79":1,"85":1,"86":1,"107":1}}],["shape",{"2":{"6":1}}],["scene",{"2":{"111":3}}],["scenariomip",{"2":{"59":1,"107":2,"112":1}}],["scenarios",{"2":{"17":1,"107":1}}],["scripts",{"2":{"93":1}}],["scope",{"2":{"89":1,"90":1}}],["scales",{"2":{"112":1,"113":1,"114":1}}],["scalar",{"2":{"59":1,"113":1,"114":1}}],["scatterlines",{"2":{"114":1}}],["scatter",{"2":{"112":3,"113":2,"115":1}}],["scattered",{"2":{"7":1}}],["such",{"2":{"63":1,"71":1,"89":1,"97":1}}],["surface",{"2":{"50":2,"56":2,"59":2,"60":2,"63":6,"68":5,"69":6,"70":6,"71":10,"109":1,"110":1,"113":2,"114":2}}],["subcubes",{"2":{"89":1}}],["subtype",{"2":{"74":1,"78":1,"90":1,"97":1}}],["subtables",{"2":{"42":1}}],["subsetextensions",{"2":{"90":1}}],["subsetcube",{"2":{"89":1}}],["subseting",{"2":{"72":1}}],["subsetting",{"0":{"37":1,"38":1,"39":1,"40":1},"1":{"39":1,"40":1},"2":{"59":1,"60":1,"90":1,"101":1}}],["subset",{"0":{"36":1},"1":{"37":1,"38":1,"39":1,"40":1},"2":{"37":5,"40":4,"67":1,"70":1,"89":1,"90":1,"107":1,"113":1}}],["subsets",{"2":{"15":1,"77":1}}],["subsequent",{"2":{"17":1}}],["supposed",{"2":{"89":1}}],["support",{"2":{"27":1,"46":1}}],["supertype",{"2":{"26":1,"27":1}}],["summarysize",{"2":{"47":2}}],["sum",{"2":{"18":1,"19":1,"21":1,"22":2,"41":1,"51":4,"54":2,"55":4,"56":2}}],["suggestions",{"2":{"6":1}}],["s",{"2":{"10":1,"16":3,"18":1,"19":1,"21":2,"33":1,"35":1,"37":1,"39":1,"40":2,"56":7,"58":1,"62":1,"67":1,"77":1,"86":1,"89":2,"90":1,"99":1,"101":1,"112":4,"113":2,"114":1}}],["style",{"0":{"105":1}}],["st",{"2":{"97":1}}],["stdzero",{"2":{"89":1}}],["stock3",{"2":{"46":4}}],["stock2",{"2":{"46":4}}],["stock1",{"2":{"46":4}}],["stocks",{"2":{"46":7}}],["storing",{"2":{"75":1}}],["storage",{"2":{"11":1,"59":1}}],["stored",{"2":{"74":3,"90":2}}],["stores",{"2":{"74":1,"89":1}}],["store",{"2":{"0":1,"59":4,"74":1,"75":1,"107":2,"112":1}}],["struct",{"2":{"89":1,"90":4}}],["structures",{"2":{"73":1}}],["structure",{"2":{"33":2,"46":1,"76":1}}],["strings",{"0":{"47":1}}],["string",{"2":{"8":1,"9":2,"10":1,"12":1,"13":1,"14":2,"16":5,"17":3,"18":4,"19":3,"20":1,"21":4,"22":6,"25":1,"27":3,"29":3,"32":1,"33":3,"34":1,"35":2,"37":5,"41":3,"42":3,"47":5,"50":2,"51":1,"52":1,"54":2,"55":1,"56":1,"59":2,"60":2,"61":1,"63":3,"64":1,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"84":1,"85":1,"86":1,"89":6,"90":4,"96":4,"101":1,"107":1,"113":1,"114":1}}],["stable",{"2":{"97":1}}],["statistical",{"2":{"115":1}}],["statistics",{"2":{"14":1,"23":1,"42":3,"48":1,"100":1}}],["stat",{"2":{"83":2}}],["status",{"2":{"63":2}}],["standard",{"2":{"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["standards",{"2":{"59":1,"60":1,"67":1,"79":1,"85":1,"107":1}}],["stack",{"2":{"47":1}}],["started",{"0":{"94":1},"1":{"95":1,"96":1,"97":1}}],["start=12",{"2":{"51":2,"52":1,"54":2,"55":2,"56":3}}],["start=december",{"2":{"51":3,"54":1}}],["start",{"2":{"10":1,"37":1,"81":1,"87":1}}],["still",{"2":{"8":1,"22":1,"75":1,"103":1}}],["step=3",{"2":{"51":2,"52":1,"54":2,"55":2,"56":3}}],["steps",{"2":{"10":1,"14":1,"56":1,"89":1,"93":1,"113":2,"114":1}}],["step",{"2":{"7":1,"14":1,"20":1,"41":2,"89":1,"90":2,"107":1,"112":1}}],["sphere",{"0":{"111":1},"2":{"111":3}}],["spheroid",{"2":{"61":1}}],["split",{"2":{"89":1}}],["splitted",{"2":{"2":1}}],["special",{"2":{"69":1,"89":1,"90":1}}],["specifiers",{"2":{"90":1}}],["specifier",{"2":{"89":1}}],["specifies",{"2":{"89":3}}],["specified",{"2":{"66":1,"89":8,"90":1}}],["specific",{"2":{"37":1,"78":1,"89":2}}],["specifying",{"2":{"65":1,"89":2,"90":1}}],["specify",{"0":{"20":1},"2":{"17":1,"29":1,"89":1}}],["specs",{"2":{"59":1,"107":1,"115":2}}],["spectral",{"2":{"56":1}}],["sparse",{"2":{"74":1}}],["spatio",{"2":{"41":1}}],["spatial",{"2":{"1":1,"14":1,"22":5,"23":1,"48":1,"74":1}}],["span",{"2":{"37":1,"100":1}}],["space",{"2":{"1":1,"16":1}}],["safe",{"2":{"60":2}}],["sampled",{"2":{"4":4,"5":4,"6":2,"8":1,"9":1,"10":3,"12":3,"13":3,"14":3,"16":9,"17":3,"18":3,"19":2,"20":3,"21":9,"22":8,"25":2,"27":4,"29":9,"30":3,"32":9,"33":6,"34":2,"35":3,"37":14,"39":6,"40":10,"41":9,"42":5,"44":1,"45":5,"46":4,"47":4,"50":6,"51":3,"52":2,"54":3,"55":1,"56":7,"59":6,"60":6,"61":2,"63":9,"64":3,"65":10,"66":4,"67":3,"68":6,"69":4,"70":9,"71":15,"72":3,"79":3,"85":6,"86":6,"96":5,"101":1,"107":3,"113":3,"114":3}}],["same",{"2":{"0":1,"2":1,"5":1,"6":1,"9":1,"16":1,"20":1,"21":1,"22":2,"26":1,"27":1,"33":2,"34":2,"35":1,"40":1,"45":1,"46":2,"62":1,"68":1,"69":1,"70":1,"74":1,"75":3,"76":2,"89":1,"90":1,"93":1}}],["saves",{"2":{"84":1,"89":1}}],["save",{"0":{"86":1},"2":{"12":1,"27":1,"45":1,"47":1,"80":2,"81":1,"82":2,"83":1,"86":1,"89":2}}],["savecube",{"2":{"2":1,"64":4,"80":1,"82":1,"86":1,"89":2}}],["savedataset",{"2":{"4":1,"5":1,"6":1,"81":1,"83":1,"84":1,"85":1,"86":2,"89":1,"90":1}}],["saved",{"2":{"2":1,"11":1,"20":1,"83":1,"84":1}}],["saving",{"2":{"1":1,"4":1,"5":1,"6":1,"16":1}}],["serve",{"2":{"90":1}}],["series",{"0":{"49":1,"114":1},"2":{"23":1,"114":2}}],["sequence",{"2":{"74":1}}],["sebastien",{"2":{"60":2,"67":2,"79":2,"85":2}}],["seaborn",{"2":{"108":1,"109":1,"110":1,"111":1}}],["sea",{"2":{"60":3,"63":6,"67":1,"68":5,"69":6,"70":6,"71":10,"79":1,"85":1}}],["searching",{"2":{"89":1}}],["search",{"2":{"58":1,"89":1}}],["season",{"2":{"51":1,"54":2,"55":1}}],["seasons",{"0":{"51":1,"53":1,"56":1},"1":{"52":1,"53":1},"2":{"51":9,"54":1,"56":5,"78":1}}],["seasonal",{"0":{"49":1,"100":1,"102":1},"1":{"101":1,"102":1},"2":{"49":1,"55":1,"56":1,"100":1,"101":4}}],["separate",{"2":{"89":1,"90":1}}],["separated",{"2":{"75":1}}],["separately",{"2":{"5":1,"22":1,"23":1}}],["sep",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["selected",{"2":{"90":1,"100":1}}],["select",{"0":{"67":1,"68":1,"69":1,"70":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"40":1,"67":1}}],["selectors",{"2":{"71":1}}],["selector",{"2":{"40":1,"70":1}}],["selection",{"2":{"40":2}}],["selecting",{"2":{"37":1,"39":1,"40":1}}],["seed",{"2":{"17":1,"21":2}}],["see",{"2":{"16":1,"18":1,"58":1,"71":1,"78":1,"89":1,"97":1,"113":1}}],["second",{"2":{"8":3,"18":1,"19":1,"89":1}}],["section",{"2":{"7":1,"10":1,"24":1,"28":1,"31":1,"46":1,"57":1,"73":1,"88":1}}],["setting",{"2":{"84":1,"89":1,"90":1}}],["sets",{"2":{"6":1,"50":1}}],["set",{"0":{"4":1,"5":1,"6":1},"2":{"4":1,"5":1,"19":2,"22":1,"59":1,"84":1,"89":1,"90":2,"93":1,"112":1}}],["setchunks",{"2":{"1":1,"2":2,"3":1,"4":1,"5":1,"6":1,"89":1,"90":1}}],["several",{"0":{"16":1},"2":{"0":1,"16":1,"35":1,"38":1,"78":1}}],["significant",{"2":{"81":1}}],["sin",{"2":{"100":1}}],["sink",{"2":{"90":1}}],["since",{"2":{"63":1,"98":1}}],["single",{"0":{"100":1},"1":{"101":1,"102":1},"2":{"0":1,"7":1,"8":1,"60":1,"76":1,"80":1,"82":1,"89":6,"90":1}}],["similar",{"2":{"112":1}}],["simulate",{"2":{"46":1}}],["simplicity",{"2":{"100":1}}],["simply",{"2":{"23":1,"47":1,"87":1,"93":1,"98":1}}],["simpler",{"2":{"112":1}}],["simple",{"2":{"16":1,"31":1,"96":1}}],["situations",{"2":{"1":1,"64":1}}],["size=",{"2":{"109":1,"110":1,"111":1,"113":3,"114":1,"115":1}}],["sizes",{"2":{"2":1,"89":2,"90":2}}],["size",{"2":{"0":1,"1":1,"4":1,"5":1,"8":1,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"21":3,"22":2,"25":1,"27":1,"29":2,"32":1,"33":3,"34":1,"35":1,"37":5,"41":3,"42":3,"50":2,"54":1,"56":1,"59":1,"60":1,"63":3,"64":1,"68":2,"69":3,"70":3,"71":5,"83":4,"86":1,"87":1,"89":3,"90":4,"96":3,"100":1,"101":2,"102":1,"108":1,"113":1,"114":1}}],["sophisticated",{"2":{"112":1}}],["sosstsst",{"2":{"60":1,"63":3,"68":2,"69":3,"70":3,"71":5}}],["software",{"2":{"60":1,"67":1,"79":1}}],["sort",{"2":{"22":1}}],["so",{"2":{"2":1,"23":1,"36":1,"40":1,"89":1,"90":1,"112":1}}],["source",{"2":{"0":2,"58":1,"60":1,"67":1,"79":1,"84":1,"85":1,"89":25,"90":24}}],["sometimes",{"2":{"78":1,"86":1,"105":1}}],["some",{"0":{"40":1},"2":{"0":1,"11":1,"38":1,"40":1,"41":1,"46":2,"56":1,"89":1,"100":1,"109":1,"113":1}}],["a4",{"2":{"64":3,"65":1,"66":1}}],["advance",{"2":{"63":1}}],["addargs",{"2":{"89":3,"90":1}}],["adds",{"2":{"74":2,"77":1}}],["addprocs",{"2":{"23":2}}],["addition",{"2":{"22":1,"24":1,"74":1}}],["additional",{"2":{"4":3,"5":3,"9":1,"16":1,"21":1,"40":10,"45":4,"46":4,"59":2,"85":3,"89":4,"90":3,"107":2,"113":1}}],["added",{"2":{"15":1,"85":1,"89":1,"90":1}}],["add",{"2":{"6":1,"10":1,"12":1,"41":1,"60":1,"92":2,"95":2,"98":3,"99":4,"109":1,"113":1}}],["again",{"2":{"84":1,"87":1,"113":1}}],["agreement",{"2":{"56":1}}],["aggregation",{"2":{"23":1}}],["aggregate",{"2":{"22":1}}],["authority",{"2":{"61":5}}],["auto",{"2":{"18":1,"20":1,"89":1}}],["aug",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["api",{"0":{"88":1,"89":1,"90":1},"1":{"89":1,"90":1}}],["apr",{"2":{"51":4,"52":2,"53":1,"54":4,"55":4,"56":6}}],["appropriate",{"2":{"92":1}}],["approximated",{"2":{"90":1}}],["approx",{"2":{"89":1,"90":1}}],["approach",{"2":{"9":1,"51":1,"112":1}}],["append=true",{"2":{"85":2}}],["append=false",{"2":{"84":1,"89":1}}],["append",{"0":{"85":1}}],["apply",{"0":{"41":1},"2":{"10":2,"13":1,"15":1,"21":1,"23":1,"56":1,"101":1}}],["application",{"2":{"21":1}}],["applications",{"2":{"0":1}}],["applies",{"2":{"13":1}}],["applied",{"2":{"0":1,"3":1,"4":1,"22":1,"89":2,"90":1}}],["air",{"2":{"50":2,"56":2,"59":3,"113":3,"114":3}}],["a3",{"2":{"30":4,"64":3,"65":1,"66":1}}],["a2",{"2":{"29":1,"30":3,"60":2,"64":3,"65":2,"67":2,"79":2,"85":2,"96":1}}],["a1",{"2":{"29":1,"64":3,"65":2}}],["able",{"2":{"45":1}}],["abstractstring",{"2":{"89":1}}],["abstractdict",{"2":{"89":1,"90":3}}],["abstractdimarray",{"2":{"26":1,"27":1,"74":1}}],["abs",{"2":{"21":1}}],["about",{"2":{"1":2,"36":1,"70":1,"96":1,"104":1}}],["above",{"2":{"0":1,"5":1,"16":1,"86":1,"95":1}}],["atol",{"2":{"70":1}}],["atmosphere",{"2":{"60":1,"67":1,"79":1,"85":1}}],["atmos",{"2":{"59":1,"107":1}}],["attributes",{"2":{"56":1,"89":1,"90":1,"112":1,"113":1}}],["at",{"2":{"21":1,"22":4,"27":1,"40":1,"46":3,"56":1,"58":1,"60":3,"63":3,"67":1,"68":2,"69":6,"70":7,"71":5,"75":1,"76":2,"79":1,"84":2,"85":1,"89":3,"90":2,"91":1,"92":2,"93":2,"96":1,"103":2}}],["after",{"2":{"14":1,"16":1,"61":1,"89":3}}],["asaxisarray",{"2":{"89":1}}],["assemble",{"2":{"96":1}}],["assessment",{"2":{"60":2,"67":2,"79":2,"85":2}}],["associated",{"2":{"89":1}}],["assign",{"0":{"43":1},"1":{"44":1,"45":1}}],["aspect=dataaspect",{"2":{"56":1,"108":1}}],["asked",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1}}],["as",{"2":{"5":1,"8":1,"9":1,"10":1,"12":1,"16":6,"17":1,"18":1,"19":1,"21":1,"22":2,"23":2,"26":1,"27":2,"29":1,"33":2,"34":1,"35":1,"40":1,"42":1,"46":3,"48":1,"51":2,"56":1,"58":1,"59":1,"60":1,"61":1,"62":1,"64":1,"65":2,"66":2,"68":1,"71":1,"72":1,"74":1,"77":1,"78":1,"86":1,"87":1,"89":12,"90":3,"96":1,"97":1,"101":1,"105":1,"107":1}}],["axs",{"2":{"56":9}}],["ax",{"2":{"42":1,"100":3,"102":3,"108":1,"109":3,"110":3,"111":5}}],["axlist",{"2":{"10":2,"17":2,"19":1,"21":4,"22":2,"23":2,"29":2,"30":1,"35":3,"90":5,"96":3}}],["axessmall",{"2":{"90":2}}],["axes",{"0":{"32":1,"34":1},"1":{"33":1},"2":{"4":4,"5":4,"6":1,"20":1,"29":1,"30":1,"32":2,"33":1,"34":2,"37":2,"39":5,"40":13,"44":1,"45":5,"46":8,"59":3,"60":1,"61":1,"65":3,"66":1,"67":2,"74":2,"79":1,"85":4,"86":1,"89":15,"90":11,"96":1,"101":2,"107":3}}],["axislegend",{"2":{"102":1}}],["axis=false",{"2":{"111":1}}],["axis=",{"2":{"100":1}}],["axisdescriptor",{"2":{"90":1}}],["axisdesc",{"2":{"89":3}}],["axis",{"0":{"4":1},"2":{"4":1,"9":2,"16":3,"34":1,"37":1,"39":1,"40":7,"46":1,"56":1,"61":2,"72":1,"77":1,"86":1,"89":16,"90":14,"96":1,"102":1,"107":1,"108":1,"112":1,"113":1}}],["albeit",{"2":{"112":1}}],["always",{"2":{"89":2,"90":1,"91":1,"97":1}}],["already",{"2":{"63":1,"65":1,"84":1,"89":1,"90":1}}],["al",{"2":{"60":1,"67":1,"76":1,"79":1,"85":1}}],["alternatives",{"2":{"89":1}}],["alternatively",{"2":{"0":1,"2":1,"89":2,"95":1}}],["altered",{"2":{"59":1,"60":1,"63":3,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["although",{"2":{"46":1,"47":1,"71":1}}],["algebraic",{"2":{"112":1}}],["algebraofgraphics",{"0":{"112":1},"1":{"113":1,"114":1,"115":1},"2":{"99":1,"112":2,"115":1}}],["algebra",{"0":{"41":1},"2":{"41":1,"112":1}}],["along",{"0":{"8":1,"65":1,"66":1},"2":{"8":1,"16":1,"64":2,"65":2,"66":2,"89":6,"90":2,"103":1,"112":1}}],["allaxes",{"2":{"90":1}}],["allinaxes",{"2":{"90":1}}],["allmissing",{"2":{"89":1}}],["allocate",{"2":{"86":1}}],["allocation",{"2":{"22":1}}],["allow",{"2":{"90":1}}],["allowed",{"2":{"47":1}}],["allowing",{"2":{"26":1,"27":1,"75":1}}],["allows",{"2":{"23":1,"112":1}}],["all",{"0":{"6":1,"39":1,"40":1},"2":{"4":1,"6":2,"10":1,"12":1,"13":1,"14":2,"22":1,"23":4,"38":1,"40":2,"46":3,"56":2,"58":2,"61":1,"71":1,"74":1,"76":2,"84":3,"86":1,"88":1,"89":7,"90":7,"93":1}}],["also",{"2":{"2":1,"3":1,"14":1,"21":1,"23":1,"29":1,"32":1,"40":1,"42":1,"65":1,"74":2,"75":1,"81":1,"86":2,"89":1,"95":1,"115":1}}],["annual",{"2":{"89":1}}],["analysis",{"0":{"115":1},"2":{"115":1}}],["analyzing",{"2":{"1":1}}],["analog",{"2":{"75":1}}],["anchor",{"2":{"21":1}}],["another",{"2":{"16":1,"40":1,"66":1}}],["anynymous",{"2":{"89":1}}],["anyocean",{"2":{"89":1}}],["anymissing",{"2":{"89":1}}],["anymore",{"2":{"21":1}}],["any",{"2":{"8":1,"9":1,"10":1,"11":1,"14":2,"16":5,"18":3,"20":1,"21":2,"22":4,"25":1,"27":3,"29":1,"32":1,"33":3,"34":1,"35":1,"37":6,"41":3,"42":3,"47":4,"50":2,"51":3,"52":2,"54":4,"55":3,"56":3,"58":1,"59":2,"60":3,"61":1,"63":3,"64":1,"67":1,"68":2,"69":3,"70":3,"71":5,"79":1,"85":1,"86":1,"89":4,"90":9,"96":1,"101":1,"107":1,"113":1,"114":1}}],["an",{"0":{"8":1},"2":{"9":1,"10":4,"12":1,"13":1,"15":1,"23":2,"33":1,"34":1,"39":1,"40":1,"42":1,"47":1,"62":1,"66":1,"67":3,"70":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"84":1,"85":1,"89":19,"90":8}}],["and",{"0":{"17":1,"28":1,"34":1,"48":1,"57":1,"67":1,"71":1,"79":1},"1":{"18":1,"19":1,"20":1,"29":1,"30":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"68":1,"69":1,"70":1,"71":1,"72":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"0":1,"2":1,"5":1,"6":1,"7":1,"8":1,"12":1,"16":4,"17":2,"18":2,"20":2,"21":4,"22":2,"24":1,"28":1,"29":1,"32":1,"35":1,"37":1,"40":6,"41":1,"42":6,"46":5,"48":1,"49":1,"50":1,"51":2,"56":1,"57":2,"58":1,"59":1,"60":1,"63":1,"64":1,"65":1,"67":1,"71":1,"74":5,"75":3,"76":2,"79":1,"81":2,"83":1,"84":1,"85":1,"86":3,"87":1,"89":19,"90":6,"91":1,"93":4,"95":1,"96":2,"100":1,"107":1,"109":1,"112":4,"114":1}}],["available",{"2":{"58":1,"71":2,"86":1,"88":1,"89":2,"95":1}}],["avariable",{"2":{"0":1}}],["avoid",{"2":{"51":1,"60":1}}],["avoids",{"2":{"22":1}}],["avoided",{"2":{"0":1}}],["averaging",{"2":{"14":1}}],["averages",{"0":{"49":1},"2":{"48":1}}],["average",{"2":{"14":1,"49":2}}],["arg",{"2":{"89":1}}],["argument",{"2":{"23":1,"86":1,"89":4,"90":2}}],["arguments",{"2":{"21":1,"56":1,"58":1,"89":12,"90":3}}],["artype",{"2":{"89":2}}],["archgdaldatasets",{"2":{"61":1}}],["archgdal",{"2":{"61":2,"99":1}}],["arr2",{"2":{"27":1}}],["arr",{"2":{"22":7,"27":2}}],["arrayinfo",{"2":{"90":1}}],["arrays",{"2":{"6":1,"7":1,"8":2,"9":1,"11":1,"28":1,"30":2,"59":2,"60":2,"73":1,"74":4,"75":3,"76":3,"89":2,"90":1}}],["array",{"0":{"22":1,"25":1},"2":{"0":1,"1":1,"8":2,"9":2,"10":3,"12":2,"13":2,"15":1,"18":1,"20":1,"22":8,"25":2,"34":1,"51":1,"56":1,"67":1,"74":4,"75":1,"76":1,"77":2,"86":5,"87":5,"89":10,"90":4,"96":3}}],["arbitrary",{"2":{"16":1}}],["arithmetics",{"0":{"12":1},"2":{"10":1}}],["areas",{"2":{"89":1}}],["area",{"2":{"59":2,"89":1,"113":2,"114":2}}],["areacella",{"2":{"59":2,"107":1,"113":1,"114":1}}],["are",{"2":{"0":1,"11":1,"18":1,"19":1,"24":3,"34":1,"36":1,"40":1,"46":3,"51":2,"56":2,"58":2,"63":2,"64":1,"66":1,"67":1,"71":1,"72":1,"74":3,"75":2,"76":3,"78":1,"86":1,"89":13,"90":6,"91":1,"93":1,"103":2,"105":1,"112":2}}],["according",{"2":{"89":1}}],["accessible",{"2":{"51":1}}],["access",{"2":{"1":2,"13":1,"29":1,"74":1,"77":1}}],["accessed",{"2":{"0":2,"59":1,"60":2}}],["activate",{"2":{"42":1,"93":2,"100":1,"108":1,"111":1,"112":1}}],["actually",{"2":{"90":1}}],["actual",{"2":{"13":1,"60":1,"86":1,"90":1,"96":1}}],["achieves",{"2":{"33":1}}],["achieved",{"2":{"0":1}}],["across",{"2":{"0":1,"7":1,"16":1,"74":3}}],["a",{"0":{"9":1,"11":1,"22":1,"29":1,"30":1,"32":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"46":2,"47":1,"65":1,"66":1,"68":1,"72":1,"84":1,"85":1,"100":1,"106":1},"1":{"33":1,"37":1,"38":1,"39":2,"40":2,"44":1,"45":1,"101":1,"102":1},"2":{"0":4,"2":7,"3":1,"4":1,"7":1,"8":1,"9":2,"10":3,"11":1,"12":4,"13":2,"14":2,"15":1,"16":5,"17":2,"18":1,"19":2,"20":1,"22":75,"23":11,"25":2,"26":5,"27":8,"29":1,"31":1,"32":2,"33":2,"34":1,"36":4,"37":3,"38":1,"40":2,"42":3,"44":2,"45":2,"46":4,"49":1,"54":1,"56":2,"58":1,"59":6,"60":4,"61":1,"64":4,"65":3,"66":1,"70":2,"71":4,"72":1,"74":12,"75":4,"76":8,"77":1,"78":4,"80":3,"81":3,"82":3,"83":1,"84":4,"86":5,"89":65,"90":31,"92":2,"93":2,"96":4,"97":1,"104":1,"105":1,"112":3,"114":1}}],["iall",{"2":{"90":1}}],["iwindow",{"2":{"90":1}}],["icolon",{"2":{"90":1}}],["icefire",{"2":{"108":1,"109":1,"110":1,"111":1}}],["ice",{"2":{"60":1,"67":1,"79":1,"85":1}}],["ipcc",{"2":{"60":3,"67":3,"79":3,"85":3}}],["ipsl",{"2":{"60":6,"67":6,"79":6,"85":6}}],["idx",{"2":{"101":3}}],["identical",{"2":{"89":1}}],["id",{"2":{"59":2,"60":2,"67":2,"79":2,"85":2,"107":2}}],["irregular",{"2":{"20":1,"40":6,"42":2,"46":4,"50":2,"51":1,"54":3,"55":1,"56":1,"59":4,"60":2,"63":3,"64":1,"65":3,"66":2,"67":1,"68":2,"69":2,"70":6,"71":5,"79":1,"85":1,"90":1,"107":2,"113":2,"114":2}}],["illustrate",{"2":{"17":1}}],["immutable",{"2":{"11":1}}],["improving",{"2":{"97":1}}],["improvement",{"2":{"81":1}}],["improve",{"2":{"6":1}}],["implementing",{"2":{"89":1}}],["importance",{"2":{"90":1}}],["important",{"2":{"1":1}}],["import",{"2":{"65":1,"66":1}}],["impossible",{"2":{"11":1}}],["i",{"0":{"35":1,"36":1,"41":1,"42":1,"43":1,"46":1},"1":{"37":1,"38":1,"39":1,"40":1,"44":1,"45":1},"2":{"8":1,"22":3,"26":1,"27":1,"37":1,"56":2,"58":1,"60":2,"64":4,"65":2,"84":1,"89":8,"90":4,"93":2,"96":1,"101":3}}],["ispar",{"2":{"89":1,"90":1}}],["ismissing",{"2":{"86":1}}],["issue",{"2":{"81":1}}],["issues",{"2":{"50":1}}],["isequal",{"2":{"22":1}}],["is",{"2":{"1":2,"2":1,"6":1,"7":1,"9":1,"13":1,"14":2,"15":1,"16":4,"21":2,"22":2,"23":3,"24":1,"27":1,"31":1,"33":2,"35":1,"36":1,"40":2,"41":1,"42":4,"46":2,"47":2,"49":2,"50":2,"51":2,"55":1,"58":1,"60":2,"63":2,"66":1,"68":1,"71":2,"72":1,"74":4,"75":1,"76":2,"77":1,"78":1,"86":4,"87":1,"89":12,"90":10,"92":1,"95":1,"97":1,"98":1,"103":1,"105":1,"112":1}}],["if",{"2":{"0":1,"18":1,"19":1,"24":1,"40":3,"78":2,"81":1,"84":1,"86":2,"89":12,"90":6,"93":1,"98":1,"103":1}}],["incubes",{"2":{"90":1}}],["incs",{"2":{"90":1}}],["include",{"2":{"89":2,"90":1}}],["included",{"2":{"71":1}}],["inarbc",{"2":{"90":1}}],["inar",{"2":{"90":2}}],["inplace",{"2":{"89":3,"90":1}}],["inputcube",{"2":{"90":2}}],["inputs",{"2":{"18":1}}],["input",{"2":{"16":1,"17":1,"18":1,"20":1,"23":2,"42":1,"89":13,"90":8}}],["innerchunks",{"2":{"90":1}}],["inner",{"2":{"89":9,"90":3}}],["insize",{"2":{"90":1}}],["inside",{"2":{"89":3}}],["installed",{"2":{"97":1}}],["installation",{"0":{"95":1}}],["install",{"0":{"98":1},"2":{"93":1,"95":1,"99":1}}],["instantaneous",{"2":{"50":2}}],["instead",{"2":{"8":1,"9":1,"13":1,"32":1,"37":1,"71":1,"74":1}}],["initialization",{"2":{"59":1,"107":1}}],["initially",{"2":{"22":1}}],["inds",{"2":{"90":1}}],["indeed",{"2":{"87":1}}],["indexing",{"2":{"69":2,"70":2,"87":1,"97":1}}],["index",{"2":{"59":2,"90":2,"107":2}}],["independently",{"2":{"46":1}}],["indices",{"2":{"90":1,"101":1}}],["indicate",{"2":{"89":1}}],["indicating",{"2":{"9":1,"22":1,"89":1}}],["indims=indims",{"2":{"22":1,"23":1}}],["indims",{"0":{"18":1,"19":1,"21":1},"2":{"16":8,"18":4,"20":7,"21":3,"89":7}}],["individually",{"2":{"13":2}}],["individual",{"2":{"0":1,"59":1,"60":1}}],["information",{"2":{"58":1,"63":1,"84":1,"90":2}}],["info",{"2":{"16":2,"27":1,"32":1,"48":1,"51":1,"60":11,"78":1,"83":4,"86":1,"97":1,"112":1}}],["introducing",{"2":{"76":1}}],["int",{"2":{"33":1,"47":1,"101":3}}],["interoperability",{"0":{"99":1}}],["internal",{"0":{"90":1},"2":{"90":9}}],["internally",{"2":{"75":1}}],["interface",{"2":{"89":2,"105":1}}],["interested",{"2":{"103":1}}],["interest",{"2":{"63":1}}],["interval",{"2":{"60":1,"63":3,"68":2,"69":3,"70":4,"71":6}}],["intervalsets",{"2":{"71":1}}],["intervals",{"0":{"71":1},"2":{"37":1}}],["interactive",{"2":{"0":1}}],["integer",{"2":{"29":1,"69":1,"70":1,"74":1}}],["int64",{"2":{"4":4,"5":4,"6":2,"8":1,"9":1,"16":8,"17":1,"18":1,"19":1,"21":7,"25":2,"27":2,"29":3,"32":9,"33":7,"34":4,"37":15,"39":4,"40":7,"42":3,"44":1,"45":5,"47":5,"50":4,"51":6,"52":6,"54":5,"56":18,"64":2,"65":7,"66":2,"85":3,"86":6,"90":1,"96":2}}],["into",{"0":{"62":1,"106":1},"1":{"63":1},"2":{"0":1,"1":1,"2":1,"7":1,"8":1,"16":1,"22":1,"24":2,"27":1,"40":4,"47":1,"50":1,"57":1,"62":1,"76":2,"84":1,"87":1,"89":6,"90":3,"93":1,"112":1,"113":1}}],["in",{"0":{"20":1,"43":1},"1":{"44":1,"45":1},"2":{"0":5,"1":1,"2":1,"4":2,"5":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":4,"16":5,"17":1,"18":2,"19":2,"21":5,"22":8,"23":3,"24":2,"25":1,"26":1,"27":2,"29":2,"32":1,"33":3,"34":2,"37":5,"38":1,"40":1,"41":3,"42":5,"46":4,"47":2,"49":2,"50":3,"51":2,"53":3,"54":1,"56":4,"59":2,"60":4,"62":1,"63":9,"64":2,"65":1,"66":1,"68":2,"69":3,"70":4,"71":7,"72":1,"73":1,"74":5,"75":1,"76":2,"78":3,"86":2,"87":1,"89":15,"90":9,"93":2,"95":1,"96":4,"98":2,"101":2,"103":3,"105":4,"107":1,"112":2,"114":1}}],["iter",{"2":{"89":1}}],["iterate",{"2":{"105":1}}],["iteration",{"0":{"105":1}}],["iterator",{"2":{"42":1}}],["iterators",{"2":{"22":1}}],["iterable",{"2":{"42":2,"89":2}}],["itself",{"2":{"89":1,"90":1}}],["its",{"2":{"0":1,"58":1}}],["it",{"2":{"0":2,"1":3,"12":1,"16":1,"18":1,"20":1,"23":2,"32":1,"34":1,"35":1,"40":2,"42":2,"46":2,"47":1,"52":1,"54":1,"56":1,"60":1,"65":1,"67":1,"74":2,"75":1,"77":1,"78":1,"83":1,"84":1,"86":2,"87":1,"89":10,"90":5,"93":1,"95":1,"112":2}}],["lscene",{"2":{"111":1}}],["lmdz",{"2":{"60":1,"67":1,"79":1,"85":1}}],["link",{"2":{"92":1}}],["linewidth=0",{"2":{"109":1,"110":1}}],["linewidth=2",{"2":{"102":2}}],["linewidth=1",{"2":{"100":1,"102":1}}],["linestyle=",{"2":{"102":2}}],["lines",{"2":{"100":1,"102":3,"113":3}}],["line",{"2":{"42":1}}],["limits=",{"2":{"112":1,"113":1}}],["lim",{"2":{"60":1,"67":1,"79":1,"85":1}}],["library",{"2":{"112":1}}],["libraries",{"2":{"37":1,"74":1}}],["libray",{"2":{"36":1}}],["little",{"2":{"23":1,"114":1}}],["list",{"2":{"22":1,"46":5,"64":2,"89":7,"90":6}}],["like",{"2":{"0":1,"42":1,"46":1,"64":1,"89":2,"90":1,"92":1,"112":1}}],["learn",{"2":{"105":1}}],["learning",{"2":{"74":1,"103":1}}],["leap",{"2":{"100":1}}],["least",{"2":{"40":1,"46":1,"89":1}}],["length",{"2":{"51":2,"52":1,"54":3,"65":1,"89":1,"90":3}}],["length=20",{"2":{"35":1,"96":1}}],["length=365",{"2":{"100":1}}],["length=3",{"2":{"17":1}}],["length=4",{"2":{"17":1}}],["length=15",{"2":{"10":1,"22":1,"23":1,"29":1,"35":1,"96":1}}],["length=10",{"2":{"10":1,"22":1,"23":1,"29":1,"35":1,"96":1}}],["level",{"2":{"21":1,"46":1,"81":1,"83":1,"92":1,"93":1,"112":1}}],["left",{"2":{"14":2}}],["let",{"2":{"10":1,"16":2,"18":1,"19":1,"33":1,"35":1,"37":1,"39":1,"40":1,"56":1,"58":1,"62":1,"67":1,"101":1,"112":3,"113":2,"114":1}}],["loopinds",{"2":{"90":2}}],["looping",{"2":{"89":1,"90":1}}],["loopcachesize",{"2":{"90":1}}],["loopchunksize",{"2":{"89":1}}],["loopaxes",{"2":{"90":1}}],["loopvars",{"2":{"89":1,"90":1}}],["loops",{"2":{"89":1}}],["loop",{"2":{"89":1,"90":2}}],["looped",{"2":{"89":3,"90":3}}],["look",{"2":{"84":1,"89":1,"90":1,"92":1,"93":1}}],["looking",{"2":{"78":1}}],["lookups",{"2":{"51":15,"52":10,"54":11,"55":5,"56":38,"66":1,"72":3}}],["lookup",{"2":{"51":1,"53":1,"107":3}}],["looks",{"2":{"42":1,"46":1}}],["located",{"2":{"103":1}}],["locate",{"2":{"93":1}}],["location",{"2":{"90":3}}],["locations",{"2":{"75":1,"76":1}}],["localhost",{"2":{"93":1}}],["locally",{"0":{"93":1},"2":{"93":1}}],["local",{"2":{"23":1,"59":1}}],["lock",{"2":{"60":3}}],["locks",{"2":{"60":1}}],["lowclip",{"2":{"56":4}}],["low",{"2":{"46":4}}],["lost",{"2":{"24":1}}],["lo",{"2":{"16":4}}],["loadorgenerate",{"2":{"90":1}}],["loading",{"2":{"61":1,"63":1,"87":1}}],["load",{"0":{"62":1},"1":{"63":1},"2":{"16":1,"37":1,"40":2,"50":1,"62":1,"63":1,"74":1,"114":1}}],["loaded",{"2":{"8":1,"9":1,"10":1,"12":1,"13":1,"14":2,"16":5,"17":1,"18":1,"19":1,"21":3,"22":2,"25":1,"27":1,"29":2,"32":1,"33":3,"34":1,"35":1,"37":5,"40":2,"41":3,"42":3,"47":2,"50":2,"54":1,"59":1,"60":1,"63":8,"64":1,"68":2,"69":3,"70":3,"71":5,"86":1,"96":2,"101":1,"113":1,"114":1}}],["lon=50",{"2":{"113":2}}],["lon=1",{"2":{"37":1,"39":1}}],["long",{"2":{"50":2,"56":1,"59":1,"60":1,"63":4,"68":2,"69":3,"70":3,"71":5,"113":1,"114":1}}],["longitudes=longitudes",{"2":{"40":1}}],["longitudes",{"2":{"40":12}}],["longitude",{"2":{"21":1,"37":1,"61":1,"78":6,"96":2}}],["lonlat",{"2":{"39":1}}],["lon",{"0":{"78":1},"2":{"10":2,"12":1,"13":1,"14":2,"16":10,"17":2,"18":1,"19":1,"20":1,"21":5,"22":12,"23":1,"26":2,"29":3,"30":1,"35":2,"37":7,"39":3,"41":4,"42":3,"59":2,"60":2,"63":3,"64":5,"65":3,"66":1,"67":1,"68":2,"69":3,"70":6,"71":10,"72":2,"78":8,"79":1,"85":1,"96":2,"107":2,"109":3,"112":2,"113":4,"114":3,"115":1}}],["lazy",{"2":{"89":1}}],["lazily",{"2":{"9":1,"13":1,"16":2,"35":1,"50":1,"59":1,"60":1,"63":1,"64":1,"68":2,"69":3,"70":3,"71":5,"113":1}}],["layername",{"2":{"89":2}}],["layername=",{"2":{"86":2,"90":1}}],["layer",{"2":{"65":3,"66":1,"86":1,"89":1,"90":1}}],["layout",{"2":{"56":2,"113":3}}],["labelled",{"2":{"89":1}}],["labels",{"2":{"56":1,"72":1,"76":1,"77":1}}],["label=false",{"2":{"56":1}}],["label=",{"2":{"56":1,"102":3}}],["label=cb",{"2":{"56":1}}],["label",{"2":{"56":3,"59":1,"78":1,"107":1}}],["last",{"2":{"16":1,"23":1}}],["la",{"2":{"16":4}}],["latest",{"2":{"97":1,"98":1}}],["later",{"2":{"18":1}}],["lat=50",{"2":{"115":1}}],["lat=5",{"2":{"37":1,"39":1}}],["latitudes=latitudes",{"2":{"40":1}}],["latitudes",{"2":{"40":11}}],["latitude",{"2":{"21":1,"37":1,"61":1,"78":6,"96":2}}],["lat",{"0":{"78":1},"2":{"10":2,"12":1,"13":1,"14":2,"16":7,"17":2,"18":1,"19":1,"20":1,"21":5,"22":12,"23":1,"26":2,"29":3,"30":1,"35":2,"37":7,"39":3,"41":4,"42":3,"59":2,"60":2,"63":3,"64":5,"65":3,"66":1,"67":1,"68":2,"69":3,"70":5,"71":5,"72":2,"78":8,"79":1,"85":1,"89":1,"96":2,"107":3,"109":1,"110":1,"112":2,"113":5,"114":2,"115":1}}],["larger",{"2":{"24":1}}],["large",{"2":{"0":2,"24":1,"50":1,"74":1}}]],"serializationVersion":2}';export{e as default};
diff --git a/previews/PR486/assets/chunks/VPLocalSearchBox.D16mVP9n.js b/previews/PR486/assets/chunks/VPLocalSearchBox.D16mVP9n.js
new file mode 100644
index 00000000..cf3a16db
--- /dev/null
+++ b/previews/PR486/assets/chunks/VPLocalSearchBox.D16mVP9n.js
@@ -0,0 +1,8 @@
+var Ft=Object.defineProperty;var Ot=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ae=(a,e,t)=>Ot(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,p as ie,h as me,aj as tt,ak as Rt,al as At,q as $e,am as Mt,d as Lt,D as xe,an as st,ao as Dt,ap as zt,s as Pt,aq as jt,v as Me,P as he,O as _e,ar as Vt,as as $t,W as Bt,R as Wt,$ as Kt,o as H,b as Jt,j as _,a0 as Ut,k as L,at as qt,au as Gt,av as Ht,c as Z,n as nt,e as Se,C as it,F as rt,a as fe,t as pe,aw as Qt,ax as at,ay as Yt,a9 as Zt,af as Xt,az as es,_ as ts}from"./framework.piKCME0r.js";import{u as ss,d as ns}from"./theme.ChQEK1xa.js";const is={root:()=>Ct(()=>import("./@localSearchIndexroot.DSCdH7hL.js"),[])};/*!
+* tabbable 6.2.0
+* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
+*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ne=mt.join(","),gt=typeof Element>"u",ae=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Fe=!gt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Oe=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},rs=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},bt=function(e,t,s){if(Oe(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ne));return t&&ae.call(e,Ne)&&n.unshift(e),n=n.filter(s),n},yt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Oe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,Ne);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var m=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),f=!Oe(m,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(m&&f){var b=a(m===!0?i.children:m.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},re=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||rs(e))&&!wt(e)?0:e.tabIndex},as=function(e,t){var s=re(e);return s<0&&t&&!wt(e)?0:s},os=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},ls=function(e){return xt(e)&&e.type==="hidden"},cs=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},us=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ae.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=Fe(e);if(l&&!l.shadowRoot&&n(l)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(ps(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return ot(e);return!1},ms=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},bs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=as(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(os).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:gs}):s=bt(e,t.includeContainer,Be.bind(null,t)),bs(s)},ws=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=bt(e,t.includeContainer,Ce.bind(null,t)),s},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Ne)===!1?!1:Be(t,e)},xs=mt.concat("iframe").join(","),Le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,xs)===!1?!1:Ce(t,e)};/*!
+* focus-trap 7.6.2
+* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
+*/function We(a,e){(e==null||e>a.length)&&(e=a.length);for(var t=0,s=Array(e);t0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Os=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cs=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Rs=function(e){return ge(e)&&!e.shiftKey},As=function(e){return ge(e)&&e.shiftKey},dt=function(e){return setTimeout(e,0)},ve=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1&&arguments[1]!==void 0?arguments[1]:{},g=d.hasFallback,T=g===void 0?!1:g,k=d.params,O=k===void 0?[]:k,S=r[u];if(typeof S=="function"&&(S=S.apply(void 0,Is(O))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var C=S;if(typeof S=="string"){try{C=s.querySelector(S)}catch(v){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(v.message,'"'))}if(!C&&!T)throw new Error("`".concat(u,"` as selector refers to no known node"))}return C},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!Le(u,r.tabbableOptions))if(c(s.activeElement)>=0)u=s.activeElement;else{var d=i.tabbableGroups[0],g=d&&d.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},f=function(){if(i.containerGroups=i.containers.map(function(u){var d=ys(u,r.tabbableOptions),g=ws(u,r.tabbableOptions),T=d.length>0?d[0]:void 0,k=d.length>0?d[d.length-1]:void 0,O=g.find(function(v){return oe(v)}),S=g.slice().reverse().find(function(v){return oe(v)}),C=!!d.find(function(v){return re(v)>0});return{container:u,tabbableNodes:d,focusableNodes:g,posTabIndexesFound:C,firstTabbableNode:T,lastTabbableNode:k,firstDomTabbableNode:O,lastDomTabbableNode:S,nextTabbableNode:function(p){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,F=d.indexOf(p);return F<0?E?g.slice(g.indexOf(p)+1).find(function(z){return oe(z)}):g.slice(0,g.indexOf(p)).reverse().find(function(z){return oe(z)}):d[F+(E?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var d=u.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?b(d.shadowRoot):d},y=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){y(m());return}u.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=u,Os(u)&&u.select()}},x=function(u){var d=h("setReturnFocus",{params:[u]});return d||(d===!1?!1:u)},w=function(u){var d=u.target,g=u.event,T=u.isBackward,k=T===void 0?!1:T;d=d||Ee(g),f();var O=null;if(i.tabbableGroups.length>0){var S=c(d,g),C=S>=0?i.containerGroups[S]:void 0;if(S<0)k?O=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:O=i.tabbableGroups[0].firstTabbableNode;else if(k){var v=i.tabbableGroups.findIndex(function(j){var I=j.firstTabbableNode;return d===I});if(v<0&&(C.container===d||Le(d,r.tabbableOptions)&&!oe(d,r.tabbableOptions)&&!C.nextTabbableNode(d,!1))&&(v=S),v>=0){var p=v===0?i.tabbableGroups.length-1:v-1,E=i.tabbableGroups[p];O=re(d)>=0?E.lastTabbableNode:E.lastDomTabbableNode}else ge(g)||(O=C.nextTabbableNode(d,!1))}else{var F=i.tabbableGroups.findIndex(function(j){var I=j.lastTabbableNode;return d===I});if(F<0&&(C.container===d||Le(d,r.tabbableOptions)&&!oe(d,r.tabbableOptions)&&!C.nextTabbableNode(d))&&(F=S),F>=0){var z=F===i.tabbableGroups.length-1?0:F+1,P=i.tabbableGroups[z];O=re(d)>=0?P.firstTabbableNode:P.firstDomTabbableNode}else ge(g)||(O=C.nextTabbableNode(d))}}else O=h("fallbackFocus");return O},R=function(u){var d=Ee(u);if(!(c(d,u)>=0)){if(ve(r.clickOutsideDeactivates,u)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}ve(r.allowOutsideClick,u)||u.preventDefault()}},A=function(u){var d=Ee(u),g=c(d,u)>=0;if(g||d instanceof Document)g&&(i.mostRecentlyFocusedNode=d);else{u.stopImmediatePropagation();var T,k=!0;if(i.mostRecentlyFocusedNode)if(re(i.mostRecentlyFocusedNode)>0){var O=c(i.mostRecentlyFocusedNode),S=i.containerGroups[O].tabbableNodes;if(S.length>0){var C=S.findIndex(function(v){return v===i.mostRecentlyFocusedNode});C>=0&&(r.isKeyForward(i.recentNavEvent)?C+1=0&&(T=S[C-1],k=!1))}}else i.containerGroups.some(function(v){return v.tabbableNodes.some(function(p){return re(p)>0})})||(k=!1);else k=!1;k&&(T=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(T||i.mostRecentlyFocusedNode||m())}i.recentNavEvent=void 0},J=function(u){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var g=w({event:u,isBackward:d});g&&(ge(u)&&u.preventDefault(),y(g))},Q=function(u){(r.isKeyForward(u)||r.isKeyBackward(u))&&J(u,r.isKeyBackward(u))},W=function(u){Cs(u)&&ve(r.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},V=function(u){var d=Ee(u);c(d,u)>=0||ve(r.clickOutsideDeactivates,u)||ve(r.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(i.active)return ut.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?dt(function(){y(m())}):y(m()),s.addEventListener("focusin",A,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",Q,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},be=function(){if(i.active)return s.removeEventListener("focusin",A,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",Q,!0),s.removeEventListener("keydown",W),o},M=function(u){var d=u.some(function(g){var T=Array.from(g.removedNodes);return T.some(function(k){return k===i.mostRecentlyFocusedNode})});d&&y(m())},U=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(M):void 0,q=function(){U&&(U.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){U.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var d=l(u,"onActivate"),g=l(u,"onPostActivate"),T=l(u,"checkCanFocusTrap");T||f(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,d==null||d();var k=function(){T&&f(),$(),q(),g==null||g()};return T?(T(i.containers.concat()).then(k,k),this):(k(),this)},deactivate:function(u){if(!i.active)return this;var d=ct({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,be(),i.active=!1,i.paused=!1,q(),ut.deactivateTrap(n,o);var g=l(d,"onDeactivate"),T=l(d,"onPostDeactivate"),k=l(d,"checkCanReturnFocus"),O=l(d,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){dt(function(){O&&y(x(i.nodeFocusedBeforeActivation)),T==null||T()})};return O&&k?(k(x(i.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){if(i.paused||!i.active)return this;var d=l(u,"onPause"),g=l(u,"onPostPause");return i.paused=!0,d==null||d(),be(),q(),g==null||g(),this},unpause:function(u){if(!i.paused||!i.active)return this;var d=l(u,"onUnpause"),g=l(u,"onPostUnpause");return i.paused=!1,d==null||d(),f(),$(),q(),g==null||g(),this},updateContainerElements:function(u){var d=[].concat(u).filter(Boolean);return i.containers=d.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&f(),q(),this}},o.updateContainerElements(e),o};function Ds(a,e={}){let t;const{immediate:s,...n}=e,r=ie(!1),i=ie(!1),o=f=>t&&t.activate(f),l=f=>t&&t.deactivate(f),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},m=me(()=>{const f=tt(a);return(Array.isArray(f)?f:[f]).map(b=>{const y=tt(b);return typeof y=="string"?y:Rt(y)}).filter(At)});return $e(m,f=>{f.length&&(t=Ls(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{ce.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;m();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(c,h,f,o),f=>{this.createInstanceOnIframe(f).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(f=>{s(f)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let zs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,m=e.value.substr(0,i.start),f=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=m+f,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let m=1;ms(l[i],m),(m,f)=>{e.lastIndex=f,n(m)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,i,r.value);m&&this.wrapRangeInMappedTextNode(r,c,h,f=>t(f,o,r.value.substring(c,h),l),f=>{s(f,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(f,b)=>this.opt.filter(b,c,s,m),f=>{m++,s++,this.opt.each(f)},()=>{m===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ps(a){const e=new zs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function ke(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(m){i(m)}}function l(h){try{c(s.throw(h))}catch(m){i(m)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const js="ENTRIES",_t="KEYS",St="VALUES",D="";class De{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===D)return{done:!1,value:this.result()};const s=e.get(le(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==D).join("")}value(){return le(this._path).node.get(D)}result(){switch(this._type){case St:return this.value();case _t:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Vs=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===D){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let m=0;mt)continue e}Et(a.get(c),e,t,s,n,h,i,o+c)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Re(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=qe(s);for(const i of n.keys())if(i!==D&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,$s(this._tree,e)}entries(){return new De(this,js)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return Vs(this._tree,e,t)}get(e){const t=Ke(this._tree,e);return t!==void 0?t.get(D):void 0}has(e){const t=Ke(this._tree,e);return t!==void 0&&t.has(D)}keys(){return new De(this,_t)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(D,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);return s.set(D,t(s.get(D))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);let n=s.get(D);return n===void 0&&s.set(D,n=t()),n}values(){return new De(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Re=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==D&&e.startsWith(s))return t.push([a,s]),Re(a.get(s),e.slice(s.length),t);return t.push([a,e]),Re(void 0,"",t)},Ke=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==D&&e.startsWith(t))return Ke(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Re(a,e);if(t!==void 0){if(t.delete(D),t.size===0)Tt(s);else if(t.size===1){const[n,r]=t.entries().next().value;It(s,n,r)}}},Tt=a=>{if(a.length===0)return;const[e,t]=qe(a);if(e.delete(t),e.size===0)Tt(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==D&&It(a.slice(0,-1),s,n)}},It=(a,e,t)=>{if(a.length===0)return;const[s,n]=qe(a);s.set(n+e,t),s.delete(n)},qe=a=>a[a.length-1],Ge="or",kt="and",Bs="and_not";class ue{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Ve:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},je),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ht),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},qs),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const m=s(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.addFieldLength(l,f,this._documentCount-1,b);for(const y of m){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(f,l,w);else x&&this.addTerm(f,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const m=t(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.removeFieldLength(l,f,this._documentCount,b);for(const y of m){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(f,l,w);else x&&this.removeTerm(f,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return ke(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||Je.batchSize,r=e.batchWait||Je.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Ve.minDirtCount,s=s||Ve.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:s}=this._options,n=Object.assign(Object.assign({},s),t),r=this.executeQuery(e,t),i=[];for(const[o,{score:l,terms:c,match:h}]of r){const m=c.length||1,f={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(f,this._storedFields.get(o)),(n.filter==null||n.filter(f))&&i.push(f)}return e===ue.wildcard&&n.boostDocument==null||i.sort(pt),i}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(pt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return ke(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(je.hasOwnProperty(e))return Pe(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Te(n),l._fieldLength=Te(r),l._storedFields=Te(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const m=new Map;for(const f of Object.keys(h)){let b=h[f];o===1&&(b=b.ds),m.set(parseInt(f,10),Te(b))}l._index.set(c,m)}return l}static loadJSAsync(e,t){return ke(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield Ie(n),l._fieldLength=yield Ie(r),l._storedFields=yield Ie(i);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of s){const f=new Map;for(const b of Object.keys(m)){let y=m[b];o===1&&(y=y.ds),f.set(parseInt(b,10),yield Ie(y))}++c%1e3===0&&(yield Nt(0)),l._index.set(h,f)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new ue(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new X,c}executeQuery(e,t={}){if(e===ue.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const f=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,f));return this.combineResults(b,f.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,m=o(e).flatMap(f=>l(f)).filter(f=>!!f).map(Us(i)).map(f=>this.executeQuerySpec(f,i));return this.combineResults(m,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:Pe(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},ht.weights),i),m=this._index.get(e.term),f=this.termResults(e.term,e.term,1,e.termBoost,m,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const R=x.length-e.term.length;if(!R)continue;y==null||y.delete(x);const A=h*x.length/(x.length+.3*R);this.termResults(e.term,x,A,e.termBoost,w,n,r,l,f)}if(y)for(const x of y.keys()){const[w,R]=y.get(x);if(!R)continue;const A=c*x.length/(x.length+R);this.termResults(e.term,x,A,e.termBoost,w,n,r,l,f)}return f}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const s=t.toLowerCase(),n=Ws[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const m=i[h],f=this._fieldIds[h],b=r.get(f);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[f];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(f,w,t),y-=1;continue}const R=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!R)continue;const A=b.get(w),J=this._fieldLength.get(w)[f],Q=Js(A,y,this._documentCount,J,x,l),W=s*n*m*R*Q,V=c.get(w);if(V){V.score+=W,Gs(V.terms,e);const $=Pe(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,vt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,vt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Ws={[Ge]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ft(s.terms,r)}}return a},[kt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ft(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Bs]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},Ks={k:1.2,b:.7,d:.5},Js=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},Us=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},je={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Hs),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:Ks},qs={combineWith:kt,prefix:(a,e,t)=>e===t.length-1},Je={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},Ve=Object.assign(Object.assign({},Je),Ue),Gs=(a,e)=>{a.includes(e)||a.push(e)},ft=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,vt=()=>new Map,Te=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=a=>ke(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Nt(0));return e}),Nt=a=>new Promise(e=>setTimeout(e,a)),Hs=/[\n\r\p{Z}\p{P}]+/u;class Qs{constructor(e=10){Ae(this,"max");Ae(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Ys=["aria-owns"],Zs={class:"shell"},Xs=["title"],en={class:"search-actions before"},tn=["title"],sn=["aria-activedescendant","aria-controls","placeholder"],nn={class:"search-actions"},rn=["title"],an=["disabled","title"],on=["id","role","aria-labelledby"],ln=["id","aria-selected"],cn=["href","aria-label","onMouseenter","onFocusin","data-index"],un={class:"titles"},dn=["innerHTML"],hn={class:"title main"},fn=["innerHTML"],pn={key:0,class:"excerpt-wrapper"},vn={key:0,class:"excerpt",inert:""},mn=["innerHTML"],gn={key:0,class:"no-results"},bn={class:"search-keyboard-shortcuts"},yn=["aria-label"],wn=["aria-label"],xn=["aria-label"],_n=["aria-label"],Sn=Lt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var S,C;const t=e,s=xe(),n=xe(),r=xe(is),i=ss(),{activate:o}=Ds(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=st(async()=>{var v,p,E,F,z,P,j,I,K;return at(ue.loadJSON((E=await((p=(v=r.value)[l.value])==null?void 0:p.call(v)))==null?void 0:E.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((F=c.value.search)==null?void 0:F.provider)==="local"&&((P=(z=c.value.search.options)==null?void 0:z.miniSearch)==null?void 0:P.searchOptions)},...((j=c.value.search)==null?void 0:j.provider)==="local"&&((K=(I=c.value.search.options)==null?void 0:I.miniSearch)==null?void 0:K.options)}))}),f=me(()=>{var v,p;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((p=c.value.search.options)==null?void 0:p.disableQueryPersistence)===!0}).value?ie(""):Dt("vitepress:local-search-filter",""),b=zt("vitepress:local-search-detailed-list",((S=c.value.search)==null?void 0:S.provider)==="local"&&((C=c.value.search.options)==null?void 0:C.detailedView)===!0),y=me(()=>{var v,p,E;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((p=c.value.search.options)==null?void 0:p.disableDetailedView)===!0||((E=c.value.search.options)==null?void 0:E.detailedView)===!1)}),x=me(()=>{var p,E,F,z,P,j,I;const v=((p=c.value.search)==null?void 0:p.options)??c.value.algolia;return((P=(z=(F=(E=v==null?void 0:v.locales)==null?void 0:E[l.value])==null?void 0:F.translations)==null?void 0:z.button)==null?void 0:P.buttonText)||((I=(j=v==null?void 0:v.translations)==null?void 0:j.button)==null?void 0:I.buttonText)||"Search"});Pt(()=>{y.value&&(b.value=!1)});const w=xe([]),R=ie(!1);$e(f,()=>{R.value=!1});const A=st(async()=>{if(n.value)return at(new Ps(n.value))},null),J=new Qs(16);jt(()=>[h.value,f.value,b.value],async([v,p,E],F,z)=>{var ee,ye,He,Qe;(F==null?void 0:F[0])!==v&&J.clear();let P=!1;if(z(()=>{P=!0}),!v)return;w.value=v.search(p).slice(0,16),R.value=!0;const j=E?await Promise.all(w.value.map(B=>Q(B.id))):[];if(P)return;for(const{id:B,mod:te}of j){const se=B.slice(0,B.indexOf("#"));let Y=J.get(se);if(Y)continue;Y=new Map,J.set(se,Y);const G=te.default??te;if(G!=null&&G.render||G!=null&&G.setup){const ne=Yt(G);ne.config.warnHandler=()=>{},ne.provide(Zt,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ye=document.createElement("div");ne.mount(Ye),Ye.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(de=>{var et;const we=(et=de.querySelector("a"))==null?void 0:et.getAttribute("href"),Ze=(we==null?void 0:we.startsWith("#"))&&we.slice(1);if(!Ze)return;let Xe="";for(;(de=de.nextElementSibling)&&!/^h[1-6]$/i.test(de.tagName);)Xe+=de.outerHTML;Y.set(Ze,Xe)}),ne.unmount()}if(P)return}const I=new Set;if(w.value=w.value.map(B=>{const[te,se]=B.id.split("#"),Y=J.get(te),G=(Y==null?void 0:Y.get(se))??"";for(const ne in B.match)I.add(ne);return{...B,text:G}}),await he(),P)return;await new Promise(B=>{var te;(te=A.value)==null||te.unmark({done:()=>{var se;(se=A.value)==null||se.markRegExp(k(I),{done:B})}})});const K=((ee=s.value)==null?void 0:ee.querySelectorAll(".result .excerpt"))??[];for(const B of K)(ye=B.querySelector('mark[data-markjs="true"]'))==null||ye.scrollIntoView({block:"center"});(Qe=(He=n.value)==null?void 0:He.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function Q(v){const p=Xt(v.slice(0,v.indexOf("#")));try{if(!p)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(p)}}catch(E){return console.error(E),{id:v,mod:{}}}}const W=ie(),V=me(()=>{var v;return((v=f.value)==null?void 0:v.length)<=0});function $(v=!0){var p,E;(p=W.value)==null||p.focus(),v&&((E=W.value)==null||E.select())}Me(()=>{$()});function be(v){v.pointerType==="mouse"&&$()}const M=ie(-1),U=ie(!0);$e(w,v=>{M.value=v.length?0:-1,q()});function q(){he(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}_e("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=w.value.length-1),U.value=!0,q()}),_e("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=w.value.length&&(M.value=0),U.value=!0,q()});const N=Vt();_e("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const p=w.value[M.value];if(v.target instanceof HTMLInputElement&&!p){v.preventDefault();return}p&&(N.go(p.id),t("close"))}),_e("Escape",()=>{t("close")});const d=ns({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Me(()=>{window.history.pushState(null,"",null)}),$t("popstate",v=>{v.preventDefault(),t("close")});const g=Bt(Wt?document.body:null);Me(()=>{he(()=>{g.value=!0,he().then(()=>o())})}),Kt(()=>{g.value=!1});function T(){f.value="",he().then(()=>$(!1))}function k(v){return new RegExp([...v].sort((p,E)=>E.length-p.length).map(p=>`(${es(p)})`).join("|"),"gi")}function O(v){var F;if(!U.value)return;const p=(F=v.target)==null?void 0:F.closest(".result"),E=Number.parseInt(p==null?void 0:p.dataset.index);E>=0&&E!==M.value&&(M.value=E),U.value=!1}return(v,p)=>{var E,F,z,P,j;return H(),Jt(Qt,{to:"body"},[_("div",{ref_key:"el",ref:s,role:"button","aria-owns":(E=w.value)!=null&&E.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[_("div",{class:"backdrop",onClick:p[0]||(p[0]=I=>v.$emit("close"))}),_("div",Zs,[_("form",{class:"search-bar",onPointerup:p[4]||(p[4]=I=>be(I)),onSubmit:p[5]||(p[5]=Ut(()=>{},["prevent"]))},[_("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},p[7]||(p[7]=[_("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,Xs),_("div",en,[_("button",{class:"back-button",title:L(d)("modal.backButtonTitle"),onClick:p[1]||(p[1]=I=>v.$emit("close"))},p[8]||(p[8]=[_("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,tn)]),qt(_("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":p[2]||(p[2]=I=>Ht(f)?f.value=I:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(F=w.value)!=null&&F.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:x.value,spellcheck:"false",type:"search"},null,8,sn),[[Gt,L(f)]]),_("div",nn,[y.value?Se("",!0):(H(),Z("button",{key:0,class:nt(["toggle-layout-button",{"detailed-list":L(b)}]),type:"button",title:L(d)("modal.displayDetails"),onClick:p[3]||(p[3]=I=>M.value>-1&&(b.value=!L(b)))},p[9]||(p[9]=[_("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,rn)),_("button",{class:"clear-button",type:"reset",disabled:V.value,title:L(d)("modal.resetButtonTitle"),onClick:T},p[10]||(p[10]=[_("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,an)])],32),_("ul",{ref_key:"resultsEl",ref:n,id:(z=w.value)!=null&&z.length?"localsearch-list":void 0,role:(P=w.value)!=null&&P.length?"listbox":void 0,"aria-labelledby":(j=w.value)!=null&&j.length?"localsearch-label":void 0,class:"results",onMousemove:O},[(H(!0),Z(rt,null,it(w.value,(I,K)=>(H(),Z("li",{key:I.id,id:"localsearch-item-"+K,"aria-selected":M.value===K?"true":"false",role:"option"},[_("a",{href:I.id,class:nt(["result",{selected:M.value===K}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:ee=>!U.value&&(M.value=K),onFocusin:ee=>M.value=K,onClick:p[6]||(p[6]=ee=>v.$emit("close")),"data-index":K},[_("div",null,[_("div",un,[p[12]||(p[12]=_("span",{class:"title-icon"},"#",-1)),(H(!0),Z(rt,null,it(I.titles,(ee,ye)=>(H(),Z("span",{key:ye,class:"title"},[_("span",{class:"text",innerHTML:ee},null,8,dn),p[11]||(p[11]=_("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),_("span",hn,[_("span",{class:"text",innerHTML:I.title},null,8,fn)])]),L(b)?(H(),Z("div",pn,[I.text?(H(),Z("div",vn,[_("div",{class:"vp-doc",innerHTML:I.text},null,8,mn)])):Se("",!0),p[13]||(p[13]=_("div",{class:"excerpt-gradient-bottom"},null,-1)),p[14]||(p[14]=_("div",{class:"excerpt-gradient-top"},null,-1))])):Se("",!0)])],42,cn)],8,ln))),128)),L(f)&&!w.value.length&&R.value?(H(),Z("li",gn,[fe(pe(L(d)("modal.noResultsText"))+' "',1),_("strong",null,pe(L(f)),1),p[15]||(p[15]=fe('" '))])):Se("",!0)],40,on),_("div",bn,[_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.navigateUpKeyAriaLabel")},p[16]||(p[16]=[_("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,yn),_("kbd",{"aria-label":L(d)("modal.footer.navigateDownKeyAriaLabel")},p[17]||(p[17]=[_("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,wn),fe(" "+pe(L(d)("modal.footer.navigateText")),1)]),_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.selectKeyAriaLabel")},p[18]||(p[18]=[_("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,xn),fe(" "+pe(L(d)("modal.footer.selectText")),1)]),_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.closeKeyAriaLabel")},"esc",8,_n),fe(" "+pe(L(d)("modal.footer.closeText")),1)])])])],8,Ys)])}}}),Fn=ts(Sn,[["__scopeId","data-v-42e65fb9"]]);export{Fn as default};
diff --git a/previews/PR486/assets/chunks/framework.piKCME0r.js b/previews/PR486/assets/chunks/framework.piKCME0r.js
new file mode 100644
index 00000000..42af66b1
--- /dev/null
+++ b/previews/PR486/assets/chunks/framework.piKCME0r.js
@@ -0,0 +1,18 @@
+/**
+* @vue/shared v3.5.13
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**//*! #__NO_SIDE_EFFECTS__ */function Ns(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Et=[],ke=()=>{},Ko=()=>!1,en=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fs=e=>e.startsWith("onUpdate:"),ae=Object.assign,Hs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},qo=Object.prototype.hasOwnProperty,z=(e,t)=>qo.call(e,t),W=Array.isArray,Tt=e=>In(e)==="[object Map]",ii=e=>In(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",Xe=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",oi=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),li=Object.prototype.toString,In=e=>li.call(e),Go=e=>In(e).slice(8,-1),ci=e=>In(e)==="[object Object]",$s=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ct=Ns(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Nn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Yo=/-(\w)/g,Le=Nn(e=>e.replace(Yo,(t,n)=>n?n.toUpperCase():"")),Xo=/\B([A-Z])/g,st=Nn(e=>e.replace(Xo,"-$1").toLowerCase()),Fn=Nn(e=>e.charAt(0).toUpperCase()+e.slice(1)),_n=Nn(e=>e?`on${Fn(e)}`:""),tt=(e,t)=>!Object.is(e,t),bn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},vs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Jo=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let ar;const Hn=()=>ar||(ar=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ds(e){if(W(e)){const t={};for(let n=0;n{if(n){const s=n.split(Qo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function js(e){let t="";if(re(e))t=e;else if(W(e))for(let n=0;n!!(e&&e.__v_isRef===!0),sl=e=>re(e)?e:e==null?"":W(e)||ne(e)&&(e.toString===li||!q(e.toString))?ui(e)?sl(e.value):JSON.stringify(e,di,2):String(e),di=(e,t)=>ui(t)?di(e,t.value):Tt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[zn(s,i)+" =>"]=r,n),{})}:ii(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>zn(n))}:Xe(t)?zn(t):ne(t)&&!W(t)&&!ci(t)?String(t):t,zn=(e,t="")=>{var n;return Xe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
+* @vue/reactivity v3.5.13
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/let we;class rl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(jt){let t=jt;for(jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function yi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function vi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),ks(s),ol(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function _s(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(_i(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function _i(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt))return;e.globalVersion=Kt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!_s(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{yi(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,vi(e),e.flags&=-3}}function ks(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)ks(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ol(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const bi=[];function rt(){bi.push(Ne),Ne=!1}function it(){const e=bi.pop();Ne=e===void 0?!0:e}function fr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class ll{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class $n{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new ll(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,wi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Vs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Us()}}}function wi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)wi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Cn=new WeakMap,dt=Symbol(""),bs=Symbol(""),qt=Symbol("");function me(e,t,n){if(Ne&&te){let s=Cn.get(e);s||Cn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new $n),r.map=s,r.key=n),r.track()}}function Ge(e,t,n,s,r,i){const o=Cn.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Vs(),t==="clear")o.forEach(l);else{const c=W(e),f=c&&$s(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,y)=>{(y==="length"||y===qt||!Xe(y)&&y>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(qt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"delete":c||(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"set":Tt(e)&&l(o.get(dt));break}}Us()}function cl(e,t){const n=Cn.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(me(t,"iterate",qt),Pe(e)?t:t.map(ye))}function Dn(e){return me(e=J(e),"iterate",qt),e}const al={__proto__:null,[Symbol.iterator](){return Zn(this,Symbol.iterator,ye)},concat(...e){return _t(this).concat(...e.map(t=>W(t)?_t(t):t))},entries(){return Zn(this,"entries",e=>(e[1]=ye(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(ye),arguments)},find(e,t){return We(this,"find",e,t,ye,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,ye,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return es(this,"includes",e)},indexOf(...e){return es(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return es(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ft(this,"pop")},push(...e){return Ft(this,"push",e)},reduce(e,...t){return ur(this,"reduce",e,t)},reduceRight(e,...t){return ur(this,"reduceRight",e,t)},shift(){return Ft(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ft(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ft(this,"unshift",e)},values(){return Zn(this,"values",ye)}};function Zn(e,t,n){const s=Dn(e),r=s[t]();return s!==e&&!Pe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const fl=Array.prototype;function We(e,t,n,s,r,i){const o=Dn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==fl[t]){const h=c.apply(e,i);return l?ye(h):h}let f=n;o!==e&&(l?f=function(h,y){return n.call(this,ye(h),y,e)}:n.length>2&&(f=function(h,y){return n.call(this,h,y,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function ur(e,t,n,s){const r=Dn(e);let i=n;return r!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ye(l),c,e)}),r[t](i,...s)}function es(e,t,n){const s=J(e);me(s,"iterate",qt);const r=s[t](...n);return(r===-1||r===!1)&&Ks(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Ft(e,t,n=[]){rt(),Vs();const s=J(e)[t].apply(e,n);return Us(),it(),s}const ul=Ns("__proto__,__v_isRef,__isVue"),Si=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xe));function dl(e){Xe(e)||(e=String(e));const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}class xi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Sl:Ai:i?Ci:Ti).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=W(t);if(!r){let c;if(o&&(c=al[n]))return c;if(n==="hasOwnProperty")return dl}const l=Reflect.get(t,n,fe(t)?t:s);return(Xe(n)?Si.has(n):ul(n))||(r||me(t,"get",n),i)?l:fe(l)?o&&$s(n)?l:l.value:ne(l)?r?Vn(l):jn(l):l}}class Ei extends xi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=yt(i);if(!Pe(s)&&!yt(s)&&(i=J(i),s=J(s)),!W(t)&&fe(i)&&!fe(s))return c?!1:(i.value=s,!0)}const o=W(t)&&$s(n)?Number(n)e,cn=e=>Reflect.getPrototypeOf(e);function yl(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=Tt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?ws:t?Ss:ye;return!t&&me(i,"iterate",c?bs:dt),{next(){const{value:h,done:y}=f.next();return y?{value:h,done:y}:{value:l?[a(h[0]),a(h[1])]:a(h),done:y}},[Symbol.iterator](){return this}}}}function an(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vl(e,t){const n={get(r){const i=this.__v_raw,o=J(i),l=J(r);e||(tt(r,l)&&me(o,"get",r),me(o,"get",l));const{has:c}=cn(o),f=t?ws:e?Ss:ye;if(c.call(o,r))return f(i.get(r));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&me(J(r),"iterate",dt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=J(i),l=J(r);return e||(tt(r,l)&&me(o,"has",r),me(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=J(l),f=t?ws:e?Ss:ye;return!e&&me(c,"iterate",dt),l.forEach((a,h)=>r.call(i,f(a),f(h),o))}};return ae(n,e?{add:an("add"),set:an("set"),delete:an("delete"),clear:an("clear")}:{add(r){!t&&!Pe(r)&&!yt(r)&&(r=J(r));const i=J(this);return cn(i).has.call(i,r)||(i.add(r),Ge(i,"add",r,r)),this},set(r,i){!t&&!Pe(i)&&!yt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=cn(o);let f=l.call(o,r);f||(r=J(r),f=l.call(o,r));const a=c.call(o,r);return o.set(r,i),f?tt(i,a)&&Ge(o,"set",r,i):Ge(o,"add",r,i),this},delete(r){const i=J(this),{has:o,get:l}=cn(i);let c=o.call(i,r);c||(r=J(r),c=o.call(i,r)),l&&l.call(i,r);const f=i.delete(r);return c&&Ge(i,"delete",r,void 0),f},clear(){const r=J(this),i=r.size!==0,o=r.clear();return i&&Ge(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=yl(r,e,t)}),n}function Bs(e,t){const n=vl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const _l={get:Bs(!1,!1)},bl={get:Bs(!1,!0)},wl={get:Bs(!0,!1)};const Ti=new WeakMap,Ci=new WeakMap,Ai=new WeakMap,Sl=new WeakMap;function xl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function El(e){return e.__v_skip||!Object.isExtensible(e)?0:xl(Go(e))}function jn(e){return yt(e)?e:Ws(e,!1,pl,_l,Ti)}function Tl(e){return Ws(e,!1,ml,bl,Ci)}function Vn(e){return Ws(e,!0,gl,wl,Ai)}function Ws(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=El(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function ht(e){return yt(e)?ht(e.__v_raw):!!(e&&e.__v_isReactive)}function yt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Ks(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function wn(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&ai(e,"__v_skip",!0),e}const ye=e=>ne(e)?jn(e):e,Ss=e=>ne(e)?Vn(e):e;function fe(e){return e?e.__v_isRef===!0:!1}function oe(e){return Ri(e,!1)}function qs(e){return Ri(e,!0)}function Ri(e,t){return fe(e)?e:new Cl(e,t)}class Cl{constructor(t,n){this.dep=new $n,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:ye(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Pe(t)||yt(t);t=s?t:J(t),tt(t,n)&&(this._rawValue=t,this._value=s?t:ye(t),this.dep.trigger())}}function Oi(e){return fe(e)?e.value:e}const Al={get:(e,t,n)=>t==="__v_raw"?e:Oi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Mi(e){return ht(e)?e:new Proxy(e,Al)}class Rl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new $n,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Ol(e){return new Rl(e)}class Ml{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return cl(J(this._object),this._key)}}class Pl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Ll(e,t,n){return fe(e)?e:q(e)?new Pl(e):ne(e)&&arguments.length>1?Il(e,t,n):oe(e)}function Il(e,t,n){const s=e[t];return fe(s)?s:new Ml(e,t,n)}class Nl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new $n(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return mi(this,!0),!0}get value(){const t=this.dep.track();return _i(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Fl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Nl(s,r,n)}const fn={},An=new WeakMap;let ft;function Hl(e,t=!1,n=ft){if(n){let s=An.get(n);s||An.set(n,s=[]),s.push(e)}}function $l(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>r?g:Pe(g)||r===!1||r===0?Ye(g,1):Ye(g);let a,h,y,v,S=!1,_=!1;if(fe(e)?(h=()=>e.value,S=Pe(e)):ht(e)?(h=()=>f(e),S=!0):W(e)?(_=!0,S=e.some(g=>ht(g)||Pe(g)),h=()=>e.map(g=>{if(fe(g))return g.value;if(ht(g))return f(g);if(q(g))return c?c(g,2):g()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){rt();try{y()}finally{it()}}const g=ft;ft=a;try{return c?c(e,3,[v]):e(v)}finally{ft=g}}:h=ke,t&&r){const g=h,O=r===!0?1/0:r;h=()=>Ye(g(),O)}const K=hi(),N=()=>{a.stop(),K&&K.active&&Hs(K.effects,a)};if(i&&t){const g=t;t=(...O)=>{g(...O),N()}}let j=_?new Array(e.length).fill(fn):fn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const O=a.run();if(r||S||(_?O.some((F,$)=>tt(F,j[$])):tt(O,j))){y&&y();const F=ft;ft=a;try{const $=[O,j===fn?void 0:_&&j[0]===fn?[]:j,v];c?c(t,3,$):t(...$),j=O}finally{ft=F}}}else a.run()};return l&&l(p),a=new pi(h),a.scheduler=o?()=>o(p,!1):p,v=g=>Hl(g,!1,a),y=a.onStop=()=>{const g=An.get(a);if(g){if(c)c(g,4);else for(const O of g)O();An.delete(a)}},t?s?p(!0):j=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function Ye(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,fe(e))Ye(e.value,t,n);else if(W(e))for(let s=0;s{Ye(s,t,n)});else if(ci(e)){for(const s in e)Ye(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ye(e[s],t,n)}return e}/**
+* @vue/runtime-core v3.5.13
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/function tn(e,t,n,s){try{return s?e(...s):e()}catch(r){nn(r,t,n)}}function He(e,t,n,s){if(q(e)){const r=tn(e,t,n,s);return r&&oi(r)&&r.catch(i=>{nn(i,t,n)}),r}if(W(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=Gt(r);i=Gt(n)?Se.push(e):Se.splice(jl(t),0,e),e.flags|=1,Li()}}function Li(){Rn||(Rn=Pi.then(Ii))}function Vl(e){W(e)?At.push(...e):Qe&&e.id===-1?Qe.splice(wt+1,0,e):e.flags&1||(At.push(e),e.flags|=1),Li()}function dr(e,t,n=Ve+1){for(;nGt(n)-Gt(s));if(At.length=0,Qe){Qe.push(...t);return}for(Qe=t,wt=0;wte.id==null?e.flags&2?-1:1/0:e.id;function Ii(e){try{for(Ve=0;Ve{s._d&&Ar(-1);const i=Mn(t);let o;try{o=e(...r)}finally{Mn(i),s._d&&Ar(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function _f(e,t){if(de===null)return e;const n=Gn(de),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Vt=e=>e&&(e.disabled||e.disabled===""),hr=e=>e&&(e.defer||e.defer===""),pr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,xs=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},$i={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:h,pbc:y,o:{insert:v,querySelector:S,createText:_,createComment:K}}=f,N=Vt(t.props);let{shapeFlag:j,children:p,dynamicChildren:g}=t;if(e==null){const O=t.el=_(""),F=t.anchor=_("");v(O,n,s),v(F,n,s);const $=(R,b)=>{j&16&&(r&&r.isCE&&(r.ce._teleportTarget=R),a(p,R,b,r,i,o,l,c))},V=()=>{const R=t.target=xs(t.props,S),b=Di(R,t,_,v);R&&(o!=="svg"&&pr(R)?o="svg":o!=="mathml"&&gr(R)&&(o="mathml"),N||($(R,b),Sn(t,!1)))};N&&($(n,F),Sn(t,!0)),hr(t.props)?be(()=>{V(),t.el.__isMounted=!0},i):V()}else{if(hr(t.props)&&!e.el.__isMounted){be(()=>{$i.process(e,t,n,s,r,i,o,l,c,f),delete e.el.__isMounted},i);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,V=Vt(e.props),R=V?n:F,b=V?O:$;if(o==="svg"||pr(F)?o="svg":(o==="mathml"||gr(F))&&(o="mathml"),g?(y(e.dynamicChildren,g,R,r,i,o,l),Qs(e,t,!0)):c||h(e,t,R,b,r,i,o,l,!1),N)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):un(t,n,O,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const I=t.target=xs(t.props,S);I&&un(t,I,null,f,0)}else V&&un(t,F,$,f,1);Sn(t,N)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:y}=e;if(h&&(r(f),r(a)),i&&r(c),o&16){const v=i||!Vt(y);for(let S=0;S{e.isMounted=!0}),Ki(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],ji={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},Vi=e=>{const t=e.subTree;return t.component?Vi(t.component):t},Wl={name:"BaseTransition",props:ji,setup(e,{slots:t}){const n=qn(),s=Bl();return()=>{const r=t.default&&Bi(t.default(),!0);if(!r||!r.length)return;const i=Ui(r),o=J(e),{mode:l}=o;if(s.isLeaving)return ts(i);const c=mr(i);if(!c)return ts(i);let f=Es(c,o,s,n,h=>f=h);c.type!==ve&&Yt(c,f);let a=n.subTree&&mr(n.subTree);if(a&&a.type!==ve&&!ut(c,a)&&Vi(n).type!==ve){let h=Es(a,o,s,n);if(Yt(a,h),l==="out-in"&&c.type!==ve)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},ts(i);l==="in-out"&&c.type!==ve?h.delayLeave=(y,v,S)=>{const _=ki(s,a);_[String(a.key)]=a,y[Ze]=()=>{v(),y[Ze]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{S(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ui(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ve){t=n;break}}return t}const Kl=Wl;function ki(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Es(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:y,onLeave:v,onAfterLeave:S,onLeaveCancelled:_,onBeforeAppear:K,onAppear:N,onAfterAppear:j,onAppearCancelled:p}=t,g=String(e.key),O=ki(n,e),F=(R,b)=>{R&&He(R,s,9,b)},$=(R,b)=>{const I=b[1];F(R,b),W(R)?R.every(x=>x.length<=1)&&I():R.length<=1&&I()},V={mode:o,persisted:l,beforeEnter(R){let b=c;if(!n.isMounted)if(i)b=K||c;else return;R[Ze]&&R[Ze](!0);const I=O[g];I&&ut(e,I)&&I.el[Ze]&&I.el[Ze](),F(b,[R])},enter(R){let b=f,I=a,x=h;if(!n.isMounted)if(i)b=N||f,I=j||a,x=p||h;else return;let B=!1;const se=R[dn]=le=>{B||(B=!0,le?F(x,[R]):F(I,[R]),V.delayedLeave&&V.delayedLeave(),R[dn]=void 0)};b?$(b,[R,se]):se()},leave(R,b){const I=String(e.key);if(R[dn]&&R[dn](!0),n.isUnmounting)return b();F(y,[R]);let x=!1;const B=R[Ze]=se=>{x||(x=!0,b(),se?F(_,[R]):F(S,[R]),R[Ze]=void 0,O[I]===e&&delete O[I])};O[I]=e,v?$(v,[R,B]):B()},clone(R){const b=Es(R,t,n,s,r);return r&&r(b),b}};return V}function ts(e){if(sn(e))return e=nt(e),e.children=null,e}function mr(e){if(!sn(e))return Hi(e.type)&&e.children?Ui(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iXt(S,t&&(W(t)?t[_]:t),n,s,r));return}if(pt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Xt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Gn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,y=J(h),v=h===Z?()=>!1:S=>z(y,S);if(f!=null&&f!==c&&(re(f)?(a[f]=null,v(f)&&(h[f]=null)):fe(f)&&(f.value=null)),q(c))tn(c,l,12,[o,a]);else{const S=re(c),_=fe(c);if(S||_){const K=()=>{if(e.f){const N=S?v(c)?h[c]:a[c]:c.value;r?W(N)&&Hs(N,i):W(N)?N.includes(i)||N.push(i):S?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else S?(a[c]=o,v(c)&&(h[c]=o)):_&&(c.value=o,e.k&&(a[e.k]=o))};o?(K.id=-1,be(K,n)):K()}}}let yr=!1;const bt=()=>{yr||(console.error("Hydration completed but contains mismatches."),yr=!0)},ql=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Gl=e=>e.namespaceURI.includes("MathML"),hn=e=>{if(e.nodeType===1){if(ql(e))return"svg";if(Gl(e))return"mathml"}},xt=e=>e.nodeType===8;function Yl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),On(),g._vnode=p;return}h(g.firstChild,p,null,null,null),On(),g._vnode=p},h=(p,g,O,F,$,V=!1)=>{V=V||!!g.dynamicChildren;const R=xt(p)&&p.data==="[",b=()=>_(p,g,O,F,$,R),{type:I,ref:x,shapeFlag:B,patchFlag:se}=g;let le=p.nodeType;g.el=p,se===-2&&(V=!1,g.dynamicChildren=null);let U=null;switch(I){case gt:le!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=b():(p.data!==g.children&&(bt(),p.data=g.children),U=i(p));break;case ve:j(p)?(U=i(p),N(g.el=p.content.firstChild,p,O)):le!==8||R?U=b():U=i(p);break;case kt:if(R&&(p=i(p),le=p.nodeType),le===1||le===3){U=p;const Y=!g.children.length;for(let D=0;D{V=V||!!g.dynamicChildren;const{type:R,props:b,patchFlag:I,shapeFlag:x,dirs:B,transition:se}=g,le=R==="input"||R==="option";if(le||I!==-1){B&&Ue(g,null,O,"created");let U=!1;if(j(p)){U=co(null,se)&&O&&O.vnode.props&&O.vnode.props.appear;const D=p.content.firstChild;U&&se.beforeEnter(D),N(D,p,O),g.el=p=D}if(x&16&&!(b&&(b.innerHTML||b.textContent))){let D=v(p.firstChild,g,p,O,F,$,V);for(;D;){pn(p,1)||bt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=g.children;D[0]===`
+`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(pn(p,0)||bt(),p.textContent=g.children)}if(b){if(le||!V||I&48){const D=p.tagName.includes("-");for(const he in b)(le&&(he.endsWith("value")||he==="indeterminate")||en(he)&&!Ct(he)||he[0]==="."||D)&&s(p,he,null,b[he],void 0,O)}else if(b.onClick)s(p,"onClick",null,b.onClick,void 0,O);else if(I&4&&ht(b.style))for(const D in b.style)b.style[D]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Oe(Y,O,g),B&&Ue(g,null,O,"beforeMount"),((Y=b&&b.onVnodeMounted)||B||U)&&go(()=>{Y&&Oe(Y,O,g),U&&se.enter(p),B&&Ue(g,null,O,"mounted")},F)}return p.nextSibling},v=(p,g,O,F,$,V,R)=>{R=R||!!g.dynamicChildren;const b=g.children,I=b.length;for(let x=0;x{const{slotScopeIds:R}=g;R&&($=$?$.concat(R):R);const b=o(p),I=v(i(p),g,b,O,F,$,V);return I&&xt(I)&&I.data==="]"?i(g.anchor=I):(bt(),c(g.anchor=f("]"),b,I),I)},_=(p,g,O,F,$,V)=>{if(pn(p.parentElement,1)||bt(),g.el=null,V){const I=K(p);for(;;){const x=i(p);if(x&&x!==I)l(x);else break}}const R=i(p),b=o(p);return l(p),n(null,g,b,R,O,F,hn(b),$),O&&(O.vnode.el=g.el,ho(O,g.el)),R},K=(p,g="[",O="]")=>{let F=0;for(;p;)if(p=i(p),p&&xt(p)&&(p.data===g&&F++,p.data===O)){if(F===0)return i(p);F--}return p},N=(p,g,O)=>{const F=g.parentNode;F&&F.replaceChild(p,g);let $=O;for(;$;)$.vnode.el===g&&($.vnode.el=$.subTree.el=p),$=$.parent},j=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const vr="data-allow-mismatch",Xl={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function pn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(vr);)e=e.parentElement;const n=e&&e.getAttribute(vr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(Xl[t])}}Hn().requestIdleCallback;Hn().cancelIdleCallback;function Jl(e,t){if(xt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(xt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const pt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function wf(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const y=()=>(h++,f=null,v()),v=()=>{let S;return f||(S=f=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),c)return new Promise((K,N)=>{c(_,()=>K(y()),()=>N(_),h+1)});throw _}).then(_=>S!==f&&f?f:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return Ys({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(S,_,K){const N=i?()=>{const j=i(K,p=>Jl(S,p));j&&(_.bum||(_.bum=[])).push(j)}:K;a?N():v().then(()=>!_.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const S=ue;if(Xs(S),a)return()=>ns(a,S);const _=p=>{f=null,nn(p,S,13,!s)};if(l&&S.suspense||Mt)return v().then(p=>()=>ns(p,S)).catch(p=>(_(p),()=>s?ce(s,{error:p}):null));const K=oe(!1),N=oe(),j=oe(!!r);return r&&setTimeout(()=>{j.value=!1},r),o!=null&&setTimeout(()=>{if(!K.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);_(p),N.value=p}},o),v().then(()=>{K.value=!0,S.parent&&sn(S.parent.vnode)&&S.parent.update()}).catch(p=>{_(p),N.value=p}),()=>{if(K.value&&a)return ns(a,S);if(N.value&&s)return ce(s,{error:N.value});if(n&&!j.value)return ce(n)}}})}function ns(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=ce(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const sn=e=>e.type.__isKeepAlive;function zl(e,t){Wi(e,"a",t)}function Ql(e,t){Wi(e,"da",t)}function Wi(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(kn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)sn(r.parent.vnode)&&Zl(s,t,n,r),r=r.parent}}function Zl(e,t,n,s){const r=kn(t,e,s,!0);Bn(()=>{Hs(s[t],r)},n)}function kn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{rt();const l=rn(n),c=He(t,n,e,o);return l(),it(),c});return s?r.unshift(i):r.push(i),i}}const Je=e=>(t,n=ue)=>{(!Mt||e==="sp")&&kn(e,(...s)=>t(...s),n)},ec=Je("bm"),Lt=Je("m"),tc=Je("bu"),nc=Je("u"),Ki=Je("bum"),Bn=Je("um"),sc=Je("sp"),rc=Je("rtg"),ic=Je("rtc");function oc(e,t=ue){kn("ec",e,t)}const qi="components";function Sf(e,t){return Yi(qi,e,!0,t)||e}const Gi=Symbol.for("v-ndc");function xf(e){return re(e)?Yi(qi,e,!1)||e:e||Gi}function Yi(e,t,n=!0,s=!1){const r=de||ue;if(r){const i=r.type;{const l=Wc(i,!1);if(l&&(l===t||l===Le(t)||l===Fn(Le(t))))return i}const o=_r(r[e]||i[e],t)||_r(r.appContext[e],t);return!o&&s?i:o}}function _r(e,t){return e&&(e[t]||e[Le(t)]||e[Fn(Le(t))])}function Ef(e,t,n,s){let r;const i=n,o=W(e);if(o||re(e)){const l=o&&ht(e);let c=!1;l&&(c=!Pe(e),e=Dn(e)),r=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;czt(t)?!(t.type===ve||t.type===xe&&!Xi(t.children)):!0)?e:null}function Cf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:_n(s)]=e[s];return n}const Ts=e=>e?bo(e)?Gn(e):Ts(e.parent):null,Ut=ae(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ts(e.parent),$root:e=>Ts(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Js(e),$forceUpdate:e=>e.f||(e.f=()=>{Gs(e.update)}),$nextTick:e=>e.n||(e.n=Un.bind(e.proxy)),$watch:e=>Rc.bind(e)}),ss=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),lc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ss(s,t))return o[t]=1,s[t];if(r!==Z&&z(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&z(f,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];Cs&&(o[t]=0)}}const a=Ut[t];let h,y;if(a)return t==="$attrs"&&me(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,z(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ss(r,t)?(r[t]=n,!0):s!==Z&&z(s,t)?(s[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&z(e,o)||ss(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z(Ut,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Af(){return cc().slots}function cc(){const e=qn();return e.setupContext||(e.setupContext=So(e))}function br(e){return W(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Cs=!0;function ac(e){const t=Js(e),n=e.proxy,s=e.ctx;Cs=!1,t.beforeCreate&&wr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:y,beforeUpdate:v,updated:S,activated:_,deactivated:K,beforeDestroy:N,beforeUnmount:j,destroyed:p,unmounted:g,render:O,renderTracked:F,renderTriggered:$,errorCaptured:V,serverPrefetch:R,expose:b,inheritAttrs:I,components:x,directives:B,filters:se}=t;if(f&&fc(f,s,null),o)for(const Y in o){const D=o[Y];q(D)&&(s[Y]=D.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=jn(Y))}if(Cs=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):ke,on=!q(D)&&q(D.set)?D.set.bind(n):ke,ot=ie({get:he,set:on});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>ot.value,set:De=>ot.value=De})}if(l)for(const Y in l)Ji(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{mc(D,Y[D])})}a&&wr(a,e,"c");function U(Y,D){W(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(U(ec,h),U(Lt,y),U(tc,v),U(nc,S),U(zl,_),U(Ql,K),U(oc,V),U(ic,F),U(rc,$),U(Ki,j),U(Bn,g),U(sc,R),W(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});O&&e.render===ke&&(e.render=O),I!=null&&(e.inheritAttrs=I),x&&(e.components=x),B&&(e.directives=B),R&&Xs(e)}function fc(e,t,n=ke){W(e)&&(e=As(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Ot(r.from||s,r.default,!0):i=Ot(r.from||s):i=Ot(r),fe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function wr(e,t,n){He(W(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,s){let r=s.includes(".")?fo(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Fe(r,i)}else if(q(e))Fe(r,e.bind(n));else if(ne(e))if(W(e))e.forEach(i=>Ji(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Fe(r,i,e)}}function Js(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Pn(c,f,o,!0)),Pn(c,t,o)),ne(t)&&i.set(t,c),c}function Pn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Pn(e,i,n,!0),r&&r.forEach(o=>Pn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=uc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const uc={data:Sr,props:xr,emits:xr,methods:$t,computed:$t,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:$t,directives:$t,watch:hc,provide:Sr,inject:dc};function Sr(e,t){return t?e?function(){return ae(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function dc(e,t){return $t(As(e),As(t))}function As(e){if(W(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const Qi={},Zi=()=>Object.create(Qi),eo=e=>Object.getPrototypeOf(e)===Qi;function yc(e,t,n,s=!1){const r={},i=Zi();e.propsDefaults=Object.create(null),to(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Tl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,v]=no(h,t,!0);ae(o,y),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,Et),Et;if(W(i))for(let a=0;ae[0]==="_"||e==="$stable",zs=e=>W(e)?e.map(Me):[Me(e)],bc=(e,t,n)=>{if(t._n)return t;const s=Ul((...r)=>zs(t(...r)),n);return s._c=!1,s},ro=(e,t,n)=>{const s=e._ctx;for(const r in e){if(so(r))continue;const i=e[r];if(q(i))t[r]=bc(r,i,s);else if(i!=null){const o=zs(i);t[r]=()=>o}}},io=(e,t)=>{const n=zs(t);e.slots.default=()=>n},oo=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},wc=(e,t,n)=>{const s=e.slots=Zi();if(e.vnode.shapeFlag&32){const r=t._;r?(oo(s,t,n),n&&ai(s,"_",r,!0)):ro(t,s)}else t&&io(e,t)},Sc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:oo(r,t,n):(i=!t.$stable,ro(t,r)),o=t}else t&&(io(e,t),o={default:1});if(i)for(const l in r)!so(l)&&o[l]==null&&delete r[l]},be=go;function xc(e){return lo(e)}function Ec(e){return lo(e,Yl)}function lo(e,t){const n=Hn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:y,setScopeId:v=ke,insertStaticContent:S}=e,_=(u,d,m,T=null,w=null,E=null,P=void 0,M=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!ut(u,d)&&(T=ln(u),De(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:k,shapeFlag:L}=d;switch(C){case gt:K(u,d,m,T);break;case ve:N(u,d,m,T);break;case kt:u==null&&j(d,m,T,P);break;case xe:x(u,d,m,T,w,E,P,M,A);break;default:L&1?O(u,d,m,T,w,E,P,M,A):L&6?B(u,d,m,T,w,E,P,M,A):(L&64||L&128)&&C.process(u,d,m,T,w,E,P,M,A,vt)}k!=null&&w&&Xt(k,u&&u.ref,E,d||u,!d)},K=(u,d,m,T)=>{if(u==null)s(d.el=l(d.children),m,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,m,T)=>{u==null?s(d.el=c(d.children||""),m,T):d.el=u.el},j=(u,d,m,T)=>{[u.el,u.anchor]=S(u.children,d,m,T,u.el,u.anchor)},p=({el:u,anchor:d},m,T)=>{let w;for(;u&&u!==d;)w=y(u),s(u,m,T),u=w;s(d,m,T)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),r(u),u=m;r(d)},O=(u,d,m,T,w,E,P,M,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,m,T,w,E,P,M,A):R(u,d,w,E,P,M,A)},F=(u,d,m,T,w,E,P,M)=>{let A,C;const{props:k,shapeFlag:L,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,k&&k.is,k),L&8?a(A,u.children):L&16&&V(u.children,A,null,T,w,rs(u,E),P,M),G&&Ue(u,null,T,"created"),$(A,u,u.scopeId,P,T),k){for(const ee in k)ee!=="value"&&!Ct(ee)&&i(A,ee,null,k[ee],E,T);"value"in k&&i(A,"value",null,k.value,E),(C=k.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ue(u,null,T,"beforeMount");const X=co(w,H);X&&H.beforeEnter(A),s(A,d,m),((C=k&&k.onVnodeMounted)||X||G)&&be(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ue(u,null,T,"mounted")},w)},$=(u,d,m,T,w)=>{if(m&&v(u,m),T)for(let E=0;E{for(let C=A;C{const M=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:k}=d;A|=u.patchFlag&16;const L=u.props||Z,H=d.props||Z;let G;if(m&<(m,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,m,d,u),k&&Ue(d,u,m,"beforeUpdate"),m&<(m,!0),(L.innerHTML&&H.innerHTML==null||L.textContent&&H.textContent==null)&&a(M,""),C?b(u.dynamicChildren,C,M,m,T,rs(d,w),E):P||D(u,d,M,null,m,T,rs(d,w),E,!1),A>0){if(A&16)I(M,L,H,m,w);else if(A&2&&L.class!==H.class&&i(M,"class",null,H.class,w),A&4&&i(M,"style",L.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,m,d,u),k&&Ue(d,u,m,"updated")},T)},b=(u,d,m,T,w,E,P)=>{for(let M=0;M{if(d!==m){if(d!==Z)for(const E in d)!Ct(E)&&!(E in m)&&i(u,E,d[E],null,w,T);for(const E in m){if(Ct(E))continue;const P=m[E],M=d[E];P!==M&&E!=="value"&&i(u,E,M,P,w,T)}"value"in m&&i(u,"value",d.value,m.value,w)}},x=(u,d,m,T,w,E,P,M,A)=>{const C=d.el=u?u.el:l(""),k=d.anchor=u?u.anchor:l("");let{patchFlag:L,dynamicChildren:H,slotScopeIds:G}=d;G&&(M=M?M.concat(G):G),u==null?(s(C,m,T),s(k,m,T),V(d.children||[],m,k,w,E,P,M,A)):L>0&&L&64&&H&&u.dynamicChildren?(b(u.dynamicChildren,H,m,w,E,P,M),(d.key!=null||w&&d===w.subTree)&&Qs(u,d,!0)):D(u,d,m,k,w,E,P,M,A)},B=(u,d,m,T,w,E,P,M,A)=>{d.slotScopeIds=M,u==null?d.shapeFlag&512?w.ctx.activate(d,m,T,P,A):se(d,m,T,w,E,P,A):le(u,d,A)},se=(u,d,m,T,w,E,P)=>{const M=u.component=Vc(u,T,w);if(sn(u)&&(M.ctx.renderer=vt),Uc(M,!1,P),M.asyncDep){if(w&&w.registerDep(M,U,P),!u.el){const A=M.subTree=ce(ve);N(null,A,d,m)}}else U(M,u,d,m,w,E,P)},le=(u,d,m)=>{const T=d.component=u.component;if(Ic(u,d,m))if(T.asyncDep&&!T.asyncResolved){Y(T,d,m);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},U=(u,d,m,T,w,E,P)=>{const M=()=>{if(u.isMounted){let{next:L,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=ao(u);if(Te){L&&(L.el=ee.el,Y(u,L,P)),Te.asyncDep.then(()=>{u.isUnmounted||M()});return}}let Q=L,Ee;lt(u,!1),L?(L.el=ee.el,Y(u,L,P)):L=ee,H&&bn(H),(Ee=L.props&&L.props.onVnodeBeforeUpdate)&&Oe(Ee,X,L,ee),lt(u,!0);const pe=is(u),Ie=u.subTree;u.subTree=pe,_(Ie,pe,h(Ie.el),ln(Ie),u,w,E),L.el=pe.el,Q===null&&ho(u,pe.el),G&&be(G,w),(Ee=L.props&&L.props.onVnodeUpdated)&&be(()=>Oe(Ee,X,L,ee),w)}else{let L;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:Ee,type:pe}=u,Ie=pt(d);if(lt(u,!1),X&&bn(X),!Ie&&(L=G&&G.onVnodeBeforeMount)&&Oe(L,Q,d),lt(u,!0),H&&Jn){const Te=()=>{u.subTree=is(u),Jn(H,u.subTree,u,w,null)};Ie&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{Ee.ce&&Ee.ce._injectChildStyle(pe);const Te=u.subTree=is(u);_(null,Te,m,T,u,w,E),d.el=Te.el}if(ee&&be(ee,w),!Ie&&(L=G&&G.onVnodeMounted)){const Te=d;be(()=>Oe(L,Q,Te),w)}(d.shapeFlag&256||Q&&pt(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&be(u.a,w),u.isMounted=!0,d=m=T=null}};u.scope.on();const A=u.effect=new pi(M);u.scope.off();const C=u.update=A.run.bind(A),k=u.job=A.runIfDirty.bind(A);k.i=u,k.id=u.uid,A.scheduler=()=>Gs(k),lt(u,!0),C()},Y=(u,d,m)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,vc(u,d.props,T,m),Sc(u,d.children,m),rt(),dr(u),it()},D=(u,d,m,T,w,E,P,M,A=!1)=>{const C=u&&u.children,k=u?u.shapeFlag:0,L=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,L,m,T,w,E,P,M,A);return}else if(H&256){he(C,L,m,T,w,E,P,M,A);return}}G&8?(k&16&&It(C,w,E),L!==C&&a(m,L)):k&16?G&16?on(C,L,m,T,w,E,P,M,A):It(C,w,E,!0):(k&8&&a(m,""),G&16&&V(L,m,T,w,E,P,M,A))},he=(u,d,m,T,w,E,P,M,A)=>{u=u||Et,d=d||Et;const C=u.length,k=d.length,L=Math.min(C,k);let H;for(H=0;Hk?It(u,w,E,!0,!1,L):V(d,m,T,w,E,P,M,A,L)},on=(u,d,m,T,w,E,P,M,A)=>{let C=0;const k=d.length;let L=u.length-1,H=k-1;for(;C<=L&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;C++}for(;C<=L&&C<=H;){const G=u[L],X=d[H]=A?et(d[H]):Me(d[H]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;L--,H--}if(C>L){if(C<=H){const G=H+1,X=GH)for(;C<=L;)De(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,Ee=0;const pe=H-X+1;let Ie=!1,Te=0;const Nt=new Array(pe);for(C=0;C=pe){De(Ce,w,E,!0);continue}let je;if(Ce.key!=null)je=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Nt[Q-X]===0&&ut(Ce,d[Q])){je=Q;break}je===void 0?De(Ce,w,E,!0):(Nt[je-X]=C+1,je>=Te?Te=je:Ie=!0,_(Ce,d[je],m,null,w,E,P,M,A),Ee++)}const lr=Ie?Tc(Nt):Et;for(Q=lr.length-1,C=pe-1;C>=0;C--){const Ce=X+C,je=d[Ce],cr=Ce+1{const{el:E,type:P,transition:M,children:A,shapeFlag:C}=u;if(C&6){ot(u.component.subTree,d,m,T);return}if(C&128){u.suspense.move(d,m,T);return}if(C&64){P.move(u,d,m,vt);return}if(P===xe){s(E,d,m);for(let L=0;LM.enter(E),w);else{const{leave:L,delayLeave:H,afterLeave:G}=M,X=()=>s(E,d,m),ee=()=>{L(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else s(E,d,m)},De=(u,d,m,T=!1,w=!1)=>{const{type:E,props:P,ref:M,children:A,dynamicChildren:C,shapeFlag:k,patchFlag:L,dirs:H,cacheIndex:G}=u;if(L===-2&&(w=!1),M!=null&&Xt(M,null,m,u,!0),G!=null&&(d.renderCache[G]=void 0),k&256){d.ctx.deactivate(u);return}const X=k&1&&H,ee=!pt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),k&6)Wo(u.component,m,T);else{if(k&128){u.suspense.unmount(m,T);return}X&&Ue(u,null,d,"beforeUnmount"),k&64?u.type.remove(u,d,m,vt,T):C&&!C.hasOnce&&(E!==xe||L>0&&L&64)?It(C,d,m,!1,!0):(E===xe&&L&384||!w&&k&16)&&It(A,d,m),T&&ir(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&be(()=>{Q&&Oe(Q,d,u),X&&Ue(u,null,d,"unmounted")},m)},ir=u=>{const{type:d,el:m,anchor:T,transition:w}=u;if(d===xe){Bo(m,T);return}if(d===kt){g(u);return}const E=()=>{r(m),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:M}=w,A=()=>P(m,E);M?M(u.el,E,A):A()}else E()},Bo=(u,d)=>{let m;for(;u!==d;)m=y(u),r(u),u=m;r(d)},Wo=(u,d,m)=>{const{bum:T,scope:w,job:E,subTree:P,um:M,m:A,a:C}=u;Tr(A),Tr(C),T&&bn(T),w.stop(),E&&(E.flags|=8,De(P,u,d,m)),M&&be(M,d),be(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},It=(u,d,m,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[Fi];return m?y(m):d};let Yn=!1;const or=(u,d,m)=>{u==null?d._vnode&&De(d._vnode,null,null,!0):_(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Yn||(Yn=!0,dr(),On(),Yn=!1)},vt={p:_,um:De,m:ot,r:ir,mt:se,mc:V,pc:D,pbc:b,n:ln,o:e};let Xn,Jn;return t&&([Xn,Jn]=t(vt)),{render:or,hydrate:Xn,createApp:gc(or,Xn)}}function rs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function lt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Qs(e,t,n=!1){const s=e.children,r=t.children;if(W(s)&&W(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ao(t)}function Tr(e){if(e)for(let t=0;tOt(Cc);function Zs(e,t){return Wn(e,null,t)}function Rf(e,t){return Wn(e,null,{flush:"post"})}function Fe(e,t,n){return Wn(e,t,n)}function Wn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=ae({},n),c=t&&s||!t&&i!=="post";let f;if(Mt){if(i==="sync"){const v=Ac();f=v.__watcherHandles||(v.__watcherHandles=[])}else if(!c){const v=()=>{};return v.stop=ke,v.resume=ke,v.pause=ke,v}}const a=ue;l.call=(v,S,_)=>He(v,a,S,_);let h=!1;i==="post"?l.scheduler=v=>{be(v,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(v,S)=>{S?v():Gs(v)}),l.augmentJob=v=>{t&&(v.flags|=4),h&&(v.flags|=2,a&&(v.id=a.uid,v.i=a))};const y=$l(e,t,l);return Mt&&(f?f.push(y):c&&y()),y}function Rc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?fo(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=rn(this),l=Wn(r,i.bind(s),n);return o(),l}function fo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${st(t)}Modifiers`];function Mc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&Oc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(vs)));let l,c=s[l=_n(t)]||s[l=_n(Le(t))];!c&&i&&(c=s[l=_n(st(t))]),c&&He(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,He(f,e,6,r)}}function uo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=uo(f,t,!0);a&&(l=!0,ae(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(W(i)?i.forEach(c=>o[c]=null):ae(o,i),ne(e)&&s.set(e,o),o)}function Kn(e,t){return!e||!en(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,st(t))||z(e,t))}function is(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:y,setupState:v,ctx:S,inheritAttrs:_}=e,K=Mn(e);let N,j;try{if(n.shapeFlag&4){const g=r||s,O=g;N=Me(f.call(O,g,a,h,v,y,S)),j=l}else{const g=t;N=Me(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),j=t.props?l:Pc(l)}}catch(g){Bt.length=0,nn(g,e,1),N=ce(ve)}let p=N;if(j&&_!==!1){const g=Object.keys(j),{shapeFlag:O}=p;g.length&&O&7&&(i&&g.some(Fs)&&(j=Lc(j,i)),p=nt(p,j,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,Mn(K),N}const Pc=e=>{let t;for(const n in e)(n==="class"||n==="style"||en(n))&&((t||(t={}))[n]=e[n]);return t},Lc=(e,t)=>{const n={};for(const s in e)(!Fs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ic(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Cr(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function go(e,t){t&&t.pendingBranch?W(e)?t.effects.push(...e):t.effects.push(e):Vl(e)}const xe=Symbol.for("v-fgt"),gt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),kt=Symbol.for("v-stc"),Bt=[];let Ae=null;function Os(e=!1){Bt.push(Ae=e?null:[])}function Nc(){Bt.pop(),Ae=Bt[Bt.length-1]||null}let Jt=1;function Ar(e,t=!1){Jt+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function mo(e){return e.dynamicChildren=Jt>0?Ae||Et:null,Nc(),Jt>0&&Ae&&Ae.push(e),e}function Of(e,t,n,s,r,i){return mo(vo(e,t,n,s,r,i,!0))}function Ms(e,t,n,s,r){return mo(ce(e,t,n,s,r,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function ut(e,t){return e.type===t.type&&e.key===t.key}const yo=({key:e})=>e??null,xn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||fe(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function vo(e,t=null,n=null,s=0,r=null,i=e===xe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yo(t),ref:t&&xn(t),scopeId:Ni,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:de};return l?(er(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Jt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ce=Fc;function Fc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Gi)&&(e=ve),zt(e)){const l=nt(e,t,!0);return n&&er(l,n),Jt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Kc(e)&&(e=e.__vccOpts),t){t=Hc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=js(l)),ne(c)&&(Ks(c)&&!W(c)&&(c=ae({},c)),t.style=Ds(c))}const o=re(e)?1:po(e)?128:Hi(e)?64:ne(e)?4:q(e)?2:0;return vo(e,t,n,s,r,o,i,!0)}function Hc(e){return e?Ks(e)||eo(e)?ae({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?$c(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&yo(f),ref:t&&t.ref?n&&i?W(i)?i.concat(xn(t)):[i,xn(t)]:xn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==xe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Yt(a,c.clone(a)),a}function _o(e=" ",t=0){return ce(gt,null,e,t)}function Mf(e,t){const n=ce(kt,null,e);return n.staticCount=t,n}function Pf(e="",t=!1){return t?(Os(),Ms(ve,null,e)):ce(ve,null,e)}function Me(e){return e==null||typeof e=="boolean"?ce(ve):W(e)?ce(xe,null,e.slice()):zt(e)?et(e):ce(gt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function er(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(W(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),er(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!eo(t)?t._ctx=de:r===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),s&64?(n=16,t=[_o(t)]):n=8);e.children=t,e.shapeFlag|=n}function $c(...e){const t={};for(let n=0;nue||de;let Ln,Ps;{const e=Hn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Ln=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Ps=t("__VUE_SSR_SETTERS__",n=>Mt=n)}const rn=e=>{const t=ue;return Ln(e),e.scope.on(),()=>{e.scope.off(),Ln(t)}},Rr=()=>{ue&&ue.scope.off(),Ln(null)};function bo(e){return e.vnode.shapeFlag&4}let Mt=!1;function Uc(e,t=!1,n=!1){t&&Ps(t);const{props:s,children:r}=e.vnode,i=bo(e);yc(e,s,i,t),wc(e,r,n);const o=i?kc(e,t):void 0;return t&&Ps(!1),o}function kc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,lc);const{setup:s}=n;if(s){rt();const r=e.setupContext=s.length>1?So(e):null,i=rn(e),o=tn(s,e,0,[e.props,r]),l=oi(o);if(it(),i(),(l||e.sp)&&!pt(e)&&Xs(e),l){if(o.then(Rr,Rr),t)return o.then(c=>{Or(e,c,t)}).catch(c=>{nn(c,e,0)});e.asyncDep=o}else Or(e,o,t)}else wo(e,t)}function Or(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Mi(t)),wo(e,n)}let Mr;function wo(e,t,n){const s=e.type;if(!e.render){if(!t&&Mr&&!s.render){const r=s.template||Js(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=ae(ae({isCustomElement:i,delimiters:l},o),c);s.render=Mr(r,f)}}e.render=s.render||ke}{const r=rn(e);rt();try{ac(e)}finally{it(),r()}}}const Bc={get(e,t){return me(e,"get",""),e[t]}};function So(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Bc),slots:e.slots,emit:e.emit,expose:t}}function Gn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mi(wn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function Wc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Kc(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>Fl(e,t,Mt);function Ls(e,t,n){const s=arguments.length;return s===2?ne(t)&&!W(t)?zt(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&zt(n)&&(n=[n]),ce(e,t,n))}const qc="3.5.13";/**
+* @vue/runtime-dom v3.5.13
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/let Is;const Pr=typeof window<"u"&&window.trustedTypes;if(Pr)try{Is=Pr.createPolicy("vue",{createHTML:e=>e})}catch{}const xo=Is?e=>Is.createHTML(e):e=>e,Gc="http://www.w3.org/2000/svg",Yc="http://www.w3.org/1998/Math/MathML",qe=typeof document<"u"?document:null,Lr=qe&&qe.createElement("template"),Xc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?qe.createElementNS(Gc,e):t==="mathml"?qe.createElementNS(Yc,e):n?qe.createElement(e,{is:n}):qe.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>qe.createTextNode(e),createComment:e=>qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Lr.innerHTML=xo(s==="svg"?`${e} `:s==="mathml"?`${e} `:e);const l=Lr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ze="transition",Ht="animation",Qt=Symbol("_vtc"),Eo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Jc=ae({},ji,Eo),zc=e=>(e.displayName="Transition",e.props=Jc,e),Lf=zc((e,{slots:t})=>Ls(Kl,Qc(e),t)),ct=(e,t=[])=>{W(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ir=e=>e?W(e)?e.some(t=>t.length>1):e.length>1:!1;function Qc(e){const t={};for(const x in e)x in Eo||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,S=Zc(r),_=S&&S[0],K=S&&S[1],{onBeforeEnter:N,onEnter:j,onEnterCancelled:p,onLeave:g,onLeaveCancelled:O,onBeforeAppear:F=N,onAppear:$=j,onAppearCancelled:V=p}=t,R=(x,B,se,le)=>{x._enterCancelled=le,at(x,B?a:l),at(x,B?f:o),se&&se()},b=(x,B)=>{x._isLeaving=!1,at(x,h),at(x,v),at(x,y),B&&B()},I=x=>(B,se)=>{const le=x?$:j,U=()=>R(B,x,se);ct(le,[B,U]),Nr(()=>{at(B,x?c:i),Ke(B,x?a:l),Ir(le)||Fr(B,s,_,U)})};return ae(t,{onBeforeEnter(x){ct(N,[x]),Ke(x,i),Ke(x,o)},onBeforeAppear(x){ct(F,[x]),Ke(x,c),Ke(x,f)},onEnter:I(!1),onAppear:I(!0),onLeave(x,B){x._isLeaving=!0;const se=()=>b(x,B);Ke(x,h),x._enterCancelled?(Ke(x,y),Dr()):(Dr(),Ke(x,y)),Nr(()=>{x._isLeaving&&(at(x,h),Ke(x,v),Ir(g)||Fr(x,s,K,se))}),ct(g,[x,se])},onEnterCancelled(x){R(x,!1,void 0,!0),ct(p,[x])},onAppearCancelled(x){R(x,!0,void 0,!0),ct(V,[x])},onLeaveCancelled(x){b(x),ct(O,[x])}})}function Zc(e){if(e==null)return null;if(ne(e))return[os(e.enter),os(e.leave)];{const t=os(e);return[t,t]}}function os(e){return Jo(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Qt]||(e[Qt]=new Set)).add(t)}function at(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Qt];n&&(n.delete(t),n.size||(e[Qt]=void 0))}function Nr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ea=0;function Fr(e,t,n,s){const r=e._endId=++ea,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ta(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,y),i()},y=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[S]||"").split(", "),r=s(`${ze}Delay`),i=s(`${ze}Duration`),o=Hr(r,i),l=s(`${Ht}Delay`),c=s(`${Ht}Duration`),f=Hr(l,c);let a=null,h=0,y=0;t===ze?o>0&&(a=ze,h=o,y=i.length):t===Ht?f>0&&(a=Ht,h=f,y=c.length):(h=Math.max(o,f),a=h>0?o>f?ze:Ht:null,y=a?a===ze?i.length:c.length:0);const v=a===ze&&/\b(transform|all)(,|$)/.test(s(`${ze}Property`).toString());return{type:a,timeout:h,propCount:y,hasTransform:v}}function Hr(e,t){for(;e.length$r(n)+$r(e[s])))}function $r(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Dr(){return document.body.offsetHeight}function na(e,t,n){const s=e[Qt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const jr=Symbol("_vod"),sa=Symbol("_vsh"),ra=Symbol(""),ia=/(^|;)\s*display\s*:/;function oa(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&En(s,l,"")}else for(const o in t)n[o]==null&&En(s,o,"");for(const o in n)o==="display"&&(i=!0),En(s,o,n[o])}else if(r){if(t!==n){const o=s[ra];o&&(n+=";"+o),s.cssText=n,i=ia.test(n)}}else t&&e.removeAttribute("style");jr in e&&(e[jr]=i?s.display:"",e[sa]&&(s.display="none"))}const Vr=/\s*!important$/;function En(e,t,n){if(W(n))n.forEach(s=>En(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=la(e,t);Vr.test(n)?e.setProperty(st(s),n.replace(Vr,""),"important"):e[s]=n}}const Ur=["Webkit","Moz","ms"],ls={};function la(e,t){const n=ls[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return ls[t]=s;s=Fn(s);for(let r=0;rcs||(ua.then(()=>cs=0),cs=Date.now());function ha(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;He(pa(s,n.value),t,5,[s])};return n.value=e,n.attached=da(),n}function pa(e,t){if(W(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Gr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ga=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?na(e,s,o):t==="style"?oa(e,n,s):en(t)?Fs(t)||aa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ma(e,t,s,o))?(Wr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?Wr(e,Le(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Br(e,t,s,o))};function ma(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Gr(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Gr(t)&&re(n)?!1:t in e}const Yr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return W(t)?n=>bn(t,n):t};function ya(e){e.target.composing=!0}function Xr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const as=Symbol("_assign"),If={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[as]=Yr(r);const i=s||r.props&&r.props.type==="number";St(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=vs(l)),e[as](l)}),n&&St(e,"change",()=>{e.value=e.value.trim()}),t||(St(e,"compositionstart",ya),St(e,"compositionend",Xr),St(e,"change",Xr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[as]=Yr(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?vs(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},va=["ctrl","shift","alt","meta"],_a={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>va.some(n=>e[`${n}Key`]&&!t.includes(n))},Nf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=st(r.key);if(t.some(o=>o===i||ba[o]===i))return e(r)})},To=ae({patchProp:ga},Xc);let Wt,Jr=!1;function wa(){return Wt||(Wt=xc(To))}function Sa(){return Wt=Jr?Wt:Ec(To),Jr=!0,Wt}const Hf=(...e)=>{const t=wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Co(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},$f=(...e)=>{const t=Sa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(r)return n(r,!0,Co(r))},t};function Co(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ao(e){return re(e)?document.querySelector(e):e}const Df=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},xa=window.__VP_SITE_DATA__;function tr(e){return hi()?(il(e),!0):!1}function Be(e){return typeof e=="function"?e():Oi(e)}const Ro=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jf=e=>e!=null,Ea=Object.prototype.toString,Ta=e=>Ea.call(e)==="[object Object]",Zt=()=>{},zr=Ca();function Ca(){var e,t;return Ro&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Aa(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Oo=e=>e();function Ra(e,t={}){let n,s,r=Zt;const i=l=>{clearTimeout(l),r(),r=Zt};return l=>{const c=Be(e),f=Be(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(s&&(i(s),s=null),Promise.resolve(l())):new Promise((a,h)=>{r=t.rejectOnCancel?h:a,f&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,a(l())},f)),n=setTimeout(()=>{s&&i(s),s=null,a(l())},c)})}}function Oa(e=Oo){const t=oe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Vn(t),pause:n,resume:s,eventFilter:r}}function Ma(e){return qn()}function Mo(...e){if(e.length!==1)return Ll(...e);const t=e[0];return typeof t=="function"?Vn(Ol(()=>({get:t,set:Zt}))):oe(t)}function Po(e,t,n={}){const{eventFilter:s=Oo,...r}=n;return Fe(e,Aa(s,t),r)}function Pa(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Oa(s);return{stop:Po(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function nr(e,t=!0,n){Ma()?Lt(e,n):t?e():Un(e)}function Vf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Po(e,t,{...i,eventFilter:Ra(s,{maxWait:r})})}function Uf(e,t,n){let s;fe(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Zt}=s,c=oe(!r),f=o?qs(t):oe(t);let a=0;return Zs(async h=>{if(!c.value)return;a++;const y=a;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const S=await e(_=>{h(()=>{i&&(i.value=!1),v||_()})});y===a&&(f.value=S)}catch(S){l(S)}finally{i&&y===a&&(i.value=!1),v=!0}}),r?ie(()=>(c.value=!0,f.value)):f}const $e=Ro?window:void 0;function Lo(e){var t;const n=Be(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Pt(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=$e):[t,n,s,r]=e,!t)return Zt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,y,v)=>(a.addEventListener(h,y,v),()=>a.removeEventListener(h,y,v)),c=Fe(()=>[Lo(t),Be(r)],([a,h])=>{if(o(),!a)return;const y=Ta(h)?{...h}:h;i.push(...n.flatMap(v=>s.map(S=>l(a,v,S,y))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return tr(f),f}function La(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function kf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=$e,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=La(t);return Pt(r,i,a=>{a.repeat&&Be(l)||c(a)&&n(a)},o)}function Ia(){const e=oe(!1),t=qn();return t&&Lt(()=>{e.value=!0},t),e}function Na(e){const t=Ia();return ie(()=>(t.value,!!e()))}function Io(e,t={}){const{window:n=$e}=t,s=Na(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=Zs(()=>{s.value&&(l(),r=n.matchMedia(Be(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return tr(()=>{c(),l(),r=void 0}),i}const gn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},mn="__vueuse_ssr_handlers__",Fa=Ha();function Ha(){return mn in gn||(gn[mn]=gn[mn]||{}),gn[mn]}function No(e,t){return Fa[e]||t}function sr(e){return Io("(prefers-color-scheme: dark)",e)}function $a(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Da={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Qr="vueuse-storage";function rr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=$e,eventFilter:y,onError:v=b=>{console.error(b)},initOnMounted:S}=s,_=(a?qs:oe)(typeof t=="function"?t():t);if(!n)try{n=No("getDefaultStorage",()=>{var b;return(b=$e)==null?void 0:b.localStorage})()}catch(b){v(b)}if(!n)return _;const K=Be(t),N=$a(K),j=(r=s.serializer)!=null?r:Da[N],{pause:p,resume:g}=Pa(_,()=>F(_.value),{flush:i,deep:o,eventFilter:y});h&&l&&nr(()=>{n instanceof Storage?Pt(h,"storage",V):Pt(h,Qr,R),S&&V()}),S||V();function O(b,I){if(h){const x={key:e,oldValue:b,newValue:I,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(Qr,{detail:x}))}}function F(b){try{const I=n.getItem(e);if(b==null)O(I,null),n.removeItem(e);else{const x=j.write(b);I!==x&&(n.setItem(e,x),O(I,x))}}catch(I){v(I)}}function $(b){const I=b?b.newValue:n.getItem(e);if(I==null)return c&&K!=null&&n.setItem(e,j.write(K)),K;if(!b&&f){const x=j.read(I);return typeof f=="function"?f(x,K):N==="object"&&!Array.isArray(x)?{...K,...x}:x}else return typeof I!="string"?I:j.read(I)}function V(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){_.value=K;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==j.write(_.value)&&(_.value=$(b))}catch(I){v(I)}finally{b?Un(g):g()}}}}function R(b){V(b.detail)}return _}const ja="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Va(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=$e,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=sr({window:r}),v=ie(()=>y.value?"dark":"light"),S=c||(o==null?Mo(s):rr(o,s,i,{window:r,listenToStorageChanges:l})),_=ie(()=>S.value==="auto"?v.value:S.value),K=No("updateHTMLAttrs",(g,O,F)=>{const $=typeof g=="string"?r==null?void 0:r.document.querySelector(g):Lo(g);if(!$)return;const V=new Set,R=new Set;let b=null;if(O==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(B=>(B||"").split(/\s/g)).filter(Boolean).forEach(B=>{x.includes(B)?V.add(B):R.add(B)})}else b={key:O,value:F};if(V.size===0&&R.size===0&&b===null)return;let I;a&&(I=r.document.createElement("style"),I.appendChild(document.createTextNode(ja)),r.document.head.appendChild(I));for(const x of V)$.classList.add(x);for(const x of R)$.classList.remove(x);b&&$.setAttribute(b.key,b.value),a&&(r.getComputedStyle(I).opacity,document.head.removeChild(I))});function N(g){var O;K(t,n,(O=h[g])!=null?O:g)}function j(g){e.onChanged?e.onChanged(g,N):N(g)}Fe(_,j,{flush:"post",immediate:!0}),nr(()=>j(_.value));const p=ie({get(){return f?S.value:_.value},set(g){S.value=g}});try{return Object.assign(p,{store:S,system:v,state:_})}catch{return p}}function Ua(e={}){const{valueDark:t="dark",valueLight:n="",window:s=$e}=e,r=Va({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>r.system?r.system.value:sr({window:s}).value?"dark":"light");return ie({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function fs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Bf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.localStorage,n)}function Fo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const us=new WeakMap;function Wf(e,t=!1){const n=oe(t);let s=null,r="";Fe(Mo(e),l=>{const c=fs(Be(l));if(c){const f=c;if(us.get(f)||us.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=fs(Be(e));!l||n.value||(zr&&(s=Pt(l,"touchmove",c=>{ka(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=fs(Be(e));!l||!n.value||(zr&&(s==null||s()),l.style.overflow=r,us.delete(l),n.value=!1)};return tr(o),ie({get(){return n.value},set(l){l?i():o()}})}function Kf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.sessionStorage,n)}function qf(e={}){const{window:t=$e,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const s=oe(t.scrollX),r=oe(t.scrollY),i=ie({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Pt(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function Gf(e={}){const{window:t=$e,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(s),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),nr(f),Pt("resize",f,{passive:!0}),r){const a=Io("(orientation: portrait)");Fe(a,()=>f())}return{width:l,height:c}}const ds={BASE_URL:"/YAXArrays.jl/previews/PR486/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var hs={};const Ho=/^(?:[a-z]+:|\/\/)/i,Ba="vitepress-theme-appearance",Wa=/#.*$/,Ka=/[?#].*$/,qa=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",$o={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ga(e,t,n=!1){if(t===void 0)return!1;if(e=Zr(`/${e}`),n)return new RegExp(t).test(e);if(Zr(t)!==e)return!1;const s=t.match(Wa);return s?(ge?location.hash:"")===s[0]:!0}function Zr(e){return decodeURI(e).replace(Ka,"").replace(qa,"$1")}function Ya(e){return Ho.test(e)}function Xa(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ya(n)&&Ga(t,`/${n}/`,!0))||"root"}function Ja(e,t){var s,r,i,o,l,c,f;const n=Xa(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:jo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Do(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=za(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function za(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Qa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function jo(e,t){return[...e.filter(n=>!Qa(t,n)),...t]}const Za=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ef=/^[a-z]:/i;function ei(e){const t=ef.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Za,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ps=new Set;function tf(e){if(ps.size===0){const n=typeof process=="object"&&(hs==null?void 0:hs.VITE_EXTRA_EXTENSIONS)||(ds==null?void 0:ds.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>ps.add(s))}const t=e.split(".").pop();return t==null||!ps.has(t.toLowerCase())}function Yf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const nf=Symbol(),mt=qs(xa);function Xf(e){const t=ie(()=>Ja(mt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?oe(!0):n==="force-auto"?sr():n?Ua({storageKey:Ba,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),r=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Fe(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>Do(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function sf(){const e=Ot(nf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function rf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ti(e){return Ho.test(e)||!e.startsWith("/")?e:rf(mt.value.base,e)}function of(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/YAXArrays.jl/previews/PR486/";t=ei(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${ei(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Tn=[];function Jf(e){Tn.push(e),Bn(()=>{Tn=Tn.filter(t=>t!==e)})}function lf(){let e=mt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=ni(e,n);else if(Array.isArray(e))for(const s of e){const r=ni(s,n);if(r){t=r;break}}return t}function ni(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const cf=Symbol(),Vo="http://a.com",af=()=>({path:"/",component:null,data:$o});function zf(e,t){const n=jn(af()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,f;l=gs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==gs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l)))}let i=null;async function o(l,c=0,f=!1){var y,v;if(await((y=s.onBeforePageLoad)==null?void 0:y.call(s,l))===!1)return;const a=new URL(l,Vo),h=i=a.pathname;try{let S=await e(h);if(!S)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:K}=S;if(!_)throw new Error(`Invalid route component: ${_}`);await((v=s.onAfterPageLoad)==null?void 0:v.call(s,l)),n.path=ge?h:ti(h),n.component=wn(_),n.data=wn(K),ge&&Un(()=>{let N=mt.value.base+K.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!mt.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==a.pathname&&(a.pathname=N,l=N+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let j=null;try{j=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(j){si(j,a.hash);return}}window.scrollTo(0,c)})}}catch(S){if(!/fetch|Page not found/.test(S.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(S),!f)try{const _=await fetch(mt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:ti(h),n.component=t?wn(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...$o,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:y,hash:v,search:S}=new URL(f,c.baseURI),_=new URL(location.href);h===_.origin&&tf(y)&&(l.preventDefault(),y===_.pathname&&S===_.search?(v!==_.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:_.href,newURL:a}))),v?si(c,v,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(gs(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function ff(){const e=Ot(cf);if(!e)throw new Error("useRouter() is called without provider.");return e}function Uo(){return ff().route}function si(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-lf()+i;requestAnimationFrame(r)}}function gs(e){const t=new URL(e,Vo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),mt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const yn=()=>Tn.forEach(e=>e()),Qf=Ys({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Uo(),{frontmatter:n,site:s}=sf();return Fe(n,yn,{deep:!0,flush:"post"}),()=>Ls(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ls(t.component,{onVnodeMounted:yn,onVnodeUpdated:yn,onVnodeUnmounted:yn}):"404 Page Not Found"])}}),uf="modulepreload",df=function(e){return"/YAXArrays.jl/previews/PR486/"+e},ri={},Zf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=df(c),c in ri)return;ri[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":uf,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((y,v)=>{h.addEventListener("load",y),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},eu=Ys({setup(e,{slots:t}){const n=oe(!1);return Lt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function tu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function nu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),hf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function hf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function su(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=ms(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(ms);s.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};Zs(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=Do(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):ms(["meta",{name:"description",content:a}]),r(jo(o.head,gf(c)))})}function ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function pf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function gf(e){return e.filter(t=>!pf(t))}const ys=new Set,ko=()=>document.createElement("link"),mf=e=>{const t=ko();t.rel="prefetch",t.href=e,document.head.appendChild(t)},yf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let vn;const vf=ge&&(vn=ko())&&vn.relList&&vn.relList.supports&&vn.relList.supports("prefetch")?mf:yf;function ru(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!ys.has(c)){ys.add(c);const f=of(c);f&&vf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):ys.add(l))})})};Lt(s);const r=Uo();Fe(()=>r.path,s),Bn(()=>{n&&n.disconnect()})}export{Ki as $,lf as A,Sf as B,Ef as C,qs as D,Jf as E,xe as F,ce as G,xf as H,Ho as I,Uo as J,$c as K,Ot as L,Gf as M,Ds as N,kf as O,Un as P,qf as Q,ge as R,Vn as S,Lf as T,wf as U,Zf as V,Wf as W,mc as X,Cf as Y,Ff as Z,Df as _,_o as a,Nf as a0,Af as a1,Mf as a2,jn as a3,Ll as a4,Ls as a5,su as a6,cf as a7,Xf as a8,nf as a9,Qf as aa,eu as ab,mt as ac,$f as ad,zf as ae,of as af,ru as ag,nu as ah,tu as ai,Be as aj,Lo as ak,jf as al,tr as am,Uf as an,Kf as ao,Bf as ap,Vf as aq,ff as ar,Pt as as,_f as at,If as au,fe as av,bf as aw,wn as ax,Hf as ay,Yf as az,Ms as b,Of as c,Ys as d,Pf as e,tf as f,ti as g,ie as h,Ya as i,vo as j,Oi as k,Ga as l,Io as m,js as n,Os as o,oe as p,Fe as q,Tf as r,Zs as s,sl as t,sf as u,Lt as v,Ul as w,Bn as x,Rf as y,nc as z};
diff --git a/previews/PR486/assets/chunks/theme.ChQEK1xa.js b/previews/PR486/assets/chunks/theme.ChQEK1xa.js
new file mode 100644
index 00000000..6f55fec9
--- /dev/null
+++ b/previews/PR486/assets/chunks/theme.ChQEK1xa.js
@@ -0,0 +1,2 @@
+const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.D16mVP9n.js","assets/chunks/framework.piKCME0r.js"])))=>i.map(i=>d[i]);
+import{d as b,o,c,r as d,n as M,a as G,t as w,b as y,w as m,e as h,T as Se,_ as g,u as ze,i as _t,f as bt,g as Le,h as P,j as p,k as i,l as X,m as ge,p as I,q as R,s as de,v as j,x as Ve,y as Ce,z as gt,A as kt,B as Z,F as T,C as Q,D as Ze,E as pe,G as k,H as U,I as Ye,J as fe,K as z,L as ee,M as yt,N as Xe,O as ke,P as Ie,Q as xe,R as me,S as $t,U as At,V as Pt,W as qe,X as Ne,Y as St,Z as Lt,$ as Vt,a0 as Ct,a1 as et,a2 as It,a3 as Nt,a4 as wt,a5 as _e}from"./framework.piKCME0r.js";const Mt=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(o(),c("span",{class:M(["VPBadge",e.type])},[d(e.$slots,"default",{},()=>[G(w(e.text),1)])],2))}}),Tt={key:0,class:"VPBackdrop"},Et=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(o(),y(Se,{name:"fade"},{default:m(()=>[e.show?(o(),c("div",Tt)):h("",!0)]),_:1}))}}),Bt=g(Et,[["__scopeId","data-v-b06cdb19"]]),L=ze;function Qt(n,e){let t,a=!1;return()=>{t&&clearTimeout(t),a?t=setTimeout(n,e):(n(),(a=!0)&&setTimeout(()=>a=!1,e))}}function ye(n){return/^\//.test(n)?n:`/${n}`}function we(n){const{pathname:e,search:t,hash:a,protocol:s}=new URL(n,"http://a.com");if(_t(n)||n.startsWith("#")||!s.startsWith("http")||!bt(e))return n;const{site:r}=L(),l=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${a}`);return Le(l)}function ne({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:a,theme:s,hash:r}=L(),l=P(()=>{var u,_;return{label:(u=e.value.locales[t.value])==null?void 0:u.label,link:((_=e.value.locales[t.value])==null?void 0:_.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:P(()=>Object.entries(e.value.locales).flatMap(([u,_])=>l.value.label===_.label?[]:{text:_.label,link:Ft(_.link||(u==="root"?"/":`/${u}/`),s.value.i18nRouting!==!1&&n,a.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+r.value})),currentLang:l}}function Ft(n,e,t,a){return e?n.replace(/\/$/,"")+ye(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):n}const Ht={class:"NotFound"},Wt={class:"code"},Ot={class:"title"},Dt={class:"quote"},Ut={class:"action"},Gt=["href","aria-label"],Rt=b({__name:"NotFound",setup(n){const{theme:e}=L(),{currentLang:t}=ne();return(a,s)=>{var r,l,f,u,_;return o(),c("div",Ht,[p("p",Wt,w(((r=i(e).notFound)==null?void 0:r.code)??"404"),1),p("h1",Ot,w(((l=i(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),s[0]||(s[0]=p("div",{class:"divider"},null,-1)),p("blockquote",Dt,w(((f=i(e).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",Ut,[p("a",{class:"link",href:i(Le)(i(t).link),"aria-label":((u=i(e).notFound)==null?void 0:u.linkLabel)??"go to home"},w(((_=i(e).notFound)==null?void 0:_.linkText)??"Take me home"),9,Gt)])])}}}),jt=g(Rt,[["__scopeId","data-v-951cab6c"]]);function tt(n,e){if(Array.isArray(n))return le(n);if(n==null)return[];e=ye(e);const t=Object.keys(n).sort((s,r)=>r.split("/").length-s.split("/").length).find(s=>e.startsWith(ye(s))),a=t?n[t]:[];return Array.isArray(a)?le(a):le(a.items,a.base)}function Jt(n){const e=[];let t=0;for(const a in n){const s=n[a];if(s.items){t=e.push(s);continue}e[t]||e.push({items:[]}),e[t].items.push(s)}return e}function Kt(n){const e=[];function t(a){for(const s of a)s.text&&s.link&&e.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&t(s.items)}return t(n),e}function $e(n,e){return Array.isArray(e)?e.some(t=>$e(n,t)):X(n,e.link)?!0:e.items?$e(n,e.items):!1}function le(n,e){return[...n].map(t=>{const a={...t},s=a.base||e;return s&&a.link&&(a.link=s+a.link),a.items&&(a.items=le(a.items,s)),a})}function K(){const{frontmatter:n,page:e,theme:t}=L(),a=ge("(min-width: 960px)"),s=I(!1),r=P(()=>{const E=t.value.sidebar,V=e.value.relativePath;return E?tt(E,V):[]}),l=I(r.value);R(r,(E,V)=>{JSON.stringify(E)!==JSON.stringify(V)&&(l.value=r.value)});const f=P(()=>n.value.sidebar!==!1&&l.value.length>0&&n.value.layout!=="home"),u=P(()=>_?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),_=P(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),$=P(()=>f.value&&a.value),v=P(()=>f.value?Jt(l.value):[]);function A(){s.value=!0}function S(){s.value=!1}function C(){s.value?S():A()}return{isOpen:s,sidebar:l,sidebarGroups:v,hasSidebar:f,hasAside:_,leftAside:u,isSidebarEnabled:$,open:A,close:S,toggle:C}}function zt(n,e){let t;de(()=>{t=n.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",a)}),Ve(()=>{window.removeEventListener("keyup",a)});function a(s){s.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function Zt(n){const{page:e,hash:t}=L(),a=I(!1),s=P(()=>n.value.collapsed!=null),r=P(()=>!!n.value.link),l=I(!1),f=()=>{l.value=X(e.value.relativePath,n.value.link)};R([e,n,t],f),j(f);const u=P(()=>l.value?!0:n.value.items?$e(e.value.relativePath,n.value.items):!1),_=P(()=>!!(n.value.items&&n.value.items.length));de(()=>{a.value=!!(s.value&&n.value.collapsed)}),Ce(()=>{(l.value||u.value)&&(a.value=!1)});function $(){s.value&&(a.value=!a.value)}return{collapsed:a,collapsible:s,isLink:r,isActiveLink:l,hasActiveLink:u,hasChildren:_,toggle:$}}function Yt(){const{hasSidebar:n}=K(),e=ge("(min-width: 960px)"),t=ge("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ae=[];function nt(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Me(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const a=Number(t.tagName[1]);return{element:t,title:Xt(t),link:"#"+t.id,level:a}});return xt(e,n)}function Xt(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function xt(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[a,s]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return tn(n,a,s)}function qt(n,e){const{isAsideEnabled:t}=Yt(),a=Qt(r,100);let s=null;j(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),gt(()=>{l(location.hash)}),Ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!t.value)return;const f=window.scrollY,u=window.innerHeight,_=document.body.offsetHeight,$=Math.abs(f+u-_)<1,v=Ae.map(({element:S,link:C})=>({link:C,top:en(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,C)=>S.top-C.top);if(!v.length){l(null);return}if(f<1){l(null);return}if($){l(v[v.length-1].link);return}let A=null;for(const{link:S,top:C}of v){if(C>f+kt()+4)break;A=S}l(A)}function l(f){s&&s.classList.remove("active"),f==null?s=null:s=n.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const u=s;u?(u.classList.add("active"),e.value.style.top=u.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function en(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}function tn(n,e,t){Ae.length=0;const a=[],s=[];return n.forEach(r=>{const l={...r,children:[]};let f=s[s.length-1];for(;f&&f.level>=l.level;)s.pop(),f=s[s.length-1];if(l.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){s.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const s=Z("VPDocOutlineItem",!0);return o(),c("ul",{class:M(["VPDocOutlineItem",t.root?"root":"nested"])},[(o(!0),c(T,null,Q(t.headers,({children:r,link:l,title:f})=>(o(),c("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:f},w(f),9,nn),r!=null&&r.length?(o(),y(s,{key:0,headers:r},null,8,["headers"])):h("",!0)]))),256))],2)}}}),st=g(sn,[["__scopeId","data-v-3f927ebe"]]),an={class:"content"},on={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},rn=b({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=L(),a=Ze([]);pe(()=>{a.value=Me(e.value.outline??t.value.outline)});const s=I(),r=I();return qt(s,r),(l,f)=>(o(),c("nav",{"aria-labelledby":"doc-outline-aria-label",class:M(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:s},[p("div",an,[p("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),p("div",on,w(i(nt)(i(t))),1),k(st,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),ln=g(rn,[["__scopeId","data-v-b38bf2ff"]]),cn={class:"VPDocAsideCarbonAds"},un=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,a)=>(o(),c("div",cn,[k(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),dn={class:"VPDocAside"},pn=b({__name:"VPDocAside",setup(n){const{theme:e}=L();return(t,a)=>(o(),c("div",dn,[d(t.$slots,"aside-top",{},void 0,!0),d(t.$slots,"aside-outline-before",{},void 0,!0),k(ln),d(t.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=p("div",{class:"spacer"},null,-1)),d(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(o(),y(un,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),d(t.$slots,"aside-ads-after",{},void 0,!0),d(t.$slots,"aside-bottom",{},void 0,!0)]))}}),fn=g(pn,[["__scopeId","data-v-6d7b3c46"]]);function mn(){const{theme:n,page:e}=L();return P(()=>{const{text:t="Edit this page",pattern:a=""}=n.value.editLink||{};let s;return typeof a=="function"?s=a(e.value):s=a.replace(/:path/g,e.value.filePath),{url:s,text:t}})}function vn(){const{page:n,theme:e,frontmatter:t}=L();return P(()=>{var _,$,v,A,S,C,E,V;const a=tt(e.value.sidebar,n.value.relativePath),s=Kt(a),r=hn(s,B=>B.link.replace(/[?#].*$/,"")),l=r.findIndex(B=>X(n.value.relativePath,B.link)),f=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,u=(($=e.value.docFooter)==null?void 0:$.next)===!1&&!t.value.next||t.value.next===!1;return{prev:f?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((v=r[l-1])==null?void 0:v.docFooterText)??((A=r[l-1])==null?void 0:A.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=r[l-1])==null?void 0:S.link)},next:u?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((C=r[l+1])==null?void 0:C.docFooterText)??((E=r[l+1])==null?void 0:E.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((V=r[l+1])==null?void 0:V.link)}}})}function hn(n,e){const t=new Set;return n.filter(a=>{const s=e(a);return t.has(s)?!1:t.add(s)})}const D=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=P(()=>e.tag??(e.href?"a":"span")),a=P(()=>e.href&&Ye.test(e.href)||e.target==="_blank");return(s,r)=>(o(),y(U(t.value),{class:M(["VPLink",{link:s.href,"vp-external-link-icon":a.value,"no-icon":s.noIcon}]),href:s.href?i(we)(s.href):void 0,target:s.target??(a.value?"_blank":void 0),rel:s.rel??(a.value?"noreferrer":void 0)},{default:m(()=>[d(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),_n={class:"VPLastUpdated"},bn=["datetime"],gn=b({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:a}=L(),s=P(()=>new Date(t.value.lastUpdated)),r=P(()=>s.value.toISOString()),l=I("");return j(()=>{de(()=>{var f,u,_;l.value=new Intl.DateTimeFormat((u=(f=e.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&u.forceLocale?a.value:void 0,((_=e.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(s.value)})}),(f,u)=>{var _;return o(),c("p",_n,[G(w(((_=i(e).lastUpdated)==null?void 0:_.text)||i(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:r.value},w(l.value),9,bn)])}}}),kn=g(gn,[["__scopeId","data-v-475f71b8"]]),yn={key:0,class:"VPDocFooter"},$n={key:0,class:"edit-info"},An={key:0,class:"edit-link"},Pn={key:1,class:"last-updated"},Sn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ln={class:"pager"},Vn=["innerHTML"],Cn=["innerHTML"],In={class:"pager"},Nn=["innerHTML"],wn=["innerHTML"],Mn=b({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:a}=L(),s=mn(),r=vn(),l=P(()=>e.value.editLink&&a.value.editLink!==!1),f=P(()=>t.value.lastUpdated),u=P(()=>l.value||f.value||r.value.prev||r.value.next);return(_,$)=>{var v,A,S,C;return u.value?(o(),c("footer",yn,[d(_.$slots,"doc-footer-before",{},void 0,!0),l.value||f.value?(o(),c("div",$n,[l.value?(o(),c("div",An,[k(D,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:m(()=>[$[0]||($[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),G(" "+w(i(s).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(o(),c("div",Pn,[k(kn)])):h("",!0)])):h("",!0),(v=i(r).prev)!=null&&v.link||(A=i(r).next)!=null&&A.link?(o(),c("nav",Sn,[$[1]||($[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Ln,[(S=i(r).prev)!=null&&S.link?(o(),y(D,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:m(()=>{var E;return[p("span",{class:"desc",innerHTML:((E=i(e).docFooter)==null?void 0:E.prev)||"Previous page"},null,8,Vn),p("span",{class:"title",innerHTML:i(r).prev.text},null,8,Cn)]}),_:1},8,["href"])):h("",!0)]),p("div",In,[(C=i(r).next)!=null&&C.link?(o(),y(D,{key:0,class:"pager-link next",href:i(r).next.link},{default:m(()=>{var E;return[p("span",{class:"desc",innerHTML:((E=i(e).docFooter)==null?void 0:E.next)||"Next page"},null,8,Nn),p("span",{class:"title",innerHTML:i(r).next.text},null,8,wn)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Tn=g(Mn,[["__scopeId","data-v-4f9813fa"]]),En={class:"container"},Bn={class:"aside-container"},Qn={class:"aside-content"},Fn={class:"content"},Hn={class:"content-container"},Wn={class:"main"},On=b({__name:"VPDoc",setup(n){const{theme:e}=L(),t=fe(),{hasSidebar:a,hasAside:s,leftAside:r}=K(),l=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,u)=>{const _=Z("Content");return o(),c("div",{class:M(["VPDoc",{"has-sidebar":i(a),"has-aside":i(s)}])},[d(f.$slots,"doc-top",{},void 0,!0),p("div",En,[i(s)?(o(),c("div",{key:0,class:M(["aside",{"left-aside":i(r)}])},[u[0]||(u[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",Bn,[p("div",Qn,[k(fn,null,{"aside-top":m(()=>[d(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[d(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[d(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[d(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[d(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[d(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",Fn,[p("div",Hn,[d(f.$slots,"doc-before",{},void 0,!0),p("main",Wn,[k(_,{class:M(["vp-doc",[l.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Tn,null,{"doc-footer-before":m(()=>[d(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(f.$slots,"doc-after",{},void 0,!0)])])]),d(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Dn=g(On,[["__scopeId","data-v-83890dd9"]]),Un=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=P(()=>e.href&&Ye.test(e.href)),a=P(()=>e.tag||(e.href?"a":"button"));return(s,r)=>(o(),y(U(a.value),{class:M(["VPButton",[s.size,s.theme]]),href:s.href?i(we)(s.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:m(()=>[G(w(s.text),1)]),_:1},8,["class","href","target","rel"]))}}),Gn=g(Un,[["__scopeId","data-v-906d7fb4"]]),Rn=["src","alt"],jn=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const a=Z("VPImage",!0);return e.image?(o(),c(T,{key:0},[typeof e.image=="string"||"src"in e.image?(o(),c("img",z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(Le)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Rn)):(o(),c(T,{key:1},[k(a,z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(a,z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ce=g(jn,[["__scopeId","data-v-35a7d0b8"]]),Jn={class:"container"},Kn={class:"main"},zn={key:0,class:"name"},Zn=["innerHTML"],Yn=["innerHTML"],Xn=["innerHTML"],xn={key:0,class:"actions"},qn={key:0,class:"image"},es={class:"image-container"},ts=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=ee("hero-image-slot-exists");return(t,a)=>(o(),c("div",{class:M(["VPHero",{"has-image":t.image||i(e)}])},[p("div",Jn,[p("div",Kn,[d(t.$slots,"home-hero-info-before",{},void 0,!0),d(t.$slots,"home-hero-info",{},()=>[t.name?(o(),c("h1",zn,[p("span",{innerHTML:t.name,class:"clip"},null,8,Zn)])):h("",!0),t.text?(o(),c("p",{key:1,innerHTML:t.text,class:"text"},null,8,Yn)):h("",!0),t.tagline?(o(),c("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Xn)):h("",!0)],!0),d(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(o(),c("div",xn,[(o(!0),c(T,null,Q(t.actions,s=>(o(),c("div",{key:s.link,class:"action"},[k(Gn,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link,target:s.target,rel:s.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),d(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(o(),c("div",qn,[p("div",es,[a[0]||(a[0]=p("div",{class:"image-bg"},null,-1)),d(t.$slots,"home-hero-image",{},()=>[t.image?(o(),y(ce,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),ns=g(ts,[["__scopeId","data-v-955009fc"]]),ss=b({__name:"VPHomeHero",setup(n){const{frontmatter:e}=L();return(t,a)=>i(e).hero?(o(),y(ns,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":m(()=>[d(t.$slots,"home-hero-info-before")]),"home-hero-info":m(()=>[d(t.$slots,"home-hero-info")]),"home-hero-info-after":m(()=>[d(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":m(()=>[d(t.$slots,"home-hero-actions-after")]),"home-hero-image":m(()=>[d(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),as={class:"box"},os={key:0,class:"icon"},rs=["innerHTML"],is=["innerHTML"],ls=["innerHTML"],cs={key:4,class:"link-text"},us={class:"link-text-value"},ds=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(o(),y(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:m(()=>[p("article",as,[typeof e.icon=="object"&&e.icon.wrap?(o(),c("div",os,[k(ce,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(o(),y(ce,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(o(),c("div",{key:2,class:"icon",innerHTML:e.icon},null,8,rs)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,is),e.details?(o(),c("p",{key:3,class:"details",innerHTML:e.details},null,8,ls)):h("",!0),e.linkText?(o(),c("div",cs,[p("p",us,[G(w(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),ps=g(ds,[["__scopeId","data-v-f5e9645b"]]),fs={key:0,class:"VPFeatures"},ms={class:"container"},vs={class:"items"},hs=b({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=P(()=>{const a=e.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,s)=>a.features?(o(),c("div",fs,[p("div",ms,[p("div",vs,[(o(!0),c(T,null,Q(a.features,r=>(o(),c("div",{key:r.title,class:M(["item",[t.value]])},[k(ps,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),_s=g(hs,[["__scopeId","data-v-d0a190d7"]]),bs=b({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=L();return(t,a)=>i(e).features?(o(),y(_s,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),gs=b({__name:"VPHomeContent",setup(n){const{width:e}=yt({initialWidth:0,includeScrollbar:!1});return(t,a)=>(o(),c("div",{class:"vp-doc container",style:Xe(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[d(t.$slots,"default",{},void 0,!0)],4))}}),ks=g(gs,[["__scopeId","data-v-7a48a447"]]),ys={class:"VPHome"},$s=b({__name:"VPHome",setup(n){const{frontmatter:e}=L();return(t,a)=>{const s=Z("Content");return o(),c("div",ys,[d(t.$slots,"home-hero-before",{},void 0,!0),k(ss,null,{"home-hero-info-before":m(()=>[d(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[d(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[d(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[d(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[d(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(t.$slots,"home-hero-after",{},void 0,!0),d(t.$slots,"home-features-before",{},void 0,!0),k(bs),d(t.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(o(),y(ks,{key:0},{default:m(()=>[k(s)]),_:1})):(o(),y(s,{key:1}))])}}}),As=g($s,[["__scopeId","data-v-cbb6ec48"]]),Ps={},Ss={class:"VPPage"};function Ls(n,e){const t=Z("Content");return o(),c("div",Ss,[d(n.$slots,"page-top"),k(t),d(n.$slots,"page-bottom")])}const Vs=g(Ps,[["render",Ls]]),Cs=b({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=L(),{hasSidebar:a}=K();return(s,r)=>(o(),c("div",{class:M(["VPContent",{"has-sidebar":i(a),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?d(s.$slots,"not-found",{key:0},()=>[k(jt)],!0):i(t).layout==="page"?(o(),y(Vs,{key:1},{"page-top":m(()=>[d(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[d(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(o(),y(As,{key:2},{"home-hero-before":m(()=>[d(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[d(s.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[d(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[d(s.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[d(s.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[d(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[d(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[d(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[d(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(o(),y(U(i(t).layout),{key:3})):(o(),y(Dn,{key:4},{"doc-top":m(()=>[d(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[d(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":m(()=>[d(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[d(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[d(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":m(()=>[d(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":m(()=>[d(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[d(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[d(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[d(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":m(()=>[d(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Is=g(Cs,[["__scopeId","data-v-91765379"]]),Ns={class:"container"},ws=["innerHTML"],Ms=["innerHTML"],Ts=b({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=L(),{hasSidebar:a}=K();return(s,r)=>i(e).footer&&i(t).footer!==!1?(o(),c("footer",{key:0,class:M(["VPFooter",{"has-sidebar":i(a)}])},[p("div",Ns,[i(e).footer.message?(o(),c("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,ws)):h("",!0),i(e).footer.copyright?(o(),c("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,Ms)):h("",!0)])],2)):h("",!0)}}),Es=g(Ts,[["__scopeId","data-v-c970a860"]]);function Bs(){const{theme:n,frontmatter:e}=L(),t=Ze([]),a=P(()=>t.value.length>0);return pe(()=>{t.value=Me(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:a}}const Qs={class:"menu-text"},Fs={class:"header"},Hs={class:"outline"},Ws=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=L(),a=I(!1),s=I(0),r=I(),l=I();function f(v){var A;(A=r.value)!=null&&A.contains(v.target)||(a.value=!1)}R(a,v=>{if(v){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),ke("Escape",()=>{a.value=!1}),pe(()=>{a.value=!1});function u(){a.value=!a.value,s.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function _(v){v.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ie(()=>{a.value=!1}))}function $(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(v,A)=>(o(),c("div",{class:"VPLocalNavOutlineDropdown",style:Xe({"--vp-vh":s.value+"px"}),ref_key:"main",ref:r},[v.headers.length>0?(o(),c("button",{key:0,onClick:u,class:M({open:a.value})},[p("span",Qs,w(i(nt)(i(t))),1),A[0]||(A[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(o(),c("button",{key:1,onClick:$},w(i(t).returnToTopLabel||"Return to top"),1)),k(Se,{name:"flyout"},{default:m(()=>[a.value?(o(),c("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:_},[p("div",Fs,[p("a",{class:"top-link",href:"#",onClick:$},w(i(t).returnToTopLabel||"Return to top"),1)]),p("div",Hs,[k(st,{headers:v.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),Os=g(Ws,[["__scopeId","data-v-bc9dc845"]]),Ds={class:"container"},Us=["aria-expanded"],Gs={class:"menu-text"},Rs=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=L(),{hasSidebar:a}=K(),{headers:s}=Bs(),{y:r}=xe(),l=I(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),pe(()=>{s.value=Me(t.value.outline??e.value.outline)});const f=P(()=>s.value.length===0),u=P(()=>f.value&&!a.value),_=P(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:f.value,fixed:u.value}));return($,v)=>i(t).layout!=="home"&&(!u.value||i(r)>=l.value)?(o(),c("div",{key:0,class:M(_.value)},[p("div",Ds,[i(a)?(o(),c("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:v[0]||(v[0]=A=>$.$emit("open-menu"))},[v[1]||(v[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",Gs,w(i(e).sidebarMenuLabel||"Menu"),1)],8,Us)):h("",!0),k(Os,{headers:i(s),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),js=g(Rs,[["__scopeId","data-v-070ab83d"]]);function Js(){const n=I(!1);function e(){n.value=!0,window.addEventListener("resize",s)}function t(){n.value=!1,window.removeEventListener("resize",s)}function a(){n.value?t():e()}function s(){window.outerWidth>=768&&t()}const r=fe();return R(()=>r.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:a}}const Ks={},zs={class:"VPSwitch",type:"button",role:"switch"},Zs={class:"check"},Ys={key:0,class:"icon"};function Xs(n,e){return o(),c("button",zs,[p("span",Zs,[n.$slots.default?(o(),c("span",Ys,[d(n.$slots,"default",{},void 0,!0)])):h("",!0)])])}const xs=g(Ks,[["render",Xs],["__scopeId","data-v-4a1c76db"]]),qs=b({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=L(),a=ee("toggle-appearance",()=>{e.value=!e.value}),s=I("");return Ce(()=>{s.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(o(),y(xs,{title:s.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(a)},{default:m(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),Te=g(qs,[["__scopeId","data-v-e40a8bb6"]]),ea={key:0,class:"VPNavBarAppearance"},ta=b({__name:"VPNavBarAppearance",setup(n){const{site:e}=L();return(t,a)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(o(),c("div",ea,[k(Te)])):h("",!0)}}),na=g(ta,[["__scopeId","data-v-af096f4a"]]),Ee=I();let at=!1,be=0;function sa(n){const e=I(!1);if(me){!at&&aa(),be++;const t=R(Ee,a=>{var s,r,l;a===n.el.value||(s=n.el.value)!=null&&s.contains(a)?(e.value=!0,(r=n.onFocus)==null||r.call(n)):(e.value=!1,(l=n.onBlur)==null||l.call(n))});Ve(()=>{t(),be--,be||oa()})}return $t(e)}function aa(){document.addEventListener("focusin",ot),at=!0,Ee.value=document.activeElement}function oa(){document.removeEventListener("focusin",ot)}function ot(){Ee.value=document.activeElement}const ra={class:"VPMenuLink"},ia=["innerHTML"],la=b({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=L();return(t,a)=>(o(),c("div",ra,[k(D,{class:M({active:i(X)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:m(()=>[p("span",{innerHTML:t.item.text},null,8,ia)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ve=g(la,[["__scopeId","data-v-acbfed09"]]),ca={class:"VPMenuGroup"},ua={key:0,class:"title"},da=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(o(),c("div",ca,[e.text?(o(),c("p",ua,w(e.text),1)):h("",!0),(o(!0),c(T,null,Q(e.items,a=>(o(),c(T,null,["link"in a?(o(),y(ve,{key:0,item:a},null,8,["item"])):h("",!0)],64))),256))]))}}),pa=g(da,[["__scopeId","data-v-48c802d0"]]),fa={class:"VPMenu"},ma={key:0,class:"items"},va=b({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(o(),c("div",fa,[e.items?(o(),c("div",ma,[(o(!0),c(T,null,Q(e.items,a=>(o(),c(T,{key:JSON.stringify(a)},["link"in a?(o(),y(ve,{key:0,item:a},null,8,["item"])):"component"in a?(o(),y(U(a.component),z({key:1,ref_for:!0},a.props),null,16)):(o(),y(pa,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0),d(e.$slots,"default",{},void 0,!0)]))}}),ha=g(va,[["__scopeId","data-v-7dd3104a"]]),_a=["aria-expanded","aria-label"],ba={key:0,class:"text"},ga=["innerHTML"],ka={key:1,class:"vpi-more-horizontal icon"},ya={class:"menu"},$a=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=I(!1),t=I();sa({el:t,onBlur:a});function a(){e.value=!1}return(s,r)=>(o(),c("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=l=>e.value=!0),onMouseleave:r[2]||(r[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=l=>e.value=!e.value)},[s.button||s.icon?(o(),c("span",ba,[s.icon?(o(),c("span",{key:0,class:M([s.icon,"option-icon"])},null,2)):h("",!0),s.button?(o(),c("span",{key:1,innerHTML:s.button},null,8,ga)):h("",!0),r[3]||(r[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(o(),c("span",ka))],8,_a),p("div",ya,[k(ha,{items:s.items},{default:m(()=>[d(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Be=g($a,[["__scopeId","data-v-04f5c5e9"]]),Aa=["href","aria-label","innerHTML"],Pa=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=I();j(async()=>{var r;await Ie();const s=(r=t.value)==null?void 0:r.children[0];s instanceof HTMLElement&&s.className.startsWith("vpi-social-")&&(getComputedStyle(s).maskImage||getComputedStyle(s).webkitMaskImage)==="none"&&s.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const a=P(()=>typeof e.icon=="object"?e.icon.svg:` `);return(s,r)=>(o(),c("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Aa))}}),Sa=g(Pa,[["__scopeId","data-v-d26d30cb"]]),La={class:"VPSocialLinks"},Va=b({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(o(),c("div",La,[(o(!0),c(T,null,Q(e.links,({link:a,icon:s,ariaLabel:r})=>(o(),y(Sa,{key:a,icon:s,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),he=g(Va,[["__scopeId","data-v-ee7a9424"]]),Ca={key:0,class:"group translations"},Ia={class:"trans-title"},Na={key:1,class:"group"},wa={class:"item appearance"},Ma={class:"label"},Ta={class:"appearance-action"},Ea={key:2,class:"group"},Ba={class:"item social-links"},Qa=b({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=L(),{localeLinks:a,currentLang:s}=ne({correspondingLink:!0}),r=P(()=>a.value.length&&s.value.label||e.value.appearance||t.value.socialLinks);return(l,f)=>r.value?(o(),y(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:m(()=>[i(a).length&&i(s).label?(o(),c("div",Ca,[p("p",Ia,w(i(s).label),1),(o(!0),c(T,null,Q(i(a),u=>(o(),y(ve,{key:u.link,item:u},null,8,["item"]))),128))])):h("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(o(),c("div",Na,[p("div",wa,[p("p",Ma,w(i(t).darkModeSwitchLabel||"Appearance"),1),p("div",Ta,[k(Te)])])])):h("",!0),i(t).socialLinks?(o(),c("div",Ea,[p("div",Ba,[k(he,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),Fa=g(Qa,[["__scopeId","data-v-925effce"]]),Ha=["aria-expanded"],Wa=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(o(),c("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=a=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,Ha))}}),Oa=g(Wa,[["__scopeId","data-v-5dea55bf"]]),Da=["innerHTML"],Ua=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=L();return(t,a)=>(o(),y(D,{class:M({VPNavBarMenuLink:!0,active:i(X)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:m(()=>[p("span",{innerHTML:t.item.text},null,8,Da)]),_:1},8,["class","href","target","rel","no-icon"]))}}),Ga=g(Ua,[["__scopeId","data-v-956ec74c"]]),rt=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=L(),a=r=>"component"in r?!1:"link"in r?X(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(a),s=P(()=>a(e.item));return(r,l)=>(o(),y(Be,{class:M({VPNavBarMenuGroup:!0,active:i(X)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||s.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Ra={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ja=b({__name:"VPNavBarMenu",setup(n){const{theme:e}=L();return(t,a)=>i(e).nav?(o(),c("nav",Ra,[a[0]||(a[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(o(!0),c(T,null,Q(i(e).nav,s=>(o(),c(T,{key:JSON.stringify(s)},["link"in s?(o(),y(Ga,{key:0,item:s},null,8,["item"])):"component"in s?(o(),y(U(s.component),z({key:1,ref_for:!0},s.props),null,16)):(o(),y(rt,{key:2,item:s},null,8,["item"]))],64))),128))])):h("",!0)}}),Ja=g(ja,[["__scopeId","data-v-e6d46098"]]);function Ka(n){const{localeIndex:e,theme:t}=L();function a(s){var C,E,V;const r=s.split("."),l=(C=t.value.search)==null?void 0:C.options,f=l&&typeof l=="object",u=f&&((V=(E=l.locales)==null?void 0:E[e.value])==null?void 0:V.translations)||null,_=f&&l.translations||null;let $=u,v=_,A=n;const S=r.pop();for(const B of r){let W=null;const H=A==null?void 0:A[B];H&&(W=A=H);const x=v==null?void 0:v[B];x&&(W=v=x);const F=$==null?void 0:$[B];F&&(W=$=F),H||(A=W),x||(v=W),F||($=W)}return($==null?void 0:$[S])??(v==null?void 0:v[S])??(A==null?void 0:A[S])??""}return a}const za=["aria-label"],Za={class:"DocSearch-Button-Container"},Ya={class:"DocSearch-Button-Placeholder"},Oe=b({__name:"VPNavBarSearchButton",setup(n){const t=Ka({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,s)=>(o(),c("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[p("span",Za,[s[0]||(s[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",Ya,w(i(t)("button.buttonText")),1)]),s[1]||(s[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,za))}}),Xa={class:"VPNavBarSearch"},xa={id:"local-search"},qa={key:1,id:"docsearch"},eo=b({__name:"VPNavBarSearch",setup(n){const e=At(()=>Pt(()=>import("./VPLocalSearchBox.D16mVP9n.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:a}=L(),s=I(!1),r=I(!1);j(()=>{});function l(){s.value||(s.value=!0,setTimeout(f,16))}function f(){const v=new Event("keydown");v.key="k",v.metaKey=!0,window.dispatchEvent(v),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function u(v){const A=v.target,S=A.tagName;return A.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const _=I(!1);ke("k",v=>{(v.ctrlKey||v.metaKey)&&(v.preventDefault(),_.value=!0)}),ke("/",v=>{u(v)||(v.preventDefault(),_.value=!0)});const $="local";return(v,A)=>{var S;return o(),c("div",Xa,[i($)==="local"?(o(),c(T,{key:0},[_.value?(o(),y(i(e),{key:0,onClose:A[0]||(A[0]=C=>_.value=!1)})):h("",!0),p("div",xa,[k(Oe,{onClick:A[1]||(A[1]=C=>_.value=!0)})])],64)):i($)==="algolia"?(o(),c(T,{key:1},[s.value?(o(),y(i(t),{key:0,algolia:((S=i(a).search)==null?void 0:S.options)??i(a).algolia,onVnodeBeforeMount:A[2]||(A[2]=C=>r.value=!0)},null,8,["algolia"])):h("",!0),r.value?h("",!0):(o(),c("div",qa,[k(Oe,{onClick:l})]))],64)):h("",!0)])}}}),to=b({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=L();return(t,a)=>i(e).socialLinks?(o(),y(he,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),no=g(to,[["__scopeId","data-v-164c457f"]]),so=["href","rel","target"],ao=["innerHTML"],oo={key:2},ro=b({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=L(),{hasSidebar:a}=K(),{currentLang:s}=ne(),r=P(()=>{var u;return typeof t.value.logoLink=="string"?t.value.logoLink:(u=t.value.logoLink)==null?void 0:u.link}),l=P(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.rel}),f=P(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.target});return(u,_)=>(o(),c("div",{class:M(["VPNavBarTitle",{"has-sidebar":i(a)}])},[p("a",{class:"title",href:r.value??i(we)(i(s).link),rel:l.value,target:f.value},[d(u.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(o(),y(ce,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(o(),c("span",{key:1,innerHTML:i(t).siteTitle},null,8,ao)):i(t).siteTitle===void 0?(o(),c("span",oo,w(i(e).title),1)):h("",!0),d(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,so)],2))}}),io=g(ro,[["__scopeId","data-v-0f4f798b"]]),lo={class:"items"},co={class:"title"},uo=b({__name:"VPNavBarTranslations",setup(n){const{theme:e}=L(),{localeLinks:t,currentLang:a}=ne({correspondingLink:!0});return(s,r)=>i(t).length&&i(a).label?(o(),y(Be,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:m(()=>[p("div",lo,[p("p",co,w(i(a).label),1),(o(!0),c(T,null,Q(i(t),l=>(o(),y(ve,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),po=g(uo,[["__scopeId","data-v-c80d9ad0"]]),fo={class:"wrapper"},mo={class:"container"},vo={class:"title"},ho={class:"content"},_o={class:"content-body"},bo=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=xe(),{hasSidebar:a}=K(),{frontmatter:s}=L(),r=I({});return Ce(()=>{r.value={"has-sidebar":a.value,home:s.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,f)=>(o(),c("div",{class:M(["VPNavBar",r.value])},[p("div",fo,[p("div",mo,[p("div",vo,[k(io,null,{"nav-bar-title-before":m(()=>[d(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[d(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",ho,[p("div",_o,[d(l.$slots,"nav-bar-content-before",{},void 0,!0),k(eo,{class:"search"}),k(Ja,{class:"menu"}),k(po,{class:"translations"}),k(na,{class:"appearance"}),k(no,{class:"social-links"}),k(Fa,{class:"extra"}),d(l.$slots,"nav-bar-content-after",{},void 0,!0),k(Oa,{class:"hamburger",active:l.isScreenOpen,onClick:f[0]||(f[0]=u=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),go=g(bo,[["__scopeId","data-v-822684d1"]]),ko={key:0,class:"VPNavScreenAppearance"},yo={class:"text"},$o=b({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=L();return(a,s)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(o(),c("div",ko,[p("p",yo,w(i(t).darkModeSwitchLabel||"Appearance"),1),k(Te)])):h("",!0)}}),Ao=g($o,[["__scopeId","data-v-ffb44008"]]),Po=["innerHTML"],So=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=ee("close-screen");return(t,a)=>(o(),y(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:m(()=>[p("span",{innerHTML:t.item.text},null,8,Po)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Lo=g(So,[["__scopeId","data-v-735512b8"]]),Vo=["innerHTML"],Co=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=ee("close-screen");return(t,a)=>(o(),y(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:m(()=>[p("span",{innerHTML:t.item.text},null,8,Vo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),it=g(Co,[["__scopeId","data-v-372ae7c0"]]),Io={class:"VPNavScreenMenuGroupSection"},No={key:0,class:"title"},wo=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(o(),c("div",Io,[e.text?(o(),c("p",No,w(e.text),1)):h("",!0),(o(!0),c(T,null,Q(e.items,a=>(o(),y(it,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Mo=g(wo,[["__scopeId","data-v-4b8941ac"]]),To=["aria-controls","aria-expanded"],Eo=["innerHTML"],Bo=["id"],Qo={key:0,class:"item"},Fo={key:1,class:"item"},Ho={key:2,class:"group"},Wo=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=I(!1),a=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){t.value=!t.value}return(r,l)=>(o(),c("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":a.value,"aria-expanded":t.value,onClick:s},[p("span",{class:"button-text",innerHTML:r.text},null,8,Eo),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,To),p("div",{id:a.value,class:"items"},[(o(!0),c(T,null,Q(r.items,f=>(o(),c(T,{key:JSON.stringify(f)},["link"in f?(o(),c("div",Qo,[k(it,{item:f},null,8,["item"])])):"component"in f?(o(),c("div",Fo,[(o(),y(U(f.component),z({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(o(),c("div",Ho,[k(Mo,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,Bo)],2))}}),lt=g(Wo,[["__scopeId","data-v-875057a5"]]),Oo={key:0,class:"VPNavScreenMenu"},Do=b({__name:"VPNavScreenMenu",setup(n){const{theme:e}=L();return(t,a)=>i(e).nav?(o(),c("nav",Oo,[(o(!0),c(T,null,Q(i(e).nav,s=>(o(),c(T,{key:JSON.stringify(s)},["link"in s?(o(),y(Lo,{key:0,item:s},null,8,["item"])):"component"in s?(o(),y(U(s.component),z({key:1,ref_for:!0},s.props,{"screen-menu":""}),null,16)):(o(),y(lt,{key:2,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Uo=b({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=L();return(t,a)=>i(e).socialLinks?(o(),y(he,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),Go={class:"list"},Ro=b({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=ne({correspondingLink:!0}),a=I(!1);function s(){a.value=!a.value}return(r,l)=>i(e).length&&i(t).label?(o(),c("div",{key:0,class:M(["VPNavScreenTranslations",{open:a.value}])},[p("button",{class:"title",onClick:s},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),G(" "+w(i(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",Go,[(o(!0),c(T,null,Q(i(e),f=>(o(),c("li",{key:f.link,class:"item"},[k(D,{class:"link",href:f.link},{default:m(()=>[G(w(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),jo=g(Ro,[["__scopeId","data-v-362991c2"]]),Jo={class:"container"},Ko=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=I(null),t=qe(me?document.body:null);return(a,s)=>(o(),y(Se,{name:"fade",onEnter:s[0]||(s[0]=r=>t.value=!0),onAfterLeave:s[1]||(s[1]=r=>t.value=!1)},{default:m(()=>[a.open?(o(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",Jo,[d(a.$slots,"nav-screen-content-before",{},void 0,!0),k(Do,{class:"menu"}),k(jo,{class:"translations"}),k(Ao,{class:"appearance"}),k(Uo,{class:"social-links"}),d(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),zo=g(Ko,[["__scopeId","data-v-833aabba"]]),Zo={key:0,class:"VPNav"},Yo=b({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:a}=Js(),{frontmatter:s}=L(),r=P(()=>s.value.navbar!==!1);return Ne("close-screen",t),de(()=>{me&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,f)=>r.value?(o(),c("header",Zo,[k(go,{"is-screen-open":i(e),onToggleScreen:i(a)},{"nav-bar-title-before":m(()=>[d(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[d(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[d(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[d(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(zo,{open:i(e)},{"nav-screen-content-before":m(()=>[d(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[d(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Xo=g(Yo,[["__scopeId","data-v-f1e365da"]]),xo=["role","tabindex"],qo={key:1,class:"items"},er=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:a,isLink:s,isActiveLink:r,hasActiveLink:l,hasChildren:f,toggle:u}=Zt(P(()=>e.item)),_=P(()=>f.value?"section":"div"),$=P(()=>s.value?"a":"div"),v=P(()=>f.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),A=P(()=>s.value?void 0:"button"),S=P(()=>[[`level-${e.depth}`],{collapsible:a.value},{collapsed:t.value},{"is-link":s.value},{"is-active":r.value},{"has-active":l.value}]);function C(V){"key"in V&&V.key!=="Enter"||!e.item.link&&u()}function E(){e.item.link&&u()}return(V,B)=>{const W=Z("VPSidebarItem",!0);return o(),y(U(_.value),{class:M(["VPSidebarItem",S.value])},{default:m(()=>[V.item.text?(o(),c("div",z({key:0,class:"item",role:A.value},St(V.item.items?{click:C,keydown:C}:{},!0),{tabindex:V.item.items&&0}),[B[1]||(B[1]=p("div",{class:"indicator"},null,-1)),V.item.link?(o(),y(D,{key:0,tag:$.value,class:"link",href:V.item.link,rel:V.item.rel,target:V.item.target},{default:m(()=>[(o(),y(U(v.value),{class:"text",innerHTML:V.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(o(),y(U(v.value),{key:1,class:"text",innerHTML:V.item.text},null,8,["innerHTML"])),V.item.collapsed!=null&&V.item.items&&V.item.items.length?(o(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:E,onKeydown:Lt(E,["enter"]),tabindex:"0"},B[0]||(B[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,xo)):h("",!0),V.item.items&&V.item.items.length?(o(),c("div",qo,[V.depth<5?(o(!0),c(T,{key:0},Q(V.item.items,H=>(o(),y(W,{key:H.text,item:H,depth:V.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),tr=g(er,[["__scopeId","data-v-196b2e5f"]]),nr=b({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=I(!0);let t=null;return j(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Vt(()=>{t!=null&&(clearTimeout(t),t=null)}),(a,s)=>(o(!0),c(T,null,Q(a.items,r=>(o(),c("div",{key:r.text,class:M(["group",{"no-transition":e.value}])},[k(tr,{item:r,depth:0},null,8,["item"])],2))),128))}}),sr=g(nr,[["__scopeId","data-v-9e426adc"]]),ar={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},or=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=K(),a=n,s=I(null),r=qe(me?document.body:null);R([a,s],()=>{var f;a.open?(r.value=!0,(f=s.value)==null||f.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=I(0);return R(e,()=>{l.value+=1},{deep:!0}),(f,u)=>i(t)?(o(),c("aside",{key:0,class:M(["VPSidebar",{open:f.open}]),ref_key:"navEl",ref:s,onClick:u[0]||(u[0]=Ct(()=>{},["stop"]))},[u[2]||(u[2]=p("div",{class:"curtain"},null,-1)),p("nav",ar,[u[1]||(u[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),d(f.$slots,"sidebar-nav-before",{},void 0,!0),(o(),y(sr,{items:i(e),key:l.value},null,8,["items"])),d(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),rr=g(or,[["__scopeId","data-v-18756405"]]),ir=b({__name:"VPSkipLink",setup(n){const e=fe(),t=I();R(()=>e.path,()=>t.value.focus());function a({target:s}){const r=document.getElementById(decodeURIComponent(s.hash).slice(1));if(r){const l=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",l)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",l),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(o(),c(T,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:a}," Skip to content ")],64))}}),lr=g(ir,[["__scopeId","data-v-c3508ec8"]]),cr=b({__name:"Layout",setup(n){const{isOpen:e,open:t,close:a}=K(),s=fe();R(()=>s.path,a),zt(e,a);const{frontmatter:r}=L(),l=et(),f=P(()=>!!l["home-hero-image"]);return Ne("hero-image-slot-exists",f),(u,_)=>{const $=Z("Content");return i(r).layout!==!1?(o(),c("div",{key:0,class:M(["Layout",i(r).pageClass])},[d(u.$slots,"layout-top",{},void 0,!0),k(lr),k(Bt,{class:"backdrop",show:i(e),onClick:i(a)},null,8,["show","onClick"]),k(Xo,null,{"nav-bar-title-before":m(()=>[d(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[d(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[d(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[d(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":m(()=>[d(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[d(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(js,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),k(rr,{open:i(e)},{"sidebar-nav-before":m(()=>[d(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":m(()=>[d(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Is,null,{"page-top":m(()=>[d(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[d(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":m(()=>[d(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":m(()=>[d(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[d(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[d(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[d(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[d(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[d(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[d(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[d(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[d(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":m(()=>[d(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[d(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[d(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":m(()=>[d(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[d(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":m(()=>[d(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[d(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[d(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[d(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[d(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[d(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Es),d(u.$slots,"layout-bottom",{},void 0,!0)],2)):(o(),y($,{key:1}))}}}),ur=g(cr,[["__scopeId","data-v-a9a9e638"]]),dr={},pr={class:"VPTeamPage"};function fr(n,e){return o(),c("div",pr,[d(n.$slots,"default")])}const Pi=g(dr,[["render",fr],["__scopeId","data-v-c2f8e101"]]),mr={},vr={class:"VPTeamPageTitle"},hr={key:0,class:"title"},_r={key:1,class:"lead"};function br(n,e){return o(),c("div",vr,[n.$slots.title?(o(),c("h1",hr,[d(n.$slots,"title",{},void 0,!0)])):h("",!0),n.$slots.lead?(o(),c("p",_r,[d(n.$slots,"lead",{},void 0,!0)])):h("",!0)])}const Si=g(mr,[["render",br],["__scopeId","data-v-e277e15c"]]),gr={},kr={class:"VPTeamPageSection"},yr={class:"title"},$r={key:0,class:"title-text"},Ar={key:0,class:"lead"},Pr={key:1,class:"members"};function Sr(n,e){return o(),c("section",kr,[p("div",yr,[e[0]||(e[0]=p("div",{class:"title-line"},null,-1)),n.$slots.title?(o(),c("h2",$r,[d(n.$slots,"title",{},void 0,!0)])):h("",!0)]),n.$slots.lead?(o(),c("p",Ar,[d(n.$slots,"lead",{},void 0,!0)])):h("",!0),n.$slots.members?(o(),c("div",Pr,[d(n.$slots,"members",{},void 0,!0)])):h("",!0)])}const Li=g(gr,[["render",Sr],["__scopeId","data-v-d43bc49d"]]),Lr={class:"profile"},Vr={class:"avatar"},Cr=["src","alt"],Ir={class:"data"},Nr={class:"name"},wr={key:0,class:"affiliation"},Mr={key:0,class:"title"},Tr={key:1,class:"at"},Er=["innerHTML"],Br={key:2,class:"links"},Qr={key:0,class:"sp"},Fr=b({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(o(),c("article",{class:M(["VPTeamMembersItem",[e.size]])},[p("div",Lr,[p("figure",Vr,[p("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Cr)]),p("div",Ir,[p("h1",Nr,w(e.member.name),1),e.member.title||e.member.org?(o(),c("p",wr,[e.member.title?(o(),c("span",Mr,w(e.member.title),1)):h("",!0),e.member.title&&e.member.org?(o(),c("span",Tr," @ ")):h("",!0),e.member.org?(o(),y(D,{key:2,class:M(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:m(()=>[G(w(e.member.org),1)]),_:1},8,["class","href"])):h("",!0)])):h("",!0),e.member.desc?(o(),c("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,Er)):h("",!0),e.member.links?(o(),c("div",Br,[k(he,{links:e.member.links},null,8,["links"])])):h("",!0)])]),e.member.sponsor?(o(),c("div",Qr,[k(D,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:m(()=>[t[0]||(t[0]=p("span",{class:"vpi-heart sp-icon"},null,-1)),G(" "+w(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):h("",!0)],2))}}),Hr=g(Fr,[["__scopeId","data-v-f9987cb6"]]),Wr={class:"container"},Or=b({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=P(()=>[e.size,`count-${e.members.length}`]);return(a,s)=>(o(),c("div",{class:M(["VPTeamMembers",t.value])},[p("div",Wr,[(o(!0),c(T,null,Q(a.members,r=>(o(),c("div",{key:r.name,class:"item"},[k(Hr,{size:a.size,member:r},null,8,["size","member"])]))),128))])],2))}}),Vi=g(Or,[["__scopeId","data-v-fba19bad"]]),De={Layout:ur,enhanceApp:({app:n})=>{n.component("Badge",Mt)}},Dr={},Ur={style:{"text-align":"center"}};function Gr(n,e){const t=Z("font");return o(),c(T,null,[e[1]||(e[1]=p("br",null,null,-1)),p("h1",Ur,[p("strong",null,[k(t,{color:"orange"},{default:m(()=>e[0]||(e[0]=[G(" Package Ecosystem")])),_:1})])]),e[2]||(e[2]=It('DiskArrays.jl
DimensionalData.jl
Zarr.jl
Rasters.jl
NetCDF.jl
ArchGDAL.jl
GeoInterface.jl
GRIBDatasets.jl
NCDatasets.jl
',9))],64)}const Rr=g(Dr,[["render",Gr]]),jr=b({__name:"VersionPicker",props:{screenMenu:{type:Boolean}},setup(n){const e=I([]),t=I("Versions"),a=I(!1);ze();const s=()=>typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"),r=()=>{if(typeof window>"u")return"";const{origin:u,pathname:_}=window.location;if(u.includes("github.io")){const $=_.split("/").filter(Boolean),v=$.length>0?`/${$[0]}`:"";return`${u}${v}`}else return u},l=()=>new Promise(u=>{if(s()){u(!1);return}const _=setInterval(()=>{window.DOC_VERSIONS&&window.DOCUMENTER_CURRENT_VERSION&&(clearInterval(_),u(!0))},100);setTimeout(()=>{clearInterval(_),u(!1)},5e3)});return j(async()=>{if(!(typeof window>"u")){try{if(s()){const u=["dev"];e.value=u.map(_=>({text:_,link:"/"})),t.value="dev"}else{const u=await l(),_=P(()=>r());if(u&&window.DOC_VERSIONS&&window.DOCUMENTER_CURRENT_VERSION)e.value=window.DOC_VERSIONS.map($=>({text:$,link:`${_.value}/${$}/`})),t.value=window.DOCUMENTER_CURRENT_VERSION;else{const $=["dev"];e.value=$.map(v=>({text:v,link:`${_.value}/${v}/`})),t.value="dev"}}}catch(u){console.warn("Error loading versions:",u);const _=["dev"],$=P(()=>r());e.value=_.map(v=>({text:v,link:`${$.value}/${v}/`})),t.value="dev"}a.value=!0}}),(u,_)=>a.value?(o(),c(T,{key:0},[!u.screenMenu&&e.value.length>0?(o(),y(rt,{key:0,item:{text:t.value,items:e.value},class:"VPVersionPicker"},null,8,["item"])):u.screenMenu&&e.value.length>0?(o(),y(lt,{key:1,text:t.value,items:e.value,class:"VPVersionPicker"},null,8,["text","items"])):h("",!0)],64)):h("",!0)}}),Jr=g(jr,[["__scopeId","data-v-44adf51f"]]);function Kr(n){return Math.abs(n=Math.round(n))>=1e21?n.toLocaleString("en").replace(/,/g,""):n.toString(10)}function ue(n,e){if((t=(n=e?n.toExponential(e-1):n.toExponential()).indexOf("e"))<0)return null;var t,a=n.slice(0,t);return[a.length>1?a[0]+a.slice(2):a,+n.slice(t+1)]}function zr(n){return n=ue(Math.abs(n)),n?n[1]:NaN}function Zr(n,e){return function(t,a){for(var s=t.length,r=[],l=0,f=n[0],u=0;s>0&&f>0&&(u+f+1>a&&(f=Math.max(1,a-u)),r.push(t.substring(s-=f,s+f)),!((u+=f+1)>a));)f=n[l=(l+1)%n.length];return r.reverse().join(e)}}function Yr(n){return function(e){return e.replace(/[0-9]/g,function(t){return n[+t]})}}var Xr=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Pe(n){if(!(e=Xr.exec(n)))throw new Error("invalid format: "+n);var e;return new Qe({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}Pe.prototype=Qe.prototype;function Qe(n){this.fill=n.fill===void 0?" ":n.fill+"",this.align=n.align===void 0?">":n.align+"",this.sign=n.sign===void 0?"-":n.sign+"",this.symbol=n.symbol===void 0?"":n.symbol+"",this.zero=!!n.zero,this.width=n.width===void 0?void 0:+n.width,this.comma=!!n.comma,this.precision=n.precision===void 0?void 0:+n.precision,this.trim=!!n.trim,this.type=n.type===void 0?"":n.type+""}Qe.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function xr(n){e:for(var e=n.length,t=1,a=-1,s;t0&&(a=0);break}return a>0?n.slice(0,a)+n.slice(s+1):n}var ct;function qr(n,e){var t=ue(n,e);if(!t)return n+"";var a=t[0],s=t[1],r=s-(ct=Math.max(-8,Math.min(8,Math.floor(s/3)))*3)+1,l=a.length;return r===l?a:r>l?a+new Array(r-l+1).join("0"):r>0?a.slice(0,r)+"."+a.slice(r):"0."+new Array(1-r).join("0")+ue(n,Math.max(0,e+r-1))[0]}function Ue(n,e){var t=ue(n,e);if(!t)return n+"";var a=t[0],s=t[1];return s<0?"0."+new Array(-s).join("0")+a:a.length>s+1?a.slice(0,s+1)+"."+a.slice(s+1):a+new Array(s-a.length+2).join("0")}const Ge={"%":(n,e)=>(n*100).toFixed(e),b:n=>Math.round(n).toString(2),c:n=>n+"",d:Kr,e:(n,e)=>n.toExponential(e),f:(n,e)=>n.toFixed(e),g:(n,e)=>n.toPrecision(e),o:n=>Math.round(n).toString(8),p:(n,e)=>Ue(n*100,e),r:Ue,s:qr,X:n=>Math.round(n).toString(16).toUpperCase(),x:n=>Math.round(n).toString(16)};function Re(n){return n}var je=Array.prototype.map,Je=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function ei(n){var e=n.grouping===void 0||n.thousands===void 0?Re:Zr(je.call(n.grouping,Number),n.thousands+""),t=n.currency===void 0?"":n.currency[0]+"",a=n.currency===void 0?"":n.currency[1]+"",s=n.decimal===void 0?".":n.decimal+"",r=n.numerals===void 0?Re:Yr(je.call(n.numerals,String)),l=n.percent===void 0?"%":n.percent+"",f=n.minus===void 0?"−":n.minus+"",u=n.nan===void 0?"NaN":n.nan+"";function _(v){v=Pe(v);var A=v.fill,S=v.align,C=v.sign,E=v.symbol,V=v.zero,B=v.width,W=v.comma,H=v.precision,x=v.trim,F=v.type;F==="n"?(W=!0,F="g"):Ge[F]||(H===void 0&&(H=12),x=!0,F="g"),(V||A==="0"&&S==="=")&&(V=!0,A="0",S="=");var mt=E==="$"?t:E==="#"&&/[boxX]/.test(F)?"0"+F.toLowerCase():"",vt=E==="$"?a:/[%p]/.test(F)?l:"",Fe=Ge[F],ht=/[defgprs%]/.test(F);H=H===void 0?6:/[gprs]/.test(F)?Math.max(1,Math.min(21,H)):Math.max(0,Math.min(20,H));function He(N){var Y=mt,O=vt,q,We,se;if(F==="c")O=Fe(N)+O,N="";else{N=+N;var ae=N<0||1/N<0;if(N=isNaN(N)?u:Fe(Math.abs(N),H),x&&(N=xr(N)),ae&&+N==0&&C!=="+"&&(ae=!1),Y=(ae?C==="("?C:f:C==="-"||C==="("?"":C)+Y,O=(F==="s"?Je[8+ct/3]:"")+O+(ae&&C==="("?")":""),ht){for(q=-1,We=N.length;++qse||se>57){O=(se===46?s+N.slice(q+1):N.slice(q))+O,N=N.slice(0,q);break}}}W&&!V&&(N=e(N,1/0));var oe=Y.length+N.length+O.length,J=oe>1)+Y+N+O+J.slice(oe);break;default:N=J+Y+N+O;break}return r(N)}return He.toString=function(){return v+""},He}function $(v,A){var S=_((v=Pe(v),v.type="f",v)),C=Math.max(-8,Math.min(8,Math.floor(zr(A)/3)))*3,E=Math.pow(10,-C),V=Je[8+C/3];return function(B){return S(E*B)+V}}return{format:_,formatPrefix:$}}var re,ut;ti({thousands:",",grouping:[3],currency:["$",""]});function ti(n){return re=ei(n),re.format,ut=re.formatPrefix,re}const ie=JSON.parse("104"),ni=["title"],si={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor",style:{"vertical-align":"middle","margin-right":"0.25rem","margin-left":"0.5rem"}},ai=["title"],oi={__name:"StarUs",setup(n){const e=ie?ut(".1s",1e3)(ie):"";return(t,a)=>(o(),c(T,null,[p("a",{target:"_blank","data-decoration":"★",title:i(ie).toLocaleString("en-US").concat(" GitHub stars"),href:"https://github.com/JuliaDataCubes/YAXArrays.jl"},[(o(),c("svg",si,a[0]||(a[0]=[p("path",{d:"M12 .297C5.375.297 0 5.673 0 12.3c0 5.292 3.438 9.8 8.207 11.387.6.11.793-.26.793-.577 0-.285-.01-1.04-.015-2.04-3.338.727-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.807 1.305 3.493.997.107-.774.42-1.305.762-1.605-2.665-.3-5.467-1.333-5.467-5.931 0-1.31.47-2.382 1.236-3.222-.123-.303-.535-1.52.117-3.166 0 0 1.01-.323 3.31 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.3-1.553 3.31-1.23 3.31-1.23.653 1.646.24 2.863.117 3.166.765.84 1.236 1.912 1.236 3.222 0 4.61-2.807 5.625-5.477 5.921.43.372.823 1.102.823 2.222 0 1.606-.015 2.902-.015 3.293 0 .32.192.693.8.577C20.565 22.1 24 17.588 24 12.297 24 5.673 18.627.297 12 .297z"},null,-1)]))),p("span",null,w(i(e)),1)],8,ni),p("a",{class:"mobile",target:"_blank",title:i(ie).toLocaleString("en-US").concat(" GitHub stars"),href:"https://juliadatacubes.github.io/YAXArrays.jl/stable/"},a[1]||(a[1]=[p("svg",{xmlns:"http://www.w3.org/2000/svg",width:"21",height:"21",viewBox:"0 0 21 21",fill:"none"},[p("path",{d:"M19.625 5.60534C18.7083 4.03477 17.4649 2.79135 15.8945 1.87479C14.3238 0.958185 12.6091 0.5 10.7492 0.5C8.88947 0.5 7.17422 0.958325 5.60388 1.87479C4.0333 2.7913 2.78997 4.03477 1.87332 5.60534C0.956814 7.17587 0.498535 8.89089 0.498535 10.7504C0.498535 12.984 1.15021 14.9926 2.4539 16.7766C3.75744 18.5607 5.44142 19.7952 7.50571 20.4803C7.746 20.5249 7.92388 20.4936 8.03954 20.387C8.15524 20.2804 8.21302 20.1467 8.21302 19.9868C8.21302 19.9601 8.21073 19.7199 8.20629 19.266C8.20171 18.8122 8.19956 18.4162 8.19956 18.0783L7.89256 18.1315C7.69682 18.1673 7.44989 18.1825 7.15178 18.1782C6.8538 18.174 6.54446 18.1428 6.22419 18.0847C5.90377 18.0272 5.60575 17.8937 5.32988 17.6846C5.05416 17.4755 4.85842 17.2018 4.74272 16.8639L4.60925 16.5568C4.52029 16.3523 4.38023 16.1251 4.18888 15.8761C3.99754 15.6269 3.80405 15.458 3.60831 15.369L3.51486 15.3021C3.45259 15.2577 3.39481 15.204 3.34138 15.1418C3.28799 15.0796 3.24802 15.0173 3.22132 14.955C3.19458 14.8926 3.21674 14.8414 3.28804 14.8012C3.35933 14.761 3.48817 14.7416 3.67512 14.7416L3.94196 14.7814C4.11993 14.8171 4.34007 14.9236 4.60266 15.1017C4.86511 15.2796 5.08085 15.5109 5.24994 15.7956C5.4547 16.1605 5.7014 16.4385 5.99072 16.6299C6.27982 16.8212 6.5713 16.9167 6.86488 16.9167C7.15846 16.9167 7.41203 16.8945 7.62567 16.8502C7.83908 16.8057 8.0393 16.7388 8.22625 16.6499C8.30633 16.0535 8.52437 15.5953 8.88017 15.275C8.37304 15.2217 7.9171 15.1414 7.51212 15.0347C7.10736 14.9278 6.6891 14.7544 6.25761 14.5139C5.82589 14.2738 5.46774 13.9756 5.18309 13.6198C4.89839 13.2639 4.66474 12.7966 4.48247 12.2183C4.3001 11.6399 4.20889 10.9726 4.20889 10.2163C4.20889 9.13941 4.56044 8.22304 5.26341 7.46665C4.93411 6.65705 4.96519 5.74947 5.35676 4.744C5.61482 4.66382 5.9975 4.72399 6.50463 4.92412C7.01186 5.12434 7.38323 5.29587 7.61912 5.43808C7.85502 5.58024 8.04402 5.70071 8.18642 5.79842C9.01411 5.56715 9.86825 5.45149 10.7491 5.45149C11.6299 5.45149 12.4843 5.56715 13.312 5.79842L13.8192 5.47823C14.166 5.26459 14.5756 5.06881 15.0469 4.89083C15.5185 4.71295 15.8791 4.66396 16.1284 4.74414C16.5286 5.74966 16.5643 6.65719 16.2349 7.46679C16.9378 8.22318 17.2895 9.13978 17.2895 10.2164C17.2895 10.9727 17.198 11.6421 17.0159 12.225C16.8336 12.808 16.5979 13.2749 16.3088 13.6265C16.0194 13.9781 15.659 14.274 15.2275 14.5141C14.7959 14.7544 14.3775 14.9278 13.9728 15.0347C13.5678 15.1415 13.1119 15.2219 12.6047 15.2752C13.0673 15.6755 13.2986 16.3073 13.2986 17.1704V19.9864C13.2986 20.1464 13.3542 20.2799 13.4656 20.3867C13.5768 20.4932 13.7524 20.5246 13.9927 20.4799C16.0573 19.7949 17.7413 18.5603 19.0448 16.7762C20.3481 14.9922 21 12.9837 21 10.75C20.9996 8.89075 20.541 7.17587 19.625 5.60534Z",fill:"currentColor"})],-1)]),8,ai)],64))}},ri=g(oi,[["__scopeId","data-v-a679c84d"]]),ii=n=>{if(typeof document>"u")return{stabilizeScrollPosition:s=>async(...r)=>s(...r)};const e=document.documentElement;return{stabilizeScrollPosition:a=>async(...s)=>{const r=a(...s),l=n.value;if(!l)return r;const f=l.offsetTop-e.scrollTop;return await Ie(),e.scrollTop=l.offsetTop-f,r}}},dt="vitepress:tabSharedState",te=typeof localStorage<"u"?localStorage:null,pt="vitepress:tabsSharedState",li=()=>{const n=te==null?void 0:te.getItem(pt);if(n)try{return JSON.parse(n)}catch{}return{}},ci=n=>{te&&te.setItem(pt,JSON.stringify(n))},ui=n=>{const e=Nt({});R(()=>e.content,(t,a)=>{t&&a&&ci(t)},{deep:!0}),n.provide(dt,e)},di=(n,e)=>{const t=ee(dt);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");j(()=>{t.content||(t.content=li())});const a=I(),s=P({get(){var u;const l=e.value,f=n.value;if(l){const _=(u=t.content)==null?void 0:u[l];if(_&&f.includes(_))return _}else{const _=a.value;if(_)return _}return f[0]},set(l){const f=e.value;f?t.content&&(t.content[f]=l):a.value=l}});return{selected:s,select:l=>{s.value=l}}};let Ke=0;const pi=()=>(Ke++,""+Ke);function fi(){const n=et();return P(()=>{var a;const t=(a=n.default)==null?void 0:a.call(n);return t?t.filter(s=>typeof s.type=="object"&&"__name"in s.type&&s.type.__name==="PluginTabsTab"&&s.props).map(s=>{var r;return(r=s.props)==null?void 0:r.label}):[]})}const ft="vitepress:tabSingleState",mi=n=>{Ne(ft,n)},vi=()=>{const n=ee(ft);if(!n)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return n},hi={class:"plugin-tabs"},_i=["id","aria-selected","aria-controls","tabindex","onClick"],bi=b({__name:"PluginTabs",props:{sharedStateKey:{}},setup(n){const e=n,t=fi(),{selected:a,select:s}=di(t,wt(e,"sharedStateKey")),r=I(),{stabilizeScrollPosition:l}=ii(r),f=l(s),u=I([]),_=v=>{var C;const A=t.value.indexOf(a.value);let S;v.key==="ArrowLeft"?S=A>=1?A-1:t.value.length-1:v.key==="ArrowRight"&&(S=A(o(),c("div",hi,[p("div",{ref_key:"tablist",ref:r,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:_},[(o(!0),c(T,null,Q(i(t),S=>(o(),c("button",{id:`tab-${S}-${i($)}`,ref_for:!0,ref_key:"buttonRefs",ref:u,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===i(a),"aria-controls":`panel-${S}-${i($)}`,tabindex:S===i(a)?0:-1,onClick:()=>i(f)(S)},w(S),9,_i))),128))],544),d(v.$slots,"default")]))}}),gi=["id","aria-labelledby"],ki=b({__name:"PluginTabsTab",props:{label:{}},setup(n){const{uid:e,selected:t}=vi();return(a,s)=>i(t)===a.label?(o(),c("div",{key:0,id:`panel-${a.label}-${i(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${a.label}-${i(e)}`},[d(a.$slots,"default",{},void 0,!0)],8,gi)):h("",!0)}}),yi=g(ki,[["__scopeId","data-v-9b0d03d2"]]),$i=n=>{ui(n),n.component("PluginTabs",bi),n.component("PluginTabsTab",yi)},Ci={extends:De,Layout(){return _e(De.Layout,null,{"aside-ads-before":()=>_e(Rr),"nav-bar-content-after":()=>_e(ri)})},enhanceApp({app:n,router:e,siteData:t}){$i(n),n.component("VersionPicker",Jr)}};export{Ci as R,Si as V,Vi as a,Li as b,Pi as c,Ka as d,L as u};
diff --git a/previews/PR486/assets/cyhvrkj.B7KFIfDV.jpeg b/previews/PR486/assets/cyhvrkj.B7KFIfDV.jpeg
new file mode 100644
index 00000000..793464fc
Binary files /dev/null and b/previews/PR486/assets/cyhvrkj.B7KFIfDV.jpeg differ
diff --git a/previews/PR486/assets/development_contribute.md.CXgVQbV5.js b/previews/PR486/assets/development_contribute.md.CXgVQbV5.js
new file mode 100644
index 00000000..e9ed21ad
--- /dev/null
+++ b/previews/PR486/assets/development_contribute.md.CXgVQbV5.js
@@ -0,0 +1,3 @@
+import{_ as s,c as t,a2 as a,o as i}from"./chunks/framework.piKCME0r.js";const u=JSON.parse('{"title":"Contribute to YAXArrays.jl","description":"","frontmatter":{},"headers":[],"relativePath":"development/contribute.md","filePath":"development/contribute.md","lastUpdated":null}'),l={name:"development/contribute.md"};function o(n,e,r,p,d,h){return i(),t("div",null,e[0]||(e[0]=[a(`Contribute to YAXArrays.jl Pull requests and bug reports are always welcome at the YAXArrays.jl GitHub repository .
Contribute to Documentation Contributing with examples can be done by first creating a new file example here
new file
your_new_file.md
at docs/src/UserGuide/
Once this is done you need to add a new entry here at the appropriate level.
add entry to docs
Your new entry should look like:
{ text: 'Your title example', link: '/UserGuide/your_new_file.md' } Build docs locally If you want to take a look at the docs locally before doing a PR follow the next steps:
Install the dependencies in your system, locate yourself at the docs
level folder, then do
Then simply go to your docs
env and activate it, i.e.
sh docs > julia
+julia > ]
+pkg > activate .
Next, run the scripts. Generate files and build docs by running:
Now go to your terminal
in the same path docs>
and run:
This should ouput http://localhost:5173/YAXArrays.jl/
, copy/paste this into your browser and you are all set.
`,18)]))}const k=s(l,[["render",o]]);export{u as __pageData,k as default};
diff --git a/previews/PR486/assets/development_contribute.md.CXgVQbV5.lean.js b/previews/PR486/assets/development_contribute.md.CXgVQbV5.lean.js
new file mode 100644
index 00000000..e9ed21ad
--- /dev/null
+++ b/previews/PR486/assets/development_contribute.md.CXgVQbV5.lean.js
@@ -0,0 +1,3 @@
+import{_ as s,c as t,a2 as a,o as i}from"./chunks/framework.piKCME0r.js";const u=JSON.parse('{"title":"Contribute to YAXArrays.jl","description":"","frontmatter":{},"headers":[],"relativePath":"development/contribute.md","filePath":"development/contribute.md","lastUpdated":null}'),l={name:"development/contribute.md"};function o(n,e,r,p,d,h){return i(),t("div",null,e[0]||(e[0]=[a(`Contribute to YAXArrays.jl Pull requests and bug reports are always welcome at the YAXArrays.jl GitHub repository .
Contribute to Documentation Contributing with examples can be done by first creating a new file example here
new file
your_new_file.md
at docs/src/UserGuide/
Once this is done you need to add a new entry here at the appropriate level.
add entry to docs
Your new entry should look like:
{ text: 'Your title example', link: '/UserGuide/your_new_file.md' } Build docs locally If you want to take a look at the docs locally before doing a PR follow the next steps:
Install the dependencies in your system, locate yourself at the docs
level folder, then do
Then simply go to your docs
env and activate it, i.e.
sh docs > julia
+julia > ]
+pkg > activate .
Next, run the scripts. Generate files and build docs by running:
Now go to your terminal
in the same path docs>
and run:
This should ouput http://localhost:5173/YAXArrays.jl/
, copy/paste this into your browser and you are all set.
`,18)]))}const k=s(l,[["render",o]]);export{u as __pageData,k as default};
diff --git a/previews/PR486/assets/development_contributors.md.Dh50rkWi.js b/previews/PR486/assets/development_contributors.md.Dh50rkWi.js
new file mode 100644
index 00000000..950a612e
--- /dev/null
+++ b/previews/PR486/assets/development_contributors.md.Dh50rkWi.js
@@ -0,0 +1 @@
+import{V as u,a as l,b as m,c as g}from"./chunks/theme.ChQEK1xa.js";import{c as h,G as r,w as s,k as n,B as c,o as b,a as e,j as t}from"./chunks/framework.piKCME0r.js";const p={align:"justify"},_=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"development/contributors.md","filePath":"development/contributors.md","lastUpdated":null}'),v={name:"development/contributors.md"},j=Object.assign(v,{setup(f){const o=[{avatar:"https://www.bgc-jena.mpg.de/employee_images/121366-1667825290?t=eyJ3aWR0aCI6MjEzLCJoZWlnaHQiOjI3NCwiZml0IjoiY3JvcCIsImZpbGVfZXh0ZW5zaW9uIjoid2VicCIsInF1YWxpdHkiOjg2fQ%3D%3D--3e1d41ff4b1ea8928e6734bc473242a90f797dea",name:"Fabian Gans",title:"Geoscientific Programmer",links:[{icon:"github",link:"https://github.com/meggart"}]},{avatar:"https://avatars.githubusercontent.com/u/17124431?v=4",name:"Felix Cremer",title:"PhD Candidate in Remote Sensing",links:[{icon:"github",link:"https://github.com/felixcremer"}]},{avatar:"https://avatars.githubusercontent.com/u/2534009?v=4",name:"Rafael Schouten",title:"Spatial/ecological modelling",links:[{icon:"github",link:"https://github.com/rafaqz"}]},{avatar:"https://avatars.githubusercontent.com/u/19525261?v=4",name:"Lazaro Alonso",title:"Scientist. Data Visualization",links:[{icon:"github",link:"https://github.com/lazarusA"},{icon:"bluesky",link:"https://bsky.app/profile/lazarusa.bsky.social"},{icon:"x",link:"https://twitter.com/LazarusAlon"},{icon:"linkedin",link:"https://www.linkedin.com/in/lazaro-alonso/"},{icon:"mastodon",link:"https://julialang.social/@LazaroAlonso"}]}];return(k,a)=>{const i=c("font");return b(),h("div",null,[r(n(g),null,{default:s(()=>[r(n(u),null,{title:s(()=>a[0]||(a[0]=[e("Contributors")])),lead:s(()=>[a[8]||(a[8]=t("strong",null,"Current core contributors ",-1)),a[9]||(a[9]=e()),a[10]||(a[10]=t("br",null,null,-1)),t("div",p,[a[4]||(a[4]=e(" They have taking the lead for the ongoing organizational maintenance and technical direction of ")),r(i,{color:"orange"},{default:s(()=>a[1]||(a[1]=[e("YAXArrays.jl")])),_:1}),a[5]||(a[5]=e(", ")),r(i,{color:"orange"},{default:s(()=>a[2]||(a[2]=[e("DiskArrays.jl")])),_:1}),a[6]||(a[6]=e(" and ")),r(i,{color:"orange"},{default:s(()=>a[3]||(a[3]=[e("DimensionalData.jl")])),_:1}),a[7]||(a[7]=e(". "))])]),_:1}),r(n(l),{size:"small",members:o}),r(n(m),null,{title:s(()=>a[11]||(a[11]=[e("Our valuable contributors")])),lead:s(()=>a[12]||(a[12]=[e(" We appreciate all contributions from the Julia community so that this ecosystem can thrive."),t("br",null,null,-1)])),members:s(()=>a[13]||(a[13]=[t("div",{class:"row"},[t("a",{href:"https://github.com/meggart",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/2539563?v=4"})]),t("a",{href:"https://github.com/felixcremer",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/17124431?v=4"})]),t("a",{href:"https://github.com/lazarusA",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/19525261?v=4"})]),t("a",{href:"https://github.com/gdkrmr",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/12512930?v=4"})]),t("a",{href:"https://github.com/apps/github-actions",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/in/15368?v=4"})]),t("a",{href:"https://github.com/pdimens",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/19176506?v=4"})]),t("a",{href:"https://github.com/twinGu",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/29449917?v=4"})]),t("a",{href:"https://github.com/dpabon",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/13040959?v=4"})]),t("a",{href:"https://github.com/Qfl3x",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/20775896?v=4"})]),t("a",{href:"https://github.com/kongdd",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/9815742?v=4"})]),t("a",{href:"https://github.com/MartinuzziFrancesco",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/10376688?v=4"})]),t("a",{href:"https://github.com/Sonicious",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/16307399?v=4"})]),t("a",{href:"https://github.com/rafaqz",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/2534009?v=4"})]),t("a",{href:"https://github.com/danlooo",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/5780565?v=4"})]),t("a",{href:"https://github.com/MarkusZehner",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/56972144?v=4"})]),t("a",{href:"https://github.com/Balinus",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/3630311?v=4"})]),t("a",{href:"https://github.com/singularitti",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/25192197?v=4"})]),t("a",{href:"https://github.com/ckrich",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/28727495?v=4"})]),t("a",{href:"https://github.com/apps/femtocleaner",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/in/4123?v=4"})]),t("a",{href:"https://github.com/ikselven",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/10441332?v=4"})]),t("a",{href:"https://github.com/linamaes",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/7131773?v=4"})])],-1)])),_:1})]),_:1})])}}});export{_ as __pageData,j as default};
diff --git a/previews/PR486/assets/development_contributors.md.Dh50rkWi.lean.js b/previews/PR486/assets/development_contributors.md.Dh50rkWi.lean.js
new file mode 100644
index 00000000..950a612e
--- /dev/null
+++ b/previews/PR486/assets/development_contributors.md.Dh50rkWi.lean.js
@@ -0,0 +1 @@
+import{V as u,a as l,b as m,c as g}from"./chunks/theme.ChQEK1xa.js";import{c as h,G as r,w as s,k as n,B as c,o as b,a as e,j as t}from"./chunks/framework.piKCME0r.js";const p={align:"justify"},_=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"development/contributors.md","filePath":"development/contributors.md","lastUpdated":null}'),v={name:"development/contributors.md"},j=Object.assign(v,{setup(f){const o=[{avatar:"https://www.bgc-jena.mpg.de/employee_images/121366-1667825290?t=eyJ3aWR0aCI6MjEzLCJoZWlnaHQiOjI3NCwiZml0IjoiY3JvcCIsImZpbGVfZXh0ZW5zaW9uIjoid2VicCIsInF1YWxpdHkiOjg2fQ%3D%3D--3e1d41ff4b1ea8928e6734bc473242a90f797dea",name:"Fabian Gans",title:"Geoscientific Programmer",links:[{icon:"github",link:"https://github.com/meggart"}]},{avatar:"https://avatars.githubusercontent.com/u/17124431?v=4",name:"Felix Cremer",title:"PhD Candidate in Remote Sensing",links:[{icon:"github",link:"https://github.com/felixcremer"}]},{avatar:"https://avatars.githubusercontent.com/u/2534009?v=4",name:"Rafael Schouten",title:"Spatial/ecological modelling",links:[{icon:"github",link:"https://github.com/rafaqz"}]},{avatar:"https://avatars.githubusercontent.com/u/19525261?v=4",name:"Lazaro Alonso",title:"Scientist. Data Visualization",links:[{icon:"github",link:"https://github.com/lazarusA"},{icon:"bluesky",link:"https://bsky.app/profile/lazarusa.bsky.social"},{icon:"x",link:"https://twitter.com/LazarusAlon"},{icon:"linkedin",link:"https://www.linkedin.com/in/lazaro-alonso/"},{icon:"mastodon",link:"https://julialang.social/@LazaroAlonso"}]}];return(k,a)=>{const i=c("font");return b(),h("div",null,[r(n(g),null,{default:s(()=>[r(n(u),null,{title:s(()=>a[0]||(a[0]=[e("Contributors")])),lead:s(()=>[a[8]||(a[8]=t("strong",null,"Current core contributors ",-1)),a[9]||(a[9]=e()),a[10]||(a[10]=t("br",null,null,-1)),t("div",p,[a[4]||(a[4]=e(" They have taking the lead for the ongoing organizational maintenance and technical direction of ")),r(i,{color:"orange"},{default:s(()=>a[1]||(a[1]=[e("YAXArrays.jl")])),_:1}),a[5]||(a[5]=e(", ")),r(i,{color:"orange"},{default:s(()=>a[2]||(a[2]=[e("DiskArrays.jl")])),_:1}),a[6]||(a[6]=e(" and ")),r(i,{color:"orange"},{default:s(()=>a[3]||(a[3]=[e("DimensionalData.jl")])),_:1}),a[7]||(a[7]=e(". "))])]),_:1}),r(n(l),{size:"small",members:o}),r(n(m),null,{title:s(()=>a[11]||(a[11]=[e("Our valuable contributors")])),lead:s(()=>a[12]||(a[12]=[e(" We appreciate all contributions from the Julia community so that this ecosystem can thrive."),t("br",null,null,-1)])),members:s(()=>a[13]||(a[13]=[t("div",{class:"row"},[t("a",{href:"https://github.com/meggart",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/2539563?v=4"})]),t("a",{href:"https://github.com/felixcremer",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/17124431?v=4"})]),t("a",{href:"https://github.com/lazarusA",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/19525261?v=4"})]),t("a",{href:"https://github.com/gdkrmr",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/12512930?v=4"})]),t("a",{href:"https://github.com/apps/github-actions",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/in/15368?v=4"})]),t("a",{href:"https://github.com/pdimens",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/19176506?v=4"})]),t("a",{href:"https://github.com/twinGu",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/29449917?v=4"})]),t("a",{href:"https://github.com/dpabon",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/13040959?v=4"})]),t("a",{href:"https://github.com/Qfl3x",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/20775896?v=4"})]),t("a",{href:"https://github.com/kongdd",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/9815742?v=4"})]),t("a",{href:"https://github.com/MartinuzziFrancesco",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/10376688?v=4"})]),t("a",{href:"https://github.com/Sonicious",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/16307399?v=4"})]),t("a",{href:"https://github.com/rafaqz",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/2534009?v=4"})]),t("a",{href:"https://github.com/danlooo",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/5780565?v=4"})]),t("a",{href:"https://github.com/MarkusZehner",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/56972144?v=4"})]),t("a",{href:"https://github.com/Balinus",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/3630311?v=4"})]),t("a",{href:"https://github.com/singularitti",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/25192197?v=4"})]),t("a",{href:"https://github.com/ckrich",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/28727495?v=4"})]),t("a",{href:"https://github.com/apps/femtocleaner",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/in/4123?v=4"})]),t("a",{href:"https://github.com/ikselven",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/10441332?v=4"})]),t("a",{href:"https://github.com/linamaes",target:"_blank"},[t("img",{src:"https://avatars.githubusercontent.com/u/7131773?v=4"})])],-1)])),_:1})]),_:1})])}}});export{_ as __pageData,j as default};
diff --git a/previews/PR486/assets/dzarsbx.C5U_qDue.jpeg b/previews/PR486/assets/dzarsbx.C5U_qDue.jpeg
new file mode 100644
index 00000000..4463667a
Binary files /dev/null and b/previews/PR486/assets/dzarsbx.C5U_qDue.jpeg differ
diff --git a/previews/PR486/assets/frwqpez.DX1O6I5P.jpeg b/previews/PR486/assets/frwqpez.DX1O6I5P.jpeg
new file mode 100644
index 00000000..41b875ad
Binary files /dev/null and b/previews/PR486/assets/frwqpez.DX1O6I5P.jpeg differ
diff --git a/previews/PR486/assets/get_started.md.CdXe2EOO.js b/previews/PR486/assets/get_started.md.CdXe2EOO.js
new file mode 100644
index 00000000..6e526b28
--- /dev/null
+++ b/previews/PR486/assets/get_started.md.CdXe2EOO.js
@@ -0,0 +1,53 @@
+import{_ as a,c as i,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const E=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"get_started.md","filePath":"get_started.md","lastUpdated":null}'),p={name:"get_started.md"};function l(e,s,h,k,r,d){return t(),i("div",null,s[0]||(s[0]=[n(`Getting Started Installation Install Julia v1.10 or above . YAXArrays.jl is available through the Julia package manager. You can enter it by pressing ]
in the REPL and then typing
Alternatively, you can also do
julia import Pkg; Pkg . add ( "YAXArrays" )
Quickstart Create a simple array from random numbers given the size of each dimension or axis:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+a = YAXArray ( rand ( 2 , 3 ))
┌ 2×3 YAXArray{Float64, 2} ┐
+├──────────────────────────┴──────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ data size: 48.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
Assemble a more complex YAXArray
with 4 dimensions, i.e. time, x, y and a variable type:
julia # axes or dimensions with name and tick values
+axlist = (
+ YAX . time ( range ( 1 , 20 , length = 20 )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+ Variables ([ "temperature" , "precipitation" ])
+)
+
+# the actual data matching the dimensions defined in axlist
+data = rand ( 20 , 10 , 15 , 2 )
+
+# metadata about the array
+props = Dict (
+ "origin" => "YAXArrays.jl example" ,
+ "x" => "longitude" ,
+ "y" => "latitude" ,
+);
+
+a2 = YAXArray (axlist, data, props)
┌ 20×10×15×2 YAXArray{Float64, 4} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["temperature", "precipitation"] ReverseOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 3 entries:
+ "y" => "latitude"
+ "x" => "longitude"
+ "origin" => "YAXArrays.jl example"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 46.88 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Get the temperature map at the first point in time:
julia a2[Variables = At ( "temperature" ), time = 1 ] . data
10×15 view(::Array{Float64, 4}, 1, :, :, 1) with eltype Float64:
+ 0.320052 0.500909 0.827727 0.415137 … 0.825496 0.487315 0.0962708
+ 0.209357 0.0833026 0.207967 0.224959 0.309666 0.211397 0.552582
+ 0.507229 0.757781 0.514759 0.973442 0.111379 0.787476 0.0247931
+ 0.879677 0.374138 0.97643 0.748725 0.665274 0.776172 0.666534
+ 0.79472 0.958973 0.0114824 0.274902 0.499743 0.645512 0.622774
+ 0.320869 0.952795 0.547668 0.982108 … 0.80871 0.253383 0.743343
+ 0.496429 0.0436 0.790617 0.233118 0.137114 0.55245 0.716721
+ 0.683599 0.598769 0.0571978 0.155874 0.623962 0.959705 0.957463
+ 0.179919 0.551487 0.783779 0.828388 0.303359 0.542756 0.903079
+ 0.487093 0.78064 0.191898 0.908084 0.60764 0.833498 0.198806
Updates TIP
The Julia Compiler is always improving. As such, we recommend using the latest stable version of Julia.
You may check the installed version with:
INFO
With YAXArrays.jl 0.5
we switched the underlying data type to be a subtype of the DimensionalData.jl types. Therefore the indexing with named dimensions changed to the DimensionalData syntax. See the DimensionalData.jl docs
.
`,21)]))}const g=a(p,[["render",l]]);export{E as __pageData,g as default};
diff --git a/previews/PR486/assets/get_started.md.CdXe2EOO.lean.js b/previews/PR486/assets/get_started.md.CdXe2EOO.lean.js
new file mode 100644
index 00000000..6e526b28
--- /dev/null
+++ b/previews/PR486/assets/get_started.md.CdXe2EOO.lean.js
@@ -0,0 +1,53 @@
+import{_ as a,c as i,a2 as n,o as t}from"./chunks/framework.piKCME0r.js";const E=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"get_started.md","filePath":"get_started.md","lastUpdated":null}'),p={name:"get_started.md"};function l(e,s,h,k,r,d){return t(),i("div",null,s[0]||(s[0]=[n(`Getting Started Installation Install Julia v1.10 or above . YAXArrays.jl is available through the Julia package manager. You can enter it by pressing ]
in the REPL and then typing
Alternatively, you can also do
julia import Pkg; Pkg . add ( "YAXArrays" )
Quickstart Create a simple array from random numbers given the size of each dimension or axis:
julia using YAXArrays
+using YAXArrays : YAXArrays as YAX
+
+a = YAXArray ( rand ( 2 , 3 ))
┌ 2×3 YAXArray{Float64, 2} ┐
+├──────────────────────────┴──────────────────────────────────── dims ┐
+ ↓ Dim_1 Sampled{Int64} Base.OneTo(2) ForwardOrdered Regular Points,
+ → Dim_2 Sampled{Int64} Base.OneTo(3) ForwardOrdered Regular Points
+├─────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├─────────────────────────────────────────────────── loaded in memory ┤
+ data size: 48.0 bytes
+└─────────────────────────────────────────────────────────────────────┘
Assemble a more complex YAXArray
with 4 dimensions, i.e. time, x, y and a variable type:
julia # axes or dimensions with name and tick values
+axlist = (
+ YAX . time ( range ( 1 , 20 , length = 20 )),
+ lon ( range ( 1 , 10 , length = 10 )),
+ lat ( range ( 1 , 5 , length = 15 )),
+ Variables ([ "temperature" , "precipitation" ])
+)
+
+# the actual data matching the dimensions defined in axlist
+data = rand ( 20 , 10 , 15 , 2 )
+
+# metadata about the array
+props = Dict (
+ "origin" => "YAXArrays.jl example" ,
+ "x" => "longitude" ,
+ "y" => "latitude" ,
+);
+
+a2 = YAXArray (axlist, data, props)
┌ 20×10×15×2 YAXArray{Float64, 4} ┐
+├─────────────────────────────────┴────────────────────────────────────── dims ┐
+ ↓ time Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,
+ → lon Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+ ↗ lat Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+ ⬔ Variables Categorical{String} ["temperature", "precipitation"] ReverseOrdered
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, String} with 3 entries:
+ "y" => "latitude"
+ "x" => "longitude"
+ "origin" => "YAXArrays.jl example"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 46.88 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Get the temperature map at the first point in time:
julia a2[Variables = At ( "temperature" ), time = 1 ] . data
10×15 view(::Array{Float64, 4}, 1, :, :, 1) with eltype Float64:
+ 0.320052 0.500909 0.827727 0.415137 … 0.825496 0.487315 0.0962708
+ 0.209357 0.0833026 0.207967 0.224959 0.309666 0.211397 0.552582
+ 0.507229 0.757781 0.514759 0.973442 0.111379 0.787476 0.0247931
+ 0.879677 0.374138 0.97643 0.748725 0.665274 0.776172 0.666534
+ 0.79472 0.958973 0.0114824 0.274902 0.499743 0.645512 0.622774
+ 0.320869 0.952795 0.547668 0.982108 … 0.80871 0.253383 0.743343
+ 0.496429 0.0436 0.790617 0.233118 0.137114 0.55245 0.716721
+ 0.683599 0.598769 0.0571978 0.155874 0.623962 0.959705 0.957463
+ 0.179919 0.551487 0.783779 0.828388 0.303359 0.542756 0.903079
+ 0.487093 0.78064 0.191898 0.908084 0.60764 0.833498 0.198806
Updates TIP
The Julia Compiler is always improving. As such, we recommend using the latest stable version of Julia.
You may check the installed version with:
INFO
With YAXArrays.jl 0.5
we switched the underlying data type to be a subtype of the DimensionalData.jl types. Therefore the indexing with named dimensions changed to the DimensionalData syntax. See the DimensionalData.jl docs
.
`,21)]))}const g=a(p,[["render",l]]);export{E as __pageData,g as default};
diff --git a/previews/PR486/assets/idgplot.Blc9BtwN.jpeg b/previews/PR486/assets/idgplot.Blc9BtwN.jpeg
new file mode 100644
index 00000000..e859d8b9
Binary files /dev/null and b/previews/PR486/assets/idgplot.Blc9BtwN.jpeg differ
diff --git a/previews/PR486/assets/index.md.N2EASpe3.js b/previews/PR486/assets/index.md.N2EASpe3.js
new file mode 100644
index 00000000..252a4700
--- /dev/null
+++ b/previews/PR486/assets/index.md.N2EASpe3.js
@@ -0,0 +1,9 @@
+import{_ as s,c as a,a2 as t,o as e}from"./chunks/framework.piKCME0r.js";const g=JSON.parse(`{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YAXArrays.jl","text":"Yet another xarray-like Julia package","tagline":"A package for operating on out-of-core labeled arrays, based on stores like NetCDF, Zarr or GDAL.","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"theme":"brand","text":"Get Started","link":"/get_started"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaDataCubes/YAXArrays.jl"},{"theme":"alt","text":"API reference","link":"/api"}]},"features":[{"title":"Flexible I/O capabilities","details":"Open and operate on NetCDF and Zarr datasets directly. Or bring in data from other sources with ArchGDAL.jl, GRIBDatasets.jl, GeoJSON.jl, HDF5.jl, Shapefile.jl, GeoParquet.jl, etc.","link":"/UserGuide/read"},{"title":"Interoperability","details":"Well integrated with Julia's ecosystem, i.e., distributed operations are native. And plotting with Makie.jl is well supported.","link":"/tutorials/plottingmaps"},{"title":"Named dimensions and GroupBy(in memory)","details":"Apply operations over named dimensions, select values by labels and integers as well as efficient split-apply-combine operations with groupby via DimensionalData.jl.","link":"/UserGuide/group"},{"title":"Efficiency","details":"Efficient mapslices(x) and mapCube operations on huge multiple arrays, optimized for high-latency data access (object storage, compressed datasets).","link":"/UserGuide/compute"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}`),l={name:"index.md"};function n(p,i,h,r,k,o){return e(),a("div",null,i[0]||(i[0]=[t(`How to Install YAXArrays.jl? Since YAXArrays.jl
is registered in the Julia General registry, you can simply run the following command in the Julia REPL:
julia julia > using Pkg
+julia > Pkg . add ( "YAXArrays.jl" )
+# or
+julia > ] # ']' should be pressed
+pkg > add YAXArrays
If you want to use the latest unreleased version, you can run the following command:
julia pkg > add YAXArrays #master
Want interoperability? Install the following package(s) for:
`,8)]))}const E=s(l,[["render",n]]);export{g as __pageData,E as default};
diff --git a/previews/PR486/assets/index.md.N2EASpe3.lean.js b/previews/PR486/assets/index.md.N2EASpe3.lean.js
new file mode 100644
index 00000000..252a4700
--- /dev/null
+++ b/previews/PR486/assets/index.md.N2EASpe3.lean.js
@@ -0,0 +1,9 @@
+import{_ as s,c as a,a2 as t,o as e}from"./chunks/framework.piKCME0r.js";const g=JSON.parse(`{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YAXArrays.jl","text":"Yet another xarray-like Julia package","tagline":"A package for operating on out-of-core labeled arrays, based on stores like NetCDF, Zarr or GDAL.","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"theme":"brand","text":"Get Started","link":"/get_started"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaDataCubes/YAXArrays.jl"},{"theme":"alt","text":"API reference","link":"/api"}]},"features":[{"title":"Flexible I/O capabilities","details":"Open and operate on NetCDF and Zarr datasets directly. Or bring in data from other sources with ArchGDAL.jl, GRIBDatasets.jl, GeoJSON.jl, HDF5.jl, Shapefile.jl, GeoParquet.jl, etc.","link":"/UserGuide/read"},{"title":"Interoperability","details":"Well integrated with Julia's ecosystem, i.e., distributed operations are native. And plotting with Makie.jl is well supported.","link":"/tutorials/plottingmaps"},{"title":"Named dimensions and GroupBy(in memory)","details":"Apply operations over named dimensions, select values by labels and integers as well as efficient split-apply-combine operations with groupby via DimensionalData.jl.","link":"/UserGuide/group"},{"title":"Efficiency","details":"Efficient mapslices(x) and mapCube operations on huge multiple arrays, optimized for high-latency data access (object storage, compressed datasets).","link":"/UserGuide/compute"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}`),l={name:"index.md"};function n(p,i,h,r,k,o){return e(),a("div",null,i[0]||(i[0]=[t(`How to Install YAXArrays.jl? Since YAXArrays.jl
is registered in the Julia General registry, you can simply run the following command in the Julia REPL:
julia julia > using Pkg
+julia > Pkg . add ( "YAXArrays.jl" )
+# or
+julia > ] # ']' should be pressed
+pkg > add YAXArrays
If you want to use the latest unreleased version, you can run the following command:
julia pkg > add YAXArrays #master
Want interoperability? Install the following package(s) for:
`,8)]))}const E=s(l,[["render",n]]);export{g as __pageData,E as default};
diff --git a/previews/PR486/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/previews/PR486/assets/inter-italic-cyrillic-ext.r48I6akx.woff2
new file mode 100644
index 00000000..b6b603d5
Binary files /dev/null and b/previews/PR486/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/previews/PR486/assets/inter-italic-cyrillic.By2_1cv3.woff2
new file mode 100644
index 00000000..def40a4f
Binary files /dev/null and b/previews/PR486/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/previews/PR486/assets/inter-italic-greek-ext.1u6EdAuj.woff2
new file mode 100644
index 00000000..e070c3d3
Binary files /dev/null and b/previews/PR486/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/previews/PR486/assets/inter-italic-greek.DJ8dCoTZ.woff2
new file mode 100644
index 00000000..a3c16ca4
Binary files /dev/null and b/previews/PR486/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/previews/PR486/assets/inter-italic-latin-ext.CN1xVJS-.woff2
new file mode 100644
index 00000000..2210a899
Binary files /dev/null and b/previews/PR486/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-latin.C2AdPX0b.woff2 b/previews/PR486/assets/inter-italic-latin.C2AdPX0b.woff2
new file mode 100644
index 00000000..790d62dc
Binary files /dev/null and b/previews/PR486/assets/inter-italic-latin.C2AdPX0b.woff2 differ
diff --git a/previews/PR486/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/previews/PR486/assets/inter-italic-vietnamese.BSbpV94h.woff2
new file mode 100644
index 00000000..1eec0775
Binary files /dev/null and b/previews/PR486/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/previews/PR486/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2
new file mode 100644
index 00000000..2cfe6153
Binary files /dev/null and b/previews/PR486/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/previews/PR486/assets/inter-roman-cyrillic.C5lxZ8CY.woff2
new file mode 100644
index 00000000..e3886dd1
Binary files /dev/null and b/previews/PR486/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/previews/PR486/assets/inter-roman-greek-ext.CqjqNYQ-.woff2
new file mode 100644
index 00000000..36d67487
Binary files /dev/null and b/previews/PR486/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-greek.BBVDIX6e.woff2 b/previews/PR486/assets/inter-roman-greek.BBVDIX6e.woff2
new file mode 100644
index 00000000..2bed1e85
Binary files /dev/null and b/previews/PR486/assets/inter-roman-greek.BBVDIX6e.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/previews/PR486/assets/inter-roman-latin-ext.4ZJIpNVo.woff2
new file mode 100644
index 00000000..9a8d1e2b
Binary files /dev/null and b/previews/PR486/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-latin.Di8DUHzh.woff2 b/previews/PR486/assets/inter-roman-latin.Di8DUHzh.woff2
new file mode 100644
index 00000000..07d3c53a
Binary files /dev/null and b/previews/PR486/assets/inter-roman-latin.Di8DUHzh.woff2 differ
diff --git a/previews/PR486/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/previews/PR486/assets/inter-roman-vietnamese.BjW4sHH5.woff2
new file mode 100644
index 00000000..57bdc22a
Binary files /dev/null and b/previews/PR486/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ
diff --git a/previews/PR486/assets/jkytbph.C-WFBMfk.png b/previews/PR486/assets/jkytbph.C-WFBMfk.png
new file mode 100644
index 00000000..5bb3fc16
Binary files /dev/null and b/previews/PR486/assets/jkytbph.C-WFBMfk.png differ
diff --git a/previews/PR486/assets/lnenoem.DldUI1n7.jpeg b/previews/PR486/assets/lnenoem.DldUI1n7.jpeg
new file mode 100644
index 00000000..b4577158
Binary files /dev/null and b/previews/PR486/assets/lnenoem.DldUI1n7.jpeg differ
diff --git a/previews/PR486/assets/mbalbzx.96k_BqPR.jpeg b/previews/PR486/assets/mbalbzx.96k_BqPR.jpeg
new file mode 100644
index 00000000..c10e4016
Binary files /dev/null and b/previews/PR486/assets/mbalbzx.96k_BqPR.jpeg differ
diff --git a/previews/PR486/assets/mmzaksu.BJNzQY3Z.png b/previews/PR486/assets/mmzaksu.BJNzQY3Z.png
new file mode 100644
index 00000000..520e812c
Binary files /dev/null and b/previews/PR486/assets/mmzaksu.BJNzQY3Z.png differ
diff --git a/previews/PR486/assets/obatlyf.D9rvatPm.png b/previews/PR486/assets/obatlyf.D9rvatPm.png
new file mode 100644
index 00000000..8eccd132
Binary files /dev/null and b/previews/PR486/assets/obatlyf.D9rvatPm.png differ
diff --git a/previews/PR486/assets/oowdcxc.B7b9FwLj.jpeg b/previews/PR486/assets/oowdcxc.B7b9FwLj.jpeg
new file mode 100644
index 00000000..16af7e06
Binary files /dev/null and b/previews/PR486/assets/oowdcxc.B7b9FwLj.jpeg differ
diff --git a/previews/PR486/assets/pdifvqr.Dwd2F2F-.jpeg b/previews/PR486/assets/pdifvqr.Dwd2F2F-.jpeg
new file mode 100644
index 00000000..6b2240ae
Binary files /dev/null and b/previews/PR486/assets/pdifvqr.Dwd2F2F-.jpeg differ
diff --git a/previews/PR486/assets/ssvwqbb.Cj8iZQLt.jpeg b/previews/PR486/assets/ssvwqbb.Cj8iZQLt.jpeg
new file mode 100644
index 00000000..4d27b9c3
Binary files /dev/null and b/previews/PR486/assets/ssvwqbb.Cj8iZQLt.jpeg differ
diff --git a/previews/PR486/assets/style.DuT_E6J7.css b/previews/PR486/assets/style.DuT_E6J7.css
new file mode 100644
index 00000000..fb70f46f
--- /dev/null
+++ b/previews/PR486/assets/style.DuT_E6J7.css
@@ -0,0 +1 @@
+@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/YAXArrays.jl/previews/PR486/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}.NotFound[data-v-951cab6c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-951cab6c]{padding:96px 32px 168px}}.code[data-v-951cab6c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-951cab6c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-951cab6c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-951cab6c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-951cab6c]{padding-top:20px}.link[data-v-951cab6c]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-951cab6c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3f927ebe]{position:relative;z-index:1}.nested[data-v-3f927ebe]{padding-right:16px;padding-left:16px}.outline-link[data-v-3f927ebe]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3f927ebe]:hover,.outline-link.active[data-v-3f927ebe]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3f927ebe]{padding-left:13px}.VPDocAsideOutline[data-v-b38bf2ff]{display:none}.VPDocAsideOutline.has-outline[data-v-b38bf2ff]{display:block}.content[data-v-b38bf2ff]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b38bf2ff]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b38bf2ff]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-475f71b8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-475f71b8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-4f9813fa]{margin-top:64px}.edit-info[data-v-4f9813fa]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-4f9813fa]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-4f9813fa]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-4f9813fa]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-4f9813fa]{margin-right:8px}.prev-next[data-v-4f9813fa]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-4f9813fa]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-4f9813fa]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-4f9813fa]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-4f9813fa]{margin-left:auto;text-align:right}.desc[data-v-4f9813fa]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-4f9813fa]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-83890dd9]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-83890dd9]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-83890dd9]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-83890dd9]{display:flex;justify-content:center}.VPDoc .aside[data-v-83890dd9]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{max-width:1104px}}.container[data-v-83890dd9]{margin:0 auto;width:100%}.aside[data-v-83890dd9]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-83890dd9]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-83890dd9]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-83890dd9]::-webkit-scrollbar{display:none}.aside-curtain[data-v-83890dd9]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-83890dd9]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-83890dd9]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-83890dd9]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-83890dd9]{order:1;margin:0;min-width:640px}}.content-container[data-v-83890dd9]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-83890dd9]{max-width:688px}.VPButton[data-v-906d7fb4]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-906d7fb4]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-906d7fb4]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-906d7fb4]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-906d7fb4]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-906d7fb4]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-906d7fb4]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-906d7fb4]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-906d7fb4]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-906d7fb4]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-906d7fb4]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-906d7fb4]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-906d7fb4]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-35a7d0b8]{display:none}.dark .VPImage.light[data-v-35a7d0b8]{display:none}.VPHero[data-v-955009fc]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-955009fc]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-955009fc]{flex-direction:row}}.main[data-v-955009fc]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-955009fc]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-955009fc]{text-align:left}}@media (min-width: 960px){.main[data-v-955009fc]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-955009fc]{max-width:592px}}.name[data-v-955009fc],.text[data-v-955009fc]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0 auto}.name[data-v-955009fc]{color:var(--vp-home-hero-name-color)}.clip[data-v-955009fc]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-955009fc],.text[data-v-955009fc]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-955009fc],.text[data-v-955009fc]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0}}.tagline[data-v-955009fc]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-955009fc]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-955009fc]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-955009fc]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-955009fc]{margin:0}}.actions[data-v-955009fc]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-955009fc]{justify-content:center}@media (min-width: 640px){.actions[data-v-955009fc]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-955009fc]{justify-content:flex-start}}.action[data-v-955009fc]{flex-shrink:0;padding:6px}.image[data-v-955009fc]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-955009fc]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-955009fc]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-955009fc]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-955009fc]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-955009fc]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-955009fc]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-955009fc]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-955009fc]{width:320px;height:320px}}[data-v-955009fc] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-955009fc] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-955009fc] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f5e9645b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f5e9645b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f5e9645b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f5e9645b]>.VPImage{margin-bottom:20px}.icon[data-v-f5e9645b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f5e9645b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f5e9645b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f5e9645b]{padding-top:8px}.link-text-value[data-v-f5e9645b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f5e9645b]{margin-left:6px}.VPFeatures[data-v-d0a190d7]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d0a190d7]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d0a190d7]{padding:0 64px}}.container[data-v-d0a190d7]{margin:0 auto;max-width:1152px}.items[data-v-d0a190d7]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d0a190d7]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7]{width:50%}.item.grid-3[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d0a190d7]{width:25%}}.container[data-v-7a48a447]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-7a48a447]{padding:0 48px}}@media (min-width: 960px){.container[data-v-7a48a447]{width:100%;padding:0 64px}}.vp-doc[data-v-7a48a447] .VPHomeSponsors,.vp-doc[data-v-7a48a447] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-7a48a447] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-7a48a447] .VPHomeSponsors a,.vp-doc[data-v-7a48a447] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cbb6ec48]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cbb6ec48]{margin-bottom:128px}}.VPContent[data-v-91765379]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91765379]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91765379]{margin:0}@media (min-width: 960px){.VPContent[data-v-91765379]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91765379]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91765379]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c970a860]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c970a860]{display:none}.VPFooter[data-v-c970a860] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c970a860] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c970a860]{padding:32px}}.container[data-v-c970a860]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c970a860],.copyright[data-v-c970a860]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bc9dc845]{color:var(--vp-c-text-1)}.icon[data-v-bc9dc845]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{font-size:14px}.icon[data-v-bc9dc845]{font-size:16px}}.open>.icon[data-v-bc9dc845]{transform:rotate(90deg)}.items[data-v-bc9dc845]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bc9dc845]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bc9dc845]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bc9dc845]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bc9dc845]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bc9dc845]{transition:all .2s ease-out}.flyout-leave-active[data-v-bc9dc845]{transition:all .15s ease-in}.flyout-enter-from[data-v-bc9dc845],.flyout-leave-to[data-v-bc9dc845]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-070ab83d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-070ab83d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-070ab83d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-070ab83d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-070ab83d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-070ab83d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-070ab83d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-070ab83d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-070ab83d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-070ab83d]{display:none}}.menu-icon[data-v-070ab83d]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-070ab83d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-070ab83d]{padding:12px 32px 11px}}.VPSwitch[data-v-4a1c76db]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4a1c76db]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4a1c76db]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4a1c76db]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4a1c76db] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4a1c76db] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-e40a8bb6]{opacity:1}.moon[data-v-e40a8bb6],.dark .sun[data-v-e40a8bb6]{opacity:0}.dark .moon[data-v-e40a8bb6]{opacity:1}.dark .VPSwitchAppearance[data-v-e40a8bb6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-af096f4a]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-af096f4a]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-acbfed09]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-acbfed09]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-acbfed09]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-acbfed09]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7dd3104a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7dd3104a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7dd3104a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7dd3104a] .group:last-child{padding-bottom:0}.VPMenu[data-v-7dd3104a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7dd3104a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7dd3104a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7dd3104a] .action{padding-left:24px}.VPFlyout[data-v-04f5c5e9]{position:relative}.VPFlyout[data-v-04f5c5e9]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-04f5c5e9]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-04f5c5e9]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-04f5c5e9]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-04f5c5e9]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-04f5c5e9]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-04f5c5e9],.button[aria-expanded=true]+.menu[data-v-04f5c5e9]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-04f5c5e9]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-04f5c5e9]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-04f5c5e9]{margin-right:0;font-size:16px}.text-icon[data-v-04f5c5e9]{margin-left:4px;font-size:14px}.icon[data-v-04f5c5e9]{font-size:20px;transition:fill .25s}.menu[data-v-04f5c5e9]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-d26d30cb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d26d30cb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d26d30cb]>svg,.VPSocialLink[data-v-d26d30cb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-ee7a9424]{display:flex;justify-content:center}.VPNavBarExtra[data-v-925effce]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-925effce]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-925effce]{display:none}}.trans-title[data-v-925effce]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-925effce],.item.social-links[data-v-925effce]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-925effce]{min-width:176px}.appearance-action[data-v-925effce]{margin-right:-2px}.social-links-list[data-v-925effce]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-956ec74c]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-956ec74c],.VPNavBarMenuLink[data-v-956ec74c]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e6d46098]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e6d46098]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.title[data-v-0f4f798b]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0f4f798b]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0f4f798b]{border-bottom-color:var(--vp-c-divider)}}[data-v-0f4f798b] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-c80d9ad0]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-c80d9ad0]{display:flex;align-items:center}}.title[data-v-c80d9ad0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-822684d1]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-822684d1]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-822684d1]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-822684d1]:not(.home){background-color:transparent}.VPNavBar[data-v-822684d1]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-822684d1]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-822684d1]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-822684d1]{padding:0}}.container[data-v-822684d1]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-822684d1],.container>.content[data-v-822684d1]{pointer-events:none}.container[data-v-822684d1] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-822684d1]{max-width:100%}}.title[data-v-822684d1]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-822684d1]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-822684d1]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-822684d1]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-822684d1]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-822684d1]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-822684d1]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-822684d1]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-822684d1]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-822684d1]{column-gap:.5rem}}.menu+.translations[data-v-822684d1]:before,.menu+.appearance[data-v-822684d1]:before,.menu+.social-links[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before,.appearance+.social-links[data-v-822684d1]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before{margin-right:16px}.appearance+.social-links[data-v-822684d1]:before{margin-left:16px}.social-links[data-v-822684d1]{margin-right:-8px}.divider[data-v-822684d1]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-822684d1]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-822684d1]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-ffb44008]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ffb44008]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-735512b8]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-735512b8]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-372ae7c0]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-372ae7c0]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b8941ac]{display:block}.title[data-v-4b8941ac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-875057a5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-875057a5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-875057a5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-875057a5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-875057a5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-875057a5]{transform:rotate(45deg)}.button[data-v-875057a5]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-875057a5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-875057a5]{transition:transform .25s}.group[data-v-875057a5]:first-child{padding-top:0}.group+.group[data-v-875057a5],.group+.item[data-v-875057a5]{padding-top:4px}.VPNavScreenTranslations[data-v-362991c2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-362991c2]{height:auto}.title[data-v-362991c2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-362991c2]{font-size:16px}.icon.lang[data-v-362991c2]{margin-right:8px}.icon.chevron[data-v-362991c2]{margin-left:4px}.list[data-v-362991c2]{padding:4px 0 0 24px}.link[data-v-362991c2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-833aabba]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-833aabba],.VPNavScreen.fade-leave-active[data-v-833aabba]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-833aabba],.VPNavScreen.fade-leave-active .container[data-v-833aabba]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-833aabba],.VPNavScreen.fade-leave-to[data-v-833aabba]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-833aabba],.VPNavScreen.fade-leave-to .container[data-v-833aabba]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-833aabba]{display:none}}.container[data-v-833aabba]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-833aabba],.menu+.appearance[data-v-833aabba],.translations+.appearance[data-v-833aabba]{margin-top:24px}.menu+.social-links[data-v-833aabba]{margin-top:16px}.appearance+.social-links[data-v-833aabba]{margin-top:16px}.VPNav[data-v-f1e365da]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-f1e365da]{position:fixed}}.VPSidebarItem.level-0[data-v-196b2e5f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-196b2e5f]{padding-bottom:10px}.item[data-v-196b2e5f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-196b2e5f]{cursor:pointer}.indicator[data-v-196b2e5f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-196b2e5f]{background-color:var(--vp-c-brand-1)}.link[data-v-196b2e5f]{display:flex;align-items:center;flex-grow:1}.text[data-v-196b2e5f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-196b2e5f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-196b2e5f],.VPSidebarItem.level-2 .text[data-v-196b2e5f],.VPSidebarItem.level-3 .text[data-v-196b2e5f],.VPSidebarItem.level-4 .text[data-v-196b2e5f],.VPSidebarItem.level-5 .text[data-v-196b2e5f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-196b2e5f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.caret[data-v-196b2e5f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-196b2e5f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-196b2e5f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-196b2e5f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-196b2e5f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-196b2e5f],.VPSidebarItem.level-2 .items[data-v-196b2e5f],.VPSidebarItem.level-3 .items[data-v-196b2e5f],.VPSidebarItem.level-4 .items[data-v-196b2e5f],.VPSidebarItem.level-5 .items[data-v-196b2e5f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-196b2e5f]{display:none}.no-transition[data-v-9e426adc] .caret-icon{transition:none}.group+.group[data-v-9e426adc]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-9e426adc]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-18756405]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-18756405]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-18756405]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-18756405]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-18756405]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-18756405]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-18756405]{outline:0}.VPSkipLink[data-v-c3508ec8]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c3508ec8]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c3508ec8]{top:14px;left:16px}}.Layout[data-v-a9a9e638]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-db81191c]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-db81191c]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{margin:128px 0}}.VPHomeSponsors[data-v-db81191c]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-db81191c]{padding:0 64px}}.container[data-v-db81191c]{margin:0 auto;max-width:1152px}.love[data-v-db81191c]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-db81191c]{display:inline-block}.message[data-v-db81191c]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-db81191c]{padding-top:32px}.action[data-v-db81191c]{padding-top:40px;text-align:center}.VPTeamPage[data-v-c2f8e101]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-c2f8e101]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-c2f8e101-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-c2f8e101-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:96px}}.VPTeamMembers[data-v-c2f8e101-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-f9987cb6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f9987cb6]{padding:32px}.VPTeamMembersItem.small .data[data-v-f9987cb6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f9987cb6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f9987cb6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f9987cb6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f9987cb6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f9987cb6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f9987cb6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f9987cb6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f9987cb6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f9987cb6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f9987cb6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f9987cb6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f9987cb6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f9987cb6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f9987cb6]{text-align:center}.avatar[data-v-f9987cb6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f9987cb6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f9987cb6]{margin:0;font-weight:600}.affiliation[data-v-f9987cb6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f9987cb6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f9987cb6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f9987cb6]{margin:0 auto}.desc[data-v-f9987cb6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f9987cb6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f9987cb6]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f9987cb6]:hover,.sp .sp-link.link[data-v-f9987cb6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f9987cb6]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-fba19bad]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-fba19bad]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-fba19bad]{max-width:876px}.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-fba19bad]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-fba19bad]{max-width:760px}.container[data-v-fba19bad]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.enjoyer{margin-top:.5rem;margin-bottom:0rem;border-radius:14px;padding-top:.2rem;padding-bottom:.2rem;position:relative;font-size:.9rem;font-weight:700;line-height:1.1rem;display:flex;align-items:center;justify-content:center;width:100%;gap:1rem;background-color:var(--vp-c-bg-alt);border:2px solid var(--vp-c-bg-alt);transition:border-color .5s}.enjoyer:hover{border:2px solid var(--vp-c-brand-lighter)}.enjoyer img{transition:transform .5s;transform:scale(1.25)}.enjoyer:hover img{transform:scale(1.75)}.enjoyer .heading{background-image:linear-gradient(120deg,#6887b1 16%,var(--vp-c-brand-lighter),var(--vp-c-brand-lighter));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}.enjoyer .extra-info{color:var(--vp-c-text-1);opacity:0;font-size:.7rem;padding-left:.1rem;transition:opacity .5s}.enjoyer:hover .extra-info{opacity:.9}.VPVersionPicker[data-v-44adf51f] button .text{color:var(--vp-c-text-1)!important}.VPVersionPicker[data-v-44adf51f]:hover button .text{color:var(--vp-c-text-2)!important}a[data-v-a679c84d]{font-size:14px;font-weight:500;text-wrap:nowrap;display:flex;align-items:center;gap:4px}a[target=_blank][data-v-a679c84d]{align-items:center;gap:.25rem;text-decoration:none}a[target=_blank]:hover span[data-v-a679c84d],a[target=_blank][data-decoration][data-v-a679c84d]:after{color:var(--vp-c-brand-1);transition:color .25s}a[target=_blank][data-decoration][data-v-a679c84d]:after{content:attr(data-decoration)}a[target=_blank][data-v-a679c84d]:not(:hover,:focus):after{color:inherit}a.mobile[data-v-a679c84d]{display:none}@media screen and (max-width: 560px){a[data-v-a679c84d]{display:none}a.mobile[data-v-a679c84d]{display:flex}}:root{--vp-plugin-tabs-tab-text-color: var(--vp-c-text-2);--vp-plugin-tabs-tab-active-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-hover-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-bg: var(--vp-c-bg-soft);--vp-plugin-tabs-tab-divider: var(--vp-c-divider);--vp-plugin-tabs-tab-active-bar-color: var(--vp-c-brand-1)}.plugin-tabs{margin:16px 0;background-color:var(--vp-plugin-tabs-tab-bg);border-radius:8px}.plugin-tabs--tab-list{position:relative;padding:0 12px;overflow-x:auto;overflow-y:hidden}.plugin-tabs--tab-list:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--vp-plugin-tabs-tab-divider)}.plugin-tabs--tab{position:relative;padding:0 12px;line-height:48px;border-bottom:2px solid transparent;color:var(--vp-plugin-tabs-tab-text-color);font-size:14px;font-weight:500;white-space:nowrap;transition:color .25s}.plugin-tabs--tab[aria-selected=true]{color:var(--vp-plugin-tabs-tab-active-text-color)}.plugin-tabs--tab:hover{color:var(--vp-plugin-tabs-tab-hover-text-color)}.plugin-tabs--tab:after{content:"";position:absolute;bottom:-2px;left:8px;right:8px;height:2px;background-color:transparent;transition:background-color .25s;z-index:1}.plugin-tabs--tab[aria-selected=true]:after{background-color:var(--vp-plugin-tabs-tab-active-bar-color)}.plugin-tabs--content[data-v-9b0d03d2]{padding:16px}.plugin-tabs--content[data-v-9b0d03d2]>:first-child:first-child{margin-top:0}.plugin-tabs--content[data-v-9b0d03d2]>:last-child:last-child{margin-bottom:0}.plugin-tabs--content[data-v-9b0d03d2]>div[class*=language-]{border-radius:8px;margin:16px 0}:root:not(.dark) .plugin-tabs--content[data-v-9b0d03d2] div[class*=language-]{background-color:var(--vp-c-bg)}.VPHero .clip{white-space:pre;max-width:500px}@font-face{font-family:JuliaMono-Regular;src:url(https://cdn.jsdelivr.net/gh/cormullion/juliamono/webfonts/JuliaMono-Regular.woff2)}:root{--vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--vp-font-family-mono: JuliaMono-Regular, monospace}.mono-no-substitutions{font-family:JuliaMono-Light,monospace;font-feature-settings:"calt" off}.mono-no-substitutions-alt{font-family:JuliaMono-Light,monospace;font-variant-ligatures:none}pre,code{font-family:JuliaMono-Light,monospace;font-feature-settings:"calt" off}:root{--c-white-dark: #f8f8f8;--c-black-darker: #0d121b;--c-black: #0f0d0d;--c-black-light: #1b1c1e;--c-black-lighter: #262a44;--vp-c-brand: #0b0c0f;--vp-c-brand-light: #747bff;--vp-c-brand-lighter: #3d6692;--vp-c-brand-lightest: #bcc0ff;--vp-c-brand-dark: #535bf2;--vp-c-brand-darker: #454ce1;--vp-c-brand-dimm: rgba(255, 144, 100, .08)}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #bd34fe 30%, #41d1ff );--vp-home-hero-image-background-image: linear-gradient( -45deg, #bd34fe 50%, #47caff 50% );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-darker);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.dark{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}mjx-container>svg{display:block;margin:auto}mjx-container{padding:.5rem 0}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto;display:inline-block}:root{--vp-c-brand-1: #0087d7;--vp-c-brand-2: #0773b2;--vp-c-brand-3: #347090;--vp-c-sponsor: #ee4e95;--vitest-c-sponsor-hover: #c13071}.dark{--vp-c-bg: var(--c-black);--vp-c-bg-soft: var(--c-black-light);--vp-c-bg-soft-up: var(--c-black-lighter);--vp-c-bg-mute: var(--c-black-light);--vp-c-bg-soft-mute: var(--c-black-lighter);--vp-c-bg-alt: #111111;--vp-c-bg-elv: var(--vp-c-bg-soft);--vp-c-bg-elv-mute: var(--vp-c-bg-soft-mute);--vp-c-mute: var(--vp-c-bg-mute);--vp-c-mute-dark: var(--c-black-lighter);--vp-c-mute-darker: var(--c-black-darker);--vp-c-brand-1: #ff875f;--vp-c-brand-2: #ff875f;--vp-c-brand-3: #ff875f;--vp-c-sponsor: #ff875f;--vitest-c-sponsor-hover: #e51370}.VPDoc.has-aside .content-container{max-width:100%!important}.aside{max-width:200px!important;padding-left:0!important}.VPDoc{padding-top:15px!important;padding-left:5px!important}.VPDocOutlineItem li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:200px}.VPNavBar .title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}@media (max-width: 960px){.VPDoc{padding-left:25px!important}}:root{--vp-c-bg-input-light: #eef0f3;--vp-c-bg-output-light: #f8f9fb;--vp-c-bg-input-dark: #1a1a1a;--vp-c-bg-output-dark: #101418}:root{--vp-c-bg-input: var(--vp-c-bg-input-light);--vp-c-bg-output: var(--vp-c-bg-output-light)}.dark{--vp-c-bg-input: var(--vp-c-bg-input-dark);--vp-c-bg-output: var(--vp-c-bg-output-dark)}.language-julia{background-color:var(--vp-c-bg-input)!important}.language-{background-color:var(--vp-c-bg-output)!important}.jldocstring.custom-block{border:1px solid var(--vp-c-gray-2);color:var(--vp-c-text-1)}.jldocstring.custom-block summary{font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none;margin:0 0 8px}.row img{border-radius:50%;width:60px;height:60px}.row{display:flex;flex-wrap:wrap;padding:0 4px}.VPLocalSearchBox[data-v-42e65fb9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-42e65fb9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-42e65fb9]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-42e65fb9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-42e65fb9]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-42e65fb9]{padding:0 8px}}.search-bar[data-v-42e65fb9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-42e65fb9]{display:block;font-size:18px}.navigate-icon[data-v-42e65fb9]{display:block;font-size:14px}.search-icon[data-v-42e65fb9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-42e65fb9]{display:none}}.search-input[data-v-42e65fb9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-42e65fb9]{padding:6px 4px}}.search-actions[data-v-42e65fb9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-42e65fb9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-42e65fb9]{display:none}}.search-actions button[data-v-42e65fb9]{padding:8px}.search-actions button[data-v-42e65fb9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-42e65fb9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-42e65fb9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-42e65fb9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-42e65fb9]{display:none}}.search-keyboard-shortcuts kbd[data-v-42e65fb9]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-42e65fb9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-42e65fb9]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-42e65fb9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-42e65fb9]{margin:8px}}.titles[data-v-42e65fb9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}.title.main[data-v-42e65fb9]{font-weight:500}.title-icon[data-v-42e65fb9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-42e65fb9]{opacity:.5}.result.selected[data-v-42e65fb9]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-42e65fb9]{position:relative}.excerpt[data-v-42e65fb9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-42e65fb9]{opacity:1}.excerpt[data-v-42e65fb9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-42e65fb9] mark,.excerpt[data-v-42e65fb9] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-42e65fb9] .vp-code-group .tabs{display:none}.excerpt[data-v-42e65fb9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-42e65fb9]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-42e65fb9]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-42e65fb9],.result.selected .title-icon[data-v-42e65fb9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-42e65fb9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-42e65fb9]{flex:none}
diff --git a/previews/PR486/assets/taklqov.CQ9uchq9.jpeg b/previews/PR486/assets/taklqov.CQ9uchq9.jpeg
new file mode 100644
index 00000000..d44697f3
Binary files /dev/null and b/previews/PR486/assets/taklqov.CQ9uchq9.jpeg differ
diff --git a/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.js b/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.js
new file mode 100644
index 00000000..28f7deed
--- /dev/null
+++ b/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.js
@@ -0,0 +1,73 @@
+import{_ as i,c as a,a2 as n,o as h}from"./chunks/framework.piKCME0r.js";const l="/YAXArrays.jl/previews/PR486/assets/jkytbph.C-WFBMfk.png",k="/YAXArrays.jl/previews/PR486/assets/obatlyf.D9rvatPm.png",c=JSON.parse('{"title":"Mean Seasonal Cycle for a single pixel","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/mean_seasonal_cycle.md","filePath":"tutorials/mean_seasonal_cycle.md","lastUpdated":null}'),p={name:"tutorials/mean_seasonal_cycle.md"};function t(e,s,E,d,r,g){return h(),a("div",null,s[0]||(s[0]=[n(`Mean Seasonal Cycle for a single pixel julia using CairoMakie
+CairoMakie . activate! ()
+using Dates
+using Statistics
We define the data span. For simplicity, three non-leap years were selected.
julia t = Date ( "2021-01-01" ) : Day ( 1 ) : Date ( "2023-12-31" )
+NpY = 3
and create some seasonal dummy data
julia x = repeat ( range ( 0 , 2π , length = 365 ), NpY)
+var = @. sin (x) + 0.1 * randn ()
julia fig, ax, obj = lines (t, var; color = :purple , linewidth = 1.25 ,
+ axis = (; xlabel = "Time" , ylabel = "Variable" ),
+ figure = (; size = ( 600 , 400 ))
+ )
+ax . xticklabelrotation = π / 4
+ax . xticklabelalign = ( :right , :center )
+fig
Define the cube julia julia > using YAXArrays, DimensionalData
+
+julia > using YAXArrays : YAXArrays as YAX
+
+julia > axes = (YAX . Time (t),)
( ↓ Time Date("2021-01-01"):Dates.Day(1):Date("2023-12-31") )
julia julia > c = YAXArray (axes, var)
┌ 1095-element YAXArray{Float64, 1} ┐
+├───────────────────────────────────┴──────────────────────────────────── dims ┐
+ ↓ Time Sampled{Date} Date("2021-01-01"):Dates.Day(1):Date("2023-12-31") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 8.55 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Let's calculate the mean seasonal cycle of our dummy variable 'var'
julia function mean_seasonal_cycle (c; ndays = 365 )
+ ## filterig by month-day
+ monthday = map (x -> Dates . format (x, "u-d" ), collect (c . Time))
+ datesid = unique (monthday)
+ ## number of years
+ NpY = Int ( size (monthday, 1 ) / ndays)
+ idx = Int .( zeros (ndays, NpY))
+ ## get the day-month indices for data subsetting
+ for i in 1 : ndays
+ idx[i,:] = Int .( findall (x -> x == datesid[i], monthday))
+ end
+ ## compute the mean seasonal cycle
+ mscarray = map (x -> var[x], idx)
+ msc = mapslices (mean, mscarray, dims = 2 )
+ return msc
+end
+
+msc = mean_seasonal_cycle (c);
365×1 Matrix{Float64}:
+ 0.03528277758302477
+ 0.02345835017256051
+ 0.039451611552802975
+ 0.09689360224777122
+ 0.022312156353890087
+ 0.11391077060238619
+ 0.08058305464254185
+ 0.06159722707791853
+ 0.08158557886952912
+ 0.14715175267308206
+ ⋮
+ -0.10291543325743235
+ -0.22990067443344916
+ -0.12370988510072528
+ -0.0750790675265741
+ -0.05611581504766607
+ -0.06417594925348342
+ -0.062270000476910094
+ -0.029247418895843032
+ -0.05742042630154354
TODO: Apply the new groupby funtion from DD
Plot results: mean seasonal cycle julia fig, ax, obj = lines ( 1 : 365 , var[ 1 : 365 ]; label = "2021" , color = :black ,
+ linewidth = 2.0 , linestyle = :dot ,
+ axis = (; xlabel = "Day of Year" , ylabel = "Variable" ),
+ figure = (; size = ( 600 , 400 ))
+ )
+lines! ( 1 : 365 , var[ 366 : 730 ], label = "2022" , color = :brown ,
+ linewidth = 1.5 , linestyle = :dash
+ )
+lines! ( 1 : 365 , msc[:, 1 ]; label = "MSC" , color = :dodgerblue , linewidth = 2.5 )
+axislegend ()
+ax . xticklabelrotation = π / 4
+ax . xticklabelalign = ( :right , :center )
+fig
+current_figure ()
',21)]))}const F=i(p,[["render",t]]);export{c as __pageData,F as default};
diff --git a/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.lean.js b/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.lean.js
new file mode 100644
index 00000000..28f7deed
--- /dev/null
+++ b/previews/PR486/assets/tutorials_mean_seasonal_cycle.md.DLmkPFUH.lean.js
@@ -0,0 +1,73 @@
+import{_ as i,c as a,a2 as n,o as h}from"./chunks/framework.piKCME0r.js";const l="/YAXArrays.jl/previews/PR486/assets/jkytbph.C-WFBMfk.png",k="/YAXArrays.jl/previews/PR486/assets/obatlyf.D9rvatPm.png",c=JSON.parse('{"title":"Mean Seasonal Cycle for a single pixel","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/mean_seasonal_cycle.md","filePath":"tutorials/mean_seasonal_cycle.md","lastUpdated":null}'),p={name:"tutorials/mean_seasonal_cycle.md"};function t(e,s,E,d,r,g){return h(),a("div",null,s[0]||(s[0]=[n(`Mean Seasonal Cycle for a single pixel julia using CairoMakie
+CairoMakie . activate! ()
+using Dates
+using Statistics
We define the data span. For simplicity, three non-leap years were selected.
julia t = Date ( "2021-01-01" ) : Day ( 1 ) : Date ( "2023-12-31" )
+NpY = 3
and create some seasonal dummy data
julia x = repeat ( range ( 0 , 2π , length = 365 ), NpY)
+var = @. sin (x) + 0.1 * randn ()
julia fig, ax, obj = lines (t, var; color = :purple , linewidth = 1.25 ,
+ axis = (; xlabel = "Time" , ylabel = "Variable" ),
+ figure = (; size = ( 600 , 400 ))
+ )
+ax . xticklabelrotation = π / 4
+ax . xticklabelalign = ( :right , :center )
+fig
Define the cube julia julia > using YAXArrays, DimensionalData
+
+julia > using YAXArrays : YAXArrays as YAX
+
+julia > axes = (YAX . Time (t),)
( ↓ Time Date("2021-01-01"):Dates.Day(1):Date("2023-12-31") )
julia julia > c = YAXArray (axes, var)
┌ 1095-element YAXArray{Float64, 1} ┐
+├───────────────────────────────────┴──────────────────────────────────── dims ┐
+ ↓ Time Sampled{Date} Date("2021-01-01"):Dates.Day(1):Date("2023-12-31") ForwardOrdered Regular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any}()
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 8.55 KB
+└──────────────────────────────────────────────────────────────────────────────┘
Let's calculate the mean seasonal cycle of our dummy variable 'var'
julia function mean_seasonal_cycle (c; ndays = 365 )
+ ## filterig by month-day
+ monthday = map (x -> Dates . format (x, "u-d" ), collect (c . Time))
+ datesid = unique (monthday)
+ ## number of years
+ NpY = Int ( size (monthday, 1 ) / ndays)
+ idx = Int .( zeros (ndays, NpY))
+ ## get the day-month indices for data subsetting
+ for i in 1 : ndays
+ idx[i,:] = Int .( findall (x -> x == datesid[i], monthday))
+ end
+ ## compute the mean seasonal cycle
+ mscarray = map (x -> var[x], idx)
+ msc = mapslices (mean, mscarray, dims = 2 )
+ return msc
+end
+
+msc = mean_seasonal_cycle (c);
365×1 Matrix{Float64}:
+ 0.03528277758302477
+ 0.02345835017256051
+ 0.039451611552802975
+ 0.09689360224777122
+ 0.022312156353890087
+ 0.11391077060238619
+ 0.08058305464254185
+ 0.06159722707791853
+ 0.08158557886952912
+ 0.14715175267308206
+ ⋮
+ -0.10291543325743235
+ -0.22990067443344916
+ -0.12370988510072528
+ -0.0750790675265741
+ -0.05611581504766607
+ -0.06417594925348342
+ -0.062270000476910094
+ -0.029247418895843032
+ -0.05742042630154354
TODO: Apply the new groupby funtion from DD
Plot results: mean seasonal cycle julia fig, ax, obj = lines ( 1 : 365 , var[ 1 : 365 ]; label = "2021" , color = :black ,
+ linewidth = 2.0 , linestyle = :dot ,
+ axis = (; xlabel = "Day of Year" , ylabel = "Variable" ),
+ figure = (; size = ( 600 , 400 ))
+ )
+lines! ( 1 : 365 , var[ 366 : 730 ], label = "2022" , color = :brown ,
+ linewidth = 1.5 , linestyle = :dash
+ )
+lines! ( 1 : 365 , msc[:, 1 ]; label = "MSC" , color = :dodgerblue , linewidth = 2.5 )
+axislegend ()
+ax . xticklabelrotation = π / 4
+ax . xticklabelalign = ( :right , :center )
+fig
+current_figure ()
',21)]))}const F=i(p,[["render",t]]);export{c as __pageData,F as default};
diff --git a/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.js b/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.js
new file mode 100644
index 00000000..e49b66da
--- /dev/null
+++ b/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.js
@@ -0,0 +1 @@
+import{_ as t,c as a,a2 as r,o}from"./chunks/framework.piKCME0r.js";const c=JSON.parse('{"title":"Other tutorials","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/other_tutorials.md","filePath":"tutorials/other_tutorials.md","lastUpdated":null}'),i={name:"tutorials/other_tutorials.md"};function l(s,e,n,h,u,f){return o(),a("div",null,e[0]||(e[0]=[r('Other tutorials If you are interested in learning how to work with YAXArrays for different use cases you can follow along one of the following tutorials.
Currently the overview tutorial is located at ESDLTutorials Repository
You can find further tutorial videos at the EO College . Beware that the syntax in the video tutorials might be slightly changed.
the other tutorials are still work in progress.
General overview of the functionality of YAXArrays This tutorial provides a broad overview about the features of YAXArrays.
Table-style iteration over YAXArrays Work in progress
Sometimes you want to combine the data that is represented in the data cube with other datasets, which are best described as a data frame. In this tutorial you will learn how to use the Tables.jl interface to iterate over the data in the YAXArray.
Combining multiple tiff files into a zarr based datacube ',9)]))}const b=t(i,[["render",l]]);export{c as __pageData,b as default};
diff --git a/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.lean.js b/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.lean.js
new file mode 100644
index 00000000..e49b66da
--- /dev/null
+++ b/previews/PR486/assets/tutorials_other_tutorials.md.MTLllTlQ.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,a2 as r,o}from"./chunks/framework.piKCME0r.js";const c=JSON.parse('{"title":"Other tutorials","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/other_tutorials.md","filePath":"tutorials/other_tutorials.md","lastUpdated":null}'),i={name:"tutorials/other_tutorials.md"};function l(s,e,n,h,u,f){return o(),a("div",null,e[0]||(e[0]=[r('Other tutorials If you are interested in learning how to work with YAXArrays for different use cases you can follow along one of the following tutorials.
Currently the overview tutorial is located at ESDLTutorials Repository
You can find further tutorial videos at the EO College . Beware that the syntax in the video tutorials might be slightly changed.
the other tutorials are still work in progress.
General overview of the functionality of YAXArrays This tutorial provides a broad overview about the features of YAXArrays.
Table-style iteration over YAXArrays Work in progress
Sometimes you want to combine the data that is represented in the data cube with other datasets, which are best described as a data frame. In this tutorial you will learn how to use the Tables.jl interface to iterate over the data in the YAXArray.
Combining multiple tiff files into a zarr based datacube ',9)]))}const b=t(i,[["render",l]]);export{c as __pageData,b as default};
diff --git a/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.js b/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.js
new file mode 100644
index 00000000..7130f02b
--- /dev/null
+++ b/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.js
@@ -0,0 +1,110 @@
+import{_ as i,c as a,a2 as t,o as n}from"./chunks/framework.piKCME0r.js";const h="/YAXArrays.jl/previews/PR486/assets/taklqov.CQ9uchq9.jpeg",l="/YAXArrays.jl/previews/PR486/assets/cyhvrkj.B7KFIfDV.jpeg",p="/YAXArrays.jl/previews/PR486/assets/mbalbzx.96k_BqPR.jpeg",k="/YAXArrays.jl/previews/PR486/assets/oowdcxc.B7b9FwLj.jpeg",e="/YAXArrays.jl/previews/PR486/assets/zvezrog.B074eX2X.jpeg",r="/YAXArrays.jl/previews/PR486/assets/dzarsbx.C5U_qDue.jpeg",d="/YAXArrays.jl/previews/PR486/assets/frwqpez.DX1O6I5P.jpeg",E="/YAXArrays.jl/previews/PR486/assets/idgplot.Blc9BtwN.jpeg",g="/YAXArrays.jl/previews/PR486/assets/weuosxb.Bcyn0CpL.jpeg",y="/YAXArrays.jl/previews/PR486/assets/xzwnmje.-RBZ8LkA.jpeg",o="/YAXArrays.jl/previews/PR486/assets/ssvwqbb.Cj8iZQLt.jpeg",F="/YAXArrays.jl/previews/PR486/assets/pdifvqr.Dwd2F2F-.jpeg",v=JSON.parse('{"title":"Plotting maps","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plottingmaps.md","filePath":"tutorials/plottingmaps.md","lastUpdated":null}'),c={name:"tutorials/plottingmaps.md"};function C(u,s,m,A,B,b){return n(),a("div",null,s[0]||(s[0]=[t(`Plotting maps As test data we use the CMIP6 Scenarios.
julia using Zarr, YAXArrays, Dates
+using DimensionalData
+using GLMakie, GeoMakie
+using GLMakie . GeometryBasics
+
+store = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
"gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
julia julia > g = open_dataset ( zopen (store, consolidated = true ))
YAXArray Dataset
+Shared Axes:
+None
+Variables:
+height
+
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points ,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points )
+ Variables:
+ tas
+
+Properties: Dict{String, Any}("initialization_index" => 1, "realm" => "atmos", "variable_id" => "tas", "external_variables" => "areacella", "branch_time_in_child" => 60265.0, "data_specs_version" => "01.00.30", "history" => "2019-07-21T06:26:13Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards.", "forcing_index" => 1, "parent_variant_label" => "r1i1p1f1", "table_id" => "3hr"…)
julia julia > c = g[ "tas" ];
Subset, first time step
julia julia > ct1_slice = c[time = Near ( Date ( "2015-01-01" ))];
use lookup to get axis values
julia lon_d = lookup (ct1_slice, :lon )
+lat_d = lookup (ct1_slice, :lat )
+data_d = ct1_slice . data[:,:];
Heatmap plot julia GLMakie . activate! ()
+
+fig, ax, plt = heatmap (ct1_slice; colormap = :seaborn_icefire_gradient ,
+ axis = (; aspect = DataAspect ()),
+ figure = (; size = ( 1200 , 600 ), fontsize = 24 ))
+fig
Wintri Projection Some transformations
julia δlon = (lon_d[ 2 ] - lon_d[ 1 ]) / 2
+nlon = lon_d .- 180 .+ δlon
+ndata = circshift (data_d, ( 192 , 1 ))
and add Coastlines with GeoMakie.coastlines()
,
julia fig = Figure (;size = ( 1200 , 600 ))
+ax = GeoAxis (fig[ 1 , 1 ])
+surface! (ax, nlon, lat_d, ndata; colormap = :seaborn_icefire_gradient , shading = false )
+cl = lines! (ax, GeoMakie . coastlines (), color = :white , linewidth = 0.85 )
+translate! (cl, 0 , 0 , 1000 )
+fig
Moll projection julia fig = Figure (; size = ( 1200 , 600 ))
+ax = GeoAxis (fig[ 1 , 1 ]; dest = "+proj=moll" )
+surface! (ax, nlon, lat_d, ndata; colormap = :seaborn_icefire_gradient , shading = false )
+cl = lines! (ax, GeoMakie . coastlines (), color = :white , linewidth = 0.85 )
+translate! (cl, 0 , 0 , 1000 )
+fig
3D sphere plot julia using GLMakie
+using GLMakie . GeometryBasics
+GLMakie . activate! ()
+
+ds = replace (ndata, missing => NaN )
+sphere = uv_normal_mesh ( Tesselation ( Sphere ( Point3f ( 0 ), 1 ), 128 ))
+
+fig = Figure (backgroundcolor = :grey25 , size = ( 500 , 500 ))
+ax = LScene (fig[ 1 , 1 ], show_axis = false )
+mesh! (ax, sphere; color = ds ' [ end :- 1 : 1 ,:], shading = false ,
+ colormap = :seaborn_icefire_gradient )
+zoom! (ax . scene, cameracontrols (ax . scene), 0.5 )
+rotate! (ax . scene, 2.5 )
+fig
AlgebraOfGraphics.jl INFO
From DimensionalData docs :
AlgebraOfGraphics.jl is a high-level plotting library built on top of Makie.jl
that provides a declarative algebra for creating complex visualizations, similar to ggplot2 's "grammar of graphics" in R. It allows you to construct plots using algebraic operations like *
and +
, making it easy to create sophisticated graphics with minimal code.
julia using YAXArrays, Zarr, Dates
+using GLMakie
+using AlgebraOfGraphics
+using GLMakie . GeometryBasics
+GLMakie . activate! ()
let's continue using the cmip6 dataset
julia store = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
+g = open_dataset ( zopen (store, consolidated = true ))
+c = g[ "tas" ];
and let's focus on the first time step:
julia dim_data = readcubedata (c[time = 1 ]); # read into memory first!
and now plot
julia data (dim_data) * mapping ( :lon , :lat ; color = :value ) * visual (Scatter) |> draw
WARNING
Note that we are using a Scatter
type per point and not the Heatmap
one. There are workarounds for this, albeit cumbersome, so for now, let's keep this simpler syntax in mind along with the current approach being used.
set other attributes
julia plt = data (dim_data) * mapping ( :lon , :lat ; color = :value )
+draw (plt * visual (Scatter, marker = :rect ), scales (Color = (; colormap = :plasma ));
+ axis = (width = 600 , height = 400 , limits = ( 0 , 360 , - 90 , 90 )))
Faceting For this let's consider more time steps from our dataset:
julia using Dates
+dim_time = c[time = DateTime ( "2015-01-01" ) .. DateTime ( "2015-01-01T21:00:00" )] # subset 7 t steps
┌ 384×192×7 YAXArray{Float32, 3} ┐
+├────────────────────────────────┴─────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2015-01-01T21:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 1.97 MB
+└──────────────────────────────────────────────────────────────────────────────┘
julia dim_time = readcubedata (dim_time); # read into memory first!
julia plt = data (dim_time) * mapping ( :lon , :lat ; color = :value , layout = :time => nonnumeric)
+draw (plt * visual (Scatter, marker = :rect ))
again, let's add some additional attributes
julia plt = data (dim_time) * mapping ( :lon , :lat ; color = :value , layout = :time => nonnumeric)
+draw (plt * visual (Scatter, marker = :rect ), scales (Color = (; colormap = :magma ));
+ axis = (; limits = ( 0 , 360 , - 90 , 90 )),
+ figure = (; size = ( 900 , 600 )))
most Makie plot functions should work. See lines
for example
julia plt = data (dim_data[lon = 50 .. 100 ]) * mapping ( :lat , :value => "tas" ; color = :value => "tas" )
+draw (plt * visual (Lines); figure = (; size = ( 650 , 400 )))
or faceting them
julia plt = data (dim_data[lon = 50 .. 59 ]) * mapping ( :lat , :value => "tas" ; color = :value => "tas" ,
+ layout = :lon => nonnumeric)
+draw (plt * visual (Lines); figure = (; size = ( 650 , 400 )))
Time series For this, let's load a little bit more of time steps
julia dim_series = c[time = DateTime ( "2015-01-01" ) .. DateTime ( "2015-01-04" ), lon = 150 .. 157 , lat = 0 .. 1 ] |> readcubedata
┌ 8×1×24 YAXArray{Float32, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 150.0:0.9375:156.5625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [0.4675308904227747] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2015-01-04T00:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 768.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
and plot
julia plt = data (dim_series) * mapping ( :time , :value => "tas" ; color = :lon => nonnumeric)
+draw (plt * visual (ScatterLines), scales (Color = (; palette = :tableau_colorblind ));
+ figure = (; size = ( 800 , 400 )))
Analysis Basic statistical analysis can also be done, for example:
julia specs = data (dim_data[lat = 50 .. 55 ]) * mapping ( :lon , :value => "tas" ; color = :lat => nonnumeric)
+specs *= ( smooth () + visual (Scatter))
+draw (specs; figure = (; size = ( 700 , 400 )))
For more, visit AlgebraOfGraphics.jl .
',68)]))}const q=i(c,[["render",C]]);export{v as __pageData,q as default};
diff --git a/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.lean.js b/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.lean.js
new file mode 100644
index 00000000..7130f02b
--- /dev/null
+++ b/previews/PR486/assets/tutorials_plottingmaps.md.D1UYqyCC.lean.js
@@ -0,0 +1,110 @@
+import{_ as i,c as a,a2 as t,o as n}from"./chunks/framework.piKCME0r.js";const h="/YAXArrays.jl/previews/PR486/assets/taklqov.CQ9uchq9.jpeg",l="/YAXArrays.jl/previews/PR486/assets/cyhvrkj.B7KFIfDV.jpeg",p="/YAXArrays.jl/previews/PR486/assets/mbalbzx.96k_BqPR.jpeg",k="/YAXArrays.jl/previews/PR486/assets/oowdcxc.B7b9FwLj.jpeg",e="/YAXArrays.jl/previews/PR486/assets/zvezrog.B074eX2X.jpeg",r="/YAXArrays.jl/previews/PR486/assets/dzarsbx.C5U_qDue.jpeg",d="/YAXArrays.jl/previews/PR486/assets/frwqpez.DX1O6I5P.jpeg",E="/YAXArrays.jl/previews/PR486/assets/idgplot.Blc9BtwN.jpeg",g="/YAXArrays.jl/previews/PR486/assets/weuosxb.Bcyn0CpL.jpeg",y="/YAXArrays.jl/previews/PR486/assets/xzwnmje.-RBZ8LkA.jpeg",o="/YAXArrays.jl/previews/PR486/assets/ssvwqbb.Cj8iZQLt.jpeg",F="/YAXArrays.jl/previews/PR486/assets/pdifvqr.Dwd2F2F-.jpeg",v=JSON.parse('{"title":"Plotting maps","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plottingmaps.md","filePath":"tutorials/plottingmaps.md","lastUpdated":null}'),c={name:"tutorials/plottingmaps.md"};function C(u,s,m,A,B,b){return n(),a("div",null,s[0]||(s[0]=[t(`Plotting maps As test data we use the CMIP6 Scenarios.
julia using Zarr, YAXArrays, Dates
+using DimensionalData
+using GLMakie, GeoMakie
+using GLMakie . GeometryBasics
+
+store = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
"gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
julia julia > g = open_dataset ( zopen (store, consolidated = true ))
YAXArray Dataset
+Shared Axes:
+None
+Variables:
+height
+
+Variables with additional axes:
+ Additional Axes:
+ ( ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points ,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points ,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points )
+ Variables:
+ tas
+
+Properties: Dict{String, Any}("initialization_index" => 1, "realm" => "atmos", "variable_id" => "tas", "external_variables" => "areacella", "branch_time_in_child" => 60265.0, "data_specs_version" => "01.00.30", "history" => "2019-07-21T06:26:13Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards.", "forcing_index" => 1, "parent_variant_label" => "r1i1p1f1", "table_id" => "3hr"…)
julia julia > c = g[ "tas" ];
Subset, first time step
julia julia > ct1_slice = c[time = Near ( Date ( "2015-01-01" ))];
use lookup to get axis values
julia lon_d = lookup (ct1_slice, :lon )
+lat_d = lookup (ct1_slice, :lat )
+data_d = ct1_slice . data[:,:];
Heatmap plot julia GLMakie . activate! ()
+
+fig, ax, plt = heatmap (ct1_slice; colormap = :seaborn_icefire_gradient ,
+ axis = (; aspect = DataAspect ()),
+ figure = (; size = ( 1200 , 600 ), fontsize = 24 ))
+fig
Wintri Projection Some transformations
julia δlon = (lon_d[ 2 ] - lon_d[ 1 ]) / 2
+nlon = lon_d .- 180 .+ δlon
+ndata = circshift (data_d, ( 192 , 1 ))
and add Coastlines with GeoMakie.coastlines()
,
julia fig = Figure (;size = ( 1200 , 600 ))
+ax = GeoAxis (fig[ 1 , 1 ])
+surface! (ax, nlon, lat_d, ndata; colormap = :seaborn_icefire_gradient , shading = false )
+cl = lines! (ax, GeoMakie . coastlines (), color = :white , linewidth = 0.85 )
+translate! (cl, 0 , 0 , 1000 )
+fig
Moll projection julia fig = Figure (; size = ( 1200 , 600 ))
+ax = GeoAxis (fig[ 1 , 1 ]; dest = "+proj=moll" )
+surface! (ax, nlon, lat_d, ndata; colormap = :seaborn_icefire_gradient , shading = false )
+cl = lines! (ax, GeoMakie . coastlines (), color = :white , linewidth = 0.85 )
+translate! (cl, 0 , 0 , 1000 )
+fig
3D sphere plot julia using GLMakie
+using GLMakie . GeometryBasics
+GLMakie . activate! ()
+
+ds = replace (ndata, missing => NaN )
+sphere = uv_normal_mesh ( Tesselation ( Sphere ( Point3f ( 0 ), 1 ), 128 ))
+
+fig = Figure (backgroundcolor = :grey25 , size = ( 500 , 500 ))
+ax = LScene (fig[ 1 , 1 ], show_axis = false )
+mesh! (ax, sphere; color = ds ' [ end :- 1 : 1 ,:], shading = false ,
+ colormap = :seaborn_icefire_gradient )
+zoom! (ax . scene, cameracontrols (ax . scene), 0.5 )
+rotate! (ax . scene, 2.5 )
+fig
AlgebraOfGraphics.jl INFO
From DimensionalData docs :
AlgebraOfGraphics.jl is a high-level plotting library built on top of Makie.jl
that provides a declarative algebra for creating complex visualizations, similar to ggplot2 's "grammar of graphics" in R. It allows you to construct plots using algebraic operations like *
and +
, making it easy to create sophisticated graphics with minimal code.
julia using YAXArrays, Zarr, Dates
+using GLMakie
+using AlgebraOfGraphics
+using GLMakie . GeometryBasics
+GLMakie . activate! ()
let's continue using the cmip6 dataset
julia store = "gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/"
+g = open_dataset ( zopen (store, consolidated = true ))
+c = g[ "tas" ];
and let's focus on the first time step:
julia dim_data = readcubedata (c[time = 1 ]); # read into memory first!
and now plot
julia data (dim_data) * mapping ( :lon , :lat ; color = :value ) * visual (Scatter) |> draw
WARNING
Note that we are using a Scatter
type per point and not the Heatmap
one. There are workarounds for this, albeit cumbersome, so for now, let's keep this simpler syntax in mind along with the current approach being used.
set other attributes
julia plt = data (dim_data) * mapping ( :lon , :lat ; color = :value )
+draw (plt * visual (Scatter, marker = :rect ), scales (Color = (; colormap = :plasma ));
+ axis = (width = 600 , height = 400 , limits = ( 0 , 360 , - 90 , 90 )))
Faceting For this let's consider more time steps from our dataset:
julia using Dates
+dim_time = c[time = DateTime ( "2015-01-01" ) .. DateTime ( "2015-01-01T21:00:00" )] # subset 7 t steps
┌ 384×192×7 YAXArray{Float32, 3} ┐
+├────────────────────────────────┴─────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2015-01-01T21:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├─────────────────────────────────────────────────────────────── loaded lazily ┤
+ data size: 1.97 MB
+└──────────────────────────────────────────────────────────────────────────────┘
julia dim_time = readcubedata (dim_time); # read into memory first!
julia plt = data (dim_time) * mapping ( :lon , :lat ; color = :value , layout = :time => nonnumeric)
+draw (plt * visual (Scatter, marker = :rect ))
again, let's add some additional attributes
julia plt = data (dim_time) * mapping ( :lon , :lat ; color = :value , layout = :time => nonnumeric)
+draw (plt * visual (Scatter, marker = :rect ), scales (Color = (; colormap = :magma ));
+ axis = (; limits = ( 0 , 360 , - 90 , 90 )),
+ figure = (; size = ( 900 , 600 )))
most Makie plot functions should work. See lines
for example
julia plt = data (dim_data[lon = 50 .. 100 ]) * mapping ( :lat , :value => "tas" ; color = :value => "tas" )
+draw (plt * visual (Lines); figure = (; size = ( 650 , 400 )))
or faceting them
julia plt = data (dim_data[lon = 50 .. 59 ]) * mapping ( :lat , :value => "tas" ; color = :value => "tas" ,
+ layout = :lon => nonnumeric)
+draw (plt * visual (Lines); figure = (; size = ( 650 , 400 )))
Time series For this, let's load a little bit more of time steps
julia dim_series = c[time = DateTime ( "2015-01-01" ) .. DateTime ( "2015-01-04" ), lon = 150 .. 157 , lat = 0 .. 1 ] |> readcubedata
┌ 8×1×24 YAXArray{Float32, 3} ┐
+├─────────────────────────────┴────────────────────────────────────────── dims ┐
+ ↓ lon Sampled{Float64} 150.0:0.9375:156.5625 ForwardOrdered Regular Points,
+ → lat Sampled{Float64} [0.4675308904227747] ForwardOrdered Irregular Points,
+ ↗ time Sampled{DateTime} [2015-01-01T03:00:00, …, 2015-01-04T00:00:00] ForwardOrdered Irregular Points
+├──────────────────────────────────────────────────────────────────── metadata ┤
+ Dict{String, Any} with 10 entries:
+ "units" => "K"
+ "history" => "2019-07-21T06:26:13Z altered by CMOR: Treated scalar dime…
+ "name" => "tas"
+ "cell_methods" => "area: mean time: point"
+ "cell_measures" => "area: areacella"
+ "long_name" => "Near-Surface Air Temperature"
+ "coordinates" => "height"
+ "standard_name" => "air_temperature"
+ "_FillValue" => 1.0f20
+ "comment" => "near-surface (usually, 2 meter) air temperature"
+├──────────────────────────────────────────────────────────── loaded in memory ┤
+ data size: 768.0 bytes
+└──────────────────────────────────────────────────────────────────────────────┘
and plot
julia plt = data (dim_series) * mapping ( :time , :value => "tas" ; color = :lon => nonnumeric)
+draw (plt * visual (ScatterLines), scales (Color = (; palette = :tableau_colorblind ));
+ figure = (; size = ( 800 , 400 )))
Analysis Basic statistical analysis can also be done, for example:
julia specs = data (dim_data[lat = 50 .. 55 ]) * mapping ( :lon , :value => "tas" ; color = :lat => nonnumeric)
+specs *= ( smooth () + visual (Scatter))
+draw (specs; figure = (; size = ( 700 , 400 )))
For more, visit AlgebraOfGraphics.jl .
',68)]))}const q=i(c,[["render",C]]);export{v as __pageData,q as default};
diff --git a/previews/PR486/assets/weuosxb.Bcyn0CpL.jpeg b/previews/PR486/assets/weuosxb.Bcyn0CpL.jpeg
new file mode 100644
index 00000000..3dd7cbb7
Binary files /dev/null and b/previews/PR486/assets/weuosxb.Bcyn0CpL.jpeg differ
diff --git a/previews/PR486/assets/xzwnmje.-RBZ8LkA.jpeg b/previews/PR486/assets/xzwnmje.-RBZ8LkA.jpeg
new file mode 100644
index 00000000..c09363b8
Binary files /dev/null and b/previews/PR486/assets/xzwnmje.-RBZ8LkA.jpeg differ
diff --git a/previews/PR486/assets/zvezrog.B074eX2X.jpeg b/previews/PR486/assets/zvezrog.B074eX2X.jpeg
new file mode 100644
index 00000000..6636367d
Binary files /dev/null and b/previews/PR486/assets/zvezrog.B074eX2X.jpeg differ
diff --git a/previews/PR486/development/contribute.html b/previews/PR486/development/contribute.html
new file mode 100644
index 00000000..85fc6f10
--- /dev/null
+++ b/previews/PR486/development/contribute.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Contribute to YAXArrays.jl | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/development/contributors.html b/previews/PR486/development/contributors.html
new file mode 100644
index 00000000..65b4f299
--- /dev/null
+++ b/previews/PR486/development/contributors.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/favicon.ico b/previews/PR486/favicon.ico
new file mode 100644
index 00000000..80dd3a80
Binary files /dev/null and b/previews/PR486/favicon.ico differ
diff --git a/previews/PR486/get_started.html b/previews/PR486/get_started.html
new file mode 100644
index 00000000..a79e7e72
--- /dev/null
+++ b/previews/PR486/get_started.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+ Getting Started | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/hashmap.json b/previews/PR486/hashmap.json
new file mode 100644
index 00000000..8591f60c
--- /dev/null
+++ b/previews/PR486/hashmap.json
@@ -0,0 +1 @@
+{"api.md":"CRtEnxW2","development_contribute.md":"CXgVQbV5","development_contributors.md":"Dh50rkWi","get_started.md":"CdXe2EOO","index.md":"N2EASpe3","tutorials_mean_seasonal_cycle.md":"DLmkPFUH","tutorials_other_tutorials.md":"MTLllTlQ","tutorials_plottingmaps.md":"D1UYqyCC","userguide_cache.md":"tsnWjcXo","userguide_chunk.md":"DKasdhoL","userguide_combine.md":"DX6-a-cs","userguide_compute.md":"CUq5TZYp","userguide_convert.md":"CkB9umGg","userguide_create.md":"Bweykjuq","userguide_faq.md":"uhp-zjxe","userguide_group.md":"B_BCz8Qu","userguide_read.md":"CncWl83I","userguide_select.md":"B1gCBPvb","userguide_types.md":"DuodkEtM","userguide_write.md":"Dt-jU2T_"}
diff --git a/previews/PR486/index.html b/previews/PR486/index.html
new file mode 100644
index 00000000..52598eac
--- /dev/null
+++ b/previews/PR486/index.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+ YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content YAXArrays.jl Yet another xarray-like Julia package
A package for operating on out-of-core labeled arrays, based on stores like NetCDF, Zarr or GDAL.
How to Install YAXArrays.jl? Since YAXArrays.jl
is registered in the Julia General registry, you can simply run the following command in the Julia REPL:
julia julia > using Pkg
+julia > Pkg . add ( "YAXArrays.jl" )
+# or
+julia > ] # ']' should be pressed
+pkg > add YAXArrays
If you want to use the latest unreleased version, you can run the following command:
julia pkg > add YAXArrays #master
Want interoperability? Install the following package(s) for:
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/logo.png b/previews/PR486/logo.png
new file mode 100644
index 00000000..80dd3a80
Binary files /dev/null and b/previews/PR486/logo.png differ
diff --git a/previews/PR486/logo.svg b/previews/PR486/logo.svg
new file mode 100644
index 00000000..1d1b362f
--- /dev/null
+++ b/previews/PR486/logo.svg
@@ -0,0 +1,324 @@
+
+
+
+YAXArrays.jl
diff --git a/previews/PR486/siteinfo.js b/previews/PR486/siteinfo.js
new file mode 100644
index 00000000..9ba5dd31
--- /dev/null
+++ b/previews/PR486/siteinfo.js
@@ -0,0 +1 @@
+var DOCUMENTER_CURRENT_VERSION = "previews/PR486";
diff --git a/previews/PR486/tutorials/mean_seasonal_cycle.html b/previews/PR486/tutorials/mean_seasonal_cycle.html
new file mode 100644
index 00000000..560822b4
--- /dev/null
+++ b/previews/PR486/tutorials/mean_seasonal_cycle.html
@@ -0,0 +1,100 @@
+
+
+
+
+
+ Mean Seasonal Cycle for a single pixel | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/tutorials/other_tutorials.html b/previews/PR486/tutorials/other_tutorials.html
new file mode 100644
index 00000000..dbddb6cc
--- /dev/null
+++ b/previews/PR486/tutorials/other_tutorials.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Other tutorials | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/tutorials/plottingmaps.html b/previews/PR486/tutorials/plottingmaps.html
new file mode 100644
index 00000000..be0f5afa
--- /dev/null
+++ b/previews/PR486/tutorials/plottingmaps.html
@@ -0,0 +1,137 @@
+
+
+
+
+
+ Plotting maps | YAXArrays.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR486/vp-icons.css b/previews/PR486/vp-icons.css
new file mode 100644
index 00000000..e3160864
--- /dev/null
+++ b/previews/PR486/vp-icons.css
@@ -0,0 +1 @@
+.vpi-social-bluesky{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565C.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479c.815 2.736 3.713 3.66 6.383 3.364q.204-.03.415-.056q-.207.033-.415.056c-3.912.58-7.387 2.005-2.83 7.078c5.013 5.19 6.87-1.113 7.823-4.308c.953 3.195 2.05 9.271 7.733 4.308c4.267-4.308 1.172-6.498-2.74-7.078a9 9 0 0 1-.415-.056q.21.026.415.056c2.67.297 5.568-.628 6.383-3.364c.246-.828.624-5.79.624-6.478c0-.69-.139-1.861-.902-2.206c-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8'/%3E%3C/svg%3E")}.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127C.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611c.118 1.24.325 2.47.62 3.68c.55 2.237 2.777 4.098 4.96 4.857c2.336.792 4.849.923 7.256.38q.398-.092.786-.213c.585-.184 1.27-.39 1.774-.753a.06.06 0 0 0 .023-.043v-1.809a.05.05 0 0 0-.02-.041a.05.05 0 0 0-.046-.01a20.3 20.3 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.6 5.6 0 0 1-.319-1.433a.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546c.376 0 .75 0 1.125-.01c1.57-.044 3.224-.124 4.768-.422q.059-.011.11-.024c2.435-.464 4.753-1.92 4.989-5.604c.008-.145.03-1.52.03-1.67c.002-.512.167-3.63-.024-5.545m-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976c-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35c-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102q0-1.965 1.011-3.12c.696-.77 1.608-1.164 2.74-1.164c1.311 0 2.302.5 2.962 1.498l.638 1.06l.638-1.06c.66-.999 1.65-1.498 2.96-1.498c1.13 0 2.043.395 2.74 1.164q1.012 1.155 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-x{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584l-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}
\ No newline at end of file