diff --git a/previews/PR298/404.html b/previews/PR298/404.html new file mode 100644 index 00000000..90136931 --- /dev/null +++ b/previews/PR298/404.html @@ -0,0 +1,541 @@ + + + + + + + + + + + + + + + + + + + + + + YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/api/index.html b/previews/PR298/api/index.html new file mode 100644 index 00000000..1864f648 --- /dev/null +++ b/previews/PR298/api/index.html @@ -0,0 +1,1073 @@ + + + + + + + + + + + + + + + + + + + + + + + + API - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

API

+ +

+

+

Public API¤

+

# +YAXArrays.getAxisMethod.

+
getAxis(desc, c)
+
+

Given an Axis description and a cube, returns the corresponding axis of the cube. The Axis description can be:

+
    +
  • the name as a string or symbol.
  • +
  • an Axis object
  • +
+

source

+

# +YAXArrays.CubesModule.

+

The functions provided by YAXArrays are supposed to work on different types of cubes. This module defines the interface for all Data types that

+

source

+

# +YAXArrays.Cubes.YAXArrayType.

+
YAXArray{T,N}
+
+

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

+

# +YAXArrays.Cubes.caxesFunction.

+

Returns the axes of a Cube

+

source

+

# +YAXArrays.Cubes.caxesMethod.

+
caxes
+
+

Embeds Cube inside a new Cube

+

source

+

# +YAXArrays.Cubes.concatenatecubesMethod.

+
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

+

# +YAXArrays.Cubes.readcubedataMethod.

+
readcubedata(cube)
+
+

Given any array implementing the YAXArray interface it returns an in-memory YAXArray from it.

+

source

+

# +YAXArrays.Cubes.setchunksMethod.

+
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

+

# +YAXArrays.Cubes.subsetcubeFunction.

+

This function calculates a subset of a cube's data

+

source

+

# +YAXArrays.DAT.InDimsType.

+
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

+

# +YAXArrays.DAT.MovingWindowType.

+
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

+

# +YAXArrays.DAT.OutDimsMethod.

+
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

+

# +YAXArrays.DAT.CubeTableMethod.

+
CubeTable()
+
+

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

+

# +YAXArrays.DAT.cubefittableMethod.

+
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

+

# +YAXArrays.DAT.fittableMethod.

+
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:

+
fittable(iter,WeightedMean,:tair,weight=(i->abs(cosd(i.lat))),by=(i->month(i.time),:country))
+
+

source

+

# +YAXArrays.DAT.mapCubeMethod.

+
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

+

# +YAXArrays.DAT.mapCubeMethod.

+
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 maximum size of blocks that are read into memory, 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

+

# +YAXArrays.Datasets.DatasetType.

+
Dataset object which stores an `OrderedDict` 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.
+
+

source

+

# +YAXArrays.Datasets.DatasetMethod.

+

Dataset(; properties = Dict{String,Any}, cubes...)

+

Construct a YAXArray Dataset with global attributes properties a and a list of named YAXArrays cubes...

+

source

+

# +YAXArrays.Datasets.CubeMethod.

+
Cube(ds::Dataset; joinname="Variable")
+
+

Construct a single YAXArray from the dataset ds by concatenating the cubes in the datset on the joinname dimension.

+

source

+

# +YAXArrays.Datasets.open_datasetMethod.

+

open_dataset(g; 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.

+

source

+

# +YAXArrays.Datasets.savecubeMethod.

+
savecube(cube,name::String)
+
+

Save a YAXArray to the path.

+

Extended Help

+

The keyword arguments are:

+
    +
  • name:
  • +
  • datasetaxis="Variable" 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

+

# +YAXArrays.Datasets.savedatasetMethod.

+

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

+

# +YAXArrays.Datasets.to_datasetMethod.

+

to_dataset(c;datasetaxis = "Variable", name = "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 name

+

source

+

+

+

Internal API¤

+

# +YAXArrays.YAXDefaultsConstant.

+

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

+

# +YAXArrays.findAxisMethod.

+
findAxis(desc, c)
+
+

Internal function

+

Extended Help

+
Given an Axis description and a cube return the index of the Axis.
+
+

The Axis description can be:

+
    +
  • the name as a string or symbol.
  • +
  • an Axis object
  • +
+

source

+

# +YAXArrays.getOutAxisMethod.

+
getOutAxis
+
+

source

+

# +YAXArrays.get_descriptorMethod.

+
get_descriptor(a)
+
+

Get the descriptor of an Axis. This is used to dispatch on the descriptor.

+

source

+

# +YAXArrays.match_axisMethod.

+
match_axis
+
+

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

+

# +YAXArrays.Cubes.CleanMeType.

+
mutable struct CleanMe
+
+

Struct which describes data paths and their persistency. Non-persistend paths/files are removed at finalize step

+

source

+

# +YAXArrays.Cubes.cleanMethod.

+
clean(c::CleanMe)
+
+

finalizer function for CleanMe struct. The main process removes all directories/files which are not persistent.

+

source

+

# +YAXArrays.Cubes.copydataMethod.

+
copydata(outar, inar, copybuf)
+
+

Internal function which copies the data from the input inar into the output outar at the copybuf positions.

+

source

+

# +YAXArrays.Cubes.optifuncMethod.

+
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

+

# +YAXArrays.DAT.DATConfigType.

+

Configuration object of a DAT process. This holds all necessary information to perform the calculations. It contains the following fields:

+
    +
  • incubes::Tuple{Vararg{YAXArrays.DAT.InputCube, NIN}} where NIN: The input data cubes
  • +
  • outcubes::Tuple{Vararg{YAXArrays.DAT.OutputCube, NOUT}} 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

+

# +YAXArrays.DAT.InputCubeType.

+

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

+

# +YAXArrays.DAT.OutputCubeType.

+

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

+

# +YAXArrays.DAT.YAXColumnType.

+
YAXColumn
+
+

A struct representing a single column of a YAXArray partitioned Table # Fields

+
    +
  • inarBC
  • +
  • inds
  • +
+

source

+

# +YAXArrays.DAT.cmpcachmissesMethod.

+

Function that compares two cache miss specifiers by their importance

+

source

+

# +YAXArrays.DAT.getFrontPermMethod.

+

Calculate an axis permutation that brings the wanted dimensions to the front

+

source

+

# +YAXArrays.DAT.getLoopCacheSizeMethod.

+

Calculate optimal Cache size to DAT operation

+

source

+

# +YAXArrays.DAT.getOuttypeMethod.

+
getOuttype(outtype, cdata)
+
+

Internal function

+

Get the element type for the output cube

+

source

+

# +YAXArrays.DAT.getloopchunksMethod.

+
getloopchunks(dc::DATConfig)
+
+

Internal function

+
Returns the chunks that can be looped over toghether for all dimensions.
+This computation of the size of the chunks is handled by [`DiskArrays.approx_chunksize`](@ref)
+
+

source

+

# +YAXArrays.DAT.permuteloopaxesMethod.

+
permuteloopaxes(dc)
+
+

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

+

# +YAXArrays.Cubes.setchunksMethod.

+
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

+

# +YAXArrays.Datasets.collectfromhandleMethod.

+

Extracts a YAXArray from a dataset handle that was just created from a arrayinfo

+

source

+

# +YAXArrays.Datasets.createdatasetMethod.

+

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
  • +
  • fillvalue= T>:Missing ? defaultfillval(Base.nonmissingtype(T)) : nothing fill value
  • +
  • datasetaxis="Variable" special treatment of a categorical axis that gets written into separate zarr arrays
  • +
+

+
+

source

+

# +YAXArrays.Datasets.getarrayinfoMethod.

+

Extract necessary information to create a YAXArrayBase dataset from a name and YAXArray pair

+

source

+

# +YAXArrays.Datasets.testrangeMethod.

+

Test if data in x can be approximated by a step range

+

source

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/assets/Documenter.css b/previews/PR298/assets/Documenter.css new file mode 100644 index 00000000..d9af5d6c --- /dev/null +++ b/previews/PR298/assets/Documenter.css @@ -0,0 +1,18 @@ +div.wy-menu-vertical ul.current li.toctree-l3 a { + font-weight: bold; +} + +a.documenter-source { + float: right; +} + +.documenter-methodtable pre { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +.documenter-methodtable pre.documenter-inline { + display: inline; +} diff --git a/previews/PR298/assets/images/favicon.png b/previews/PR298/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/previews/PR298/assets/images/favicon.png differ diff --git a/previews/PR298/assets/javascripts/bundle.220ee61c.min.js b/previews/PR298/assets/javascripts/bundle.220ee61c.min.js new file mode 100644 index 00000000..116072a1 --- /dev/null +++ b/previews/PR298/assets/javascripts/bundle.220ee61c.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var M=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?M:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function _(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():M))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>M),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=_("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Simple maps

+ +
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/"
+g = open_dataset(zopen(store, consolidated=true))
+c = g["tas"]
+
+
384×192×251288 YAXArray{Float32,3} with dimensions: 
+  Dim{:lon} Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} Float64[-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+  Ti Sampled{DateTime} DateTime[2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points
+units: K
+name: tas
+Total size: 69.02 GB
+
+

Subset, first time step

+
ct1 = c[Ti = Near(Date("2015-01-01"))]
+lon = ct1.lon.val
+lat = ct1.lat.val
+data = ct1.data[:,:];
+
+

+

+

Heatmap plot¤

+
GLMakie.activate!()
+fig = Figure(resolution = (1200,600))
+ax = Axis(fig[1,1]; aspect = DataAspect())
+heatmap!(ax, lon, lat, data; colormap = :seaborn_icefire_gradient)
+fig
+
+

+

+

+

Add Coastlines via the GeoAxis, wintri Projection¤

+
δlon = (lon[2]-lon[1])/2
+nlon = lon .- 180 .+ δlon
+ndata = circshift(data, (192,1))
+
+
+fig = Figure(resolution = (1200,600))
+ax = GeoAxis(fig[1,1])
+surface!(ax, nlon, lat, 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¤

+
fig = Figure(resolution = (1200,600))
+ax = GeoAxis(fig[1,1]; dest = "+proj=moll")
+surface!(ax, nlon, lat, 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¤

+
#using JSServe, WGLMakie
+#WGLMakie.activate!()
+#Page(exportable=true, offline=true)
+
+ds = replace(ndata, missing =>NaN)
+sphere = uv_normal_mesh(Tesselation(Sphere(Point3f(0), 1), 128))
+
+fig = Figure()
+ax = LScene(fig[1,1], show_axis=false)
+mesh!(ax, sphere; color = ds'[end:-1:1,:],
+    colormap = :seaborn_icefire_gradient)
+zoom!(ax.scene, cameracontrols(ax.scene), 0.65)
+rotate!(ax.scene, 2.5)
+fig
+
+

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/Gallery/tixpumh.png b/previews/PR298/examples/generated/Gallery/tixpumh.png new file mode 100644 index 00000000..249f4a05 Binary files /dev/null and b/previews/PR298/examples/generated/Gallery/tixpumh.png differ diff --git a/previews/PR298/examples/generated/Gallery/yuawnca.png b/previews/PR298/examples/generated/Gallery/yuawnca.png new file mode 100644 index 00000000..4ade0cd9 Binary files /dev/null and b/previews/PR298/examples/generated/Gallery/yuawnca.png differ diff --git a/previews/PR298/examples/generated/HowdoI/eivuhek.png b/previews/PR298/examples/generated/HowdoI/eivuhek.png new file mode 100644 index 00000000..e4a9d34f Binary files /dev/null and b/previews/PR298/examples/generated/HowdoI/eivuhek.png differ diff --git a/previews/PR298/examples/generated/HowdoI/howdoi/index.html b/previews/PR298/examples/generated/HowdoI/howdoi/index.html new file mode 100644 index 00000000..0575de0a --- /dev/null +++ b/previews/PR298/examples/generated/HowdoI/howdoi/index.html @@ -0,0 +1,897 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + How do I ... - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

How do I ...

+ +

The purpose of this section is to do a collection of small convinient pieces of code on how to do simple things.

+
+

Question

+
+

+

+

Extract the axes names from a Cube¤

+
using YAXArrays
+using DimensionalData
+c = YAXArray(rand(10, 10, 5))
+
+caxes(c)
+
+
Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+Dim{:Dim_2} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+
+
+

Question

+
+

+

+

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.

+
# this two examples bring the same result
+collect(getAxis("Dim_1", c).val)
+collect(c.axes[1].val)
+
+# to collect data from a cube works exactly the same as doing it from an array
+c[:, :, 1]
+
+
10×10 YAXArray{Float64,2} with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Dim_2} Sampled{Int64} 1:10 ForwardOrdered Regular Points
+Total size: 800.0 bytes
+
+

+

+

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

+
using YAXArrays
+
+axlist = (
+    Dim{:time}(range(1, 20, length=20)),
+    Dim{:lon}(range(1, 10, length=10)),
+    Dim{:lat}(range(1, 5, length=15))
+    )
+
+data1 = rand(20, 10, 15)
+ds1 = YAXArray(axlist, data1)
+
+data2 = rand(20, 10, 15)
+ds2 = YAXArray(axlist, data2)
+
+
20×10×15 YAXArray{Float64,3} with dimensions: 
+  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total size: 23.44 KB
+
+

Now we can concatenate ds1 and ds2 cubes:

+
dsfinal = concatenatecubes([ds1, ds2], Dim{:Variables}(["var1", "var2"]))
+
+dsfinal
+
+
20×10×15×2 YAXArray{Float64,4} with dimensions: 
+  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+  Dim{:Variables} Categorical{String} String["var1", "var2"] ForwardOrdered
+Total size: 46.88 KB
+
+

+

+

How do I subset a Cube?¤

+

Let's start by creating a dummy cube

+
# define the time span of the cube
+using Dates
+t = Date("2020-01-01"):Month(1):Date("2022-12-31")
+
+# create cube axes
+axes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(t))
+
+# assign values to a cube
+c = YAXArray(axes, reshape(1:3600, (10, 10, 36)))
+
+
10×10×36 YAXArray{Int64,3} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Time} Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+Total size: 28.12 KB
+
+

Now we subset the cube by any dimension

+
# subset cube by years
+ctime = c[Time=Between(Date(2021,1,1), Date(2021,12,31))]
+
+# subset cube by a specific date and date range
+ctime2 = c[Time=At(Date("2021-05-01"))]
+ctime3 = c[Time=Date("2021-05-01") .. Date("2021-12-01")]
+
+# subset cube by longitude and latitude
+clonlat = c[Lon=1 .. 5, Lat=5 .. 10] # check even numbers range, it is ommiting them
+
+
5×6×36 YAXArray{Int64,3} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:5 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 5:10 ForwardOrdered Regular Points,
+  Dim{:Time} Sampled{Date} Date("2020-01-01"):Dates.Month(1):Date("2022-12-01") ForwardOrdered Regular Points
+Total size: 8.44 KB
+
+

+

+

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
+map((x, y) -> x * y, ds1, ds2)
+
+# cubes with more than 3 dimensions
+map((x, y) -> x * y, dsfinal[Variables=At("var1")], dsfinal[Variables=At("var2")])
+
+
20×10×15 YAXArray{Float64,3} with dimensions: 
+  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total 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.

+
mapslices(ds1, dims=("Lon", "Lat")) do xin
+    (xin * π) ./ maximum(skipmissing(xin))
+end
+
+
10×15×20 YAXArray{Union{Missing, Float64},3} with dimensions: 
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+Total 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
+classes = YAXArray((getAxis("lon", dsfinal), getAxis("lat", dsfinal)), rand(1:3, 10, 15))
+
+using CairoMakie
+CairoMakie.activate!()
+
+

This is how our classification map looks like

+
heatmap(classes.data[:, :])
+
+

+

Now we define the input cubes that will be considered for the iterable table

+
t = CubeTable(values=ds1, classes=classes)
+
+using DataFrames
+using OnlineStats
+# visualiztion of the CubeTable
+DataFrame(t[1])
+
+
3000×5 DataFrame
+
Rowvaluesclassestimelonlat
Float64Int64Float64Float64Float64
10.68213431.01.01.0
20.42181332.01.01.0
30.39030733.01.01.0
40.072491634.01.01.0
50.60454735.01.01.0
60.57982336.01.01.0
70.87147737.01.01.0
80.90164238.01.01.0
90.41667139.01.01.0
100.603215310.01.01.0
110.2912311.01.01.0
120.697042312.01.01.0
130.412212313.01.01.0
140.76752314.01.01.0
150.803036315.01.01.0
160.227921316.01.01.0
170.149404317.01.01.0
180.616904318.01.01.0
190.927644319.01.01.0
200.0775929320.01.01.0
210.065368931.02.01.0
220.43985932.02.01.0
230.51363833.02.01.0
240.099749434.02.01.0
250.893335.02.01.0
260.89933836.02.01.0
270.3200337.02.01.0
280.56003338.02.01.0
290.82378539.02.01.0
300.348777310.02.01.0
310.614473311.02.01.0
320.826605312.02.01.0
330.3037313.02.01.0
340.0538213314.02.01.0
350.772191315.02.01.0
360.0626547316.02.01.0
370.951853317.02.01.0
380.130601318.02.01.0
390.598268319.02.01.0
400.196384320.02.01.0
410.60225931.03.01.0
420.15406732.03.01.0
430.019548433.03.01.0
440.17427534.03.01.0
450.15942235.03.01.0
460.30830636.03.01.0
470.7256937.03.01.0
480.51122338.03.01.0
490.26873639.03.01.0
500.967526310.03.01.0
510.550787311.03.01.0
520.961019312.03.01.0
530.0982624313.03.01.0
540.315587314.03.01.0
550.426414315.03.01.0
560.120476316.03.01.0
570.200282317.03.01.0
580.0849132318.03.01.0
590.581511319.03.01.0
600.653896320.03.01.0
610.64256411.04.01.0
620.35618312.04.01.0
630.091564613.04.01.0
640.27361914.04.01.0
650.65569315.04.01.0
660.90401216.04.01.0
670.42989717.04.01.0
680.28815218.04.01.0
690.99363219.04.01.0
700.580523110.04.01.0
710.269957111.04.01.0
720.526495112.04.01.0
730.401152113.04.01.0
740.226921114.04.01.0
750.766935115.04.01.0
760.543993116.04.01.0
770.924119117.04.01.0
780.237818118.04.01.0
790.251807119.04.01.0
800.919494120.04.01.0
810.017257831.05.01.0
820.8167432.05.01.0
830.73606733.05.01.0
840.91976434.05.01.0
850.69661335.05.01.0
860.51675436.05.01.0
870.15500837.05.01.0
880.23255738.05.01.0
890.22270639.05.01.0
900.672187310.05.01.0
910.813225311.05.01.0
920.490834312.05.01.0
930.537471313.05.01.0
940.741898314.05.01.0
950.464931315.05.01.0
960.598315316.05.01.0
970.550807317.05.01.0
980.63391318.05.01.0
990.427345319.05.01.0
1000.608111320.05.01.0
1010.22927531.06.01.0
1020.3715132.06.01.0
1030.29878933.06.01.0
1040.95160834.06.01.0
1050.28542935.06.01.0
1060.15768636.06.01.0
1070.063653137.06.01.0
1080.19926438.06.01.0
1090.7788439.06.01.0
1100.40423310.06.01.0
1110.516695311.06.01.0
1120.404425312.06.01.0
1130.32251313.06.01.0
1140.93777314.06.01.0
1150.428302315.06.01.0
1160.422956316.06.01.0
1170.107945317.06.01.0
1180.739375318.06.01.0
1190.235446319.06.01.0
1200.0478653320.06.01.0
1210.40371631.07.01.0
1220.57279332.07.01.0
1230.74830333.07.01.0
1240.9307434.07.01.0
1250.369435.07.01.0
1260.081982136.07.01.0
1270.082767637.07.01.0
1280.74398738.07.01.0
1290.97321939.07.01.0
1300.228616310.07.01.0
1310.468564311.07.01.0
1320.799182312.07.01.0
1330.796699313.07.01.0
1340.0482639314.07.01.0
1350.176952315.07.01.0
1360.898868316.07.01.0
1370.0945437317.07.01.0
1380.180833318.07.01.0
1390.000153774319.07.01.0
1400.429608320.07.01.0
1410.2231811.08.01.0
1420.35580712.08.01.0
1430.25866613.08.01.0
1440.86876314.08.01.0
1450.51238415.08.01.0
1460.48907416.08.01.0
1470.91724517.08.01.0
1480.23783418.08.01.0
1490.38581919.08.01.0
1500.488432110.08.01.0
1510.404128111.08.01.0
1520.535978112.08.01.0
1530.852076113.08.01.0
1540.663979114.08.01.0
1550.770232115.08.01.0
1560.430946116.08.01.0
1570.202344117.08.01.0
1580.108317118.08.01.0
1590.380864119.08.01.0
1600.751299120.08.01.0
1610.5798531.09.01.0
1620.068867232.09.01.0
1630.79167333.09.01.0
1640.56211634.09.01.0
1650.63574435.09.01.0
1660.40907236.09.01.0
1670.70558137.09.01.0
1680.30228238.09.01.0
1690.041215339.09.01.0
1700.657268310.09.01.0
1710.0297303311.09.01.0
1720.398398312.09.01.0
1730.575467313.09.01.0
1740.306394314.09.01.0
1750.682789315.09.01.0
1760.59427316.09.01.0
1770.399689317.09.01.0
1780.020152318.09.01.0
1790.625572319.09.01.0
1800.636996320.09.01.0
1810.1121331.010.01.0
1820.65073132.010.01.0
1830.42766533.010.01.0
1840.61237434.010.01.0
1850.39728935.010.01.0
1860.27129836.010.01.0
1870.26562437.010.01.0
1880.58644938.010.01.0
1890.6354639.010.01.0
1900.0712416310.010.01.0
1910.482718311.010.01.0
1920.617405312.010.01.0
1930.865247313.010.01.0
1940.768272314.010.01.0
1950.21517315.010.01.0
1960.0320846316.010.01.0
1970.0331236317.010.01.0
1980.802799318.010.01.0
1990.352202319.010.01.0
2000.144825320.010.01.0
2010.84623711.01.01.28571
2020.95324212.01.01.28571
2030.24883513.01.01.28571
2040.30306714.01.01.28571
2050.37177815.01.01.28571
2060.50263416.01.01.28571
2070.41814817.01.01.28571
2080.84679618.01.01.28571
2090.65619419.01.01.28571
2100.440922110.01.01.28571
2110.75392111.01.01.28571
2120.254932112.01.01.28571
2130.0868324113.01.01.28571
2140.726886114.01.01.28571
2150.8762115.01.01.28571
2160.224633116.01.01.28571
2170.75911117.01.01.28571
2180.734085118.01.01.28571
2190.256183119.01.01.28571
2200.740235120.01.01.28571
2210.95925321.02.01.28571
2220.037098922.02.01.28571
2230.11821123.02.01.28571
2240.00053100224.02.01.28571
2250.93914825.02.01.28571
2260.84753626.02.01.28571
2270.79996527.02.01.28571
2280.9978228.02.01.28571
2290.88093729.02.01.28571
2300.637129210.02.01.28571
2310.871636211.02.01.28571
2320.196472212.02.01.28571
2330.569994213.02.01.28571
2340.737026214.02.01.28571
2350.182443215.02.01.28571
2360.636671216.02.01.28571
2370.112806217.02.01.28571
2380.0810873218.02.01.28571
2390.0183359219.02.01.28571
2400.73593220.02.01.28571
2410.70472221.03.01.28571
2420.35754422.03.01.28571
2430.9705423.03.01.28571
2440.55715924.03.01.28571
2450.57856325.03.01.28571
2460.63097326.03.01.28571
2470.15463527.03.01.28571
2480.86915128.03.01.28571
2490.11880729.03.01.28571
2500.226657210.03.01.28571
2510.791679211.03.01.28571
2520.423978212.03.01.28571
2530.834099213.03.01.28571
2540.0697309214.03.01.28571
2550.941494215.03.01.28571
2560.651462216.03.01.28571
2570.853781217.03.01.28571
2580.374049218.03.01.28571
2590.782219219.03.01.28571
2600.769442220.03.01.28571
2610.42804731.04.01.28571
2620.073180432.04.01.28571
2630.50344433.04.01.28571
2640.58148334.04.01.28571
2650.10897635.04.01.28571
2660.065810136.04.01.28571
2670.26967737.04.01.28571
2680.15432338.04.01.28571
2690.6046439.04.01.28571
2700.765341310.04.01.28571
2710.405099311.04.01.28571
2720.839307312.04.01.28571
2730.464829313.04.01.28571
2740.102623314.04.01.28571
2750.567896315.04.01.28571
2760.355628316.04.01.28571
2770.144556317.04.01.28571
2780.804307318.04.01.28571
2790.140461319.04.01.28571
2800.902372320.04.01.28571
2810.54743921.05.01.28571
2820.64744322.05.01.28571
2830.76939823.05.01.28571
2840.99542824.05.01.28571
2850.8957125.05.01.28571
2860.53575126.05.01.28571
2870.61092627.05.01.28571
2880.12785328.05.01.28571
2890.16963629.05.01.28571
2900.602856210.05.01.28571
2910.047635211.05.01.28571
2920.953187212.05.01.28571
2930.708361213.05.01.28571
2940.130233214.05.01.28571
2950.793625215.05.01.28571
2960.107839216.05.01.28571
2970.857122217.05.01.28571
2980.585191218.05.01.28571
2990.573865219.05.01.28571
3000.196046220.05.01.28571
3010.49947211.06.01.28571
3020.90902512.06.01.28571
3030.30489713.06.01.28571
3040.52475814.06.01.28571
3050.32230815.06.01.28571
3060.85597616.06.01.28571
3070.98845717.06.01.28571
3080.58281718.06.01.28571
3090.21550719.06.01.28571
3100.00948736110.06.01.28571
3110.14061111.06.01.28571
3120.511214112.06.01.28571
3130.856884113.06.01.28571
3140.971418114.06.01.28571
3150.19976115.06.01.28571
3160.152605116.06.01.28571
3170.558648117.06.01.28571
3180.189447118.06.01.28571
3190.428217119.06.01.28571
3200.480026120.06.01.28571
3210.84876731.07.01.28571
3220.098767832.07.01.28571
3230.49494433.07.01.28571
3240.55088634.07.01.28571
3250.51359335.07.01.28571
3260.16168336.07.01.28571
3270.17197737.07.01.28571
3280.27774338.07.01.28571
3290.94507439.07.01.28571
3300.140113310.07.01.28571
3310.577174311.07.01.28571
3320.109556312.07.01.28571
3330.145032313.07.01.28571
3340.4492314.07.01.28571
3350.913236315.07.01.28571
3360.350738316.07.01.28571
3370.604074317.07.01.28571
3380.47683318.07.01.28571
3390.135202319.07.01.28571
3400.333557320.07.01.28571
3410.89580411.08.01.28571
3420.57353112.08.01.28571
3430.50234713.08.01.28571
3440.15903914.08.01.28571
3450.0064349915.08.01.28571
3460.87591416.08.01.28571
3470.079914917.08.01.28571
3480.7632918.08.01.28571
3490.158119.08.01.28571
3500.151484110.08.01.28571
3510.187889111.08.01.28571
3520.613862112.08.01.28571
3530.215885113.08.01.28571
3540.225929114.08.01.28571
3550.797934115.08.01.28571
3560.816423116.08.01.28571
3570.543231117.08.01.28571
3580.0458482118.08.01.28571
3590.273124119.08.01.28571
3600.0264811120.08.01.28571
3610.90076221.09.01.28571
3620.13307822.09.01.28571
3630.63487623.09.01.28571
3640.6955524.09.01.28571
3650.56003225.09.01.28571
3660.03966226.09.01.28571
3670.30523127.09.01.28571
3680.22581328.09.01.28571
3690.14512529.09.01.28571
3700.545922210.09.01.28571
3710.223583211.09.01.28571
3720.731593212.09.01.28571
3730.00441011213.09.01.28571
3740.810254214.09.01.28571
3750.483363215.09.01.28571
3760.165499216.09.01.28571
3770.239655217.09.01.28571
3780.806912218.09.01.28571
3790.655909219.09.01.28571
3800.455986220.09.01.28571
3810.91946621.010.01.28571
3820.38535522.010.01.28571
3830.37985323.010.01.28571
3840.11851124.010.01.28571
3850.96158625.010.01.28571
3860.61249926.010.01.28571
3870.21895127.010.01.28571
3880.78394928.010.01.28571
3890.91716229.010.01.28571
3900.799989210.010.01.28571
3910.688591211.010.01.28571
3920.603124212.010.01.28571
3930.833043213.010.01.28571
3940.426893214.010.01.28571
3950.602304215.010.01.28571
3960.676496216.010.01.28571
3970.0584948217.010.01.28571
3980.28735218.010.01.28571
3990.592217219.010.01.28571
4000.0325142220.010.01.28571
4010.048823321.01.01.57143
4020.58197922.01.01.57143
4030.24613923.01.01.57143
4040.6134924.01.01.57143
4050.21852825.01.01.57143
4060.30197226.01.01.57143
4070.64496227.01.01.57143
4080.77077128.01.01.57143
4090.14363729.01.01.57143
4100.836487210.01.01.57143
4110.99881211.01.01.57143
4120.183526212.01.01.57143
4130.689396213.01.01.57143
4140.333577214.01.01.57143
4150.354361215.01.01.57143
4160.844056216.01.01.57143
4170.53676217.01.01.57143
4180.728998218.01.01.57143
4190.5087219.01.01.57143
4200.955592220.01.01.57143
4210.97391131.02.01.57143
4220.60467132.02.01.57143
4230.33204733.02.01.57143
4240.94429234.02.01.57143
4250.41532235.02.01.57143
4260.54248736.02.01.57143
4270.4017637.02.01.57143
4280.078454638.02.01.57143
4290.9237939.02.01.57143
4300.179936310.02.01.57143
4310.356103311.02.01.57143
4320.0954755312.02.01.57143
4330.600688313.02.01.57143
4340.380731314.02.01.57143
4350.613622315.02.01.57143
4360.978756316.02.01.57143
4370.274156317.02.01.57143
4380.102535318.02.01.57143
4390.247001319.02.01.57143
4400.840736320.02.01.57143
4410.67639721.03.01.57143
4420.35633622.03.01.57143
4430.90235823.03.01.57143
4440.90813624.03.01.57143
4450.43801125.03.01.57143
4460.24838626.03.01.57143
4470.58563827.03.01.57143
4480.55634428.03.01.57143
4490.35207529.03.01.57143
4500.738185210.03.01.57143
4510.134012211.03.01.57143
4520.685575212.03.01.57143
4530.235172213.03.01.57143
4540.941799214.03.01.57143
4550.101516215.03.01.57143
4560.231011216.03.01.57143
4570.470079217.03.01.57143
4580.696376218.03.01.57143
4590.749303219.03.01.57143
4600.815771220.03.01.57143
4610.22796521.04.01.57143
4620.78099522.04.01.57143
4630.14691323.04.01.57143
4640.4381624.04.01.57143
4650.19072625.04.01.57143
4660.30977426.04.01.57143
4670.3187127.04.01.57143
4680.37113128.04.01.57143
4690.45072429.04.01.57143
4700.0521636210.04.01.57143
4710.0798079211.04.01.57143
4720.921937212.04.01.57143
4730.0564193213.04.01.57143
4740.850588214.04.01.57143
4750.289073215.04.01.57143
4760.342357216.04.01.57143
4770.327182217.04.01.57143
4780.439564218.04.01.57143
4790.169877219.04.01.57143
4800.850475220.04.01.57143
4810.54707111.05.01.57143
4820.78737412.05.01.57143
4830.47256313.05.01.57143
4840.4158814.05.01.57143
4850.069615615.05.01.57143
4860.694716.05.01.57143
4870.51556617.05.01.57143
4880.67544618.05.01.57143
4890.2770919.05.01.57143
4900.91021110.05.01.57143
4910.666401111.05.01.57143
4920.209879112.05.01.57143
4930.744703113.05.01.57143
4940.270804114.05.01.57143
4950.424873115.05.01.57143
4960.936163116.05.01.57143
4970.12138117.05.01.57143
4980.45972118.05.01.57143
4990.957492119.05.01.57143
5000.526263120.05.01.57143
5010.38237831.06.01.57143
5020.17944832.06.01.57143
5030.82560433.06.01.57143
5040.22524434.06.01.57143
5050.52067235.06.01.57143
5060.99997536.06.01.57143
5070.67038937.06.01.57143
5080.74935738.06.01.57143
5090.91446539.06.01.57143
5100.447435310.06.01.57143
5110.82763311.06.01.57143
5120.812706312.06.01.57143
5130.903083313.06.01.57143
5140.156689314.06.01.57143
5150.376977315.06.01.57143
5160.866087316.06.01.57143
5170.556258317.06.01.57143
5180.0922375318.06.01.57143
5190.165928319.06.01.57143
5200.97762320.06.01.57143
5210.4786521.07.01.57143
5220.029895622.07.01.57143
5230.24575123.07.01.57143
5240.68187924.07.01.57143
5250.75427925.07.01.57143
5260.43720526.07.01.57143
5270.14638227.07.01.57143
5280.067781428.07.01.57143
5290.50413529.07.01.57143
5300.118001210.07.01.57143
5310.210276211.07.01.57143
5320.766471212.07.01.57143
5330.557731213.07.01.57143
5340.329019214.07.01.57143
5350.737415215.07.01.57143
5360.147378216.07.01.57143
5370.821106217.07.01.57143
5380.229147218.07.01.57143
5390.892014219.07.01.57143
5400.183441220.07.01.57143
5410.52524511.08.01.57143
5420.87251812.08.01.57143
5430.20875113.08.01.57143
5440.0069396814.08.01.57143
5450.53090215.08.01.57143
5460.011179616.08.01.57143
5470.46490817.08.01.57143
5480.79254718.08.01.57143
5490.93570619.08.01.57143
5500.201848110.08.01.57143
5510.395073111.08.01.57143
5520.951789112.08.01.57143
5530.483845113.08.01.57143
5540.0282062114.08.01.57143
5550.956254115.08.01.57143
5560.452286116.08.01.57143
5570.173136117.08.01.57143
5580.834486118.08.01.57143
5590.232937119.08.01.57143
5600.60393120.08.01.57143
5610.82254811.09.01.57143
5620.29733612.09.01.57143
5630.57066913.09.01.57143
5640.57088514.09.01.57143
5650.83019115.09.01.57143
5660.86415416.09.01.57143
5670.67178417.09.01.57143
5680.92601818.09.01.57143
5690.79341919.09.01.57143
5700.428596110.09.01.57143
5710.139549111.09.01.57143
5720.581374112.09.01.57143
5730.806336113.09.01.57143
5740.142632114.09.01.57143
5750.230906115.09.01.57143
5760.506127116.09.01.57143
5770.0722355117.09.01.57143
5780.435041118.09.01.57143
5790.919578119.09.01.57143
5800.589807120.09.01.57143
5810.49196531.010.01.57143
5820.3972332.010.01.57143
5830.48088133.010.01.57143
5840.72755834.010.01.57143
5850.50435735.010.01.57143
5860.31139936.010.01.57143
5870.91065337.010.01.57143
5880.58637838.010.01.57143
5890.59818939.010.01.57143
5900.589827310.010.01.57143
5910.62415311.010.01.57143
5920.256324312.010.01.57143
5930.0427825313.010.01.57143
5940.0913263314.010.01.57143
5950.0885822315.010.01.57143
5960.711388316.010.01.57143
5970.552879317.010.01.57143
5980.490744318.010.01.57143
5990.779435319.010.01.57143
6000.348989320.010.01.57143
6010.24435511.01.01.85714
6020.80619312.01.01.85714
6030.37581113.01.01.85714
6040.71640114.01.01.85714
6050.52823515.01.01.85714
6060.095062916.01.01.85714
6070.72842517.01.01.85714
6080.36737418.01.01.85714
6090.46960719.01.01.85714
6100.850695110.01.01.85714
6110.101449111.01.01.85714
6120.643317112.01.01.85714
6130.38513113.01.01.85714
6140.744632114.01.01.85714
6150.276053115.01.01.85714
6160.122291116.01.01.85714
6170.088824117.01.01.85714
6180.375321118.01.01.85714
6190.608312119.01.01.85714
6200.835734120.01.01.85714
6210.0085275911.02.01.85714
6220.36679612.02.01.85714
6230.10857513.02.01.85714
6240.018980814.02.01.85714
6250.32682815.02.01.85714
6260.67631816.02.01.85714
6270.45453917.02.01.85714
6280.52914918.02.01.85714
6290.29560219.02.01.85714
6300.633848110.02.01.85714
6310.888079111.02.01.85714
6320.525181112.02.01.85714
6330.723792113.02.01.85714
6340.564539114.02.01.85714
6350.715683115.02.01.85714
6360.953132116.02.01.85714
6370.233157117.02.01.85714
6380.79526118.02.01.85714
6390.271639119.02.01.85714
6400.0605851120.02.01.85714
6410.060927131.03.01.85714
6420.59938832.03.01.85714
6430.086044633.03.01.85714
6440.84051634.03.01.85714
6450.36360135.03.01.85714
6460.38507436.03.01.85714
6470.54008137.03.01.85714
6480.45454838.03.01.85714
6490.14640939.03.01.85714
6500.378382310.03.01.85714
6510.986299311.03.01.85714
6520.623513312.03.01.85714
6530.221302313.03.01.85714
6540.263612314.03.01.85714
6550.471341315.03.01.85714
6560.085499316.03.01.85714
6570.502715317.03.01.85714
6580.891791318.03.01.85714
6590.401845319.03.01.85714
6600.841105320.03.01.85714
6610.40478911.04.01.85714
6620.85949412.04.01.85714
6630.98514913.04.01.85714
6640.1432714.04.01.85714
6650.68868515.04.01.85714
6660.19675816.04.01.85714
6670.24042217.04.01.85714
6680.30031818.04.01.85714
6690.51257319.04.01.85714
6700.713432110.04.01.85714
6710.426475111.04.01.85714
6720.809605112.04.01.85714
6730.873698113.04.01.85714
6740.189708114.04.01.85714
6750.948128115.04.01.85714
6760.855817116.04.01.85714
6770.45732117.04.01.85714
6780.430294118.04.01.85714
6790.640645119.04.01.85714
6800.361578120.04.01.85714
6810.18683221.05.01.85714
6820.71270922.05.01.85714
6830.053428823.05.01.85714
6840.57131524.05.01.85714
6850.83067125.05.01.85714
6860.41833626.05.01.85714
6870.37120927.05.01.85714
6880.81132628.05.01.85714
6890.088386829.05.01.85714
6900.847095210.05.01.85714
6910.92677211.05.01.85714
6920.278503212.05.01.85714
6930.120835213.05.01.85714
6940.748072214.05.01.85714
6950.846663215.05.01.85714
6960.87619216.05.01.85714
6970.0843817217.05.01.85714
6980.4586218.05.01.85714
6990.832093219.05.01.85714
7000.50432220.05.01.85714
7010.019612421.06.01.85714
7020.33180222.06.01.85714
7030.43231923.06.01.85714
7040.15909524.06.01.85714
7050.54356725.06.01.85714
7060.22948626.06.01.85714
7070.13512627.06.01.85714
7080.53457528.06.01.85714
7090.83596129.06.01.85714
7100.088124210.06.01.85714
7110.277297211.06.01.85714
7120.995302212.06.01.85714
7130.799256213.06.01.85714
7140.0893118214.06.01.85714
7150.688673215.06.01.85714
7160.130543216.06.01.85714
7170.519731217.06.01.85714
7180.585058218.06.01.85714
7190.463822219.06.01.85714
7200.44713220.06.01.85714
7210.78645611.07.01.85714
7220.562812.07.01.85714
7230.69237713.07.01.85714
7240.36159314.07.01.85714
7250.42333415.07.01.85714
7260.89896916.07.01.85714
7270.17069517.07.01.85714
7280.66792418.07.01.85714
7290.85430619.07.01.85714
7300.166471110.07.01.85714
7310.450751111.07.01.85714
7320.0107968112.07.01.85714
7330.677651113.07.01.85714
7340.920459114.07.01.85714
7350.647384115.07.01.85714
7360.789844116.07.01.85714
7370.601803117.07.01.85714
7380.564196118.07.01.85714
7390.612963119.07.01.85714
7400.558442120.07.01.85714
7410.42850611.08.01.85714
7420.7258112.08.01.85714
7430.39767613.08.01.85714
7440.64520714.08.01.85714
7450.2756715.08.01.85714
7460.17330416.08.01.85714
7470.55183417.08.01.85714
7480.038151818.08.01.85714
7490.96293119.08.01.85714
7500.864923110.08.01.85714
7510.550037111.08.01.85714
7520.979023112.08.01.85714
7530.596676113.08.01.85714
7540.854328114.08.01.85714
7550.0743039115.08.01.85714
7560.883918116.08.01.85714
7570.461573117.08.01.85714
7580.89023118.08.01.85714
7590.03243119.08.01.85714
7600.949626120.08.01.85714
7610.27862521.09.01.85714
7620.084098522.09.01.85714
7630.24936223.09.01.85714
7640.62774324.09.01.85714
7650.33794525.09.01.85714
7660.93131726.09.01.85714
7670.43637827.09.01.85714
7680.50103628.09.01.85714
7690.91584429.09.01.85714
7700.495349210.09.01.85714
7710.389062211.09.01.85714
7720.704166212.09.01.85714
7730.476084213.09.01.85714
7740.719303214.09.01.85714
7750.759337215.09.01.85714
7760.701491216.09.01.85714
7770.0566114217.09.01.85714
7780.685421218.09.01.85714
7790.562488219.09.01.85714
7800.813586220.09.01.85714
7810.71042821.010.01.85714
7820.92835522.010.01.85714
7830.13616723.010.01.85714
7840.64106724.010.01.85714
7850.90225425.010.01.85714
7860.96163526.010.01.85714
7870.47898227.010.01.85714
7880.47444528.010.01.85714
7890.46013529.010.01.85714
7900.845938210.010.01.85714
7910.483593211.010.01.85714
7920.292689212.010.01.85714
7930.995761213.010.01.85714
7940.994957214.010.01.85714
7950.57263215.010.01.85714
7960.34912216.010.01.85714
7970.796761217.010.01.85714
7980.63756218.010.01.85714
7990.918832219.010.01.85714
8000.504641220.010.01.85714
8010.84195731.01.02.14286
8020.89219932.01.02.14286
8030.49129133.01.02.14286
8040.76612634.01.02.14286
8050.41226235.01.02.14286
8060.41454836.01.02.14286
8070.32660837.01.02.14286
8080.48353538.01.02.14286
8090.95087839.01.02.14286
8100.38497310.01.02.14286
8110.728154311.01.02.14286
8120.301964312.01.02.14286
8130.994208313.01.02.14286
8140.927875314.01.02.14286
8150.518173315.01.02.14286
8160.825802316.01.02.14286
8170.55397317.01.02.14286
8180.92514318.01.02.14286
8190.492521319.01.02.14286
8200.390265320.01.02.14286
8210.75805131.02.02.14286
8220.65651632.02.02.14286
8230.62979133.02.02.14286
8240.15559834.02.02.14286
8250.26459835.02.02.14286
8260.48152836.02.02.14286
8270.79050137.02.02.14286
8280.78950138.02.02.14286
8290.70765939.02.02.14286
8300.596195310.02.02.14286
8310.0235424311.02.02.14286
8320.125732312.02.02.14286
8330.051597313.02.02.14286
8340.58752314.02.02.14286
8350.714532315.02.02.14286
8360.531092316.02.02.14286
8370.537919317.02.02.14286
8380.9963318.02.02.14286
8390.903734319.02.02.14286
8400.684551320.02.02.14286
8410.65954631.03.02.14286
8420.92771132.03.02.14286
8430.29862933.03.02.14286
8440.10592334.03.02.14286
8450.51983135.03.02.14286
8460.47384136.03.02.14286
8470.68121337.03.02.14286
8480.19760338.03.02.14286
8490.68606339.03.02.14286
8500.996115310.03.02.14286
8510.768078311.03.02.14286
8520.373279312.03.02.14286
8530.73156313.03.02.14286
8540.967303314.03.02.14286
8550.809156315.03.02.14286
8560.121289316.03.02.14286
8570.333072317.03.02.14286
8580.0511463318.03.02.14286
8590.755356319.03.02.14286
8600.618525320.03.02.14286
8610.25863121.04.02.14286
8620.94899822.04.02.14286
8630.38441623.04.02.14286
8640.078609924.04.02.14286
8650.083889725.04.02.14286
8660.45944526.04.02.14286
8670.78607827.04.02.14286
8680.79853528.04.02.14286
8690.63347529.04.02.14286
8700.399442210.04.02.14286
8710.637858211.04.02.14286
8720.781583212.04.02.14286
8730.497834213.04.02.14286
8740.426914214.04.02.14286
8750.699699215.04.02.14286
8760.310714216.04.02.14286
8770.203373217.04.02.14286
8780.772594218.04.02.14286
8790.199682219.04.02.14286
8800.496513220.04.02.14286
8810.080302711.05.02.14286
8820.72544812.05.02.14286
8830.46470213.05.02.14286
8840.42664714.05.02.14286
8850.93429615.05.02.14286
8860.11957216.05.02.14286
8870.97404917.05.02.14286
8880.92380118.05.02.14286
8890.3413919.05.02.14286
8900.429746110.05.02.14286
8910.897294111.05.02.14286
8920.599365112.05.02.14286
8930.779912113.05.02.14286
8940.300752114.05.02.14286
8950.246063115.05.02.14286
8960.625133116.05.02.14286
8970.125895117.05.02.14286
8980.50344118.05.02.14286
8990.301822119.05.02.14286
9000.435073120.05.02.14286
9010.77550911.06.02.14286
9020.20040112.06.02.14286
9030.21078613.06.02.14286
9040.43249914.06.02.14286
9050.55731415.06.02.14286
9060.49126116.06.02.14286
9070.76900417.06.02.14286
9080.9172118.06.02.14286
9090.99664619.06.02.14286
9100.161179110.06.02.14286
9110.49496111.06.02.14286
9120.742112112.06.02.14286
9130.828501113.06.02.14286
9140.715753114.06.02.14286
9150.143504115.06.02.14286
9160.548136116.06.02.14286
9170.585418117.06.02.14286
9180.379898118.06.02.14286
9190.231624119.06.02.14286
9200.551739120.06.02.14286
9210.8092211.07.02.14286
9220.002303912.07.02.14286
9230.034005213.07.02.14286
9240.58296614.07.02.14286
9250.028205815.07.02.14286
9260.60223616.07.02.14286
9270.16013417.07.02.14286
9280.40193518.07.02.14286
9290.61333219.07.02.14286
9300.880759110.07.02.14286
9310.39809111.07.02.14286
9320.410756112.07.02.14286
9330.534566113.07.02.14286
9340.313028114.07.02.14286
9350.447705115.07.02.14286
9360.996218116.07.02.14286
9370.356499117.07.02.14286
9380.870714118.07.02.14286
9390.150302119.07.02.14286
9400.551655120.07.02.14286
9410.1118931.08.02.14286
9420.31201432.08.02.14286
9430.22301433.08.02.14286
9440.1393934.08.02.14286
9450.044941735.08.02.14286
9460.78887936.08.02.14286
9470.89528537.08.02.14286
9480.30946338.08.02.14286
9490.69986939.08.02.14286
9500.905637310.08.02.14286
9510.681091311.08.02.14286
9520.27425312.08.02.14286
9530.131653313.08.02.14286
9540.140611314.08.02.14286
9550.482227315.08.02.14286
9560.242118316.08.02.14286
9570.0639271317.08.02.14286
9580.873253318.08.02.14286
9590.0322946319.08.02.14286
9600.175329320.08.02.14286
9610.44784331.09.02.14286
9620.0070721832.09.02.14286
9630.62173633.09.02.14286
9640.23649434.09.02.14286
9650.97577135.09.02.14286
9660.28282136.09.02.14286
9670.15087437.09.02.14286
9680.4092438.09.02.14286
9690.66969539.09.02.14286
9700.679907310.09.02.14286
9710.420161311.09.02.14286
9720.7072312.09.02.14286
9730.379003313.09.02.14286
9740.591775314.09.02.14286
9750.226055315.09.02.14286
9760.00561232316.09.02.14286
9770.885459317.09.02.14286
9780.56478318.09.02.14286
9790.916181319.09.02.14286
9800.232251320.09.02.14286
9810.89739411.010.02.14286
9820.98562712.010.02.14286
9830.075203913.010.02.14286
9840.77277714.010.02.14286
9850.32607715.010.02.14286
9860.45991516.010.02.14286
9870.84763317.010.02.14286
9880.042258718.010.02.14286
9890.18730919.010.02.14286
9900.985803110.010.02.14286
9910.287882111.010.02.14286
9920.435795112.010.02.14286
9930.489851113.010.02.14286
9940.301338114.010.02.14286
9950.545145115.010.02.14286
9960.316164116.010.02.14286
9970.456092117.010.02.14286
9980.0135294118.010.02.14286
9990.55899119.010.02.14286
10000.441243120.010.02.14286
10010.49367631.01.02.42857
10020.9392432.01.02.42857
10030.95731933.01.02.42857
10040.0225934.01.02.42857
10050.405635.01.02.42857
10060.20989936.01.02.42857
10070.10839437.01.02.42857
10080.86833838.01.02.42857
10090.60394339.01.02.42857
10100.419113310.01.02.42857
10110.788981311.01.02.42857
10120.904198312.01.02.42857
10130.713098313.01.02.42857
10140.883174314.01.02.42857
10150.30781315.01.02.42857
10160.201608316.01.02.42857
10170.173914317.01.02.42857
10180.722695318.01.02.42857
10190.793063319.01.02.42857
10200.101207320.01.02.42857
10210.72925331.02.02.42857
10220.97090832.02.02.42857
10230.0099531533.02.02.42857
10240.17955734.02.02.42857
10250.27673835.02.02.42857
10260.88740636.02.02.42857
10270.28974137.02.02.42857
10280.78024238.02.02.42857
10290.035919439.02.02.42857
10300.610146310.02.02.42857
10310.352767311.02.02.42857
10320.0530587312.02.02.42857
10330.81815313.02.02.42857
10340.689266314.02.02.42857
10350.962173315.02.02.42857
10360.310311316.02.02.42857
10370.125737317.02.02.42857
10380.169863318.02.02.42857
10390.973176319.02.02.42857
10400.14417320.02.02.42857
10410.071125321.03.02.42857
10420.72491922.03.02.42857
10430.53037123.03.02.42857
10440.009589324.03.02.42857
10450.92883725.03.02.42857
10460.316526.03.02.42857
10470.71486227.03.02.42857
10480.93802228.03.02.42857
10490.47755129.03.02.42857
10500.488803210.03.02.42857
10510.286609211.03.02.42857
10520.0495175212.03.02.42857
10530.482179213.03.02.42857
10540.435639214.03.02.42857
10550.324876215.03.02.42857
10560.706218216.03.02.42857
10570.348572217.03.02.42857
10580.891676218.03.02.42857
10590.293292219.03.02.42857
10600.725187220.03.02.42857
10610.63763521.04.02.42857
10620.083936622.04.02.42857
10630.93932823.04.02.42857
10640.99823224.04.02.42857
10650.034794225.04.02.42857
10660.67935126.04.02.42857
10670.024135927.04.02.42857
10680.042270228.04.02.42857
10690.88024629.04.02.42857
10700.522459210.04.02.42857
10710.241067211.04.02.42857
10720.670922212.04.02.42857
10730.991511213.04.02.42857
10740.0777634214.04.02.42857
10750.693224215.04.02.42857
10760.307377216.04.02.42857
10770.567792217.04.02.42857
10780.257377218.04.02.42857
10790.331406219.04.02.42857
10800.758985220.04.02.42857
10810.17236421.05.02.42857
10820.044375122.05.02.42857
10830.53146423.05.02.42857
10840.016338624.05.02.42857
10850.69900725.05.02.42857
10860.48705626.05.02.42857
10870.76401827.05.02.42857
10880.33401428.05.02.42857
10890.83779429.05.02.42857
10900.0112577210.05.02.42857
10910.01766211.05.02.42857
10920.353778212.05.02.42857
10930.0844689213.05.02.42857
10940.852744214.05.02.42857
10950.68853215.05.02.42857
10960.0514129216.05.02.42857
10970.0323094217.05.02.42857
10980.337332218.05.02.42857
10990.922224219.05.02.42857
11000.195922220.05.02.42857
11010.10678321.06.02.42857
11020.35718922.06.02.42857
11030.20437223.06.02.42857
11040.88400724.06.02.42857
11050.34250225.06.02.42857
11060.4974726.06.02.42857
11070.36147927.06.02.42857
11080.9631528.06.02.42857
11090.78872829.06.02.42857
11100.338029210.06.02.42857
11110.312812211.06.02.42857
11120.586195212.06.02.42857
11130.323409213.06.02.42857
11140.288352214.06.02.42857
11150.220865215.06.02.42857
11160.0501947216.06.02.42857
11170.0713681217.06.02.42857
11180.878382218.06.02.42857
11190.133175219.06.02.42857
11200.587739220.06.02.42857
11210.56808911.07.02.42857
11220.067338912.07.02.42857
11230.20097713.07.02.42857
11240.84810714.07.02.42857
11250.70406615.07.02.42857
11260.37995616.07.02.42857
11270.27629517.07.02.42857
11280.74292518.07.02.42857
11290.52612919.07.02.42857
11300.454336110.07.02.42857
11310.78608111.07.02.42857
11320.361955112.07.02.42857
11330.768197113.07.02.42857
11340.797045114.07.02.42857
11350.674681115.07.02.42857
11360.380903116.07.02.42857
11370.765757117.07.02.42857
11380.650913118.07.02.42857
11390.50927119.07.02.42857
11400.481639120.07.02.42857
11410.3144611.08.02.42857
11420.091928312.08.02.42857
11430.28124913.08.02.42857
11440.041355714.08.02.42857
11450.032935315.08.02.42857
11460.80755716.08.02.42857
11470.87596517.08.02.42857
11480.73519418.08.02.42857
11490.86537819.08.02.42857
11500.538754110.08.02.42857
11510.924029111.08.02.42857
11520.773478112.08.02.42857
11530.120942113.08.02.42857
11540.064087114.08.02.42857
11550.774597115.08.02.42857
11560.383553116.08.02.42857
11570.460057117.08.02.42857
11580.406477118.08.02.42857
11590.629941119.08.02.42857
11600.855412120.08.02.42857
11610.24448831.09.02.42857
11620.13049832.09.02.42857
11630.22721433.09.02.42857
11640.32884634.09.02.42857
11650.32901535.09.02.42857
11660.1383136.09.02.42857
11670.13546637.09.02.42857
11680.73983338.09.02.42857
11690.60034639.09.02.42857
11700.125996310.09.02.42857
11710.122962311.09.02.42857
11720.491201312.09.02.42857
11730.159341313.09.02.42857
11740.650573314.09.02.42857
11750.676213315.09.02.42857
11760.129088316.09.02.42857
11770.675565317.09.02.42857
11780.171786318.09.02.42857
11790.346727319.09.02.42857
11800.615808320.09.02.42857
11810.89314911.010.02.42857
11820.043089612.010.02.42857
11830.57662813.010.02.42857
11840.12294314.010.02.42857
11850.62128615.010.02.42857
11860.18154516.010.02.42857
11870.71650117.010.02.42857
11880.053539518.010.02.42857
11890.011580219.010.02.42857
11900.455989110.010.02.42857
11910.139048111.010.02.42857
11920.718742112.010.02.42857
11930.0541154113.010.02.42857
11940.348572114.010.02.42857
11950.834901115.010.02.42857
11960.824086116.010.02.42857
11970.733946117.010.02.42857
11980.832646118.010.02.42857
11990.922221119.010.02.42857
12000.223231120.010.02.42857
12010.11695821.01.02.71429
12020.87499222.01.02.71429
12030.30501723.01.02.71429
12040.95666324.01.02.71429
12050.36020825.01.02.71429
12060.49990926.01.02.71429
12070.85134927.01.02.71429
12080.98250428.01.02.71429
12090.81713129.01.02.71429
12100.975961210.01.02.71429
12110.403214211.01.02.71429
12120.204991212.01.02.71429
12130.368958213.01.02.71429
12140.170257214.01.02.71429
12150.794264215.01.02.71429
12160.00785639216.01.02.71429
12170.200924217.01.02.71429
12180.927619218.01.02.71429
12190.954182219.01.02.71429
12200.398572220.01.02.71429
12210.31366331.02.02.71429
12220.80252432.02.02.71429
12230.040859633.02.02.71429
12240.047019334.02.02.71429
12250.076077735.02.02.71429
12260.091209236.02.02.71429
12270.42059437.02.02.71429
12280.57711438.02.02.71429
12290.89226639.02.02.71429
12300.433681310.02.02.71429
12310.936388311.02.02.71429
12320.76791312.02.02.71429
12330.655792313.02.02.71429
12340.989566314.02.02.71429
12350.17177315.02.02.71429
12360.978059316.02.02.71429
12370.534572317.02.02.71429
12380.226621318.02.02.71429
12390.0322724319.02.02.71429
12400.0793786320.02.02.71429
12410.86965731.03.02.71429
12420.33324232.03.02.71429
12430.44811633.03.02.71429
12440.064224834.03.02.71429
12450.93612235.03.02.71429
12460.65595536.03.02.71429
12470.7400137.03.02.71429
12480.61916438.03.02.71429
12490.26908939.03.02.71429
12500.144012310.03.02.71429
12510.448162311.03.02.71429
12520.633603312.03.02.71429
12530.680053313.03.02.71429
12540.314563314.03.02.71429
12550.529439315.03.02.71429
12560.445532316.03.02.71429
12570.794597317.03.02.71429
12580.432497318.03.02.71429
12590.075495319.03.02.71429
12600.46156320.03.02.71429
12610.0039749321.04.02.71429
12620.79329522.04.02.71429
12630.94290423.04.02.71429
12640.64118524.04.02.71429
12650.39508725.04.02.71429
12660.8392226.04.02.71429
12670.3029327.04.02.71429
12680.45117928.04.02.71429
12690.99243129.04.02.71429
12700.986712210.04.02.71429
12710.0259669211.04.02.71429
12720.0115621212.04.02.71429
12730.788136213.04.02.71429
12740.687706214.04.02.71429
12750.918925215.04.02.71429
12760.703598216.04.02.71429
12770.463543217.04.02.71429
12780.821952218.04.02.71429
12790.873701219.04.02.71429
12800.186921220.04.02.71429
12810.17009431.05.02.71429
12820.20473632.05.02.71429
12830.38719733.05.02.71429
12840.69484434.05.02.71429
12850.77995135.05.02.71429
12860.7013736.05.02.71429
12870.36887437.05.02.71429
12880.54998838.05.02.71429
12890.72932339.05.02.71429
12900.584168310.05.02.71429
12910.662039311.05.02.71429
12920.650471312.05.02.71429
12930.264497313.05.02.71429
12940.086203314.05.02.71429
12950.755199315.05.02.71429
12960.442973316.05.02.71429
12970.92794317.05.02.71429
12980.551849318.05.02.71429
12990.114738319.05.02.71429
13000.687429320.05.02.71429
13010.53315831.06.02.71429
13020.12506932.06.02.71429
13030.10818533.06.02.71429
13040.043531834.06.02.71429
13050.58734135.06.02.71429
13060.13003136.06.02.71429
13070.68922837.06.02.71429
13080.91215238.06.02.71429
13090.69911339.06.02.71429
13100.890663310.06.02.71429
13110.478624311.06.02.71429
13120.746787312.06.02.71429
13130.310358313.06.02.71429
13140.6184314.06.02.71429
13150.987277315.06.02.71429
13160.120451316.06.02.71429
13170.708749317.06.02.71429
13180.100793318.06.02.71429
13190.779945319.06.02.71429
13200.31024320.06.02.71429
13210.38085511.07.02.71429
13220.65852112.07.02.71429
13230.24405513.07.02.71429
13240.96053514.07.02.71429
13250.5128715.07.02.71429
13260.81620516.07.02.71429
13270.859617.07.02.71429
13280.87602118.07.02.71429
13290.46918819.07.02.71429
13300.826656110.07.02.71429
13310.838525111.07.02.71429
13320.74757112.07.02.71429
13330.344464113.07.02.71429
13340.427072114.07.02.71429
13350.848991115.07.02.71429
13360.798956116.07.02.71429
13370.085791117.07.02.71429
13380.321596118.07.02.71429
13390.359764119.07.02.71429
13400.700142120.07.02.71429
13410.44813731.08.02.71429
13420.8639532.08.02.71429
13430.032792733.08.02.71429
13440.51151734.08.02.71429
13450.34532335.08.02.71429
13460.83768736.08.02.71429
13470.92407737.08.02.71429
13480.2064438.08.02.71429
13490.12949639.08.02.71429
13500.563342310.08.02.71429
13510.452411311.08.02.71429
13520.845378312.08.02.71429
13530.904636313.08.02.71429
13540.296961314.08.02.71429
13550.95056315.08.02.71429
13560.864082316.08.02.71429
13570.679314317.08.02.71429
13580.754515318.08.02.71429
13590.422954319.08.02.71429
13600.242276320.08.02.71429
13610.5686231.09.02.71429
13620.49670932.09.02.71429
13630.43966133.09.02.71429
13640.60482134.09.02.71429
13650.44558335.09.02.71429
13660.73762836.09.02.71429
13670.96582637.09.02.71429
13680.20769438.09.02.71429
13690.73355239.09.02.71429
13700.409321310.09.02.71429
13710.440474311.09.02.71429
13720.795825312.09.02.71429
13730.226948313.09.02.71429
13740.768727314.09.02.71429
13750.699545315.09.02.71429
13760.141978316.09.02.71429
13770.178516317.09.02.71429
13780.570094318.09.02.71429
13790.602575319.09.02.71429
13800.061469320.09.02.71429
13810.29551721.010.02.71429
13820.26835722.010.02.71429
13830.21643323.010.02.71429
13840.49659624.010.02.71429
13850.47306225.010.02.71429
13860.53798926.010.02.71429
13870.40451727.010.02.71429
13880.3165428.010.02.71429
13890.50827229.010.02.71429
13900.515643210.010.02.71429
13910.653986211.010.02.71429
13920.693781212.010.02.71429
13930.946771213.010.02.71429
13940.970487214.010.02.71429
13950.154236215.010.02.71429
13960.906852216.010.02.71429
13970.345065217.010.02.71429
13980.0342859218.010.02.71429
13990.432951219.010.02.71429
14000.850726220.010.02.71429
14010.4247111.01.03.0
14020.26865812.01.03.0
14030.78331813.01.03.0
14040.20780614.01.03.0
14050.11681915.01.03.0
14060.28128616.01.03.0
14070.49200317.01.03.0
14080.79037618.01.03.0
14090.18043119.01.03.0
14100.421145110.01.03.0
14110.885975111.01.03.0
14120.848065112.01.03.0
14130.0922912113.01.03.0
14140.170484114.01.03.0
14150.308693115.01.03.0
14160.707299116.01.03.0
14170.874481117.01.03.0
14180.154282118.01.03.0
14190.555784119.01.03.0
14200.378225120.01.03.0
14210.027163911.02.03.0
14220.33939812.02.03.0
14230.81621413.02.03.0
14240.14607814.02.03.0
14250.010298615.02.03.0
14260.09551316.02.03.0
14270.93449917.02.03.0
14280.041325118.02.03.0
14290.98686119.02.03.0
14300.417075110.02.03.0
14310.108103111.02.03.0
14320.229291112.02.03.0
14330.277804113.02.03.0
14340.445822114.02.03.0
14350.652895115.02.03.0
14360.262166116.02.03.0
14370.94366117.02.03.0
14380.814426118.02.03.0
14390.180017119.02.03.0
14400.295824120.02.03.0
14410.85358811.03.03.0
14420.66769912.03.03.0
14430.18967213.03.03.0
14440.92714.03.03.0
14450.15714615.03.03.0
14460.14059316.03.03.0
14470.012313317.03.03.0
14480.89190218.03.03.0
14490.079588319.03.03.0
14500.560834110.03.03.0
14510.553971111.03.03.0
14520.308025112.03.03.0
14530.0499021113.03.03.0
14540.517465114.03.03.0
14550.922071115.03.03.0
14560.149324116.03.03.0
14570.570479117.03.03.0
14580.993213118.03.03.0
14590.705599119.03.03.0
14600.0778899120.03.03.0
14610.97447831.04.03.0
14620.10257732.04.03.0
14630.61171133.04.03.0
14640.43753734.04.03.0
14650.38939235.04.03.0
14660.44937536.04.03.0
14670.022660537.04.03.0
14680.1781238.04.03.0
14690.5264339.04.03.0
14700.332033310.04.03.0
14710.37291311.04.03.0
14720.33363312.04.03.0
14730.650616313.04.03.0
14740.436328314.04.03.0
14750.65956315.04.03.0
14760.475293316.04.03.0
14770.996611317.04.03.0
14780.939161318.04.03.0
14790.247888319.04.03.0
14800.541529320.04.03.0
14810.089776121.05.03.0
14820.87038322.05.03.0
14830.83490523.05.03.0
14840.34103424.05.03.0
14850.553325.05.03.0
14860.31497426.05.03.0
14870.92283927.05.03.0
14880.64909128.05.03.0
14890.51624929.05.03.0
14900.453621210.05.03.0
14910.672857211.05.03.0
14920.0387941212.05.03.0
14930.978932213.05.03.0
14940.546652214.05.03.0
14950.540027215.05.03.0
14960.618795216.05.03.0
14970.374339217.05.03.0
14980.448185218.05.03.0
14990.643429219.05.03.0
15000.104764220.05.03.0
15010.43173321.06.03.0
15020.15797722.06.03.0
15030.53301423.06.03.0
15040.61993524.06.03.0
15050.064011725.06.03.0
15060.63486726.06.03.0
15070.93473127.06.03.0
15080.95224328.06.03.0
15090.16329.06.03.0
15100.117676210.06.03.0
15110.42422211.06.03.0
15120.703342212.06.03.0
15130.966356213.06.03.0
15140.79579214.06.03.0
15150.784979215.06.03.0
15160.0322026216.06.03.0
15170.26412217.06.03.0
15180.434752218.06.03.0
15190.840897219.06.03.0
15200.17805220.06.03.0
15210.24148331.07.03.0
15220.25701432.07.03.0
15230.46917933.07.03.0
15240.39586934.07.03.0
15250.62181935.07.03.0
15260.67053436.07.03.0
15270.17085837.07.03.0
15280.35269138.07.03.0
15290.65090539.07.03.0
15300.241377310.07.03.0
15310.645931311.07.03.0
15320.609751312.07.03.0
15330.292015313.07.03.0
15340.582235314.07.03.0
15350.471873315.07.03.0
15360.505371316.07.03.0
15370.160211317.07.03.0
15380.613804318.07.03.0
15390.699452319.07.03.0
15400.826422320.07.03.0
15410.53602321.08.03.0
15420.51873422.08.03.0
15430.87460723.08.03.0
15440.069490524.08.03.0
15450.25552125.08.03.0
15460.77786926.08.03.0
15470.069685327.08.03.0
15480.99684728.08.03.0
15490.21074829.08.03.0
15500.852023210.08.03.0
15510.50965211.08.03.0
15520.328699212.08.03.0
15530.975888213.08.03.0
15540.0304139214.08.03.0
15550.949961215.08.03.0
15560.620421216.08.03.0
15570.859406217.08.03.0
15580.694328218.08.03.0
15590.764406219.08.03.0
15600.567126220.08.03.0
15610.42178221.09.03.0
15620.51440322.09.03.0
15630.8850123.09.03.0
15640.40078824.09.03.0
15650.7266325.09.03.0
15660.36019426.09.03.0
15670.27049227.09.03.0
15680.51067128.09.03.0
15690.79670729.09.03.0
15700.306947210.09.03.0
15710.021176211.09.03.0
15720.656231212.09.03.0
15730.135651213.09.03.0
15740.61404214.09.03.0
15750.734006215.09.03.0
15760.132508216.09.03.0
15770.0467042217.09.03.0
15780.885113218.09.03.0
15790.14483219.09.03.0
15800.855884220.09.03.0
15810.11858131.010.03.0
15820.52466532.010.03.0
15830.55665633.010.03.0
15840.45744734.010.03.0
15850.52998535.010.03.0
15860.62414936.010.03.0
15870.067871637.010.03.0
15880.63209138.010.03.0
15890.1629739.010.03.0
15900.973153310.010.03.0
15910.188176311.010.03.0
15920.0277237312.010.03.0
15930.059367313.010.03.0
15940.863176314.010.03.0
15950.326011315.010.03.0
15960.341259316.010.03.0
15970.667547317.010.03.0
15980.97554318.010.03.0
15990.0670164319.010.03.0
16000.736755320.010.03.0
16010.63288931.01.03.28571
16020.46253532.01.03.28571
16030.84541533.01.03.28571
16040.087848734.01.03.28571
16050.88708135.01.03.28571
16060.51785236.01.03.28571
16070.79506237.01.03.28571
16080.67852238.01.03.28571
16090.13616739.01.03.28571
16100.39544310.01.03.28571
16110.440743311.01.03.28571
16120.135331312.01.03.28571
16130.833621313.01.03.28571
16140.701648314.01.03.28571
16150.211127315.01.03.28571
16160.019999316.01.03.28571
16170.488759317.01.03.28571
16180.752683318.01.03.28571
16190.307258319.01.03.28571
16200.697889320.01.03.28571
16210.67891121.02.03.28571
16220.81587422.02.03.28571
16230.48556823.02.03.28571
16240.30821224.02.03.28571
16250.66855125.02.03.28571
16260.95125426.02.03.28571
16270.57585727.02.03.28571
16280.24440428.02.03.28571
16290.90657829.02.03.28571
16300.348258210.02.03.28571
16310.862786211.02.03.28571
16320.952156212.02.03.28571
16330.316759213.02.03.28571
16340.682704214.02.03.28571
16350.649055215.02.03.28571
16360.720552216.02.03.28571
16370.819518217.02.03.28571
16380.538798218.02.03.28571
16390.564272219.02.03.28571
16400.403667220.02.03.28571
16410.53396911.03.03.28571
16420.31957512.03.03.28571
16430.3479613.03.03.28571
16440.15520714.03.03.28571
16450.30477615.03.03.28571
16460.54770116.03.03.28571
16470.30108117.03.03.28571
16480.52661418.03.03.28571
16490.6547119.03.03.28571
16500.932998110.03.03.28571
16510.864647111.03.03.28571
16520.639587112.03.03.28571
16530.979666113.03.03.28571
16540.421697114.03.03.28571
16550.192689115.03.03.28571
16560.446806116.03.03.28571
16570.593923117.03.03.28571
16580.511758118.03.03.28571
16590.728214119.03.03.28571
16600.537502120.03.03.28571
16610.95947331.04.03.28571
16620.6740732.04.03.28571
16630.22812633.04.03.28571
16640.38351834.04.03.28571
16650.75229435.04.03.28571
16660.78952336.04.03.28571
16670.51682837.04.03.28571
16680.11465238.04.03.28571
16690.032360439.04.03.28571
16700.711565310.04.03.28571
16710.251003311.04.03.28571
16720.0382178312.04.03.28571
16730.360729313.04.03.28571
16740.664046314.04.03.28571
16750.263516315.04.03.28571
16760.0375221316.04.03.28571
16770.240376317.04.03.28571
16780.339948318.04.03.28571
16790.638981319.04.03.28571
16800.887251320.04.03.28571
16810.15101211.05.03.28571
16820.6010312.05.03.28571
16830.5774713.05.03.28571
16840.44886914.05.03.28571
16850.69518115.05.03.28571
16860.043066516.05.03.28571
16870.5132217.05.03.28571
16880.2133418.05.03.28571
16890.72969619.05.03.28571
16900.182674110.05.03.28571
16910.0595024111.05.03.28571
16920.88945112.05.03.28571
16930.10278113.05.03.28571
16940.434496114.05.03.28571
16950.402661115.05.03.28571
16960.872147116.05.03.28571
16970.533471117.05.03.28571
16980.536314118.05.03.28571
16990.413774119.05.03.28571
17000.992969120.05.03.28571
17010.73490511.06.03.28571
17020.80170512.06.03.28571
17030.035697713.06.03.28571
17040.75609914.06.03.28571
17050.36678415.06.03.28571
17060.59785916.06.03.28571
17070.34874217.06.03.28571
17080.47814518.06.03.28571
17090.021430919.06.03.28571
17100.259693110.06.03.28571
17110.189303111.06.03.28571
17120.0227416112.06.03.28571
17130.585493113.06.03.28571
17140.753118114.06.03.28571
17150.394771115.06.03.28571
17160.873033116.06.03.28571
17170.333926117.06.03.28571
17180.0460949118.06.03.28571
17190.959626119.06.03.28571
17200.866237120.06.03.28571
17210.94699411.07.03.28571
17220.73033112.07.03.28571
17230.15142513.07.03.28571
17240.61916214.07.03.28571
17250.85577715.07.03.28571
17260.45876616.07.03.28571
17270.0021482517.07.03.28571
17280.2459518.07.03.28571
17290.33215619.07.03.28571
17300.092336110.07.03.28571
17310.862857111.07.03.28571
17320.266758112.07.03.28571
17330.543382113.07.03.28571
17340.616827114.07.03.28571
17350.543621115.07.03.28571
17360.257407116.07.03.28571
17370.841948117.07.03.28571
17380.867312118.07.03.28571
17390.857757119.07.03.28571
17400.461757120.07.03.28571
17410.65153811.08.03.28571
17420.69402212.08.03.28571
17430.49500413.08.03.28571
17440.29660714.08.03.28571
17450.31431915.08.03.28571
17460.35021716.08.03.28571
17470.55268517.08.03.28571
17480.24855718.08.03.28571
17490.68747219.08.03.28571
17500.584973110.08.03.28571
17510.182826111.08.03.28571
17520.214701112.08.03.28571
17530.221977113.08.03.28571
17540.43977114.08.03.28571
17550.794297115.08.03.28571
17560.160237116.08.03.28571
17570.256578117.08.03.28571
17580.514502118.08.03.28571
17590.357774119.08.03.28571
17600.118771120.08.03.28571
17610.85116711.09.03.28571
17620.77550412.09.03.28571
17630.97992213.09.03.28571
17640.73588714.09.03.28571
17650.50596215.09.03.28571
17660.57341516.09.03.28571
17670.30961617.09.03.28571
17680.83277718.09.03.28571
17690.41695119.09.03.28571
17700.691149110.09.03.28571
17710.51832111.09.03.28571
17720.993729112.09.03.28571
17730.945865113.09.03.28571
17740.549093114.09.03.28571
17750.209275115.09.03.28571
17760.88544116.09.03.28571
17770.132122117.09.03.28571
17780.0882581118.09.03.28571
17790.00946108119.09.03.28571
17800.355212120.09.03.28571
17810.78631911.010.03.28571
17820.60325512.010.03.28571
17830.34069313.010.03.28571
17840.079351214.010.03.28571
17850.35112715.010.03.28571
17860.39917916.010.03.28571
17870.33228917.010.03.28571
17880.62296118.010.03.28571
17890.91102419.010.03.28571
17900.00506546110.010.03.28571
17910.758737111.010.03.28571
17920.143703112.010.03.28571
17930.732116113.010.03.28571
17940.184529114.010.03.28571
17950.851015115.010.03.28571
17960.981936116.010.03.28571
17970.886417117.010.03.28571
17980.249863118.010.03.28571
17990.838761119.010.03.28571
18000.553566120.010.03.28571
18010.58016711.01.03.57143
18020.056322412.01.03.57143
18030.5431213.01.03.57143
18040.71382314.01.03.57143
18050.2756715.01.03.57143
18060.58623916.01.03.57143
18070.4588217.01.03.57143
18080.88658718.01.03.57143
18090.72035319.01.03.57143
18100.348708110.01.03.57143
18110.338276111.01.03.57143
18120.892165112.01.03.57143
18130.908077113.01.03.57143
18140.0069586114.01.03.57143
18150.444185115.01.03.57143
18160.656894116.01.03.57143
18170.127839117.01.03.57143
18180.398179118.01.03.57143
18190.38163119.01.03.57143
18200.231657120.01.03.57143
18210.31310721.02.03.57143
18220.94917822.02.03.57143
18230.28442323.02.03.57143
18240.13761924.02.03.57143
18250.85796325.02.03.57143
18260.79328826.02.03.57143
18270.45849327.02.03.57143
18280.18316628.02.03.57143
18290.16534629.02.03.57143
18300.196408210.02.03.57143
18310.0170254211.02.03.57143
18320.141687212.02.03.57143
18330.167423213.02.03.57143
18340.464925214.02.03.57143
18350.69336215.02.03.57143
18360.831546216.02.03.57143
18370.0371025217.02.03.57143
18380.368709218.02.03.57143
18390.249825219.02.03.57143
18400.264275220.02.03.57143
18410.94698411.03.03.57143
18420.98531512.03.03.57143
18430.12107913.03.03.57143
18440.59280714.03.03.57143
18450.30780215.03.03.57143
18460.22505516.03.03.57143
18470.86480317.03.03.57143
18480.53760218.03.03.57143
18490.92609919.03.03.57143
18500.342777110.03.03.57143
18510.794728111.03.03.57143
18520.597494112.03.03.57143
18530.729916113.03.03.57143
18540.398821114.03.03.57143
18550.265593115.03.03.57143
18560.624117116.03.03.57143
18570.444933117.03.03.57143
18580.88222118.03.03.57143
18590.366244119.03.03.57143
18600.54509120.03.03.57143
18610.93950911.04.03.57143
18620.84784812.04.03.57143
18630.63803513.04.03.57143
18640.82168614.04.03.57143
18650.23131515.04.03.57143
18660.59791316.04.03.57143
18670.60149917.04.03.57143
18680.16987218.04.03.57143
18690.73503819.04.03.57143
18700.854558110.04.03.57143
18710.368179111.04.03.57143
18720.121681112.04.03.57143
18730.202473113.04.03.57143
18740.333616114.04.03.57143
18750.778059115.04.03.57143
18760.840961116.04.03.57143
18770.655958117.04.03.57143
18780.108306118.04.03.57143
18790.948423119.04.03.57143
18800.48708120.04.03.57143
18810.46142321.05.03.57143
18820.36391722.05.03.57143
18830.79973323.05.03.57143
18840.52650424.05.03.57143
18850.38454125.05.03.57143
18860.26875126.05.03.57143
18870.08613427.05.03.57143
18880.044392328.05.03.57143
18890.2611629.05.03.57143
18900.828873210.05.03.57143
18910.844535211.05.03.57143
18920.8563212.05.03.57143
18930.314134213.05.03.57143
18940.469899214.05.03.57143
18950.502278215.05.03.57143
18960.129708216.05.03.57143
18970.512399217.05.03.57143
18980.202901218.05.03.57143
18990.305318219.05.03.57143
19000.232303220.05.03.57143
19010.92039821.06.03.57143
19020.24735322.06.03.57143
19030.080552223.06.03.57143
19040.69504624.06.03.57143
19050.19654625.06.03.57143
19060.96552726.06.03.57143
19070.63754427.06.03.57143
19080.53636628.06.03.57143
19090.33802229.06.03.57143
19100.589359210.06.03.57143
19110.657235211.06.03.57143
19120.9817212.06.03.57143
19130.744854213.06.03.57143
19140.49326214.06.03.57143
19150.877255215.06.03.57143
19160.752375216.06.03.57143
19170.218333217.06.03.57143
19180.746771218.06.03.57143
19190.36187219.06.03.57143
19200.129736220.06.03.57143
19210.32275521.07.03.57143
19220.54347622.07.03.57143
19230.43504423.07.03.57143
19240.95330224.07.03.57143
19250.50215525.07.03.57143
19260.48002426.07.03.57143
19270.33456727.07.03.57143
19280.48546628.07.03.57143
19290.99507129.07.03.57143
19300.0132889210.07.03.57143
19310.172497211.07.03.57143
19320.216497212.07.03.57143
19330.102662213.07.03.57143
19340.842778214.07.03.57143
19350.162322215.07.03.57143
19360.574857216.07.03.57143
19370.483698217.07.03.57143
19380.695089218.07.03.57143
19390.475566219.07.03.57143
19400.170609220.07.03.57143
19410.22967731.08.03.57143
19420.4273332.08.03.57143
19430.65350733.08.03.57143
19440.65667834.08.03.57143
19450.18212135.08.03.57143
19460.18023236.08.03.57143
19470.51159837.08.03.57143
19480.11715438.08.03.57143
19490.28319939.08.03.57143
19500.728553310.08.03.57143
19510.440823311.08.03.57143
19520.636818312.08.03.57143
19530.445715313.08.03.57143
19540.0998187314.08.03.57143
19550.452991315.08.03.57143
19560.606255316.08.03.57143
19570.779928317.08.03.57143
19580.534442318.08.03.57143
19590.998682319.08.03.57143
19600.0800216320.08.03.57143
19610.083803731.09.03.57143
19620.12406432.09.03.57143
19630.35271633.09.03.57143
19640.75683134.09.03.57143
19650.73589135.09.03.57143
19660.5879736.09.03.57143
19670.0094352337.09.03.57143
19680.63474138.09.03.57143
19690.20376639.09.03.57143
19700.829413310.09.03.57143
19710.986951311.09.03.57143
19720.0248523312.09.03.57143
19730.0880984313.09.03.57143
19740.392808314.09.03.57143
19750.467864315.09.03.57143
19760.700528316.09.03.57143
19770.897121317.09.03.57143
19780.954119318.09.03.57143
19790.0271722319.09.03.57143
19800.65614320.09.03.57143
19810.31868411.010.03.57143
19820.55219312.010.03.57143
19830.53836513.010.03.57143
19840.031590414.010.03.57143
19850.43074115.010.03.57143
19860.95183716.010.03.57143
19870.53501117.010.03.57143
19880.18791418.010.03.57143
19890.086105419.010.03.57143
19900.0607098110.010.03.57143
19910.192292111.010.03.57143
19920.714951112.010.03.57143
19930.153316113.010.03.57143
19940.965317114.010.03.57143
19950.877697115.010.03.57143
19960.0377789116.010.03.57143
19970.30601117.010.03.57143
19980.177973118.010.03.57143
19990.497019119.010.03.57143
20000.590867120.010.03.57143
20010.4414131.01.03.85714
20020.090654732.01.03.85714
20030.72049133.01.03.85714
20040.31120734.01.03.85714
20050.7753235.01.03.85714
20060.017557936.01.03.85714
20070.46852537.01.03.85714
20080.67576138.01.03.85714
20090.93942439.01.03.85714
20100.467257310.01.03.85714
20110.637836311.01.03.85714
20120.167531312.01.03.85714
20130.394554313.01.03.85714
20140.395832314.01.03.85714
20150.0813438315.01.03.85714
20160.269947316.01.03.85714
20170.711538317.01.03.85714
20180.556116318.01.03.85714
20190.431665319.01.03.85714
20200.13849320.01.03.85714
20210.71014721.02.03.85714
20220.61360722.02.03.85714
20230.89712423.02.03.85714
20240.77716224.02.03.85714
20250.89280725.02.03.85714
20260.51728626.02.03.85714
20270.96610127.02.03.85714
20280.89326228.02.03.85714
20290.69992329.02.03.85714
20300.39072210.02.03.85714
20310.850574211.02.03.85714
20320.728519212.02.03.85714
20330.982309213.02.03.85714
20340.281216214.02.03.85714
20350.56256215.02.03.85714
20360.530852216.02.03.85714
20370.970547217.02.03.85714
20380.160189218.02.03.85714
20390.670425219.02.03.85714
20400.662735220.02.03.85714
20410.81115411.03.03.85714
20420.35874612.03.03.85714
20430.60012313.03.03.85714
20440.7642614.03.03.85714
20450.41918915.03.03.85714
20460.68283216.03.03.85714
20470.014794817.03.03.85714
20480.73375818.03.03.85714
20490.66532519.03.03.85714
20500.958364110.03.03.85714
20510.99262111.03.03.85714
20520.47496112.03.03.85714
20530.360634113.03.03.85714
20540.252378114.03.03.85714
20550.742072115.03.03.85714
20560.869654116.03.03.85714
20570.630199117.03.03.85714
20580.799965118.03.03.85714
20590.341305119.03.03.85714
20600.434493120.03.03.85714
20610.12128311.04.03.85714
20620.13321212.04.03.85714
20630.37295413.04.03.85714
20640.60998514.04.03.85714
20650.98040315.04.03.85714
20660.86547116.04.03.85714
20670.64962917.04.03.85714
20680.8381718.04.03.85714
20690.3196919.04.03.85714
20700.812493110.04.03.85714
20710.424575111.04.03.85714
20720.447317112.04.03.85714
20730.413097113.04.03.85714
20740.903335114.04.03.85714
20750.322545115.04.03.85714
20760.328864116.04.03.85714
20770.86354117.04.03.85714
20780.450486118.04.03.85714
20790.859959119.04.03.85714
20800.704552120.04.03.85714
20810.073070821.05.03.85714
20820.84941122.05.03.85714
20830.13473623.05.03.85714
20840.12584324.05.03.85714
20850.65654225.05.03.85714
20860.40972626.05.03.85714
20870.23393827.05.03.85714
20880.75581428.05.03.85714
20890.62181129.05.03.85714
20900.289486210.05.03.85714
20910.690642211.05.03.85714
20920.819173212.05.03.85714
20930.796214213.05.03.85714
20940.415355214.05.03.85714
20950.921261215.05.03.85714
20960.0100303216.05.03.85714
20970.642536217.05.03.85714
20980.498256218.05.03.85714
20990.978007219.05.03.85714
21000.902168220.05.03.85714
21010.82635521.06.03.85714
21020.25633222.06.03.85714
21030.91238923.06.03.85714
21040.68006624.06.03.85714
21050.36437825.06.03.85714
21060.93088626.06.03.85714
21070.2086527.06.03.85714
21080.91926228.06.03.85714
21090.50501629.06.03.85714
21100.501024210.06.03.85714
21110.244212211.06.03.85714
21120.105786212.06.03.85714
21130.309119213.06.03.85714
21140.437791214.06.03.85714
21150.538027215.06.03.85714
21160.224659216.06.03.85714
21170.32506217.06.03.85714
21180.544622218.06.03.85714
21190.889488219.06.03.85714
21200.596244220.06.03.85714
21210.71919331.07.03.85714
21220.4543932.07.03.85714
21230.86728533.07.03.85714
21240.29776934.07.03.85714
21250.48536335.07.03.85714
21260.41892336.07.03.85714
21270.6822437.07.03.85714
21280.7879938.07.03.85714
21290.16536539.07.03.85714
21300.344443310.07.03.85714
21310.14591311.07.03.85714
21320.190555312.07.03.85714
21330.47407313.07.03.85714
21340.457376314.07.03.85714
21350.516484315.07.03.85714
21360.305408316.07.03.85714
21370.897089317.07.03.85714
21380.647821318.07.03.85714
21390.842901319.07.03.85714
21400.210375320.07.03.85714
21410.21503811.08.03.85714
21420.78029612.08.03.85714
21430.43966613.08.03.85714
21440.26190514.08.03.85714
21450.814215.08.03.85714
21460.74627116.08.03.85714
21470.15046617.08.03.85714
21480.90538718.08.03.85714
21490.23891319.08.03.85714
21500.172277110.08.03.85714
21510.883882111.08.03.85714
21520.0174848112.08.03.85714
21530.45883113.08.03.85714
21540.312256114.08.03.85714
21550.599178115.08.03.85714
21560.490928116.08.03.85714
21570.295821117.08.03.85714
21580.82564118.08.03.85714
21590.31317119.08.03.85714
21600.986356120.08.03.85714
21610.51508631.09.03.85714
21620.014602632.09.03.85714
21630.93839433.09.03.85714
21640.64219634.09.03.85714
21650.16297735.09.03.85714
21660.50526436.09.03.85714
21670.98493537.09.03.85714
21680.1289138.09.03.85714
21690.40055539.09.03.85714
21700.971993310.09.03.85714
21710.348896311.09.03.85714
21720.199208312.09.03.85714
21730.483528313.09.03.85714
21740.584889314.09.03.85714
21750.539236315.09.03.85714
21760.640954316.09.03.85714
21770.367384317.09.03.85714
21780.737486318.09.03.85714
21790.815187319.09.03.85714
21800.706143320.09.03.85714
21810.60766321.010.03.85714
21820.33804522.010.03.85714
21830.48497123.010.03.85714
21840.84260324.010.03.85714
21850.97921725.010.03.85714
21860.63488426.010.03.85714
21870.013295127.010.03.85714
21880.92950828.010.03.85714
21890.12378929.010.03.85714
21900.603908210.010.03.85714
21910.0533662211.010.03.85714
21920.5251212.010.03.85714
21930.972255213.010.03.85714
21940.339605214.010.03.85714
21950.0736654215.010.03.85714
21960.639616216.010.03.85714
21970.835678217.010.03.85714
21980.449795218.010.03.85714
21990.526432219.010.03.85714
22000.174965220.010.03.85714
22010.0048986421.01.04.14286
22020.76772322.01.04.14286
22030.96377723.01.04.14286
22040.84733224.01.04.14286
22050.52435925.01.04.14286
22060.0638826.01.04.14286
22070.1857627.01.04.14286
22080.029475928.01.04.14286
22090.25937429.01.04.14286
22100.919248210.01.04.14286
22110.0518372211.01.04.14286
22120.776418212.01.04.14286
22130.644135213.01.04.14286
22140.63305214.01.04.14286
22150.0384432215.01.04.14286
22160.206753216.01.04.14286
22170.59786217.01.04.14286
22180.348305218.01.04.14286
22190.735163219.01.04.14286
22200.363556220.01.04.14286
22210.40576631.02.04.14286
22220.7942832.02.04.14286
22230.29867833.02.04.14286
22240.89917734.02.04.14286
22250.87261735.02.04.14286
22260.23991636.02.04.14286
22270.73385437.02.04.14286
22280.70338.02.04.14286
22290.55425639.02.04.14286
22300.202516310.02.04.14286
22310.247012311.02.04.14286
22320.19307312.02.04.14286
22330.879314313.02.04.14286
22340.45137314.02.04.14286
22350.618102315.02.04.14286
22360.0826983316.02.04.14286
22370.745772317.02.04.14286
22380.717679318.02.04.14286
22390.746565319.02.04.14286
22400.348716320.02.04.14286
22410.35283211.03.04.14286
22420.78672312.03.04.14286
22430.4349513.03.04.14286
22440.92591314.03.04.14286
22450.80183515.03.04.14286
22460.75318216.03.04.14286
22470.60313717.03.04.14286
22480.34693118.03.04.14286
22490.12267119.03.04.14286
22500.661368110.03.04.14286
22510.976217111.03.04.14286
22520.364869112.03.04.14286
22530.789826113.03.04.14286
22540.806965114.03.04.14286
22550.726138115.03.04.14286
22560.239686116.03.04.14286
22570.440312117.03.04.14286
22580.041726118.03.04.14286
22590.886553119.03.04.14286
22600.948075120.03.04.14286
22610.90076831.04.04.14286
22620.58804432.04.04.14286
22630.67065433.04.04.14286
22640.51931234.04.04.14286
22650.29234535.04.04.14286
22660.9693636.04.04.14286
22670.53903837.04.04.14286
22680.71827338.04.04.14286
22690.69088839.04.04.14286
22700.288952310.04.04.14286
22710.700101311.04.04.14286
22720.784993312.04.04.14286
22730.666816313.04.04.14286
22740.912836314.04.04.14286
22750.271028315.04.04.14286
22760.692344316.04.04.14286
22770.231808317.04.04.14286
22780.903946318.04.04.14286
22790.990863319.04.04.14286
22800.666233320.04.04.14286
22810.89378211.05.04.14286
22820.24755212.05.04.14286
22830.88550213.05.04.14286
22840.83868314.05.04.14286
22850.98155215.05.04.14286
22860.50225716.05.04.14286
22870.52037117.05.04.14286
22880.83121118.05.04.14286
22890.94432619.05.04.14286
22900.399655110.05.04.14286
22910.531945111.05.04.14286
22920.256692112.05.04.14286
22930.341962113.05.04.14286
22940.754891114.05.04.14286
22950.320366115.05.04.14286
22960.665162116.05.04.14286
22970.0274203117.05.04.14286
22980.632511118.05.04.14286
22990.700186119.05.04.14286
23000.511328120.05.04.14286
23010.15159821.06.04.14286
23020.54078922.06.04.14286
23030.42482323.06.04.14286
23040.87267224.06.04.14286
23050.29910425.06.04.14286
23060.05655426.06.04.14286
23070.054428727.06.04.14286
23080.61431228.06.04.14286
23090.058905329.06.04.14286
23100.133744210.06.04.14286
23110.904387211.06.04.14286
23120.180596212.06.04.14286
23130.258398213.06.04.14286
23140.711476214.06.04.14286
23150.824541215.06.04.14286
23160.306121216.06.04.14286
23170.49657217.06.04.14286
23180.795706218.06.04.14286
23190.682489219.06.04.14286
23200.0491484220.06.04.14286
23210.70622121.07.04.14286
23220.25964122.07.04.14286
23230.5994123.07.04.14286
23240.7931124.07.04.14286
23250.98016325.07.04.14286
23260.31238626.07.04.14286
23270.32592127.07.04.14286
23280.19371728.07.04.14286
23290.52913529.07.04.14286
23300.00380133210.07.04.14286
23310.925271211.07.04.14286
23320.0275578212.07.04.14286
23330.780854213.07.04.14286
23340.98761214.07.04.14286
23350.253629215.07.04.14286
23360.610879216.07.04.14286
23370.832145217.07.04.14286
23380.559689218.07.04.14286
23390.640294219.07.04.14286
23400.570818220.07.04.14286
23410.7974331.08.04.14286
23420.92560132.08.04.14286
23430.51523933.08.04.14286
23440.44058334.08.04.14286
23450.77411335.08.04.14286
23460.63767636.08.04.14286
23470.11299637.08.04.14286
23480.24262138.08.04.14286
23490.84349239.08.04.14286
23500.424147310.08.04.14286
23510.915224311.08.04.14286
23520.541996312.08.04.14286
23530.101772313.08.04.14286
23540.501972314.08.04.14286
23550.276068315.08.04.14286
23560.84328316.08.04.14286
23570.256643317.08.04.14286
23580.848727318.08.04.14286
23590.733551319.08.04.14286
23600.347623320.08.04.14286
23610.0062140511.09.04.14286
23620.83582112.09.04.14286
23630.54122813.09.04.14286
23640.96424914.09.04.14286
23650.8920515.09.04.14286
23660.2519716.09.04.14286
23670.67236817.09.04.14286
23680.50385918.09.04.14286
23690.279319.09.04.14286
23700.254399110.09.04.14286
23710.898582111.09.04.14286
23720.215945112.09.04.14286
23730.872121113.09.04.14286
23740.830766114.09.04.14286
23750.276792115.09.04.14286
23760.323445116.09.04.14286
23770.574587117.09.04.14286
23780.183965118.09.04.14286
23790.427522119.09.04.14286
23800.306049120.09.04.14286
23810.1175521.010.04.14286
23820.71563922.010.04.14286
23830.044162223.010.04.14286
23840.12892624.010.04.14286
23850.80550125.010.04.14286
23860.044407726.010.04.14286
23870.86666827.010.04.14286
23880.085613928.010.04.14286
23890.13125929.010.04.14286
23900.499134210.010.04.14286
23910.0515235211.010.04.14286
23920.488218212.010.04.14286
23930.269465213.010.04.14286
23940.0662615214.010.04.14286
23950.366477215.010.04.14286
23960.745302216.010.04.14286
23970.663563217.010.04.14286
23980.168652218.010.04.14286
23990.127281219.010.04.14286
24000.262247220.010.04.14286
24010.41667131.01.04.42857
24020.21211132.01.04.42857
24030.36026233.01.04.42857
24040.14480334.01.04.42857
24050.56169435.01.04.42857
24060.51844336.01.04.42857
24070.063818937.01.04.42857
24080.71213338.01.04.42857
24090.94259539.01.04.42857
24100.742081310.01.04.42857
24110.730244311.01.04.42857
24120.530557312.01.04.42857
24130.562625313.01.04.42857
24140.724954314.01.04.42857
24150.949389315.01.04.42857
24160.00418935316.01.04.42857
24170.0558594317.01.04.42857
24180.882658318.01.04.42857
24190.457556319.01.04.42857
24200.39375320.01.04.42857
24210.58729221.02.04.42857
24220.88319722.02.04.42857
24230.83273423.02.04.42857
24240.64936724.02.04.42857
24250.59729425.02.04.42857
24260.85083926.02.04.42857
24270.072028527.02.04.42857
24280.50028428.02.04.42857
24290.90584429.02.04.42857
24300.318116210.02.04.42857
24310.155621211.02.04.42857
24320.0360225212.02.04.42857
24330.771496213.02.04.42857
24340.282324214.02.04.42857
24350.959642215.02.04.42857
24360.554724216.02.04.42857
24370.126367217.02.04.42857
24380.0898405218.02.04.42857
24390.835598219.02.04.42857
24400.01046220.02.04.42857
24410.73076431.03.04.42857
24420.65029532.03.04.42857
24430.91188533.03.04.42857
24440.70441834.03.04.42857
24450.7433435.03.04.42857
24460.36411936.03.04.42857
24470.021370537.03.04.42857
24480.70028838.03.04.42857
24490.53644839.03.04.42857
24500.0296557310.03.04.42857
24510.895024311.03.04.42857
24520.515948312.03.04.42857
24530.545465313.03.04.42857
24540.82238314.03.04.42857
24550.112924315.03.04.42857
24560.809512316.03.04.42857
24570.055199317.03.04.42857
24580.703855318.03.04.42857
24590.663557319.03.04.42857
24600.2451320.03.04.42857
24610.63916431.04.04.42857
24620.23341532.04.04.42857
24630.010145233.04.04.42857
24640.55309534.04.04.42857
24650.34382335.04.04.42857
24660.15871336.04.04.42857
24670.35742537.04.04.42857
24680.013274238.04.04.42857
24690.073143939.04.04.42857
24700.302562310.04.04.42857
24710.660133311.04.04.42857
24720.765265312.04.04.42857
24730.1533313.04.04.42857
24740.0486619314.04.04.42857
24750.0685655315.04.04.42857
24760.0935133316.04.04.42857
24770.164051317.04.04.42857
24780.763925318.04.04.42857
24790.566414319.04.04.42857
24800.930818320.04.04.42857
24810.039263921.05.04.42857
24820.96218722.05.04.42857
24830.43358523.05.04.42857
24840.92733924.05.04.42857
24850.45324525.05.04.42857
24860.80250126.05.04.42857
24870.4802527.05.04.42857
24880.56285728.05.04.42857
24890.64447329.05.04.42857
24900.502941210.05.04.42857
24910.118068211.05.04.42857
24920.14247212.05.04.42857
24930.920409213.05.04.42857
24940.0871304214.05.04.42857
24950.13487215.05.04.42857
24960.753664216.05.04.42857
24970.544806217.05.04.42857
24980.9607218.05.04.42857
24990.095982219.05.04.42857
25000.307683220.05.04.42857
25010.1666421.06.04.42857
25020.14425722.06.04.42857
25030.93106823.06.04.42857
25040.98814724.06.04.42857
25050.3230425.06.04.42857
25060.24593826.06.04.42857
25070.87001827.06.04.42857
25080.82673528.06.04.42857
25090.25155129.06.04.42857
25100.904609210.06.04.42857
25110.50121211.06.04.42857
25120.950206212.06.04.42857
25130.343042213.06.04.42857
25140.26368214.06.04.42857
25150.910663215.06.04.42857
25160.924693216.06.04.42857
25170.597839217.06.04.42857
25180.768316218.06.04.42857
25190.596996219.06.04.42857
25200.151783220.06.04.42857
25210.79925111.07.04.42857
25220.9819212.07.04.42857
25230.37682213.07.04.42857
25240.61794714.07.04.42857
25250.648815.07.04.42857
25260.86213916.07.04.42857
25270.56526817.07.04.42857
25280.30956718.07.04.42857
25290.29198219.07.04.42857
25300.15979110.07.04.42857
25310.823229111.07.04.42857
25320.65735112.07.04.42857
25330.985712113.07.04.42857
25340.915965114.07.04.42857
25350.635461115.07.04.42857
25360.252077116.07.04.42857
25370.376258117.07.04.42857
25380.26796118.07.04.42857
25390.252331119.07.04.42857
25400.363581120.07.04.42857
25410.16862521.08.04.42857
25420.91446722.08.04.42857
25430.020332623.08.04.42857
25440.073072724.08.04.42857
25450.82501825.08.04.42857
25460.061996826.08.04.42857
25470.73145327.08.04.42857
25480.55589728.08.04.42857
25490.15815629.08.04.42857
25500.878269210.08.04.42857
25510.0258736211.08.04.42857
25520.76287212.08.04.42857
25530.916539213.08.04.42857
25540.514362214.08.04.42857
25550.263273215.08.04.42857
25560.889199216.08.04.42857
25570.0697843217.08.04.42857
25580.170665218.08.04.42857
25590.894626219.08.04.42857
25600.970725220.08.04.42857
25610.93910911.09.04.42857
25620.08740312.09.04.42857
25630.17808713.09.04.42857
25640.1877714.09.04.42857
25650.20927115.09.04.42857
25660.0030066416.09.04.42857
25670.21463617.09.04.42857
25680.47685518.09.04.42857
25690.38833619.09.04.42857
25700.0309417110.09.04.42857
25710.512255111.09.04.42857
25720.730356112.09.04.42857
25730.458537113.09.04.42857
25740.245346114.09.04.42857
25750.303919115.09.04.42857
25760.511106116.09.04.42857
25770.295407117.09.04.42857
25780.346836118.09.04.42857
25790.843764119.09.04.42857
25800.586683120.09.04.42857
25810.44603121.010.04.42857
25820.78749722.010.04.42857
25830.016791123.010.04.42857
25840.020573524.010.04.42857
25850.076065425.010.04.42857
25860.2031126.010.04.42857
25870.75273227.010.04.42857
25880.54828128.010.04.42857
25890.56595629.010.04.42857
25900.0358898210.010.04.42857
25910.493057211.010.04.42857
25920.590714212.010.04.42857
25930.921704213.010.04.42857
25940.0954602214.010.04.42857
25950.085874215.010.04.42857
25960.0397342216.010.04.42857
25970.941764217.010.04.42857
25980.499969218.010.04.42857
25990.927223219.010.04.42857
26000.28414220.010.04.42857
26010.95734721.01.04.71429
26020.049850222.01.04.71429
26030.78387423.01.04.71429
26040.48015324.01.04.71429
26050.32454925.01.04.71429
26060.91193326.01.04.71429
26070.82387327.01.04.71429
26080.88807928.01.04.71429
26090.58948229.01.04.71429
26100.253973210.01.04.71429
26110.796894211.01.04.71429
26120.50801212.01.04.71429
26130.386087213.01.04.71429
26140.195013214.01.04.71429
26150.547079215.01.04.71429
26160.920118216.01.04.71429
26170.175429217.01.04.71429
26180.344638218.01.04.71429
26190.739665219.01.04.71429
26200.138639220.01.04.71429
26210.87335431.02.04.71429
26220.26708132.02.04.71429
26230.68173433.02.04.71429
26240.62444734.02.04.71429
26250.42588935.02.04.71429
26260.12772736.02.04.71429
26270.99506137.02.04.71429
26280.19613138.02.04.71429
26290.63782939.02.04.71429
26300.767779310.02.04.71429
26310.836671311.02.04.71429
26320.249708312.02.04.71429
26330.6094313.02.04.71429
26340.901407314.02.04.71429
26350.709793315.02.04.71429
26360.507252316.02.04.71429
26370.0343773317.02.04.71429
26380.460578318.02.04.71429
26390.588605319.02.04.71429
26400.169955320.02.04.71429
26410.49562331.03.04.71429
26420.51194432.03.04.71429
26430.45810133.03.04.71429
26440.21255634.03.04.71429
26450.090246335.03.04.71429
26460.9902236.03.04.71429
26470.58814137.03.04.71429
26480.80456438.03.04.71429
26490.66842939.03.04.71429
26500.0184739310.03.04.71429
26510.557465311.03.04.71429
26520.0463477312.03.04.71429
26530.313351313.03.04.71429
26540.234686314.03.04.71429
26550.367044315.03.04.71429
26560.578948316.03.04.71429
26570.574747317.03.04.71429
26580.0613488318.03.04.71429
26590.302051319.03.04.71429
26600.0444249320.03.04.71429
26610.90841311.04.04.71429
26620.24818712.04.04.71429
26630.99156613.04.04.71429
26640.078124814.04.04.71429
26650.20615415.04.04.71429
26660.8426116.04.04.71429
26670.95005317.04.04.71429
26680.68102618.04.04.71429
26690.69310419.04.04.71429
26700.393636110.04.04.71429
26710.994666111.04.04.71429
26720.544106112.04.04.71429
26730.316326113.04.04.71429
26740.687434114.04.04.71429
26750.749572115.04.04.71429
26760.891793116.04.04.71429
26770.880613117.04.04.71429
26780.644515118.04.04.71429
26790.416033119.04.04.71429
26800.878987120.04.04.71429
26810.63831731.05.04.71429
26820.29010232.05.04.71429
26830.079590633.05.04.71429
26840.42240434.05.04.71429
26850.86398235.05.04.71429
26860.5283136.05.04.71429
26870.39848837.05.04.71429
26880.96467938.05.04.71429
26890.39653339.05.04.71429
26900.0833229310.05.04.71429
26910.369153311.05.04.71429
26920.179222312.05.04.71429
26930.845178313.05.04.71429
26940.119063314.05.04.71429
26950.53349315.05.04.71429
26960.805543316.05.04.71429
26970.528313317.05.04.71429
26980.0572516318.05.04.71429
26990.337831319.05.04.71429
27000.574659320.05.04.71429
27010.49247321.06.04.71429
27020.20753922.06.04.71429
27030.048577223.06.04.71429
27040.80638224.06.04.71429
27050.85967425.06.04.71429
27060.5340626.06.04.71429
27070.89261627.06.04.71429
27080.74992228.06.04.71429
27090.52627729.06.04.71429
27100.836573210.06.04.71429
27110.168699211.06.04.71429
27120.767376212.06.04.71429
27130.495945213.06.04.71429
27140.0432447214.06.04.71429
27150.914273215.06.04.71429
27160.714993216.06.04.71429
27170.0943361217.06.04.71429
27180.129307218.06.04.71429
27190.184475219.06.04.71429
27200.592795220.06.04.71429
27210.063579911.07.04.71429
27220.94888212.07.04.71429
27230.72192213.07.04.71429
27240.30760814.07.04.71429
27250.73314615.07.04.71429
27260.86571216.07.04.71429
27270.95683317.07.04.71429
27280.45305318.07.04.71429
27290.68152619.07.04.71429
27300.742987110.07.04.71429
27310.635466111.07.04.71429
27320.614119112.07.04.71429
27330.725373113.07.04.71429
27340.697145114.07.04.71429
27350.247654115.07.04.71429
27360.141817116.07.04.71429
27370.588343117.07.04.71429
27380.722385118.07.04.71429
27390.781212119.07.04.71429
27400.655262120.07.04.71429
27410.4202411.08.04.71429
27420.95664812.08.04.71429
27430.47452713.08.04.71429
27440.70835114.08.04.71429
27450.73244115.08.04.71429
27460.90001616.08.04.71429
27470.72598417.08.04.71429
27480.37696318.08.04.71429
27490.41445919.08.04.71429
27500.536757110.08.04.71429
27510.0645578111.08.04.71429
27520.575651112.08.04.71429
27530.516013113.08.04.71429
27540.149094114.08.04.71429
27550.383222115.08.04.71429
27560.00593482116.08.04.71429
27570.607952117.08.04.71429
27580.730763118.08.04.71429
27590.402609119.08.04.71429
27600.00792427120.08.04.71429
27610.72137331.09.04.71429
27620.70227532.09.04.71429
27630.41180133.09.04.71429
27640.08332434.09.04.71429
27650.30944935.09.04.71429
27660.49522636.09.04.71429
27670.97657237.09.04.71429
27680.066824138.09.04.71429
27690.9836739.09.04.71429
27700.40439310.09.04.71429
27710.703456311.09.04.71429
27720.388379312.09.04.71429
27730.68224313.09.04.71429
27740.718409314.09.04.71429
27750.0926626315.09.04.71429
27760.205507316.09.04.71429
27770.758457317.09.04.71429
27780.809049318.09.04.71429
27790.0643248319.09.04.71429
27800.346292320.09.04.71429
27810.29172531.010.04.71429
27820.96667232.010.04.71429
27830.33895433.010.04.71429
27840.052207834.010.04.71429
27850.65122235.010.04.71429
27860.094203236.010.04.71429
27870.83596637.010.04.71429
27880.70341238.010.04.71429
27890.34186139.010.04.71429
27900.574232310.010.04.71429
27910.981713311.010.04.71429
27920.0838874312.010.04.71429
27930.236027313.010.04.71429
27940.642915314.010.04.71429
27950.464504315.010.04.71429
27960.313969316.010.04.71429
27970.0917315317.010.04.71429
27980.0847256318.010.04.71429
27990.912936319.010.04.71429
28000.760761320.010.04.71429
28010.019167831.01.05.0
28020.65039732.01.05.0
28030.1071633.01.05.0
28040.28311734.01.05.0
28050.54062335.01.05.0
28060.57616636.01.05.0
28070.11572237.01.05.0
28080.17478438.01.05.0
28090.62885139.01.05.0
28100.188283310.01.05.0
28110.559766311.01.05.0
28120.17463312.01.05.0
28130.138878313.01.05.0
28140.630394314.01.05.0
28150.122341315.01.05.0
28160.396679316.01.05.0
28170.692337317.01.05.0
28180.38769318.01.05.0
28190.867985319.01.05.0
28200.440726320.01.05.0
28210.72033931.02.05.0
28220.43178432.02.05.0
28230.92374433.02.05.0
28240.38958234.02.05.0
28250.51858935.02.05.0
28260.50734536.02.05.0
28270.58471837.02.05.0
28280.66281738.02.05.0
28290.51567639.02.05.0
28300.178473310.02.05.0
28310.200476311.02.05.0
28320.972189312.02.05.0
28330.669492313.02.05.0
28340.361834314.02.05.0
28350.640356315.02.05.0
28360.271234316.02.05.0
28370.200332317.02.05.0
28380.186268318.02.05.0
28390.850252319.02.05.0
28400.435133320.02.05.0
28410.52769331.03.05.0
28420.19159632.03.05.0
28430.86119833.03.05.0
28440.46664434.03.05.0
28450.96154835.03.05.0
28460.37376736.03.05.0
28470.00057135837.03.05.0
28480.53902238.03.05.0
28490.097645539.03.05.0
28500.562217310.03.05.0
28510.126154311.03.05.0
28520.341373312.03.05.0
28530.601876313.03.05.0
28540.97836314.03.05.0
28550.269184315.03.05.0
28560.746459316.03.05.0
28570.800522317.03.05.0
28580.482587318.03.05.0
28590.65448319.03.05.0
28600.469888320.03.05.0
28610.7267931.04.05.0
28620.54170132.04.05.0
28630.64553733.04.05.0
28640.78681834.04.05.0
28650.69961135.04.05.0
28660.91641136.04.05.0
28670.70484137.04.05.0
28680.85703238.04.05.0
28690.8754439.04.05.0
28700.920989310.04.05.0
28710.309455311.04.05.0
28720.822834312.04.05.0
28730.768518313.04.05.0
28740.43245314.04.05.0
28750.567513315.04.05.0
28760.916166316.04.05.0
28770.933941317.04.05.0
28780.628118318.04.05.0
28790.0747135319.04.05.0
28800.889557320.04.05.0
28810.7546421.05.05.0
28820.79790522.05.05.0
28830.77893123.05.05.0
28840.28744124.05.05.0
28850.73904725.05.05.0
28860.22644326.05.05.0
28870.33521327.05.05.0
28880.48983728.05.05.0
28890.73506229.05.05.0
28900.259396210.05.05.0
28910.637687211.05.05.0
28920.999911212.05.05.0
28930.576003213.05.05.0
28940.575745214.05.05.0
28950.20361215.05.05.0
28960.417422216.05.05.0
28970.2539217.05.05.0
28980.460357218.05.05.0
28990.401898219.05.05.0
29000.567567220.05.05.0
29010.79948321.06.05.0
29020.67526422.06.05.0
29030.75264423.06.05.0
29040.39025124.06.05.0
29050.16972125.06.05.0
29060.37808126.06.05.0
29070.95484627.06.05.0
29080.57530528.06.05.0
29090.22421929.06.05.0
29100.839326210.06.05.0
29110.382998211.06.05.0
29120.275929212.06.05.0
29130.383811213.06.05.0
29140.352971214.06.05.0
29150.154613215.06.05.0
29160.805225216.06.05.0
29170.722065217.06.05.0
29180.485634218.06.05.0
29190.306613219.06.05.0
29200.275518220.06.05.0
29210.93420531.07.05.0
29220.14600132.07.05.0
29230.26918933.07.05.0
29240.98960834.07.05.0
29250.86660835.07.05.0
29260.46084736.07.05.0
29270.24564937.07.05.0
29280.21631438.07.05.0
29290.019231839.07.05.0
29300.276833310.07.05.0
29310.939041311.07.05.0
29320.095393312.07.05.0
29330.538434313.07.05.0
29340.291234314.07.05.0
29350.13161315.07.05.0
29360.143002316.07.05.0
29370.967071317.07.05.0
29380.414194318.07.05.0
29390.969357319.07.05.0
29400.401728320.07.05.0
29410.18357611.08.05.0
29420.74056612.08.05.0
29430.53567313.08.05.0
29440.97175214.08.05.0
29450.54569115.08.05.0
29460.11483916.08.05.0
29470.36335817.08.05.0
29480.85151918.08.05.0
29490.81032319.08.05.0
29500.502421110.08.05.0
29510.0714933111.08.05.0
29520.584238112.08.05.0
29530.36521113.08.05.0
29540.841723114.08.05.0
29550.79786115.08.05.0
29560.770182116.08.05.0
29570.222368117.08.05.0
29580.0611734118.08.05.0
29590.547518119.08.05.0
29600.166726120.08.05.0
29610.1860621.09.05.0
29620.74004422.09.05.0
29630.72417423.09.05.0
29640.14784824.09.05.0
29650.0508725.09.05.0
29660.99303626.09.05.0
29670.77668527.09.05.0
29680.8770628.09.05.0
29690.3101729.09.05.0
29700.364157210.09.05.0
29710.630767211.09.05.0
29720.522089212.09.05.0
29730.552769213.09.05.0
29740.185194214.09.05.0
29750.891957215.09.05.0
29760.743912216.09.05.0
29770.576135217.09.05.0
29780.277185218.09.05.0
29790.596008219.09.05.0
29800.967324220.09.05.0
29810.54036611.010.05.0
29820.53319712.010.05.0
29830.23304313.010.05.0
29840.11774514.010.05.0
29850.78426915.010.05.0
29860.098152916.010.05.0
29870.016553717.010.05.0
29880.099711818.010.05.0
29890.33145919.010.05.0
29900.484407110.010.05.0
29910.320814111.010.05.0
29920.408759112.010.05.0
29930.701191113.010.05.0
29940.857079114.010.05.0
29950.161569115.010.05.0
29960.543436116.010.05.0
29970.135289117.010.05.0
29980.226778118.010.05.0
29990.562687119.010.05.0
30000.917285120.010.05.0
+ +

In this line we calculate the Mean for each class

+
fitcube = cubefittable(t, Mean, :values, by=(:classes))
+
+
3-element YAXArray{Union{Missing, Float64},1} with dimensions: 
+  Dim{:classes} Sampled{Int64} Int64[1, 2, 3] ForwardOrdered Irregular Points
+Total 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.

+
fitcube = cubefittable(t, Mean, :values, by=(:classes, :time))
+
+
3×20 YAXArray{Union{Missing, Float64},2} with dimensions: 
+  Dim{:classes} Sampled{Int64} Int64[1, 2, 3] ForwardOrdered Irregular Points,
+  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points
+Total size: 480.0 bytes
+
+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/HowdoI/switchtodimarray/index.html b/previews/PR298/examples/generated/HowdoI/switchtodimarray/index.html new file mode 100644 index 00000000..44c46972 --- /dev/null +++ b/previews/PR298/examples/generated/HowdoI/switchtodimarray/index.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Switch to DimensionalData - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

Switch to DimensionalData

+ +

The purpose of this section is to show how to switch from the native YAXArray type to the new type based on DimensionalData.jl

+

+

+

Axis lists have to be Tuples instead of Vector¤

+

When you want to define a YAXArray from scratch the list of Axis has to be given as a Tuple instead of a vector. Otherwise you would run into a DimensionMismatch error.

+

+

+

Dim instead of RangeAxis and CategoricalAxis¤

+

The dimensions of a YAXArray are now Dimension types from DimensionalData and there is no difference anymore in the construction for categorical or

+

+

+

Get the axes of a YAXArray¤

+

To get the axes of a YAXArray use the dims function instead of the caxes function

+
using DimensionalData
+using YAXArrays
+
+axes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))
+arr = YAXArray(axes, reshape(1:10000, (10,10,100)))
+
+dims(arr)
+
+
Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points
+
+

+

+

Copy an axes with the same name but different values¤

+

Use DD.rebuild(ax, values) instead of axcopy(ax, values)

+

+

+

Subsetting is including not excluding¤

+

Beware that the subsets in DimensionalData include the bounds. Thereby the size of the subset can differ by one on every bound. a[X=1..4]

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/applyfunctions/index.html b/previews/PR298/examples/generated/UserGuide/applyfunctions/index.html new file mode 100644 index 00000000..1f34aa34 --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/applyfunctions/index.html @@ -0,0 +1,897 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Apply functions on YAXArrays - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

Apply functions on YAXArrays

+ +

How to apply functions on YAXArrays

+

To apply user defined functions on a YAXArray data type we can use the map function, mapslices function or the mapCube function. Which of these functions should be used depends on the layout of the data, that the user defined function should be applied on.

+

+

+

Apply a function on every element of a datacube¤

+

The map function can be used to apply a function on every entry of a YAXArray without taking the dimensions into account. This will lazily register the mapped function which is applied when the YAXArray is either accessed or when more involved computations are made.

+
#If we set up a dummy data cube which has all numbers between 1 and 10000.
+
+using YAXArrays
+using DimensionalData
+axes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))
+original = YAXArray(axes, reshape(1:10000, (10,10,100)))
+
+
10×10×100 YAXArray{Int64,3} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points
+Total size: 78.12 KB
+
+

with one at the first position:

+
original[1,:,1]
+
+
10-element YAXArray{Int64,1} with dimensions: 
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points
+Total size: 80.0 bytes
+
+

now we can substract 1 from all elements of this cube

+
substracted = map(x-> x-1, original)
+
+
10×10×100 YAXArray{Int64,3} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points
+Total size: 78.12 KB
+
+

substracted is a cube of the same size as original, and the applied function is registered, so that it is applied as soon as the elements of substracted are either accessed or further used in other computations.

+
substracted[1,:,1]
+
+
10-element YAXArray{Int64,1} with dimensions: 
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points
+Total size: 80.0 bytes
+
+

+

+

Apply a function along dimensions of a single cube¤

+

If an function should work along a certain dimension of the data you can use the 'mapslices' function to easily apply this function. This doesn't give you the flexibility of the mapCube function but it is easier to use for simple functions.

+

If we set up a dummy data cube which has all numbers between 1 and 10000.

+
axes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))
+original = YAXArray(axes, reshape(1:10000, (10,10,100)))
+
+
10×10×100 YAXArray{Int64,3} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points
+Total size: 78.12 KB
+
+

and then we would like to compute the sum over the Time dimension:

+
timesum = mapslices(sum, original, dims="Time")
+
+
10×10 YAXArray{Union{Missing, Int64},2} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points
+Total size: 800.0 bytes
+
+

this reduces over the time dimension and gives us the following values

+
timesum[:,:]
+
+
10×10 YAXArray{Union{Missing, Int64},2} with dimensions: 
+  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,
+  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points
+Total size: 800.0 bytes
+
+

You can also apply a function along multiple dimensions of the same data cube.

+
lonlatsum = mapslices(sum, original, dims=("Lon", "Lat"))
+
+
100-element YAXArray{Union{Missing, Int64},1} with dimensions: 
+  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points
+Total size: 800.0 bytes
+
+

+

+

How to combine multiple cubes in one computation¤

+

+

+

Compute the Mean Seasonal Cycle for one sigle pixel¤

+
using CairoMakie
+CairoMakie.activate!()
+using Dates
+using Statistics
+
+

We define the data span. For simplicity, three non-leap years were selected.

+
t =  Date("2021-01-01"):Day(1):Date("2023-12-31")
+NpY = 3
+# create some seasonal dummy data
+x = repeat(range(0, 2π, length=365), NpY)
+var = @. sin(x) + 0.1 * randn()
+
+lines(1:length(t), var; color = :purple, linewidth=1.25,
+    axis=(; xlabel="Time", ylabel="Variable"),
+    figure = (; resolution = (600,400))
+    )
+
+

+

Currently makie doesn't support time axis natively, but the following function can do the work for now.

+
function time_ticks(dates; frac=8)
+    tempo = string.(dates)
+    lentime = length(tempo)
+    slice_dates = range(1, lentime, step=lentime ÷ frac)
+    return slice_dates, tempo[slice_dates]
+end
+
+xpos, ticks = time_ticks(t; frac=8)
+
+
(1:136:1089, ["2021-01-01", "2021-05-17", "2021-09-30", "2022-02-13", "2022-06-29", "2022-11-12", "2023-03-28", "2023-08-11", "2023-12-25"])
+
+

In order to apply the previous output, we split the plotting function into his 3 components, figure, axis and plotted object, namely

+
fig, ax, obj = lines(1:length(t), var; color = :purple, linewidth=1.25,
+    axis=(; xlabel="Time", ylabel="Variable"),
+    figure = (; resolution = (600,400))
+    )
+ax.xticks = (xpos, ticks)
+ax.xticklabelrotation = π / 4
+ax.xticklabelalign = (:right, :center)
+fig
+
+

+

+

+

Define the cube¤

+
axes = (Dim{:Time}(t),)
+c = YAXArray(axes, var)
+
+
1095-element YAXArray{Float64,1} with dimensions: 
+  Dim{:Time} Sampled{Date} Date("2021-01-01"):Dates.Day(1):Date("2023-12-31") ForwardOrdered Regular Points
+Total size: 8.55 KB
+
+

Let's calculate the mean seasonal cycle of our dummy variable 'var'

+
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);
+
+

+

+

Plot results: mean seasonal cycle¤

+
xpos, ticks = time_ticks(t[1:365]; frac=8)
+
+fig, ax, obj = lines(1:365, var[1:365]; label="2021", color=:black,
+    linewidth=2.0, linestyle=:dot,
+    axis = (;  xlabel="Time", ylabel="Variable"),
+    figure=(; resolution = (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, lw=2.5)
+axislegend()
+ax.xticks = (xpos, ticks)
+ax.xticklabelrotation = π / 4
+ax.xticklabelalign = (:right, :center)
+fig
+current_figure()
+
+

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/creating/index.html b/previews/PR298/examples/generated/UserGuide/creating/index.html new file mode 100644 index 00000000..6ab38a5a --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/creating/index.html @@ -0,0 +1,1086 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Creating YAXArrays and Datasets - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

+

+

Creating YAXArrays and Datasets¤

+

+

+

Creating a YAXArray¤

+
using YAXArrays
+using DimensionalData: DimensionalData as DD
+using DimensionalData
+a = YAXArray(rand(10, 20, 5))
+
+
10×20×5 YAXArray{Float64,3} with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+Total size: 7.81 KB
+
+

if not names are defined then default ones will be used, i.e. Dim_1, Dim_2. Get data from each Dimension with

+
a.Dim_1
+
+
Dim{:Dim_1} Sampled{Int64} ForwardOrdered Regular Points
+wrapping: Base.OneTo(10)
+
+

or with

+
getproperty(a, :Dim_1)
+
+
Dim{:Dim_1} Sampled{Int64} ForwardOrdered Regular Points
+wrapping: Base.OneTo(10)
+
+

+

+

Creating a YAXArray with named axis¤

+

The two most used axis are RangeAxis and CategoricalAxis. Here, we use a combination of them to create a time, lon and lat axis and a Categorical Axis for two variables.

+

+

+

Axis definitions¤

+
using Dates
+axlist = (
+    Dim{:time}(Date("2022-01-01"):Day(1):Date("2022-01-30")),
+    Dim{:lon}(range(1, 10, length=10)),
+    Dim{:lat}(range(1, 5, length=15)),
+    Dim{:Variable}(["var1", "var2"])
+    )
+
+
Dim{:time} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30"),
+Dim{:lon} 1.0:1.0:10.0,
+Dim{:lat} 1.0:0.2857142857142857:5.0,
+Dim{:Variable} String["var1", "var2"]
+
+

And the corresponding data

+
data = rand(30, 10, 15, 2)
+ds = YAXArray(axlist, data)
+
+
30×10×15×2 YAXArray{Float64,4} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+  Dim{:Variable} Categorical{String} String["var1", "var2"] ForwardOrdered
+Total size: 70.31 KB
+
+

+

+

Select variables¤

+
ds[Variable = At("var1"), lon = DD.Between(1,2.1)]
+
+
30×2×15 YAXArray{Float64,3} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total size: 7.03 KB
+
+

+

+

Indexing and subsetting¤

+

As for most array types, YAXArray also provides special indexing behavior when using the square brackets for indexing. Assuming that c is a YAXArray, there are 3 different semantics to use the square brackets with, depending on the types of the arguments provided to getindex.

+
    +
  1. Ranges and Integers only as for example c[1,4:8,:] will access the underlying data according to the provided index in index space and read the
  2. +
+

data into memory as a plain Julia Array. It is equivalent to c.data[1,4:8,:].

+
    +
  1. Keyword arguments with values or Intervals as for example c[longitude = 30..50, time=Date(2005,6,1), variable="air_temperature"].
  2. +
+

This always creates a view into the specified subset of the data and return a new YAXArray with new axes without reading the data. Intervals and values are always interpreted in the units as provided by the axis values.

+
    +
  1. A Tables.jl-compatible object for irregular extraction of a list of points or sub-arrays and random locations.
  2. +
+

For example calling c[[(lon=30,lat=42),(lon=-50,lat=2.5)]] will extract data at the specified coordinates and along all additional axes into memory. It returns a new YAXArray with a new Multi-Index axis along the selected longitudes and latitudes.

+
+

Info

+

Overall, selecting elements in YAXArrays is brittle. Hence using DimensionalData.jl and YAXArrayBase.jl is recomended.

+
+

+

+

Select variables with DimensionalData.jl¤

+
using DimensionalData, YAXArrayBase
+
+

First we wrap the yaxarray into a DimArray via

+
dim = yaxconvert(DimArray, ds)
+
+
30×10×15×2 DimArray{Float64,4} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+  Dim{:Variable} Categorical{String} String["var1", "var2"] ForwardOrdered
+[:, :, 1, 1]
+                      1.0       …  8.0        9.0        10.0
+  2022-01-01  0.264379     0.0485374  0.468793    0.389993
+  2022-01-02  0.297533     0.878975   0.440026    0.436568
+  2022-01-03  0.458534     0.266355   0.851548    0.437344
+ ⋮                              ⋱                         ⋮
+  2022-01-27  0.897503  …  0.669995   0.328952    0.382058
+  2022-01-28  0.710513     0.300216   0.0925076   0.332528
+  2022-01-29  0.154864     0.160199   0.948726    0.151164
+  2022-01-30  0.690848     0.294271   0.364651    0.00713762
+[and 29 more slices...]
+
+

Now, the syntax from DimensionalData.jl just works

+
subset = dim[
+    time = DD.Between( Date("2022-01-01"),  Date("2022-01-10")),
+    lon=DD.Between(1,2),
+    Variable = At("var2")
+    ]
+
+
10×2×15 DimArray{Float64,3} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-10") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+and reference dimensions: 
+  Dim{:Variable} Categorical{String} String["var2"] ForwardOrdered
+[:, :, 1]
+                      1.0       2.0
+  2022-01-01  0.400221  0.657645
+  2022-01-02  0.748848  0.139248
+ ⋮                              
+  2022-01-09  0.304694  0.933361
+  2022-01-10  0.81306   0.343546
+[and 14 more slices...]
+
+

And going back to our YAXArray view is done with

+
yax = yaxconvert(YAXArray, subset)
+
+
10×2×15 YAXArray{Float64,3} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-10") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total size: 2.34 KB
+
+

This will be supported by default in the next release.

+

+

+

Properties / Attributes¤

+

You might also want to add additional properties to your YAXArray. This can be done via a Dictionary, namely

+
props = Dict(
+    "time" => "days",
+    "lon" => "longitude",
+    "lat" => "latitude",
+    "var1" => "first variable",
+    "var2" => "second variable",
+)
+
+
Dict{String, String} with 5 entries:
+  "lat"  => "latitude"
+  "var1" => "first variable"
+  "time" => "days"
+  "var2" => "second variable"
+  "lon"  => "longitude"
+
+

Then the yaxarray with properties is assemble with

+
ds = YAXArray(axlist, data, props)
+
+
30×10×15×2 YAXArray{Float64,4} with dimensions: 
+  Dim{:time} Sampled{Date} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30") ForwardOrdered Regular Points,
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,
+  Dim{:Variable} Categorical{String} String["var1", "var2"] ForwardOrdered
+Total size: 70.31 KB
+
+

Access these properties with

+
ds.properties
+
+
Dict{String, String} with 5 entries:
+  "lat"  => "latitude"
+  "var1" => "first variable"
+  "time" => "days"
+  "var2" => "second variable"
+  "lon"  => "longitude"
+
+

Note that this properties are shared for both variables var1 and var2. Namely, this are global properties for your yaxarray. However, in most cases you will want to pass properties for each variable, here we will do this via Datasets.

+

+

+

Creating a Dataset¤

+

Let's define first some range axis

+
axs = (
+    Dim{:lon}(range(0,1, length=10)),
+    Dim{:lat}(range(0,1, length=5)),
+)
+
+
Dim{:lon} 0.0:0.1111111111111111:1.0,
+Dim{:lat} 0.0:0.25:1.0
+
+

And two toy random YAXArrays to assemble our dataset

+
t2m = YAXArray(axs, rand(10,5), Dict("units" => "K", "reference" => "your references"))
+prec = YAXArray(axs, rand(10,5), Dict("units" => "mm", "reference" => "your references"))
+
+ds = Dataset(t2m=t2m, prec= prec, num = YAXArray(rand(10)),
+    properties = Dict("space"=>"lon/lat", "reference" => "your global references"))
+
+
YAXArray Dataset
+Shared Axes: 
+()
+Variables: 
+
+t2m
+ with dimensions: 
+  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points
+prec
+ with dimensions: 
+  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points
+num
+ with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Properties: Dict("reference" => "your global references", "space" => "lon/lat")
+
+

Note that the YAXArrays used not necessarily shared the same dimensions. Hence, using a Dataset if more versatile than a plain YAXArray.

+

+

+

Selected Variables into a Data Cube¤

+

Being able to collect variables that share dimensions into a data cube is possible with

+
c = Cube(ds[["t2m", "prec"]])
+
+
10×5×2 YAXArray{Float64,3} with dimensions: 
+  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points,
+  Dim{:Variable} Categorical{String} String["t2m", "prec"] ReverseOrdered
+units: mm
+Total size: 800.0 bytes
+
+

or simply the one that does not share all dimensions

+
Cube(ds[["num"]])
+
+
10-element YAXArray{Float64,1} with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Total size: 80.0 bytes
+
+

+

+

Variable properties¤

+
# Access to variables properties is done via
+Cube(ds[["t2m"]]).properties
+
+
Dict{String, String} with 2 entries:
+  "units"     => "K"
+  "reference" => "your references"
+
+

and

+
Cube(ds[["prec"]]).properties
+
+
Dict{String, String} with 2 entries:
+  "units"     => "mm"
+  "reference" => "your references"
+
+

Note also that the global properties for the Dataset are accessed with

+
ds.properties
+
+
Dict{String, String} with 2 entries:
+  "reference" => "your global references"
+  "space"     => "lon/lat"
+
+

Saving and different chunking modes are discussed in here.

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/distributed/index.html b/previews/PR298/examples/generated/UserGuide/distributed/index.html new file mode 100644 index 00000000..0b33774a --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/distributed/index.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Distributed processes - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

+

+

How to calculate a time mean¤

+
using YAXArrays, Statistics, Zarr
+using DimensionalData
+using Dates
+axlist = (
+    Dim{:time}(Date("2022-01-01"):Day(1):Date("2022-01-30")),
+    Dim{:lon}(range(1, 10, length=10)),
+    Dim{:lat}(range(1, 5, length=15)),
+    Dim{:Variable}(["var1", "var2"])
+    )
+
+
Dim{:time} Date("2022-01-01"):Dates.Day(1):Date("2022-01-30"),
+Dim{:lon} 1.0:1.0:10.0,
+Dim{:lat} 1.0:0.2857142857142857:5.0,
+Dim{:Variable} String["var1", "var2"]
+
+

And the corresponding data

+
data = rand(30, 10, 15, 2)
+ds = YAXArray(axlist, data)
+
+c = ds[Variable = At("var1")] # see OpenNetCDF to get the file
+mapslices(mean  skipmissing, c, dims="Time")
+
+
10×15 YAXArray{Union{Missing, Float64},2} with dimensions: 
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total size: 1.17 KB
+
+

+

+

Distributed calculations¤

+

It is possible to distribute the calculations over multiple process. The following code does a time mean over all grid points using multiple CPU over a local machine.

+
#using Distributed
+#addprocs(2)
+#@everywhere using Pkg
+#@everywhere Pkg.activate(".")
+#@everywhere begin
+
+

using NetCDF using YAXArrays using Statistics using Zarr

+
#end
+#@everywhere function mymean(output, pixel)
+
+

@show "doing a mean" output[:] .= mean(pixel)

+
#end
+#indims = InDims("time")
+#outdims = OutDims()
+#resultcube = mapCube(mymean, c, indims=indims, 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

+
resultcube = mapslices(mean  skipmissing, c, dims="time")
+
+
10×15 YAXArray{Union{Missing, Float64},2} with dimensions: 
+  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points
+Total size: 1.17 KB
+
+

+

+

SLURM cluster¤

+

It is also possible to distribute easily the workload on a cluster, with little modification to the code. The following code does a time mean over all grid points using multiple CPU over a SLURM cluster. To do so, we use the ClusterManagers package.

+
#using Distributed
+#using ClusterManagers
+#addprocs(SlurmManager(10))
+#@everywhere using Pkg
+#@everywhere Pkg.activate(".")
+#@everywhere using ESDL
+#@everywhere using Statistics
+#inpath="zg1000_AERday_CanESM5_esm-hist_r6i1p1f1_gn_18500101-20141231.nc"
+#c = Cube(inpath, "zg1000")
+#resultcube = mapslices(mean ∘ skipmissing, c, dims="time")
+
+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/openNetCDF/index.html b/previews/PR298/examples/generated/UserGuide/openNetCDF/index.html new file mode 100644 index 00000000..26c34f29 --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/openNetCDF/index.html @@ -0,0 +1,615 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Open NetCDF - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Open NetCDF

+ +

In this example we are going to use a NetCDF file but this should be very similar for other data backends. To open a single data file we first need to load the appropriate backend package via using NetCDF.

+
using YAXArrays, NetCDF
+using Downloads
+url = "https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc"
+filename = Downloads.download(url, "tos_O1_2001-2002.nc") # you pick your own path
+c = Cube(filename)
+
+
180×170×24 YAXArray{Union{Missing, Float32},3} with dimensions: 
+  Dim{:lon} Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,
+  Ti Sampled{CFTime.DateTime360Day} CFTime.DateTime360Day[CFTime.DateTime360Day(2001-01-16T00:00:00), …, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points
+units: K
+name: tos
+Total size: 2.8 MB
+
+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/openZarr/index.html b/previews/PR298/examples/generated/UserGuide/openZarr/index.html new file mode 100644 index 00000000..048d19e1 --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/openZarr/index.html @@ -0,0 +1,613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Open Zarr (Store) - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Open Zarr (Store)

+ +
using Zarr, YAXArrays
+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"]
+
+
384×192×251288 YAXArray{Float32,3} with dimensions: 
+  Dim{:lon} Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,
+  Dim{:lat} Sampled{Float64} Float64[-89.28422753251364, -88.35700351866494, …, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,
+  Ti Sampled{DateTime} DateTime[2015-01-01T03:00:00, …, 2101-01-01T00:00:00] ForwardOrdered Irregular Points
+units: K
+name: tas
+Total size: 69.02 GB
+
+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/rldbhqu.png b/previews/PR298/examples/generated/UserGuide/rldbhqu.png new file mode 100644 index 00000000..ca074404 Binary files /dev/null and b/previews/PR298/examples/generated/UserGuide/rldbhqu.png differ diff --git a/previews/PR298/examples/generated/UserGuide/saving/index.html b/previews/PR298/examples/generated/UserGuide/saving/index.html new file mode 100644 index 00000000..66db3394 --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/saving/index.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Saving YAXArrays and Datasets - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

+

+

Saving YAXArrays and Datasets¤

+

Is possible to save datasets and YAXArray directly to zarr files.

+

+

+

Saving a YAXArray to Zarr¤

+

One can save any YAXArray using the savecube function. Simply add a path as an argument and the cube will be saved.

+
using YAXArrays, Zarr
+a = YAXArray(rand(10,20))
+f = tempname()
+savecube(a,f,driver=:zarr)
+
+
10×20 YAXArray{Float64,2} with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points
+Total size: 1.56 KB
+
+

+

+

Saving a YAXArray to NetCDF¤

+

Saving to NetCDF works exactly the same way.

+
using YAXArrays, Zarr, NetCDF
+a = YAXArray(rand(10,20))
+f = tempname()
+savecube(a,f,driver=:netcdf)
+
+
10×20 YAXArray{Float64,2} with dimensions: 
+  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points
+Total size: 1.56 KB
+
+

+

+

Saving a Dataset¤

+

Saving Datasets can be done using the savedataset function.

+
using YAXArrays, Zarr
+ds = Dataset(x = YAXArray(rand(10,20)), y = YAXArray(rand(10)));
+f = tempname();
+savedataset(ds,path=f,driver=:zarr)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Variables: 
+
+x
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, 
+
+

+

+

Overwriting a Dataset¤

+

If a path already exists, an error will be thrown. Set overwrite=true to delete the existing dataset

+
savedataset(ds,path=f,driver=:zarr, overwrite=true)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Variables: 
+
+x
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, 
+
+

Look at the docs for more information

+

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.

+
+

+

+

Appending to a Dataset¤

+

New variables can be added to an existing dataset using the append=true keyword.

+
ds2 = Dataset(z = YAXArray(rand(10,20,5)))
+savedataset(ds2, path=f,backend=:zarr,append=true)
+open_dataset(f, driver=:zarr)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} 1:1:10 ForwardOrdered Regular Points
+Variables: 
+
+x
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} 1:1:20 ForwardOrdered Regular Points
+z
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} 1:1:20 ForwardOrdered Regular Points,
+  Dim{:Dim_3} Sampled{Int64} 1:1:5 ForwardOrdered Regular Pointsy, 
+
+

+

+

Datacube Skeleton without the actual data¤

+

Sometimes one merely wants to create a datacube "Skeleton" on disk and gradually fill it with data. Here we create YAXArray and write only the axis data and array metadata to disk, while no actual array data is copied:

+
using YAXArrays, Zarr
+a = YAXArray(zeros(Union{Missing, Int32},10,20))
+f = tempname();
+r = savecube(a,f,driver=:zarr,skeleton=true);
+all(ismissing,r[:,:])
+
+
true
+
+

The skeleton argument is also available for savedataset.

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/setchuncks/index.html b/previews/PR298/examples/generated/UserGuide/setchuncks/index.html new file mode 100644 index 00000000..721b4266 --- /dev/null +++ b/previews/PR298/examples/generated/UserGuide/setchuncks/index.html @@ -0,0 +1,870 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Setting chunks's size - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

+

+

Set chunks¤

+

To determine the chunk size of the array representation on disk, call the setchunks function prior to saving.

+

+

+

Chunking YAXArrays¤

+
using YAXArrays, Zarr
+a = YAXArray(rand(10,20))
+a_chunked = setchunks(a, (5,10))
+a_chunked.chunks
+
+
2×2 DiskArrays.GridChunks{2}:
+ (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.

+
f = tempname()
+savecube(a_chunked, f, backend=:zarr)
+Cube(f).chunks
+
+
2×2 DiskArrays.GridChunks{2}:
+ (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:

+
a_chunked = setchunks(a, (Dim_2=10, Dim_1=5))
+a_chunked.chunks
+
+
2×2 DiskArrays.GridChunks{2}:
+ (1:5, 1:10)   (1:5, 11:20)
+ (6:10, 1:10)  (6:10, 11:20)
+
+

+

+

Chunking Datasets¤

+

+

+

Set Chunks by Axis¤

+

Set chunk size for each axis occuring in a dataset. This will be applied to all variables in the dataset:

+
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}:
+[:, :, 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...

+
f = tempname()
+savedataset(dschunked, path=f,driver=:zarr)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Variables: 
+
+x
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, 
+z
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+
+

+

+

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

+
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}:
+[:, :, 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...

+
f = tempname()
+savedataset(dschunked,path=f,driver=:zarr)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points
+Variables: 
+
+x
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, 
+z
+ with dimensions: 
+  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,
+  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points
+
+

+

+

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.

+
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}:
+[:, :, 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...

+
f = tempname()
+savedataset(dschunked,path=f,driver=:zarr)
+
+
YAXArray Dataset
+Shared Axes: 
+Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,
+Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points
+Variables: 
+x, y, z, 
+
+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/examples/generated/UserGuide/spwjlrr.png b/previews/PR298/examples/generated/UserGuide/spwjlrr.png new file mode 100644 index 00000000..dc4c1486 Binary files /dev/null and b/previews/PR298/examples/generated/UserGuide/spwjlrr.png differ diff --git a/previews/PR298/examples/generated/UserGuide/tos_O1_2001-2002.nc b/previews/PR298/examples/generated/UserGuide/tos_O1_2001-2002.nc new file mode 100644 index 00000000..30aa4a9b Binary files /dev/null and b/previews/PR298/examples/generated/UserGuide/tos_O1_2001-2002.nc differ diff --git a/previews/PR298/examples/generated/UserGuide/uzepgqz.png b/previews/PR298/examples/generated/UserGuide/uzepgqz.png new file mode 100644 index 00000000..6e693a32 Binary files /dev/null and b/previews/PR298/examples/generated/UserGuide/uzepgqz.png differ diff --git a/previews/PR298/examples/generated/contribute/contribute/index.html b/previews/PR298/examples/generated/contribute/contribute/index.html new file mode 100644 index 00000000..86ba8012 --- /dev/null +++ b/previews/PR298/examples/generated/contribute/contribute/index.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Contribute to docs - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Contribute to docs

+ +

+

+

Contribute to Documentation¤

+

Contributing with examples can be done by first creating a new file example here

+
+

new file

+
    +
  • your_new_file.jl at docs/examples/UserGuide/
  • +
+
+

Once this is done you need to add a new entry here at the bottom and the appropriate level.

+
+

add entry to docs

+

Your new entry should look like:

+
    +
  • "Your title example" : "examples/generated/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:

+
+

build docs locally

+

Install the following dependencies in your system via pip, i.e.

+
    +
  • pip install mkdocs pygments python-markdown-math
  • +
  • pip install mkdocs-material pymdown-extensions mkdocstrings
  • +
  • pip mknotebooks pytkdocs_tweaks mkdocs_include_exclude_files jinja2 mkdocs-video
  • +
+
+

Then simply go to your docs env and activate it, i.e.

+

docs> julia

+

julia> ]

+

(docs) pkg> activate .

+

Next, run the scripts:

+
+

Julia env: docs

+

Generate files and build docs by running:

+
    +
  • include("genfiles.jl")
  • +
  • include("make.jl")
  • +
+
+

Now go to your terminal in the same path docs> and run:

+

mkdocs serve

+

This should ouput http://127.0.0.1:8000, copy/paste this into your browser and you are all set.

+
+

This page was generated using Literate.jl.

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/index.html b/previews/PR298/index.html new file mode 100644 index 00000000..abd0cb53 --- /dev/null +++ b/previews/PR298/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

+

+

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.

+
+

Info

+
    +
  • Open datasets from a variety of sources (NetCDF, Zarr, ArchGDAL)
  • +
  • Interoperability with other named axis packages through YAXArrayBase
  • +
  • Efficient mapslices(x) operations on huge multiple arrays, optimized for high-latency data access (object storage, compressed datasets)
  • +
+
+

+

+

Installation¤

+

In the Julia REPL type:

+
using Pkg
+Pkg.add("YAXArrays")
+
+

or

+
] add YAXArrays
+
+

The ] character starts the Julia package manager. Hit backspace key to return to Julia prompt.

+

You may check the installed version with:

+
] st YAXArrays
+
+

Start using the package:

+
using YAXArrays
+
+

The YAXArray tutorial provides a tutorial explaining how to get started using YAXArrays.

+

+

+

Quick start¤

+
using YAXArrays
+yax = YAXArray(rand(10,20,30))
+
+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR298/javascripts/mathjax.js b/previews/PR298/javascripts/mathjax.js new file mode 100644 index 00000000..a80ddbff --- /dev/null +++ b/previews/PR298/javascripts/mathjax.js @@ -0,0 +1,16 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.typesetPromise() +}) \ No newline at end of file diff --git a/previews/PR298/search/search_index.json b/previews/PR298/search/search_index.json new file mode 100644 index 00000000..34ad2075 --- /dev/null +++ b/previews/PR298/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":""},{"location":"#yaxarraysjl","title":"YAXArrays.jl","text":"

Yet another xarray-like Julia package

A package for operating on out-of-core labeled arrays, based on stores like NetCDF, Zarr or GDAL.

Info

  • Open datasets from a variety of sources (NetCDF, Zarr, ArchGDAL)
  • Interoperability with other named axis packages through YAXArrayBase
  • Efficient mapslices(x) operations on huge multiple arrays, optimized for high-latency data access (object storage, compressed datasets)

"},{"location":"#installation","title":"Installation","text":"

In the Julia REPL type:

using Pkg\nPkg.add(\"YAXArrays\")\n

or

] add YAXArrays\n

The ] character starts the Julia package manager. Hit backspace key to return to Julia prompt.

You may check the installed version with:

] st YAXArrays\n

Start using the package:

using YAXArrays\n

The YAXArray tutorial provides a tutorial explaining how to get started using YAXArrays.

"},{"location":"#quick-start","title":"Quick start","text":"
using YAXArrays\nyax = YAXArray(rand(10,20,30))\n
"},{"location":"api/","title":"API","text":""},{"location":"api/#public-api","title":"Public API","text":"

# YAXArrays.getAxis \u2014 Method.

getAxis(desc, c)\n

Given an Axis description and a cube, returns the corresponding axis of the cube. The Axis description can be:

  • the name as a string or symbol.
  • an Axis object

source

# YAXArrays.Cubes \u2014 Module.

The functions provided by YAXArrays are supposed to work on different types of cubes. This module defines the interface for all Data types that

source

# YAXArrays.Cubes.YAXArray \u2014 Type.

YAXArray{T,N}\n

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

# YAXArrays.Cubes.caxes \u2014 Function.

Returns the axes of a Cube

source

# YAXArrays.Cubes.caxes \u2014 Method.

caxes\n

Embeds Cube inside a new Cube

source

# YAXArrays.Cubes.concatenatecubes \u2014 Method.

function concatenateCubes(cubelist, cataxis::CategoricalAxis)\n

Concatenates a vector of datacubes that have identical axes to a new single cube along the new axis cataxis

source

# YAXArrays.Cubes.readcubedata \u2014 Method.

readcubedata(cube)\n

Given any array implementing the YAXArray interface it returns an in-memory YAXArray from it.

source

# YAXArrays.Cubes.setchunks \u2014 Method.

setchunks(c::YAXArray,chunks)\n

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

# YAXArrays.Cubes.subsetcube \u2014 Function.

This function calculates a subset of a cube's data

source

# YAXArrays.DAT.InDims \u2014 Type.

InDims(axisdesc...;...)\n

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

# YAXArrays.DAT.MovingWindow \u2014 Type.

MovingWindow(desc, pre, after)\n

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

# YAXArrays.DAT.OutDims \u2014 Method.

OutDims(axisdesc;...)\n

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

# YAXArrays.DAT.CubeTable \u2014 Method.

CubeTable()\n

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

# YAXArrays.DAT.cubefittable \u2014 Method.

cubefittable(tab,o,fitsym;post=getpostfunction(o),kwargs...)\n

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

# YAXArrays.DAT.fittable \u2014 Method.

fittable(tab,o,fitsym;by=(),weight=nothing)\n

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:

fittable(iter,WeightedMean,:tair,weight=(i->abs(cosd(i.lat))),by=(i->month(i.time),:country))\n

source

# YAXArrays.DAT.mapCube \u2014 Method.

mapCube(fun, cube, addargs...;kwargs...)\n\nMap 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.\nFor Datasets, only one output cube can be specified.\nIn contrast to the mapCube function for cubes, additional arguments for the inner function should be set as keyword arguments.\n\nFor the specific keyword arguments see the docstring of the mapCube function for cubes.\n

source

# YAXArrays.DAT.mapCube \u2014 Method.

mapCube(fun, cube, addargs...;kwargs...)\n

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 maximum size of blocks that are read into memory, 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

# YAXArrays.Datasets.Dataset \u2014 Type.

Dataset object which stores an `OrderedDict` 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.\n

source

# YAXArrays.Datasets.Dataset \u2014 Method.

Dataset(; properties = Dict{String,Any}, cubes...)

Construct a YAXArray Dataset with global attributes properties a and a list of named YAXArrays cubes...

source

# YAXArrays.Datasets.Cube \u2014 Method.

Cube(ds::Dataset; joinname=\"Variable\")\n

Construct a single YAXArray from the dataset ds by concatenating the cubes in the datset on the joinname dimension.

source

# YAXArrays.Datasets.open_dataset \u2014 Method.

open_dataset(g; 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.

source

# YAXArrays.Datasets.savecube \u2014 Method.

savecube(cube,name::String)\n

Save a YAXArray to the path.

Extended Help

The keyword arguments are:

  • name:
  • datasetaxis=\"Variable\" 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

# YAXArrays.Datasets.savedataset \u2014 Method.

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

# YAXArrays.Datasets.to_dataset \u2014 Method.

to_dataset(c;datasetaxis = \"Variable\", name = \"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 name

source

"},{"location":"api/#internal-api","title":"Internal API","text":"

# YAXArrays.YAXDefaults \u2014 Constant.

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

# YAXArrays.findAxis \u2014 Method.

findAxis(desc, c)\n

Internal function

Extended Help

Given an Axis description and a cube return the index of the Axis.\n

The Axis description can be:

  • the name as a string or symbol.
  • an Axis object

source

# YAXArrays.getOutAxis \u2014 Method.

getOutAxis\n

source

# YAXArrays.get_descriptor \u2014 Method.

get_descriptor(a)\n

Get the descriptor of an Axis. This is used to dispatch on the descriptor.

source

# YAXArrays.match_axis \u2014 Method.

match_axis\n

Internal function

Extended Help

Match the Axis based on the AxisDescriptor.\nThis is used to find different axes and to make certain axis description the same.\nFor example to disregard differences of captialisation.\n

source

# YAXArrays.Cubes.CleanMe \u2014 Type.

mutable struct CleanMe\n

Struct which describes data paths and their persistency. Non-persistend paths/files are removed at finalize step

source

# YAXArrays.Cubes.clean \u2014 Method.

clean(c::CleanMe)\n

finalizer function for CleanMe struct. The main process removes all directories/files which are not persistent.

source

# YAXArrays.Cubes.copydata \u2014 Method.

copydata(outar, inar, copybuf)\n

Internal function which copies the data from the input inar into the output outar at the copybuf positions.

source

# YAXArrays.Cubes.optifunc \u2014 Method.

optifunc(s, maxbuf, incs, outcs, insize, outsize, writefac)\n

Internal

This function is going to be minimized to detect the best possible chunk setting for the rechunking of the data.

source

# YAXArrays.DAT.DATConfig \u2014 Type.

Configuration object of a DAT process. This holds all necessary information to perform the calculations. It contains the following fields:

  • incubes::Tuple{Vararg{YAXArrays.DAT.InputCube, NIN}} where NIN: The input data cubes
  • outcubes::Tuple{Vararg{YAXArrays.DAT.OutputCube, NOUT}} 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

# YAXArrays.DAT.InputCube \u2014 Type.

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

# YAXArrays.DAT.OutputCube \u2014 Type.

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

# YAXArrays.DAT.YAXColumn \u2014 Type.

YAXColumn\n

A struct representing a single column of a YAXArray partitioned Table # Fields

  • inarBC
  • inds

source

# YAXArrays.DAT.cmpcachmisses \u2014 Method.

Function that compares two cache miss specifiers by their importance

source

# YAXArrays.DAT.getFrontPerm \u2014 Method.

Calculate an axis permutation that brings the wanted dimensions to the front

source

# YAXArrays.DAT.getLoopCacheSize \u2014 Method.

Calculate optimal Cache size to DAT operation

source

# YAXArrays.DAT.getOuttype \u2014 Method.

getOuttype(outtype, cdata)\n

Internal function

Get the element type for the output cube

source

# YAXArrays.DAT.getloopchunks \u2014 Method.

getloopchunks(dc::DATConfig)\n

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)\n

source

# YAXArrays.DAT.permuteloopaxes \u2014 Method.

permuteloopaxes(dc)\n

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

# YAXArrays.Cubes.setchunks \u2014 Method.

setchunks(c::Dataset,chunks)\n

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

# YAXArrays.Datasets.collectfromhandle \u2014 Method.

Extracts a YAXArray from a dataset handle that was just created from a arrayinfo

source

# YAXArrays.Datasets.createdataset \u2014 Method.

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
  • fillvalue= T>:Missing ? defaultfillval(Base.nonmissingtype(T)) : nothing fill value
  • datasetaxis=\"Variable\" special treatment of a categorical axis that gets written into separate zarr arrays
\n

source

# YAXArrays.Datasets.getarrayinfo \u2014 Method.

Extract necessary information to create a YAXArrayBase dataset from a name and YAXArray pair

source

# YAXArrays.Datasets.testrange \u2014 Method.

Test if data in x can be approximated by a step range

source

"},{"location":"examples/generated/Gallery/simplemaps/","title":"Simple maps","text":"
using Zarr, YAXArrays, Dates\nusing DimensionalData\nusing GLMakie, GeoMakie\nusing GLMakie.GeometryBasics\n\nstore =\"gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/\"\ng = open_dataset(zopen(store, consolidated=true))\nc = g[\"tas\"]\n
384\u00d7192\u00d7251288 YAXArray{Float32,3} with dimensions: \n  Dim{:lon} Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} Float64[-89.28422753251364, -88.35700351866494, \u2026, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,\n  Ti Sampled{DateTime} DateTime[2015-01-01T03:00:00, \u2026, 2101-01-01T00:00:00] ForwardOrdered Irregular Points\nunits: K\nname: tas\nTotal size: 69.02 GB\n

Subset, first time step

ct1 = c[Ti = Near(Date(\"2015-01-01\"))]\nlon = ct1.lon.val\nlat = ct1.lat.val\ndata = ct1.data[:,:];\n

"},{"location":"examples/generated/Gallery/simplemaps/#heatmap-plot","title":"Heatmap plot","text":"
GLMakie.activate!()\nfig = Figure(resolution = (1200,600))\nax = Axis(fig[1,1]; aspect = DataAspect())\nheatmap!(ax, lon, lat, data; colormap = :seaborn_icefire_gradient)\nfig\n
"},{"location":"examples/generated/Gallery/simplemaps/#add-coastlines-via-the-geoaxis-wintri-projection","title":"Add Coastlines via the GeoAxis, wintri Projection","text":"
\u03b4lon = (lon[2]-lon[1])/2\nnlon = lon .- 180 .+ \u03b4lon\nndata = circshift(data, (192,1))\n\n\nfig = Figure(resolution = (1200,600))\nax = GeoAxis(fig[1,1])\nsurface!(ax, nlon, lat, ndata; colormap = :seaborn_icefire_gradient, shading=false)\ncl=lines!(ax, GeoMakie.coastlines(), color = :white, linewidth=0.85)\ntranslate!(cl, 0, 0, 1000)\nfig\n
"},{"location":"examples/generated/Gallery/simplemaps/#moll-projection","title":"Moll projection","text":"
fig = Figure(resolution = (1200,600))\nax = GeoAxis(fig[1,1]; dest = \"+proj=moll\")\nsurface!(ax, nlon, lat, ndata; colormap = :seaborn_icefire_gradient, shading=false)\ncl=lines!(ax, GeoMakie.coastlines(), color = :white, linewidth=0.85)\ntranslate!(cl, 0, 0, 1000)\nfig\n
"},{"location":"examples/generated/Gallery/simplemaps/#3d-sphere-plot","title":"3D sphere plot","text":"
#using JSServe, WGLMakie\n#WGLMakie.activate!()\n#Page(exportable=true, offline=true)\n\nds = replace(ndata, missing =>NaN)\nsphere = uv_normal_mesh(Tesselation(Sphere(Point3f(0), 1), 128))\n\nfig = Figure()\nax = LScene(fig[1,1], show_axis=false)\nmesh!(ax, sphere; color = ds'[end:-1:1,:],\ncolormap = :seaborn_icefire_gradient)\nzoom!(ax.scene, cameracontrols(ax.scene), 0.65)\nrotate!(ax.scene, 2.5)\nfig\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/HowdoI/howdoi/","title":"How do I ...","text":"

The purpose of this section is to do a collection of small convinient pieces of code on how to do simple things.

Question

"},{"location":"examples/generated/HowdoI/howdoi/#extract-the-axes-names-from-a-cube","title":"Extract the axes names from a Cube","text":"
using YAXArrays\nusing DimensionalData\nc = YAXArray(rand(10, 10, 5))\n\ncaxes(c)\n
Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\nDim{:Dim_2} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\nDim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points\n

Question

"},{"location":"examples/generated/HowdoI/howdoi/#obtain-values-from-axes-and-data-from-the-cube","title":"Obtain values from axes and data from the cube","text":"

There are two options to collect values from axes. In this examples the axis ranges from 1 to 10.

# this two examples bring the same result\ncollect(getAxis(\"Dim_1\", c).val)\ncollect(c.axes[1].val)\n\n# to collect data from a cube works exactly the same as doing it from an array\nc[:, :, 1]\n
10\u00d710 YAXArray{Float64,2} with dimensions: \n  Dim{:Dim_1} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Dim_2} Sampled{Int64} 1:10 ForwardOrdered Regular Points\nTotal size: 800.0 bytes\n

"},{"location":"examples/generated/HowdoI/howdoi/#concatenate-cubes","title":"Concatenate cubes","text":"

It is possible to concatenate several cubes that shared the same dimensions using the [concatenatecubes]@ref function.

let's create two dummy cubes

using YAXArrays\n\naxlist = (\nDim{:time}(range(1, 20, length=20)),\nDim{:lon}(range(1, 10, length=10)),\nDim{:lat}(range(1, 5, length=15))\n)\n\ndata1 = rand(20, 10, 15)\nds1 = YAXArray(axlist, data1)\n\ndata2 = rand(20, 10, 15)\nds2 = YAXArray(axlist, data2)\n
20\u00d710\u00d715 YAXArray{Float64,3} with dimensions: \n  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 23.44 KB\n

Now we can concatenate ds1 and ds2 cubes:

dsfinal = concatenatecubes([ds1, ds2], Dim{:Variables}([\"var1\", \"var2\"]))\n\ndsfinal\n
20\u00d710\u00d715\u00d72 YAXArray{Float64,4} with dimensions: \n  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,\n  Dim{:Variables} Categorical{String} String[\"var1\", \"var2\"] ForwardOrdered\nTotal size: 46.88 KB\n

"},{"location":"examples/generated/HowdoI/howdoi/#how-do-i-subset-a-cube","title":"How do I subset a Cube?","text":"

Let's start by creating a dummy cube

# define the time span of the cube\nusing Dates\nt = Date(\"2020-01-01\"):Month(1):Date(\"2022-12-31\")\n\n# create cube axes\naxes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(t))\n\n# assign values to a cube\nc = YAXArray(axes, reshape(1:3600, (10, 10, 36)))\n
10\u00d710\u00d736 YAXArray{Int64,3} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Time} Sampled{Date} Date(\"2020-01-01\"):Dates.Month(1):Date(\"2022-12-01\") ForwardOrdered Regular Points\nTotal size: 28.12 KB\n

Now we subset the cube by any dimension

# subset cube by years\nctime = c[Time=Between(Date(2021,1,1), Date(2021,12,31))]\n\n# subset cube by a specific date and date range\nctime2 = c[Time=At(Date(\"2021-05-01\"))]\nctime3 = c[Time=Date(\"2021-05-01\") .. Date(\"2021-12-01\")]\n\n# subset cube by longitude and latitude\nclonlat = c[Lon=1 .. 5, Lat=5 .. 10] # check even numbers range, it is ommiting them\n
5\u00d76\u00d736 YAXArray{Int64,3} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:5 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 5:10 ForwardOrdered Regular Points,\n  Dim{:Time} Sampled{Date} Date(\"2020-01-01\"):Dates.Month(1):Date(\"2022-12-01\") ForwardOrdered Regular Points\nTotal size: 8.44 KB\n

"},{"location":"examples/generated/HowdoI/howdoi/#how-do-i-apply-map-algebra","title":"How do I apply map algebra?","text":"

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\nmap((x, y) -> x * y, ds1, ds2)\n\n# cubes with more than 3 dimensions\nmap((x, y) -> x * y, dsfinal[Variables=At(\"var1\")], dsfinal[Variables=At(\"var2\")])\n
20\u00d710\u00d715 YAXArray{Float64,3} with dimensions: \n  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 23.44 KB\n

To add some complexity, we will multiply each value for \u03c0 and then divided for the sum of each time step. We will use the ds1 cube for this purpose.

mapslices(ds1, dims=(\"Lon\", \"Lat\")) do xin\n(xin * \u03c0) ./ maximum(skipmissing(xin))\nend\n
10\u00d715\u00d720 YAXArray{Union{Missing, Float64},3} with dimensions: \n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,\n  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points\nTotal size: 23.44 KB\n

"},{"location":"examples/generated/HowdoI/howdoi/#how-do-i-use-the-cubetable-function","title":"How do I use the CubeTable function?","text":"

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\nclasses = YAXArray((getAxis(\"lon\", dsfinal), getAxis(\"lat\", dsfinal)), rand(1:3, 10, 15))\n\nusing CairoMakie\nCairoMakie.activate!()\n

This is how our classification map looks like

heatmap(classes.data[:, :])\n

Now we define the input cubes that will be considered for the iterable table

t = CubeTable(values=ds1, classes=classes)\n\nusing DataFrames\nusing OnlineStats\n# visualiztion of the CubeTable\nDataFrame(t[1])\n
3000\u00d75 DataFrame RowvaluesclassestimelonlatFloat64Int64Float64Float64Float6410.68213431.01.01.020.42181332.01.01.030.39030733.01.01.040.072491634.01.01.050.60454735.01.01.060.57982336.01.01.070.87147737.01.01.080.90164238.01.01.090.41667139.01.01.0100.603215310.01.01.0110.2912311.01.01.0120.697042312.01.01.0130.412212313.01.01.0140.76752314.01.01.0150.803036315.01.01.0160.227921316.01.01.0170.149404317.01.01.0180.616904318.01.01.0190.927644319.01.01.0200.0775929320.01.01.0210.065368931.02.01.0220.43985932.02.01.0230.51363833.02.01.0240.099749434.02.01.0250.893335.02.01.0260.89933836.02.01.0270.3200337.02.01.0280.56003338.02.01.0290.82378539.02.01.0300.348777310.02.01.0310.614473311.02.01.0320.826605312.02.01.0330.3037313.02.01.0340.0538213314.02.01.0350.772191315.02.01.0360.0626547316.02.01.0370.951853317.02.01.0380.130601318.02.01.0390.598268319.02.01.0400.196384320.02.01.0410.60225931.03.01.0420.15406732.03.01.0430.019548433.03.01.0440.17427534.03.01.0450.15942235.03.01.0460.30830636.03.01.0470.7256937.03.01.0480.51122338.03.01.0490.26873639.03.01.0500.967526310.03.01.0510.550787311.03.01.0520.961019312.03.01.0530.0982624313.03.01.0540.315587314.03.01.0550.426414315.03.01.0560.120476316.03.01.0570.200282317.03.01.0580.0849132318.03.01.0590.581511319.03.01.0600.653896320.03.01.0610.64256411.04.01.0620.35618312.04.01.0630.091564613.04.01.0640.27361914.04.01.0650.65569315.04.01.0660.90401216.04.01.0670.42989717.04.01.0680.28815218.04.01.0690.99363219.04.01.0700.580523110.04.01.0710.269957111.04.01.0720.526495112.04.01.0730.401152113.04.01.0740.226921114.04.01.0750.766935115.04.01.0760.543993116.04.01.0770.924119117.04.01.0780.237818118.04.01.0790.251807119.04.01.0800.919494120.04.01.0810.017257831.05.01.0820.8167432.05.01.0830.73606733.05.01.0840.91976434.05.01.0850.69661335.05.01.0860.51675436.05.01.0870.15500837.05.01.0880.23255738.05.01.0890.22270639.05.01.0900.672187310.05.01.0910.813225311.05.01.0920.490834312.05.01.0930.537471313.05.01.0940.741898314.05.01.0950.464931315.05.01.0960.598315316.05.01.0970.550807317.05.01.0980.63391318.05.01.0990.427345319.05.01.01000.608111320.05.01.01010.22927531.06.01.01020.3715132.06.01.01030.29878933.06.01.01040.95160834.06.01.01050.28542935.06.01.01060.15768636.06.01.01070.063653137.06.01.01080.19926438.06.01.01090.7788439.06.01.01100.40423310.06.01.01110.516695311.06.01.01120.404425312.06.01.01130.32251313.06.01.01140.93777314.06.01.01150.428302315.06.01.01160.422956316.06.01.01170.107945317.06.01.01180.739375318.06.01.01190.235446319.06.01.01200.0478653320.06.01.01210.40371631.07.01.01220.57279332.07.01.01230.74830333.07.01.01240.9307434.07.01.01250.369435.07.01.01260.081982136.07.01.01270.082767637.07.01.01280.74398738.07.01.01290.97321939.07.01.01300.228616310.07.01.01310.468564311.07.01.01320.799182312.07.01.01330.796699313.07.01.01340.0482639314.07.01.01350.176952315.07.01.01360.898868316.07.01.01370.0945437317.07.01.01380.180833318.07.01.01390.000153774319.07.01.01400.429608320.07.01.01410.2231811.08.01.01420.35580712.08.01.01430.25866613.08.01.01440.86876314.08.01.01450.51238415.08.01.01460.48907416.08.01.01470.91724517.08.01.01480.23783418.08.01.01490.38581919.08.01.01500.488432110.08.01.01510.404128111.08.01.01520.535978112.08.01.01530.852076113.08.01.01540.663979114.08.01.01550.770232115.08.01.01560.430946116.08.01.01570.202344117.08.01.01580.108317118.08.01.01590.380864119.08.01.01600.751299120.08.01.01610.5798531.09.01.01620.068867232.09.01.01630.79167333.09.01.01640.56211634.09.01.01650.63574435.09.01.01660.40907236.09.01.01670.70558137.09.01.01680.30228238.09.01.01690.041215339.09.01.01700.657268310.09.01.01710.0297303311.09.01.01720.398398312.09.01.01730.575467313.09.01.01740.306394314.09.01.01750.682789315.09.01.01760.59427316.09.01.01770.399689317.09.01.01780.020152318.09.01.01790.625572319.09.01.01800.636996320.09.01.01810.1121331.010.01.01820.65073132.010.01.01830.42766533.010.01.01840.61237434.010.01.01850.39728935.010.01.01860.27129836.010.01.01870.26562437.010.01.01880.58644938.010.01.01890.6354639.010.01.01900.0712416310.010.01.01910.482718311.010.01.01920.617405312.010.01.01930.865247313.010.01.01940.768272314.010.01.01950.21517315.010.01.01960.0320846316.010.01.01970.0331236317.010.01.01980.802799318.010.01.01990.352202319.010.01.02000.144825320.010.01.02010.84623711.01.01.285712020.95324212.01.01.285712030.24883513.01.01.285712040.30306714.01.01.285712050.37177815.01.01.285712060.50263416.01.01.285712070.41814817.01.01.285712080.84679618.01.01.285712090.65619419.01.01.285712100.440922110.01.01.285712110.75392111.01.01.285712120.254932112.01.01.285712130.0868324113.01.01.285712140.726886114.01.01.285712150.8762115.01.01.285712160.224633116.01.01.285712170.75911117.01.01.285712180.734085118.01.01.285712190.256183119.01.01.285712200.740235120.01.01.285712210.95925321.02.01.285712220.037098922.02.01.285712230.11821123.02.01.285712240.00053100224.02.01.285712250.93914825.02.01.285712260.84753626.02.01.285712270.79996527.02.01.285712280.9978228.02.01.285712290.88093729.02.01.285712300.637129210.02.01.285712310.871636211.02.01.285712320.196472212.02.01.285712330.569994213.02.01.285712340.737026214.02.01.285712350.182443215.02.01.285712360.636671216.02.01.285712370.112806217.02.01.285712380.0810873218.02.01.285712390.0183359219.02.01.285712400.73593220.02.01.285712410.70472221.03.01.285712420.35754422.03.01.285712430.9705423.03.01.285712440.55715924.03.01.285712450.57856325.03.01.285712460.63097326.03.01.285712470.15463527.03.01.285712480.86915128.03.01.285712490.11880729.03.01.285712500.226657210.03.01.285712510.791679211.03.01.285712520.423978212.03.01.285712530.834099213.03.01.285712540.0697309214.03.01.285712550.941494215.03.01.285712560.651462216.03.01.285712570.853781217.03.01.285712580.374049218.03.01.285712590.782219219.03.01.285712600.769442220.03.01.285712610.42804731.04.01.285712620.073180432.04.01.285712630.50344433.04.01.285712640.58148334.04.01.285712650.10897635.04.01.285712660.065810136.04.01.285712670.26967737.04.01.285712680.15432338.04.01.285712690.6046439.04.01.285712700.765341310.04.01.285712710.405099311.04.01.285712720.839307312.04.01.285712730.464829313.04.01.285712740.102623314.04.01.285712750.567896315.04.01.285712760.355628316.04.01.285712770.144556317.04.01.285712780.804307318.04.01.285712790.140461319.04.01.285712800.902372320.04.01.285712810.54743921.05.01.285712820.64744322.05.01.285712830.76939823.05.01.285712840.99542824.05.01.285712850.8957125.05.01.285712860.53575126.05.01.285712870.61092627.05.01.285712880.12785328.05.01.285712890.16963629.05.01.285712900.602856210.05.01.285712910.047635211.05.01.285712920.953187212.05.01.285712930.708361213.05.01.285712940.130233214.05.01.285712950.793625215.05.01.285712960.107839216.05.01.285712970.857122217.05.01.285712980.585191218.05.01.285712990.573865219.05.01.285713000.196046220.05.01.285713010.49947211.06.01.285713020.90902512.06.01.285713030.30489713.06.01.285713040.52475814.06.01.285713050.32230815.06.01.285713060.85597616.06.01.285713070.98845717.06.01.285713080.58281718.06.01.285713090.21550719.06.01.285713100.00948736110.06.01.285713110.14061111.06.01.285713120.511214112.06.01.285713130.856884113.06.01.285713140.971418114.06.01.285713150.19976115.06.01.285713160.152605116.06.01.285713170.558648117.06.01.285713180.189447118.06.01.285713190.428217119.06.01.285713200.480026120.06.01.285713210.84876731.07.01.285713220.098767832.07.01.285713230.49494433.07.01.285713240.55088634.07.01.285713250.51359335.07.01.285713260.16168336.07.01.285713270.17197737.07.01.285713280.27774338.07.01.285713290.94507439.07.01.285713300.140113310.07.01.285713310.577174311.07.01.285713320.109556312.07.01.285713330.145032313.07.01.285713340.4492314.07.01.285713350.913236315.07.01.285713360.350738316.07.01.285713370.604074317.07.01.285713380.47683318.07.01.285713390.135202319.07.01.285713400.333557320.07.01.285713410.89580411.08.01.285713420.57353112.08.01.285713430.50234713.08.01.285713440.15903914.08.01.285713450.0064349915.08.01.285713460.87591416.08.01.285713470.079914917.08.01.285713480.7632918.08.01.285713490.158119.08.01.285713500.151484110.08.01.285713510.187889111.08.01.285713520.613862112.08.01.285713530.215885113.08.01.285713540.225929114.08.01.285713550.797934115.08.01.285713560.816423116.08.01.285713570.543231117.08.01.285713580.0458482118.08.01.285713590.273124119.08.01.285713600.0264811120.08.01.285713610.90076221.09.01.285713620.13307822.09.01.285713630.63487623.09.01.285713640.6955524.09.01.285713650.56003225.09.01.285713660.03966226.09.01.285713670.30523127.09.01.285713680.22581328.09.01.285713690.14512529.09.01.285713700.545922210.09.01.285713710.223583211.09.01.285713720.731593212.09.01.285713730.00441011213.09.01.285713740.810254214.09.01.285713750.483363215.09.01.285713760.165499216.09.01.285713770.239655217.09.01.285713780.806912218.09.01.285713790.655909219.09.01.285713800.455986220.09.01.285713810.91946621.010.01.285713820.38535522.010.01.285713830.37985323.010.01.285713840.11851124.010.01.285713850.96158625.010.01.285713860.61249926.010.01.285713870.21895127.010.01.285713880.78394928.010.01.285713890.91716229.010.01.285713900.799989210.010.01.285713910.688591211.010.01.285713920.603124212.010.01.285713930.833043213.010.01.285713940.426893214.010.01.285713950.602304215.010.01.285713960.676496216.010.01.285713970.0584948217.010.01.285713980.28735218.010.01.285713990.592217219.010.01.285714000.0325142220.010.01.285714010.048823321.01.01.571434020.58197922.01.01.571434030.24613923.01.01.571434040.6134924.01.01.571434050.21852825.01.01.571434060.30197226.01.01.571434070.64496227.01.01.571434080.77077128.01.01.571434090.14363729.01.01.571434100.836487210.01.01.571434110.99881211.01.01.571434120.183526212.01.01.571434130.689396213.01.01.571434140.333577214.01.01.571434150.354361215.01.01.571434160.844056216.01.01.571434170.53676217.01.01.571434180.728998218.01.01.571434190.5087219.01.01.571434200.955592220.01.01.571434210.97391131.02.01.571434220.60467132.02.01.571434230.33204733.02.01.571434240.94429234.02.01.571434250.41532235.02.01.571434260.54248736.02.01.571434270.4017637.02.01.571434280.078454638.02.01.571434290.9237939.02.01.571434300.179936310.02.01.571434310.356103311.02.01.571434320.0954755312.02.01.571434330.600688313.02.01.571434340.380731314.02.01.571434350.613622315.02.01.571434360.978756316.02.01.571434370.274156317.02.01.571434380.102535318.02.01.571434390.247001319.02.01.571434400.840736320.02.01.571434410.67639721.03.01.571434420.35633622.03.01.571434430.90235823.03.01.571434440.90813624.03.01.571434450.43801125.03.01.571434460.24838626.03.01.571434470.58563827.03.01.571434480.55634428.03.01.571434490.35207529.03.01.571434500.738185210.03.01.571434510.134012211.03.01.571434520.685575212.03.01.571434530.235172213.03.01.571434540.941799214.03.01.571434550.101516215.03.01.571434560.231011216.03.01.571434570.470079217.03.01.571434580.696376218.03.01.571434590.749303219.03.01.571434600.815771220.03.01.571434610.22796521.04.01.571434620.78099522.04.01.571434630.14691323.04.01.571434640.4381624.04.01.571434650.19072625.04.01.571434660.30977426.04.01.571434670.3187127.04.01.571434680.37113128.04.01.571434690.45072429.04.01.571434700.0521636210.04.01.571434710.0798079211.04.01.571434720.921937212.04.01.571434730.0564193213.04.01.571434740.850588214.04.01.571434750.289073215.04.01.571434760.342357216.04.01.571434770.327182217.04.01.571434780.439564218.04.01.571434790.169877219.04.01.571434800.850475220.04.01.571434810.54707111.05.01.571434820.78737412.05.01.571434830.47256313.05.01.571434840.4158814.05.01.571434850.069615615.05.01.571434860.694716.05.01.571434870.51556617.05.01.571434880.67544618.05.01.571434890.2770919.05.01.571434900.91021110.05.01.571434910.666401111.05.01.571434920.209879112.05.01.571434930.744703113.05.01.571434940.270804114.05.01.571434950.424873115.05.01.571434960.936163116.05.01.571434970.12138117.05.01.571434980.45972118.05.01.571434990.957492119.05.01.571435000.526263120.05.01.571435010.38237831.06.01.571435020.17944832.06.01.571435030.82560433.06.01.571435040.22524434.06.01.571435050.52067235.06.01.571435060.99997536.06.01.571435070.67038937.06.01.571435080.74935738.06.01.571435090.91446539.06.01.571435100.447435310.06.01.571435110.82763311.06.01.571435120.812706312.06.01.571435130.903083313.06.01.571435140.156689314.06.01.571435150.376977315.06.01.571435160.866087316.06.01.571435170.556258317.06.01.571435180.0922375318.06.01.571435190.165928319.06.01.571435200.97762320.06.01.571435210.4786521.07.01.571435220.029895622.07.01.571435230.24575123.07.01.571435240.68187924.07.01.571435250.75427925.07.01.571435260.43720526.07.01.571435270.14638227.07.01.571435280.067781428.07.01.571435290.50413529.07.01.571435300.118001210.07.01.571435310.210276211.07.01.571435320.766471212.07.01.571435330.557731213.07.01.571435340.329019214.07.01.571435350.737415215.07.01.571435360.147378216.07.01.571435370.821106217.07.01.571435380.229147218.07.01.571435390.892014219.07.01.571435400.183441220.07.01.571435410.52524511.08.01.571435420.87251812.08.01.571435430.20875113.08.01.571435440.0069396814.08.01.571435450.53090215.08.01.571435460.011179616.08.01.571435470.46490817.08.01.571435480.79254718.08.01.571435490.93570619.08.01.571435500.201848110.08.01.571435510.395073111.08.01.571435520.951789112.08.01.571435530.483845113.08.01.571435540.0282062114.08.01.571435550.956254115.08.01.571435560.452286116.08.01.571435570.173136117.08.01.571435580.834486118.08.01.571435590.232937119.08.01.571435600.60393120.08.01.571435610.82254811.09.01.571435620.29733612.09.01.571435630.57066913.09.01.571435640.57088514.09.01.571435650.83019115.09.01.571435660.86415416.09.01.571435670.67178417.09.01.571435680.92601818.09.01.571435690.79341919.09.01.571435700.428596110.09.01.571435710.139549111.09.01.571435720.581374112.09.01.571435730.806336113.09.01.571435740.142632114.09.01.571435750.230906115.09.01.571435760.506127116.09.01.571435770.0722355117.09.01.571435780.435041118.09.01.571435790.919578119.09.01.571435800.589807120.09.01.571435810.49196531.010.01.571435820.3972332.010.01.571435830.48088133.010.01.571435840.72755834.010.01.571435850.50435735.010.01.571435860.31139936.010.01.571435870.91065337.010.01.571435880.58637838.010.01.571435890.59818939.010.01.571435900.589827310.010.01.571435910.62415311.010.01.571435920.256324312.010.01.571435930.0427825313.010.01.571435940.0913263314.010.01.571435950.0885822315.010.01.571435960.711388316.010.01.571435970.552879317.010.01.571435980.490744318.010.01.571435990.779435319.010.01.571436000.348989320.010.01.571436010.24435511.01.01.857146020.80619312.01.01.857146030.37581113.01.01.857146040.71640114.01.01.857146050.52823515.01.01.857146060.095062916.01.01.857146070.72842517.01.01.857146080.36737418.01.01.857146090.46960719.01.01.857146100.850695110.01.01.857146110.101449111.01.01.857146120.643317112.01.01.857146130.38513113.01.01.857146140.744632114.01.01.857146150.276053115.01.01.857146160.122291116.01.01.857146170.088824117.01.01.857146180.375321118.01.01.857146190.608312119.01.01.857146200.835734120.01.01.857146210.0085275911.02.01.857146220.36679612.02.01.857146230.10857513.02.01.857146240.018980814.02.01.857146250.32682815.02.01.857146260.67631816.02.01.857146270.45453917.02.01.857146280.52914918.02.01.857146290.29560219.02.01.857146300.633848110.02.01.857146310.888079111.02.01.857146320.525181112.02.01.857146330.723792113.02.01.857146340.564539114.02.01.857146350.715683115.02.01.857146360.953132116.02.01.857146370.233157117.02.01.857146380.79526118.02.01.857146390.271639119.02.01.857146400.0605851120.02.01.857146410.060927131.03.01.857146420.59938832.03.01.857146430.086044633.03.01.857146440.84051634.03.01.857146450.36360135.03.01.857146460.38507436.03.01.857146470.54008137.03.01.857146480.45454838.03.01.857146490.14640939.03.01.857146500.378382310.03.01.857146510.986299311.03.01.857146520.623513312.03.01.857146530.221302313.03.01.857146540.263612314.03.01.857146550.471341315.03.01.857146560.085499316.03.01.857146570.502715317.03.01.857146580.891791318.03.01.857146590.401845319.03.01.857146600.841105320.03.01.857146610.40478911.04.01.857146620.85949412.04.01.857146630.98514913.04.01.857146640.1432714.04.01.857146650.68868515.04.01.857146660.19675816.04.01.857146670.24042217.04.01.857146680.30031818.04.01.857146690.51257319.04.01.857146700.713432110.04.01.857146710.426475111.04.01.857146720.809605112.04.01.857146730.873698113.04.01.857146740.189708114.04.01.857146750.948128115.04.01.857146760.855817116.04.01.857146770.45732117.04.01.857146780.430294118.04.01.857146790.640645119.04.01.857146800.361578120.04.01.857146810.18683221.05.01.857146820.71270922.05.01.857146830.053428823.05.01.857146840.57131524.05.01.857146850.83067125.05.01.857146860.41833626.05.01.857146870.37120927.05.01.857146880.81132628.05.01.857146890.088386829.05.01.857146900.847095210.05.01.857146910.92677211.05.01.857146920.278503212.05.01.857146930.120835213.05.01.857146940.748072214.05.01.857146950.846663215.05.01.857146960.87619216.05.01.857146970.0843817217.05.01.857146980.4586218.05.01.857146990.832093219.05.01.857147000.50432220.05.01.857147010.019612421.06.01.857147020.33180222.06.01.857147030.43231923.06.01.857147040.15909524.06.01.857147050.54356725.06.01.857147060.22948626.06.01.857147070.13512627.06.01.857147080.53457528.06.01.857147090.83596129.06.01.857147100.088124210.06.01.857147110.277297211.06.01.857147120.995302212.06.01.857147130.799256213.06.01.857147140.0893118214.06.01.857147150.688673215.06.01.857147160.130543216.06.01.857147170.519731217.06.01.857147180.585058218.06.01.857147190.463822219.06.01.857147200.44713220.06.01.857147210.78645611.07.01.857147220.562812.07.01.857147230.69237713.07.01.857147240.36159314.07.01.857147250.42333415.07.01.857147260.89896916.07.01.857147270.17069517.07.01.857147280.66792418.07.01.857147290.85430619.07.01.857147300.166471110.07.01.857147310.450751111.07.01.857147320.0107968112.07.01.857147330.677651113.07.01.857147340.920459114.07.01.857147350.647384115.07.01.857147360.789844116.07.01.857147370.601803117.07.01.857147380.564196118.07.01.857147390.612963119.07.01.857147400.558442120.07.01.857147410.42850611.08.01.857147420.7258112.08.01.857147430.39767613.08.01.857147440.64520714.08.01.857147450.2756715.08.01.857147460.17330416.08.01.857147470.55183417.08.01.857147480.038151818.08.01.857147490.96293119.08.01.857147500.864923110.08.01.857147510.550037111.08.01.857147520.979023112.08.01.857147530.596676113.08.01.857147540.854328114.08.01.857147550.0743039115.08.01.857147560.883918116.08.01.857147570.461573117.08.01.857147580.89023118.08.01.857147590.03243119.08.01.857147600.949626120.08.01.857147610.27862521.09.01.857147620.084098522.09.01.857147630.24936223.09.01.857147640.62774324.09.01.857147650.33794525.09.01.857147660.93131726.09.01.857147670.43637827.09.01.857147680.50103628.09.01.857147690.91584429.09.01.857147700.495349210.09.01.857147710.389062211.09.01.857147720.704166212.09.01.857147730.476084213.09.01.857147740.719303214.09.01.857147750.759337215.09.01.857147760.701491216.09.01.857147770.0566114217.09.01.857147780.685421218.09.01.857147790.562488219.09.01.857147800.813586220.09.01.857147810.71042821.010.01.857147820.92835522.010.01.857147830.13616723.010.01.857147840.64106724.010.01.857147850.90225425.010.01.857147860.96163526.010.01.857147870.47898227.010.01.857147880.47444528.010.01.857147890.46013529.010.01.857147900.845938210.010.01.857147910.483593211.010.01.857147920.292689212.010.01.857147930.995761213.010.01.857147940.994957214.010.01.857147950.57263215.010.01.857147960.34912216.010.01.857147970.796761217.010.01.857147980.63756218.010.01.857147990.918832219.010.01.857148000.504641220.010.01.857148010.84195731.01.02.142868020.89219932.01.02.142868030.49129133.01.02.142868040.76612634.01.02.142868050.41226235.01.02.142868060.41454836.01.02.142868070.32660837.01.02.142868080.48353538.01.02.142868090.95087839.01.02.142868100.38497310.01.02.142868110.728154311.01.02.142868120.301964312.01.02.142868130.994208313.01.02.142868140.927875314.01.02.142868150.518173315.01.02.142868160.825802316.01.02.142868170.55397317.01.02.142868180.92514318.01.02.142868190.492521319.01.02.142868200.390265320.01.02.142868210.75805131.02.02.142868220.65651632.02.02.142868230.62979133.02.02.142868240.15559834.02.02.142868250.26459835.02.02.142868260.48152836.02.02.142868270.79050137.02.02.142868280.78950138.02.02.142868290.70765939.02.02.142868300.596195310.02.02.142868310.0235424311.02.02.142868320.125732312.02.02.142868330.051597313.02.02.142868340.58752314.02.02.142868350.714532315.02.02.142868360.531092316.02.02.142868370.537919317.02.02.142868380.9963318.02.02.142868390.903734319.02.02.142868400.684551320.02.02.142868410.65954631.03.02.142868420.92771132.03.02.142868430.29862933.03.02.142868440.10592334.03.02.142868450.51983135.03.02.142868460.47384136.03.02.142868470.68121337.03.02.142868480.19760338.03.02.142868490.68606339.03.02.142868500.996115310.03.02.142868510.768078311.03.02.142868520.373279312.03.02.142868530.73156313.03.02.142868540.967303314.03.02.142868550.809156315.03.02.142868560.121289316.03.02.142868570.333072317.03.02.142868580.0511463318.03.02.142868590.755356319.03.02.142868600.618525320.03.02.142868610.25863121.04.02.142868620.94899822.04.02.142868630.38441623.04.02.142868640.078609924.04.02.142868650.083889725.04.02.142868660.45944526.04.02.142868670.78607827.04.02.142868680.79853528.04.02.142868690.63347529.04.02.142868700.399442210.04.02.142868710.637858211.04.02.142868720.781583212.04.02.142868730.497834213.04.02.142868740.426914214.04.02.142868750.699699215.04.02.142868760.310714216.04.02.142868770.203373217.04.02.142868780.772594218.04.02.142868790.199682219.04.02.142868800.496513220.04.02.142868810.080302711.05.02.142868820.72544812.05.02.142868830.46470213.05.02.142868840.42664714.05.02.142868850.93429615.05.02.142868860.11957216.05.02.142868870.97404917.05.02.142868880.92380118.05.02.142868890.3413919.05.02.142868900.429746110.05.02.142868910.897294111.05.02.142868920.599365112.05.02.142868930.779912113.05.02.142868940.300752114.05.02.142868950.246063115.05.02.142868960.625133116.05.02.142868970.125895117.05.02.142868980.50344118.05.02.142868990.301822119.05.02.142869000.435073120.05.02.142869010.77550911.06.02.142869020.20040112.06.02.142869030.21078613.06.02.142869040.43249914.06.02.142869050.55731415.06.02.142869060.49126116.06.02.142869070.76900417.06.02.142869080.9172118.06.02.142869090.99664619.06.02.142869100.161179110.06.02.142869110.49496111.06.02.142869120.742112112.06.02.142869130.828501113.06.02.142869140.715753114.06.02.142869150.143504115.06.02.142869160.548136116.06.02.142869170.585418117.06.02.142869180.379898118.06.02.142869190.231624119.06.02.142869200.551739120.06.02.142869210.8092211.07.02.142869220.002303912.07.02.142869230.034005213.07.02.142869240.58296614.07.02.142869250.028205815.07.02.142869260.60223616.07.02.142869270.16013417.07.02.142869280.40193518.07.02.142869290.61333219.07.02.142869300.880759110.07.02.142869310.39809111.07.02.142869320.410756112.07.02.142869330.534566113.07.02.142869340.313028114.07.02.142869350.447705115.07.02.142869360.996218116.07.02.142869370.356499117.07.02.142869380.870714118.07.02.142869390.150302119.07.02.142869400.551655120.07.02.142869410.1118931.08.02.142869420.31201432.08.02.142869430.22301433.08.02.142869440.1393934.08.02.142869450.044941735.08.02.142869460.78887936.08.02.142869470.89528537.08.02.142869480.30946338.08.02.142869490.69986939.08.02.142869500.905637310.08.02.142869510.681091311.08.02.142869520.27425312.08.02.142869530.131653313.08.02.142869540.140611314.08.02.142869550.482227315.08.02.142869560.242118316.08.02.142869570.0639271317.08.02.142869580.873253318.08.02.142869590.0322946319.08.02.142869600.175329320.08.02.142869610.44784331.09.02.142869620.0070721832.09.02.142869630.62173633.09.02.142869640.23649434.09.02.142869650.97577135.09.02.142869660.28282136.09.02.142869670.15087437.09.02.142869680.4092438.09.02.142869690.66969539.09.02.142869700.679907310.09.02.142869710.420161311.09.02.142869720.7072312.09.02.142869730.379003313.09.02.142869740.591775314.09.02.142869750.226055315.09.02.142869760.00561232316.09.02.142869770.885459317.09.02.142869780.56478318.09.02.142869790.916181319.09.02.142869800.232251320.09.02.142869810.89739411.010.02.142869820.98562712.010.02.142869830.075203913.010.02.142869840.77277714.010.02.142869850.32607715.010.02.142869860.45991516.010.02.142869870.84763317.010.02.142869880.042258718.010.02.142869890.18730919.010.02.142869900.985803110.010.02.142869910.287882111.010.02.142869920.435795112.010.02.142869930.489851113.010.02.142869940.301338114.010.02.142869950.545145115.010.02.142869960.316164116.010.02.142869970.456092117.010.02.142869980.0135294118.010.02.142869990.55899119.010.02.1428610000.441243120.010.02.1428610010.49367631.01.02.4285710020.9392432.01.02.4285710030.95731933.01.02.4285710040.0225934.01.02.4285710050.405635.01.02.4285710060.20989936.01.02.4285710070.10839437.01.02.4285710080.86833838.01.02.4285710090.60394339.01.02.4285710100.419113310.01.02.4285710110.788981311.01.02.4285710120.904198312.01.02.4285710130.713098313.01.02.4285710140.883174314.01.02.4285710150.30781315.01.02.4285710160.201608316.01.02.4285710170.173914317.01.02.4285710180.722695318.01.02.4285710190.793063319.01.02.4285710200.101207320.01.02.4285710210.72925331.02.02.4285710220.97090832.02.02.4285710230.0099531533.02.02.4285710240.17955734.02.02.4285710250.27673835.02.02.4285710260.88740636.02.02.4285710270.28974137.02.02.4285710280.78024238.02.02.4285710290.035919439.02.02.4285710300.610146310.02.02.4285710310.352767311.02.02.4285710320.0530587312.02.02.4285710330.81815313.02.02.4285710340.689266314.02.02.4285710350.962173315.02.02.4285710360.310311316.02.02.4285710370.125737317.02.02.4285710380.169863318.02.02.4285710390.973176319.02.02.4285710400.14417320.02.02.4285710410.071125321.03.02.4285710420.72491922.03.02.4285710430.53037123.03.02.4285710440.009589324.03.02.4285710450.92883725.03.02.4285710460.316526.03.02.4285710470.71486227.03.02.4285710480.93802228.03.02.4285710490.47755129.03.02.4285710500.488803210.03.02.4285710510.286609211.03.02.4285710520.0495175212.03.02.4285710530.482179213.03.02.4285710540.435639214.03.02.4285710550.324876215.03.02.4285710560.706218216.03.02.4285710570.348572217.03.02.4285710580.891676218.03.02.4285710590.293292219.03.02.4285710600.725187220.03.02.4285710610.63763521.04.02.4285710620.083936622.04.02.4285710630.93932823.04.02.4285710640.99823224.04.02.4285710650.034794225.04.02.4285710660.67935126.04.02.4285710670.024135927.04.02.4285710680.042270228.04.02.4285710690.88024629.04.02.4285710700.522459210.04.02.4285710710.241067211.04.02.4285710720.670922212.04.02.4285710730.991511213.04.02.4285710740.0777634214.04.02.4285710750.693224215.04.02.4285710760.307377216.04.02.4285710770.567792217.04.02.4285710780.257377218.04.02.4285710790.331406219.04.02.4285710800.758985220.04.02.4285710810.17236421.05.02.4285710820.044375122.05.02.4285710830.53146423.05.02.4285710840.016338624.05.02.4285710850.69900725.05.02.4285710860.48705626.05.02.4285710870.76401827.05.02.4285710880.33401428.05.02.4285710890.83779429.05.02.4285710900.0112577210.05.02.4285710910.01766211.05.02.4285710920.353778212.05.02.4285710930.0844689213.05.02.4285710940.852744214.05.02.4285710950.68853215.05.02.4285710960.0514129216.05.02.4285710970.0323094217.05.02.4285710980.337332218.05.02.4285710990.922224219.05.02.4285711000.195922220.05.02.4285711010.10678321.06.02.4285711020.35718922.06.02.4285711030.20437223.06.02.4285711040.88400724.06.02.4285711050.34250225.06.02.4285711060.4974726.06.02.4285711070.36147927.06.02.4285711080.9631528.06.02.4285711090.78872829.06.02.4285711100.338029210.06.02.4285711110.312812211.06.02.4285711120.586195212.06.02.4285711130.323409213.06.02.4285711140.288352214.06.02.4285711150.220865215.06.02.4285711160.0501947216.06.02.4285711170.0713681217.06.02.4285711180.878382218.06.02.4285711190.133175219.06.02.4285711200.587739220.06.02.4285711210.56808911.07.02.4285711220.067338912.07.02.4285711230.20097713.07.02.4285711240.84810714.07.02.4285711250.70406615.07.02.4285711260.37995616.07.02.4285711270.27629517.07.02.4285711280.74292518.07.02.4285711290.52612919.07.02.4285711300.454336110.07.02.4285711310.78608111.07.02.4285711320.361955112.07.02.4285711330.768197113.07.02.4285711340.797045114.07.02.4285711350.674681115.07.02.4285711360.380903116.07.02.4285711370.765757117.07.02.4285711380.650913118.07.02.4285711390.50927119.07.02.4285711400.481639120.07.02.4285711410.3144611.08.02.4285711420.091928312.08.02.4285711430.28124913.08.02.4285711440.041355714.08.02.4285711450.032935315.08.02.4285711460.80755716.08.02.4285711470.87596517.08.02.4285711480.73519418.08.02.4285711490.86537819.08.02.4285711500.538754110.08.02.4285711510.924029111.08.02.4285711520.773478112.08.02.4285711530.120942113.08.02.4285711540.064087114.08.02.4285711550.774597115.08.02.4285711560.383553116.08.02.4285711570.460057117.08.02.4285711580.406477118.08.02.4285711590.629941119.08.02.4285711600.855412120.08.02.4285711610.24448831.09.02.4285711620.13049832.09.02.4285711630.22721433.09.02.4285711640.32884634.09.02.4285711650.32901535.09.02.4285711660.1383136.09.02.4285711670.13546637.09.02.4285711680.73983338.09.02.4285711690.60034639.09.02.4285711700.125996310.09.02.4285711710.122962311.09.02.4285711720.491201312.09.02.4285711730.159341313.09.02.4285711740.650573314.09.02.4285711750.676213315.09.02.4285711760.129088316.09.02.4285711770.675565317.09.02.4285711780.171786318.09.02.4285711790.346727319.09.02.4285711800.615808320.09.02.4285711810.89314911.010.02.4285711820.043089612.010.02.4285711830.57662813.010.02.4285711840.12294314.010.02.4285711850.62128615.010.02.4285711860.18154516.010.02.4285711870.71650117.010.02.4285711880.053539518.010.02.4285711890.011580219.010.02.4285711900.455989110.010.02.4285711910.139048111.010.02.4285711920.718742112.010.02.4285711930.0541154113.010.02.4285711940.348572114.010.02.4285711950.834901115.010.02.4285711960.824086116.010.02.4285711970.733946117.010.02.4285711980.832646118.010.02.4285711990.922221119.010.02.4285712000.223231120.010.02.4285712010.11695821.01.02.7142912020.87499222.01.02.7142912030.30501723.01.02.7142912040.95666324.01.02.7142912050.36020825.01.02.7142912060.49990926.01.02.7142912070.85134927.01.02.7142912080.98250428.01.02.7142912090.81713129.01.02.7142912100.975961210.01.02.7142912110.403214211.01.02.7142912120.204991212.01.02.7142912130.368958213.01.02.7142912140.170257214.01.02.7142912150.794264215.01.02.7142912160.00785639216.01.02.7142912170.200924217.01.02.7142912180.927619218.01.02.7142912190.954182219.01.02.7142912200.398572220.01.02.7142912210.31366331.02.02.7142912220.80252432.02.02.7142912230.040859633.02.02.7142912240.047019334.02.02.7142912250.076077735.02.02.7142912260.091209236.02.02.7142912270.42059437.02.02.7142912280.57711438.02.02.7142912290.89226639.02.02.7142912300.433681310.02.02.7142912310.936388311.02.02.7142912320.76791312.02.02.7142912330.655792313.02.02.7142912340.989566314.02.02.7142912350.17177315.02.02.7142912360.978059316.02.02.7142912370.534572317.02.02.7142912380.226621318.02.02.7142912390.0322724319.02.02.7142912400.0793786320.02.02.7142912410.86965731.03.02.7142912420.33324232.03.02.7142912430.44811633.03.02.7142912440.064224834.03.02.7142912450.93612235.03.02.7142912460.65595536.03.02.7142912470.7400137.03.02.7142912480.61916438.03.02.7142912490.26908939.03.02.7142912500.144012310.03.02.7142912510.448162311.03.02.7142912520.633603312.03.02.7142912530.680053313.03.02.7142912540.314563314.03.02.7142912550.529439315.03.02.7142912560.445532316.03.02.7142912570.794597317.03.02.7142912580.432497318.03.02.7142912590.075495319.03.02.7142912600.46156320.03.02.7142912610.0039749321.04.02.7142912620.79329522.04.02.7142912630.94290423.04.02.7142912640.64118524.04.02.7142912650.39508725.04.02.7142912660.8392226.04.02.7142912670.3029327.04.02.7142912680.45117928.04.02.7142912690.99243129.04.02.7142912700.986712210.04.02.7142912710.0259669211.04.02.7142912720.0115621212.04.02.7142912730.788136213.04.02.7142912740.687706214.04.02.7142912750.918925215.04.02.7142912760.703598216.04.02.7142912770.463543217.04.02.7142912780.821952218.04.02.7142912790.873701219.04.02.7142912800.186921220.04.02.7142912810.17009431.05.02.7142912820.20473632.05.02.7142912830.38719733.05.02.7142912840.69484434.05.02.7142912850.77995135.05.02.7142912860.7013736.05.02.7142912870.36887437.05.02.7142912880.54998838.05.02.7142912890.72932339.05.02.7142912900.584168310.05.02.7142912910.662039311.05.02.7142912920.650471312.05.02.7142912930.264497313.05.02.7142912940.086203314.05.02.7142912950.755199315.05.02.7142912960.442973316.05.02.7142912970.92794317.05.02.7142912980.551849318.05.02.7142912990.114738319.05.02.7142913000.687429320.05.02.7142913010.53315831.06.02.7142913020.12506932.06.02.7142913030.10818533.06.02.7142913040.043531834.06.02.7142913050.58734135.06.02.7142913060.13003136.06.02.7142913070.68922837.06.02.7142913080.91215238.06.02.7142913090.69911339.06.02.7142913100.890663310.06.02.7142913110.478624311.06.02.7142913120.746787312.06.02.7142913130.310358313.06.02.7142913140.6184314.06.02.7142913150.987277315.06.02.7142913160.120451316.06.02.7142913170.708749317.06.02.7142913180.100793318.06.02.7142913190.779945319.06.02.7142913200.31024320.06.02.7142913210.38085511.07.02.7142913220.65852112.07.02.7142913230.24405513.07.02.7142913240.96053514.07.02.7142913250.5128715.07.02.7142913260.81620516.07.02.7142913270.859617.07.02.7142913280.87602118.07.02.7142913290.46918819.07.02.7142913300.826656110.07.02.7142913310.838525111.07.02.7142913320.74757112.07.02.7142913330.344464113.07.02.7142913340.427072114.07.02.7142913350.848991115.07.02.7142913360.798956116.07.02.7142913370.085791117.07.02.7142913380.321596118.07.02.7142913390.359764119.07.02.7142913400.700142120.07.02.7142913410.44813731.08.02.7142913420.8639532.08.02.7142913430.032792733.08.02.7142913440.51151734.08.02.7142913450.34532335.08.02.7142913460.83768736.08.02.7142913470.92407737.08.02.7142913480.2064438.08.02.7142913490.12949639.08.02.7142913500.563342310.08.02.7142913510.452411311.08.02.7142913520.845378312.08.02.7142913530.904636313.08.02.7142913540.296961314.08.02.7142913550.95056315.08.02.7142913560.864082316.08.02.7142913570.679314317.08.02.7142913580.754515318.08.02.7142913590.422954319.08.02.7142913600.242276320.08.02.7142913610.5686231.09.02.7142913620.49670932.09.02.7142913630.43966133.09.02.7142913640.60482134.09.02.7142913650.44558335.09.02.7142913660.73762836.09.02.7142913670.96582637.09.02.7142913680.20769438.09.02.7142913690.73355239.09.02.7142913700.409321310.09.02.7142913710.440474311.09.02.7142913720.795825312.09.02.7142913730.226948313.09.02.7142913740.768727314.09.02.7142913750.699545315.09.02.7142913760.141978316.09.02.7142913770.178516317.09.02.7142913780.570094318.09.02.7142913790.602575319.09.02.7142913800.061469320.09.02.7142913810.29551721.010.02.7142913820.26835722.010.02.7142913830.21643323.010.02.7142913840.49659624.010.02.7142913850.47306225.010.02.7142913860.53798926.010.02.7142913870.40451727.010.02.7142913880.3165428.010.02.7142913890.50827229.010.02.7142913900.515643210.010.02.7142913910.653986211.010.02.7142913920.693781212.010.02.7142913930.946771213.010.02.7142913940.970487214.010.02.7142913950.154236215.010.02.7142913960.906852216.010.02.7142913970.345065217.010.02.7142913980.0342859218.010.02.7142913990.432951219.010.02.7142914000.850726220.010.02.7142914010.4247111.01.03.014020.26865812.01.03.014030.78331813.01.03.014040.20780614.01.03.014050.11681915.01.03.014060.28128616.01.03.014070.49200317.01.03.014080.79037618.01.03.014090.18043119.01.03.014100.421145110.01.03.014110.885975111.01.03.014120.848065112.01.03.014130.0922912113.01.03.014140.170484114.01.03.014150.308693115.01.03.014160.707299116.01.03.014170.874481117.01.03.014180.154282118.01.03.014190.555784119.01.03.014200.378225120.01.03.014210.027163911.02.03.014220.33939812.02.03.014230.81621413.02.03.014240.14607814.02.03.014250.010298615.02.03.014260.09551316.02.03.014270.93449917.02.03.014280.041325118.02.03.014290.98686119.02.03.014300.417075110.02.03.014310.108103111.02.03.014320.229291112.02.03.014330.277804113.02.03.014340.445822114.02.03.014350.652895115.02.03.014360.262166116.02.03.014370.94366117.02.03.014380.814426118.02.03.014390.180017119.02.03.014400.295824120.02.03.014410.85358811.03.03.014420.66769912.03.03.014430.18967213.03.03.014440.92714.03.03.014450.15714615.03.03.014460.14059316.03.03.014470.012313317.03.03.014480.89190218.03.03.014490.079588319.03.03.014500.560834110.03.03.014510.553971111.03.03.014520.308025112.03.03.014530.0499021113.03.03.014540.517465114.03.03.014550.922071115.03.03.014560.149324116.03.03.014570.570479117.03.03.014580.993213118.03.03.014590.705599119.03.03.014600.0778899120.03.03.014610.97447831.04.03.014620.10257732.04.03.014630.61171133.04.03.014640.43753734.04.03.014650.38939235.04.03.014660.44937536.04.03.014670.022660537.04.03.014680.1781238.04.03.014690.5264339.04.03.014700.332033310.04.03.014710.37291311.04.03.014720.33363312.04.03.014730.650616313.04.03.014740.436328314.04.03.014750.65956315.04.03.014760.475293316.04.03.014770.996611317.04.03.014780.939161318.04.03.014790.247888319.04.03.014800.541529320.04.03.014810.089776121.05.03.014820.87038322.05.03.014830.83490523.05.03.014840.34103424.05.03.014850.553325.05.03.014860.31497426.05.03.014870.92283927.05.03.014880.64909128.05.03.014890.51624929.05.03.014900.453621210.05.03.014910.672857211.05.03.014920.0387941212.05.03.014930.978932213.05.03.014940.546652214.05.03.014950.540027215.05.03.014960.618795216.05.03.014970.374339217.05.03.014980.448185218.05.03.014990.643429219.05.03.015000.104764220.05.03.015010.43173321.06.03.015020.15797722.06.03.015030.53301423.06.03.015040.61993524.06.03.015050.064011725.06.03.015060.63486726.06.03.015070.93473127.06.03.015080.95224328.06.03.015090.16329.06.03.015100.117676210.06.03.015110.42422211.06.03.015120.703342212.06.03.015130.966356213.06.03.015140.79579214.06.03.015150.784979215.06.03.015160.0322026216.06.03.015170.26412217.06.03.015180.434752218.06.03.015190.840897219.06.03.015200.17805220.06.03.015210.24148331.07.03.015220.25701432.07.03.015230.46917933.07.03.015240.39586934.07.03.015250.62181935.07.03.015260.67053436.07.03.015270.17085837.07.03.015280.35269138.07.03.015290.65090539.07.03.015300.241377310.07.03.015310.645931311.07.03.015320.609751312.07.03.015330.292015313.07.03.015340.582235314.07.03.015350.471873315.07.03.015360.505371316.07.03.015370.160211317.07.03.015380.613804318.07.03.015390.699452319.07.03.015400.826422320.07.03.015410.53602321.08.03.015420.51873422.08.03.015430.87460723.08.03.015440.069490524.08.03.015450.25552125.08.03.015460.77786926.08.03.015470.069685327.08.03.015480.99684728.08.03.015490.21074829.08.03.015500.852023210.08.03.015510.50965211.08.03.015520.328699212.08.03.015530.975888213.08.03.015540.0304139214.08.03.015550.949961215.08.03.015560.620421216.08.03.015570.859406217.08.03.015580.694328218.08.03.015590.764406219.08.03.015600.567126220.08.03.015610.42178221.09.03.015620.51440322.09.03.015630.8850123.09.03.015640.40078824.09.03.015650.7266325.09.03.015660.36019426.09.03.015670.27049227.09.03.015680.51067128.09.03.015690.79670729.09.03.015700.306947210.09.03.015710.021176211.09.03.015720.656231212.09.03.015730.135651213.09.03.015740.61404214.09.03.015750.734006215.09.03.015760.132508216.09.03.015770.0467042217.09.03.015780.885113218.09.03.015790.14483219.09.03.015800.855884220.09.03.015810.11858131.010.03.015820.52466532.010.03.015830.55665633.010.03.015840.45744734.010.03.015850.52998535.010.03.015860.62414936.010.03.015870.067871637.010.03.015880.63209138.010.03.015890.1629739.010.03.015900.973153310.010.03.015910.188176311.010.03.015920.0277237312.010.03.015930.059367313.010.03.015940.863176314.010.03.015950.326011315.010.03.015960.341259316.010.03.015970.667547317.010.03.015980.97554318.010.03.015990.0670164319.010.03.016000.736755320.010.03.016010.63288931.01.03.2857116020.46253532.01.03.2857116030.84541533.01.03.2857116040.087848734.01.03.2857116050.88708135.01.03.2857116060.51785236.01.03.2857116070.79506237.01.03.2857116080.67852238.01.03.2857116090.13616739.01.03.2857116100.39544310.01.03.2857116110.440743311.01.03.2857116120.135331312.01.03.2857116130.833621313.01.03.2857116140.701648314.01.03.2857116150.211127315.01.03.2857116160.019999316.01.03.2857116170.488759317.01.03.2857116180.752683318.01.03.2857116190.307258319.01.03.2857116200.697889320.01.03.2857116210.67891121.02.03.2857116220.81587422.02.03.2857116230.48556823.02.03.2857116240.30821224.02.03.2857116250.66855125.02.03.2857116260.95125426.02.03.2857116270.57585727.02.03.2857116280.24440428.02.03.2857116290.90657829.02.03.2857116300.348258210.02.03.2857116310.862786211.02.03.2857116320.952156212.02.03.2857116330.316759213.02.03.2857116340.682704214.02.03.2857116350.649055215.02.03.2857116360.720552216.02.03.2857116370.819518217.02.03.2857116380.538798218.02.03.2857116390.564272219.02.03.2857116400.403667220.02.03.2857116410.53396911.03.03.2857116420.31957512.03.03.2857116430.3479613.03.03.2857116440.15520714.03.03.2857116450.30477615.03.03.2857116460.54770116.03.03.2857116470.30108117.03.03.2857116480.52661418.03.03.2857116490.6547119.03.03.2857116500.932998110.03.03.2857116510.864647111.03.03.2857116520.639587112.03.03.2857116530.979666113.03.03.2857116540.421697114.03.03.2857116550.192689115.03.03.2857116560.446806116.03.03.2857116570.593923117.03.03.2857116580.511758118.03.03.2857116590.728214119.03.03.2857116600.537502120.03.03.2857116610.95947331.04.03.2857116620.6740732.04.03.2857116630.22812633.04.03.2857116640.38351834.04.03.2857116650.75229435.04.03.2857116660.78952336.04.03.2857116670.51682837.04.03.2857116680.11465238.04.03.2857116690.032360439.04.03.2857116700.711565310.04.03.2857116710.251003311.04.03.2857116720.0382178312.04.03.2857116730.360729313.04.03.2857116740.664046314.04.03.2857116750.263516315.04.03.2857116760.0375221316.04.03.2857116770.240376317.04.03.2857116780.339948318.04.03.2857116790.638981319.04.03.2857116800.887251320.04.03.2857116810.15101211.05.03.2857116820.6010312.05.03.2857116830.5774713.05.03.2857116840.44886914.05.03.2857116850.69518115.05.03.2857116860.043066516.05.03.2857116870.5132217.05.03.2857116880.2133418.05.03.2857116890.72969619.05.03.2857116900.182674110.05.03.2857116910.0595024111.05.03.2857116920.88945112.05.03.2857116930.10278113.05.03.2857116940.434496114.05.03.2857116950.402661115.05.03.2857116960.872147116.05.03.2857116970.533471117.05.03.2857116980.536314118.05.03.2857116990.413774119.05.03.2857117000.992969120.05.03.2857117010.73490511.06.03.2857117020.80170512.06.03.2857117030.035697713.06.03.2857117040.75609914.06.03.2857117050.36678415.06.03.2857117060.59785916.06.03.2857117070.34874217.06.03.2857117080.47814518.06.03.2857117090.021430919.06.03.2857117100.259693110.06.03.2857117110.189303111.06.03.2857117120.0227416112.06.03.2857117130.585493113.06.03.2857117140.753118114.06.03.2857117150.394771115.06.03.2857117160.873033116.06.03.2857117170.333926117.06.03.2857117180.0460949118.06.03.2857117190.959626119.06.03.2857117200.866237120.06.03.2857117210.94699411.07.03.2857117220.73033112.07.03.2857117230.15142513.07.03.2857117240.61916214.07.03.2857117250.85577715.07.03.2857117260.45876616.07.03.2857117270.0021482517.07.03.2857117280.2459518.07.03.2857117290.33215619.07.03.2857117300.092336110.07.03.2857117310.862857111.07.03.2857117320.266758112.07.03.2857117330.543382113.07.03.2857117340.616827114.07.03.2857117350.543621115.07.03.2857117360.257407116.07.03.2857117370.841948117.07.03.2857117380.867312118.07.03.2857117390.857757119.07.03.2857117400.461757120.07.03.2857117410.65153811.08.03.2857117420.69402212.08.03.2857117430.49500413.08.03.2857117440.29660714.08.03.2857117450.31431915.08.03.2857117460.35021716.08.03.2857117470.55268517.08.03.2857117480.24855718.08.03.2857117490.68747219.08.03.2857117500.584973110.08.03.2857117510.182826111.08.03.2857117520.214701112.08.03.2857117530.221977113.08.03.2857117540.43977114.08.03.2857117550.794297115.08.03.2857117560.160237116.08.03.2857117570.256578117.08.03.2857117580.514502118.08.03.2857117590.357774119.08.03.2857117600.118771120.08.03.2857117610.85116711.09.03.2857117620.77550412.09.03.2857117630.97992213.09.03.2857117640.73588714.09.03.2857117650.50596215.09.03.2857117660.57341516.09.03.2857117670.30961617.09.03.2857117680.83277718.09.03.2857117690.41695119.09.03.2857117700.691149110.09.03.2857117710.51832111.09.03.2857117720.993729112.09.03.2857117730.945865113.09.03.2857117740.549093114.09.03.2857117750.209275115.09.03.2857117760.88544116.09.03.2857117770.132122117.09.03.2857117780.0882581118.09.03.2857117790.00946108119.09.03.2857117800.355212120.09.03.2857117810.78631911.010.03.2857117820.60325512.010.03.2857117830.34069313.010.03.2857117840.079351214.010.03.2857117850.35112715.010.03.2857117860.39917916.010.03.2857117870.33228917.010.03.2857117880.62296118.010.03.2857117890.91102419.010.03.2857117900.00506546110.010.03.2857117910.758737111.010.03.2857117920.143703112.010.03.2857117930.732116113.010.03.2857117940.184529114.010.03.2857117950.851015115.010.03.2857117960.981936116.010.03.2857117970.886417117.010.03.2857117980.249863118.010.03.2857117990.838761119.010.03.2857118000.553566120.010.03.2857118010.58016711.01.03.5714318020.056322412.01.03.5714318030.5431213.01.03.5714318040.71382314.01.03.5714318050.2756715.01.03.5714318060.58623916.01.03.5714318070.4588217.01.03.5714318080.88658718.01.03.5714318090.72035319.01.03.5714318100.348708110.01.03.5714318110.338276111.01.03.5714318120.892165112.01.03.5714318130.908077113.01.03.5714318140.0069586114.01.03.5714318150.444185115.01.03.5714318160.656894116.01.03.5714318170.127839117.01.03.5714318180.398179118.01.03.5714318190.38163119.01.03.5714318200.231657120.01.03.5714318210.31310721.02.03.5714318220.94917822.02.03.5714318230.28442323.02.03.5714318240.13761924.02.03.5714318250.85796325.02.03.5714318260.79328826.02.03.5714318270.45849327.02.03.5714318280.18316628.02.03.5714318290.16534629.02.03.5714318300.196408210.02.03.5714318310.0170254211.02.03.5714318320.141687212.02.03.5714318330.167423213.02.03.5714318340.464925214.02.03.5714318350.69336215.02.03.5714318360.831546216.02.03.5714318370.0371025217.02.03.5714318380.368709218.02.03.5714318390.249825219.02.03.5714318400.264275220.02.03.5714318410.94698411.03.03.5714318420.98531512.03.03.5714318430.12107913.03.03.5714318440.59280714.03.03.5714318450.30780215.03.03.5714318460.22505516.03.03.5714318470.86480317.03.03.5714318480.53760218.03.03.5714318490.92609919.03.03.5714318500.342777110.03.03.5714318510.794728111.03.03.5714318520.597494112.03.03.5714318530.729916113.03.03.5714318540.398821114.03.03.5714318550.265593115.03.03.5714318560.624117116.03.03.5714318570.444933117.03.03.5714318580.88222118.03.03.5714318590.366244119.03.03.5714318600.54509120.03.03.5714318610.93950911.04.03.5714318620.84784812.04.03.5714318630.63803513.04.03.5714318640.82168614.04.03.5714318650.23131515.04.03.5714318660.59791316.04.03.5714318670.60149917.04.03.5714318680.16987218.04.03.5714318690.73503819.04.03.5714318700.854558110.04.03.5714318710.368179111.04.03.5714318720.121681112.04.03.5714318730.202473113.04.03.5714318740.333616114.04.03.5714318750.778059115.04.03.5714318760.840961116.04.03.5714318770.655958117.04.03.5714318780.108306118.04.03.5714318790.948423119.04.03.5714318800.48708120.04.03.5714318810.46142321.05.03.5714318820.36391722.05.03.5714318830.79973323.05.03.5714318840.52650424.05.03.5714318850.38454125.05.03.5714318860.26875126.05.03.5714318870.08613427.05.03.5714318880.044392328.05.03.5714318890.2611629.05.03.5714318900.828873210.05.03.5714318910.844535211.05.03.5714318920.8563212.05.03.5714318930.314134213.05.03.5714318940.469899214.05.03.5714318950.502278215.05.03.5714318960.129708216.05.03.5714318970.512399217.05.03.5714318980.202901218.05.03.5714318990.305318219.05.03.5714319000.232303220.05.03.5714319010.92039821.06.03.5714319020.24735322.06.03.5714319030.080552223.06.03.5714319040.69504624.06.03.5714319050.19654625.06.03.5714319060.96552726.06.03.5714319070.63754427.06.03.5714319080.53636628.06.03.5714319090.33802229.06.03.5714319100.589359210.06.03.5714319110.657235211.06.03.5714319120.9817212.06.03.5714319130.744854213.06.03.5714319140.49326214.06.03.5714319150.877255215.06.03.5714319160.752375216.06.03.5714319170.218333217.06.03.5714319180.746771218.06.03.5714319190.36187219.06.03.5714319200.129736220.06.03.5714319210.32275521.07.03.5714319220.54347622.07.03.5714319230.43504423.07.03.5714319240.95330224.07.03.5714319250.50215525.07.03.5714319260.48002426.07.03.5714319270.33456727.07.03.5714319280.48546628.07.03.5714319290.99507129.07.03.5714319300.0132889210.07.03.5714319310.172497211.07.03.5714319320.216497212.07.03.5714319330.102662213.07.03.5714319340.842778214.07.03.5714319350.162322215.07.03.5714319360.574857216.07.03.5714319370.483698217.07.03.5714319380.695089218.07.03.5714319390.475566219.07.03.5714319400.170609220.07.03.5714319410.22967731.08.03.5714319420.4273332.08.03.5714319430.65350733.08.03.5714319440.65667834.08.03.5714319450.18212135.08.03.5714319460.18023236.08.03.5714319470.51159837.08.03.5714319480.11715438.08.03.5714319490.28319939.08.03.5714319500.728553310.08.03.5714319510.440823311.08.03.5714319520.636818312.08.03.5714319530.445715313.08.03.5714319540.0998187314.08.03.5714319550.452991315.08.03.5714319560.606255316.08.03.5714319570.779928317.08.03.5714319580.534442318.08.03.5714319590.998682319.08.03.5714319600.0800216320.08.03.5714319610.083803731.09.03.5714319620.12406432.09.03.5714319630.35271633.09.03.5714319640.75683134.09.03.5714319650.73589135.09.03.5714319660.5879736.09.03.5714319670.0094352337.09.03.5714319680.63474138.09.03.5714319690.20376639.09.03.5714319700.829413310.09.03.5714319710.986951311.09.03.5714319720.0248523312.09.03.5714319730.0880984313.09.03.5714319740.392808314.09.03.5714319750.467864315.09.03.5714319760.700528316.09.03.5714319770.897121317.09.03.5714319780.954119318.09.03.5714319790.0271722319.09.03.5714319800.65614320.09.03.5714319810.31868411.010.03.5714319820.55219312.010.03.5714319830.53836513.010.03.5714319840.031590414.010.03.5714319850.43074115.010.03.5714319860.95183716.010.03.5714319870.53501117.010.03.5714319880.18791418.010.03.5714319890.086105419.010.03.5714319900.0607098110.010.03.5714319910.192292111.010.03.5714319920.714951112.010.03.5714319930.153316113.010.03.5714319940.965317114.010.03.5714319950.877697115.010.03.5714319960.0377789116.010.03.5714319970.30601117.010.03.5714319980.177973118.010.03.5714319990.497019119.010.03.5714320000.590867120.010.03.5714320010.4414131.01.03.8571420020.090654732.01.03.8571420030.72049133.01.03.8571420040.31120734.01.03.8571420050.7753235.01.03.8571420060.017557936.01.03.8571420070.46852537.01.03.8571420080.67576138.01.03.8571420090.93942439.01.03.8571420100.467257310.01.03.8571420110.637836311.01.03.8571420120.167531312.01.03.8571420130.394554313.01.03.8571420140.395832314.01.03.8571420150.0813438315.01.03.8571420160.269947316.01.03.8571420170.711538317.01.03.8571420180.556116318.01.03.8571420190.431665319.01.03.8571420200.13849320.01.03.8571420210.71014721.02.03.8571420220.61360722.02.03.8571420230.89712423.02.03.8571420240.77716224.02.03.8571420250.89280725.02.03.8571420260.51728626.02.03.8571420270.96610127.02.03.8571420280.89326228.02.03.8571420290.69992329.02.03.8571420300.39072210.02.03.8571420310.850574211.02.03.8571420320.728519212.02.03.8571420330.982309213.02.03.8571420340.281216214.02.03.8571420350.56256215.02.03.8571420360.530852216.02.03.8571420370.970547217.02.03.8571420380.160189218.02.03.8571420390.670425219.02.03.8571420400.662735220.02.03.8571420410.81115411.03.03.8571420420.35874612.03.03.8571420430.60012313.03.03.8571420440.7642614.03.03.8571420450.41918915.03.03.8571420460.68283216.03.03.8571420470.014794817.03.03.8571420480.73375818.03.03.8571420490.66532519.03.03.8571420500.958364110.03.03.8571420510.99262111.03.03.8571420520.47496112.03.03.8571420530.360634113.03.03.8571420540.252378114.03.03.8571420550.742072115.03.03.8571420560.869654116.03.03.8571420570.630199117.03.03.8571420580.799965118.03.03.8571420590.341305119.03.03.8571420600.434493120.03.03.8571420610.12128311.04.03.8571420620.13321212.04.03.8571420630.37295413.04.03.8571420640.60998514.04.03.8571420650.98040315.04.03.8571420660.86547116.04.03.8571420670.64962917.04.03.8571420680.8381718.04.03.8571420690.3196919.04.03.8571420700.812493110.04.03.8571420710.424575111.04.03.8571420720.447317112.04.03.8571420730.413097113.04.03.8571420740.903335114.04.03.8571420750.322545115.04.03.8571420760.328864116.04.03.8571420770.86354117.04.03.8571420780.450486118.04.03.8571420790.859959119.04.03.8571420800.704552120.04.03.8571420810.073070821.05.03.8571420820.84941122.05.03.8571420830.13473623.05.03.8571420840.12584324.05.03.8571420850.65654225.05.03.8571420860.40972626.05.03.8571420870.23393827.05.03.8571420880.75581428.05.03.8571420890.62181129.05.03.8571420900.289486210.05.03.8571420910.690642211.05.03.8571420920.819173212.05.03.8571420930.796214213.05.03.8571420940.415355214.05.03.8571420950.921261215.05.03.8571420960.0100303216.05.03.8571420970.642536217.05.03.8571420980.498256218.05.03.8571420990.978007219.05.03.8571421000.902168220.05.03.8571421010.82635521.06.03.8571421020.25633222.06.03.8571421030.91238923.06.03.8571421040.68006624.06.03.8571421050.36437825.06.03.8571421060.93088626.06.03.8571421070.2086527.06.03.8571421080.91926228.06.03.8571421090.50501629.06.03.8571421100.501024210.06.03.8571421110.244212211.06.03.8571421120.105786212.06.03.8571421130.309119213.06.03.8571421140.437791214.06.03.8571421150.538027215.06.03.8571421160.224659216.06.03.8571421170.32506217.06.03.8571421180.544622218.06.03.8571421190.889488219.06.03.8571421200.596244220.06.03.8571421210.71919331.07.03.8571421220.4543932.07.03.8571421230.86728533.07.03.8571421240.29776934.07.03.8571421250.48536335.07.03.8571421260.41892336.07.03.8571421270.6822437.07.03.8571421280.7879938.07.03.8571421290.16536539.07.03.8571421300.344443310.07.03.8571421310.14591311.07.03.8571421320.190555312.07.03.8571421330.47407313.07.03.8571421340.457376314.07.03.8571421350.516484315.07.03.8571421360.305408316.07.03.8571421370.897089317.07.03.8571421380.647821318.07.03.8571421390.842901319.07.03.8571421400.210375320.07.03.8571421410.21503811.08.03.8571421420.78029612.08.03.8571421430.43966613.08.03.8571421440.26190514.08.03.8571421450.814215.08.03.8571421460.74627116.08.03.8571421470.15046617.08.03.8571421480.90538718.08.03.8571421490.23891319.08.03.8571421500.172277110.08.03.8571421510.883882111.08.03.8571421520.0174848112.08.03.8571421530.45883113.08.03.8571421540.312256114.08.03.8571421550.599178115.08.03.8571421560.490928116.08.03.8571421570.295821117.08.03.8571421580.82564118.08.03.8571421590.31317119.08.03.8571421600.986356120.08.03.8571421610.51508631.09.03.8571421620.014602632.09.03.8571421630.93839433.09.03.8571421640.64219634.09.03.8571421650.16297735.09.03.8571421660.50526436.09.03.8571421670.98493537.09.03.8571421680.1289138.09.03.8571421690.40055539.09.03.8571421700.971993310.09.03.8571421710.348896311.09.03.8571421720.199208312.09.03.8571421730.483528313.09.03.8571421740.584889314.09.03.8571421750.539236315.09.03.8571421760.640954316.09.03.8571421770.367384317.09.03.8571421780.737486318.09.03.8571421790.815187319.09.03.8571421800.706143320.09.03.8571421810.60766321.010.03.8571421820.33804522.010.03.8571421830.48497123.010.03.8571421840.84260324.010.03.8571421850.97921725.010.03.8571421860.63488426.010.03.8571421870.013295127.010.03.8571421880.92950828.010.03.8571421890.12378929.010.03.8571421900.603908210.010.03.8571421910.0533662211.010.03.8571421920.5251212.010.03.8571421930.972255213.010.03.8571421940.339605214.010.03.8571421950.0736654215.010.03.8571421960.639616216.010.03.8571421970.835678217.010.03.8571421980.449795218.010.03.8571421990.526432219.010.03.8571422000.174965220.010.03.8571422010.0048986421.01.04.1428622020.76772322.01.04.1428622030.96377723.01.04.1428622040.84733224.01.04.1428622050.52435925.01.04.1428622060.0638826.01.04.1428622070.1857627.01.04.1428622080.029475928.01.04.1428622090.25937429.01.04.1428622100.919248210.01.04.1428622110.0518372211.01.04.1428622120.776418212.01.04.1428622130.644135213.01.04.1428622140.63305214.01.04.1428622150.0384432215.01.04.1428622160.206753216.01.04.1428622170.59786217.01.04.1428622180.348305218.01.04.1428622190.735163219.01.04.1428622200.363556220.01.04.1428622210.40576631.02.04.1428622220.7942832.02.04.1428622230.29867833.02.04.1428622240.89917734.02.04.1428622250.87261735.02.04.1428622260.23991636.02.04.1428622270.73385437.02.04.1428622280.70338.02.04.1428622290.55425639.02.04.1428622300.202516310.02.04.1428622310.247012311.02.04.1428622320.19307312.02.04.1428622330.879314313.02.04.1428622340.45137314.02.04.1428622350.618102315.02.04.1428622360.0826983316.02.04.1428622370.745772317.02.04.1428622380.717679318.02.04.1428622390.746565319.02.04.1428622400.348716320.02.04.1428622410.35283211.03.04.1428622420.78672312.03.04.1428622430.4349513.03.04.1428622440.92591314.03.04.1428622450.80183515.03.04.1428622460.75318216.03.04.1428622470.60313717.03.04.1428622480.34693118.03.04.1428622490.12267119.03.04.1428622500.661368110.03.04.1428622510.976217111.03.04.1428622520.364869112.03.04.1428622530.789826113.03.04.1428622540.806965114.03.04.1428622550.726138115.03.04.1428622560.239686116.03.04.1428622570.440312117.03.04.1428622580.041726118.03.04.1428622590.886553119.03.04.1428622600.948075120.03.04.1428622610.90076831.04.04.1428622620.58804432.04.04.1428622630.67065433.04.04.1428622640.51931234.04.04.1428622650.29234535.04.04.1428622660.9693636.04.04.1428622670.53903837.04.04.1428622680.71827338.04.04.1428622690.69088839.04.04.1428622700.288952310.04.04.1428622710.700101311.04.04.1428622720.784993312.04.04.1428622730.666816313.04.04.1428622740.912836314.04.04.1428622750.271028315.04.04.1428622760.692344316.04.04.1428622770.231808317.04.04.1428622780.903946318.04.04.1428622790.990863319.04.04.1428622800.666233320.04.04.1428622810.89378211.05.04.1428622820.24755212.05.04.1428622830.88550213.05.04.1428622840.83868314.05.04.1428622850.98155215.05.04.1428622860.50225716.05.04.1428622870.52037117.05.04.1428622880.83121118.05.04.1428622890.94432619.05.04.1428622900.399655110.05.04.1428622910.531945111.05.04.1428622920.256692112.05.04.1428622930.341962113.05.04.1428622940.754891114.05.04.1428622950.320366115.05.04.1428622960.665162116.05.04.1428622970.0274203117.05.04.1428622980.632511118.05.04.1428622990.700186119.05.04.1428623000.511328120.05.04.1428623010.15159821.06.04.1428623020.54078922.06.04.1428623030.42482323.06.04.1428623040.87267224.06.04.1428623050.29910425.06.04.1428623060.05655426.06.04.1428623070.054428727.06.04.1428623080.61431228.06.04.1428623090.058905329.06.04.1428623100.133744210.06.04.1428623110.904387211.06.04.1428623120.180596212.06.04.1428623130.258398213.06.04.1428623140.711476214.06.04.1428623150.824541215.06.04.1428623160.306121216.06.04.1428623170.49657217.06.04.1428623180.795706218.06.04.1428623190.682489219.06.04.1428623200.0491484220.06.04.1428623210.70622121.07.04.1428623220.25964122.07.04.1428623230.5994123.07.04.1428623240.7931124.07.04.1428623250.98016325.07.04.1428623260.31238626.07.04.1428623270.32592127.07.04.1428623280.19371728.07.04.1428623290.52913529.07.04.1428623300.00380133210.07.04.1428623310.925271211.07.04.1428623320.0275578212.07.04.1428623330.780854213.07.04.1428623340.98761214.07.04.1428623350.253629215.07.04.1428623360.610879216.07.04.1428623370.832145217.07.04.1428623380.559689218.07.04.1428623390.640294219.07.04.1428623400.570818220.07.04.1428623410.7974331.08.04.1428623420.92560132.08.04.1428623430.51523933.08.04.1428623440.44058334.08.04.1428623450.77411335.08.04.1428623460.63767636.08.04.1428623470.11299637.08.04.1428623480.24262138.08.04.1428623490.84349239.08.04.1428623500.424147310.08.04.1428623510.915224311.08.04.1428623520.541996312.08.04.1428623530.101772313.08.04.1428623540.501972314.08.04.1428623550.276068315.08.04.1428623560.84328316.08.04.1428623570.256643317.08.04.1428623580.848727318.08.04.1428623590.733551319.08.04.1428623600.347623320.08.04.1428623610.0062140511.09.04.1428623620.83582112.09.04.1428623630.54122813.09.04.1428623640.96424914.09.04.1428623650.8920515.09.04.1428623660.2519716.09.04.1428623670.67236817.09.04.1428623680.50385918.09.04.1428623690.279319.09.04.1428623700.254399110.09.04.1428623710.898582111.09.04.1428623720.215945112.09.04.1428623730.872121113.09.04.1428623740.830766114.09.04.1428623750.276792115.09.04.1428623760.323445116.09.04.1428623770.574587117.09.04.1428623780.183965118.09.04.1428623790.427522119.09.04.1428623800.306049120.09.04.1428623810.1175521.010.04.1428623820.71563922.010.04.1428623830.044162223.010.04.1428623840.12892624.010.04.1428623850.80550125.010.04.1428623860.044407726.010.04.1428623870.86666827.010.04.1428623880.085613928.010.04.1428623890.13125929.010.04.1428623900.499134210.010.04.1428623910.0515235211.010.04.1428623920.488218212.010.04.1428623930.269465213.010.04.1428623940.0662615214.010.04.1428623950.366477215.010.04.1428623960.745302216.010.04.1428623970.663563217.010.04.1428623980.168652218.010.04.1428623990.127281219.010.04.1428624000.262247220.010.04.1428624010.41667131.01.04.4285724020.21211132.01.04.4285724030.36026233.01.04.4285724040.14480334.01.04.4285724050.56169435.01.04.4285724060.51844336.01.04.4285724070.063818937.01.04.4285724080.71213338.01.04.4285724090.94259539.01.04.4285724100.742081310.01.04.4285724110.730244311.01.04.4285724120.530557312.01.04.4285724130.562625313.01.04.4285724140.724954314.01.04.4285724150.949389315.01.04.4285724160.00418935316.01.04.4285724170.0558594317.01.04.4285724180.882658318.01.04.4285724190.457556319.01.04.4285724200.39375320.01.04.4285724210.58729221.02.04.4285724220.88319722.02.04.4285724230.83273423.02.04.4285724240.64936724.02.04.4285724250.59729425.02.04.4285724260.85083926.02.04.4285724270.072028527.02.04.4285724280.50028428.02.04.4285724290.90584429.02.04.4285724300.318116210.02.04.4285724310.155621211.02.04.4285724320.0360225212.02.04.4285724330.771496213.02.04.4285724340.282324214.02.04.4285724350.959642215.02.04.4285724360.554724216.02.04.4285724370.126367217.02.04.4285724380.0898405218.02.04.4285724390.835598219.02.04.4285724400.01046220.02.04.4285724410.73076431.03.04.4285724420.65029532.03.04.4285724430.91188533.03.04.4285724440.70441834.03.04.4285724450.7433435.03.04.4285724460.36411936.03.04.4285724470.021370537.03.04.4285724480.70028838.03.04.4285724490.53644839.03.04.4285724500.0296557310.03.04.4285724510.895024311.03.04.4285724520.515948312.03.04.4285724530.545465313.03.04.4285724540.82238314.03.04.4285724550.112924315.03.04.4285724560.809512316.03.04.4285724570.055199317.03.04.4285724580.703855318.03.04.4285724590.663557319.03.04.4285724600.2451320.03.04.4285724610.63916431.04.04.4285724620.23341532.04.04.4285724630.010145233.04.04.4285724640.55309534.04.04.4285724650.34382335.04.04.4285724660.15871336.04.04.4285724670.35742537.04.04.4285724680.013274238.04.04.4285724690.073143939.04.04.4285724700.302562310.04.04.4285724710.660133311.04.04.4285724720.765265312.04.04.4285724730.1533313.04.04.4285724740.0486619314.04.04.4285724750.0685655315.04.04.4285724760.0935133316.04.04.4285724770.164051317.04.04.4285724780.763925318.04.04.4285724790.566414319.04.04.4285724800.930818320.04.04.4285724810.039263921.05.04.4285724820.96218722.05.04.4285724830.43358523.05.04.4285724840.92733924.05.04.4285724850.45324525.05.04.4285724860.80250126.05.04.4285724870.4802527.05.04.4285724880.56285728.05.04.4285724890.64447329.05.04.4285724900.502941210.05.04.4285724910.118068211.05.04.4285724920.14247212.05.04.4285724930.920409213.05.04.4285724940.0871304214.05.04.4285724950.13487215.05.04.4285724960.753664216.05.04.4285724970.544806217.05.04.4285724980.9607218.05.04.4285724990.095982219.05.04.4285725000.307683220.05.04.4285725010.1666421.06.04.4285725020.14425722.06.04.4285725030.93106823.06.04.4285725040.98814724.06.04.4285725050.3230425.06.04.4285725060.24593826.06.04.4285725070.87001827.06.04.4285725080.82673528.06.04.4285725090.25155129.06.04.4285725100.904609210.06.04.4285725110.50121211.06.04.4285725120.950206212.06.04.4285725130.343042213.06.04.4285725140.26368214.06.04.4285725150.910663215.06.04.4285725160.924693216.06.04.4285725170.597839217.06.04.4285725180.768316218.06.04.4285725190.596996219.06.04.4285725200.151783220.06.04.4285725210.79925111.07.04.4285725220.9819212.07.04.4285725230.37682213.07.04.4285725240.61794714.07.04.4285725250.648815.07.04.4285725260.86213916.07.04.4285725270.56526817.07.04.4285725280.30956718.07.04.4285725290.29198219.07.04.4285725300.15979110.07.04.4285725310.823229111.07.04.4285725320.65735112.07.04.4285725330.985712113.07.04.4285725340.915965114.07.04.4285725350.635461115.07.04.4285725360.252077116.07.04.4285725370.376258117.07.04.4285725380.26796118.07.04.4285725390.252331119.07.04.4285725400.363581120.07.04.4285725410.16862521.08.04.4285725420.91446722.08.04.4285725430.020332623.08.04.4285725440.073072724.08.04.4285725450.82501825.08.04.4285725460.061996826.08.04.4285725470.73145327.08.04.4285725480.55589728.08.04.4285725490.15815629.08.04.4285725500.878269210.08.04.4285725510.0258736211.08.04.4285725520.76287212.08.04.4285725530.916539213.08.04.4285725540.514362214.08.04.4285725550.263273215.08.04.4285725560.889199216.08.04.4285725570.0697843217.08.04.4285725580.170665218.08.04.4285725590.894626219.08.04.4285725600.970725220.08.04.4285725610.93910911.09.04.4285725620.08740312.09.04.4285725630.17808713.09.04.4285725640.1877714.09.04.4285725650.20927115.09.04.4285725660.0030066416.09.04.4285725670.21463617.09.04.4285725680.47685518.09.04.4285725690.38833619.09.04.4285725700.0309417110.09.04.4285725710.512255111.09.04.4285725720.730356112.09.04.4285725730.458537113.09.04.4285725740.245346114.09.04.4285725750.303919115.09.04.4285725760.511106116.09.04.4285725770.295407117.09.04.4285725780.346836118.09.04.4285725790.843764119.09.04.4285725800.586683120.09.04.4285725810.44603121.010.04.4285725820.78749722.010.04.4285725830.016791123.010.04.4285725840.020573524.010.04.4285725850.076065425.010.04.4285725860.2031126.010.04.4285725870.75273227.010.04.4285725880.54828128.010.04.4285725890.56595629.010.04.4285725900.0358898210.010.04.4285725910.493057211.010.04.4285725920.590714212.010.04.4285725930.921704213.010.04.4285725940.0954602214.010.04.4285725950.085874215.010.04.4285725960.0397342216.010.04.4285725970.941764217.010.04.4285725980.499969218.010.04.4285725990.927223219.010.04.4285726000.28414220.010.04.4285726010.95734721.01.04.7142926020.049850222.01.04.7142926030.78387423.01.04.7142926040.48015324.01.04.7142926050.32454925.01.04.7142926060.91193326.01.04.7142926070.82387327.01.04.7142926080.88807928.01.04.7142926090.58948229.01.04.7142926100.253973210.01.04.7142926110.796894211.01.04.7142926120.50801212.01.04.7142926130.386087213.01.04.7142926140.195013214.01.04.7142926150.547079215.01.04.7142926160.920118216.01.04.7142926170.175429217.01.04.7142926180.344638218.01.04.7142926190.739665219.01.04.7142926200.138639220.01.04.7142926210.87335431.02.04.7142926220.26708132.02.04.7142926230.68173433.02.04.7142926240.62444734.02.04.7142926250.42588935.02.04.7142926260.12772736.02.04.7142926270.99506137.02.04.7142926280.19613138.02.04.7142926290.63782939.02.04.7142926300.767779310.02.04.7142926310.836671311.02.04.7142926320.249708312.02.04.7142926330.6094313.02.04.7142926340.901407314.02.04.7142926350.709793315.02.04.7142926360.507252316.02.04.7142926370.0343773317.02.04.7142926380.460578318.02.04.7142926390.588605319.02.04.7142926400.169955320.02.04.7142926410.49562331.03.04.7142926420.51194432.03.04.7142926430.45810133.03.04.7142926440.21255634.03.04.7142926450.090246335.03.04.7142926460.9902236.03.04.7142926470.58814137.03.04.7142926480.80456438.03.04.7142926490.66842939.03.04.7142926500.0184739310.03.04.7142926510.557465311.03.04.7142926520.0463477312.03.04.7142926530.313351313.03.04.7142926540.234686314.03.04.7142926550.367044315.03.04.7142926560.578948316.03.04.7142926570.574747317.03.04.7142926580.0613488318.03.04.7142926590.302051319.03.04.7142926600.0444249320.03.04.7142926610.90841311.04.04.7142926620.24818712.04.04.7142926630.99156613.04.04.7142926640.078124814.04.04.7142926650.20615415.04.04.7142926660.8426116.04.04.7142926670.95005317.04.04.7142926680.68102618.04.04.7142926690.69310419.04.04.7142926700.393636110.04.04.7142926710.994666111.04.04.7142926720.544106112.04.04.7142926730.316326113.04.04.7142926740.687434114.04.04.7142926750.749572115.04.04.7142926760.891793116.04.04.7142926770.880613117.04.04.7142926780.644515118.04.04.7142926790.416033119.04.04.7142926800.878987120.04.04.7142926810.63831731.05.04.7142926820.29010232.05.04.7142926830.079590633.05.04.7142926840.42240434.05.04.7142926850.86398235.05.04.7142926860.5283136.05.04.7142926870.39848837.05.04.7142926880.96467938.05.04.7142926890.39653339.05.04.7142926900.0833229310.05.04.7142926910.369153311.05.04.7142926920.179222312.05.04.7142926930.845178313.05.04.7142926940.119063314.05.04.7142926950.53349315.05.04.7142926960.805543316.05.04.7142926970.528313317.05.04.7142926980.0572516318.05.04.7142926990.337831319.05.04.7142927000.574659320.05.04.7142927010.49247321.06.04.7142927020.20753922.06.04.7142927030.048577223.06.04.7142927040.80638224.06.04.7142927050.85967425.06.04.7142927060.5340626.06.04.7142927070.89261627.06.04.7142927080.74992228.06.04.7142927090.52627729.06.04.7142927100.836573210.06.04.7142927110.168699211.06.04.7142927120.767376212.06.04.7142927130.495945213.06.04.7142927140.0432447214.06.04.7142927150.914273215.06.04.7142927160.714993216.06.04.7142927170.0943361217.06.04.7142927180.129307218.06.04.7142927190.184475219.06.04.7142927200.592795220.06.04.7142927210.063579911.07.04.7142927220.94888212.07.04.7142927230.72192213.07.04.7142927240.30760814.07.04.7142927250.73314615.07.04.7142927260.86571216.07.04.7142927270.95683317.07.04.7142927280.45305318.07.04.7142927290.68152619.07.04.7142927300.742987110.07.04.7142927310.635466111.07.04.7142927320.614119112.07.04.7142927330.725373113.07.04.7142927340.697145114.07.04.7142927350.247654115.07.04.7142927360.141817116.07.04.7142927370.588343117.07.04.7142927380.722385118.07.04.7142927390.781212119.07.04.7142927400.655262120.07.04.7142927410.4202411.08.04.7142927420.95664812.08.04.7142927430.47452713.08.04.7142927440.70835114.08.04.7142927450.73244115.08.04.7142927460.90001616.08.04.7142927470.72598417.08.04.7142927480.37696318.08.04.7142927490.41445919.08.04.7142927500.536757110.08.04.7142927510.0645578111.08.04.7142927520.575651112.08.04.7142927530.516013113.08.04.7142927540.149094114.08.04.7142927550.383222115.08.04.7142927560.00593482116.08.04.7142927570.607952117.08.04.7142927580.730763118.08.04.7142927590.402609119.08.04.7142927600.00792427120.08.04.7142927610.72137331.09.04.7142927620.70227532.09.04.7142927630.41180133.09.04.7142927640.08332434.09.04.7142927650.30944935.09.04.7142927660.49522636.09.04.7142927670.97657237.09.04.7142927680.066824138.09.04.7142927690.9836739.09.04.7142927700.40439310.09.04.7142927710.703456311.09.04.7142927720.388379312.09.04.7142927730.68224313.09.04.7142927740.718409314.09.04.7142927750.0926626315.09.04.7142927760.205507316.09.04.7142927770.758457317.09.04.7142927780.809049318.09.04.7142927790.0643248319.09.04.7142927800.346292320.09.04.7142927810.29172531.010.04.7142927820.96667232.010.04.7142927830.33895433.010.04.7142927840.052207834.010.04.7142927850.65122235.010.04.7142927860.094203236.010.04.7142927870.83596637.010.04.7142927880.70341238.010.04.7142927890.34186139.010.04.7142927900.574232310.010.04.7142927910.981713311.010.04.7142927920.0838874312.010.04.7142927930.236027313.010.04.7142927940.642915314.010.04.7142927950.464504315.010.04.7142927960.313969316.010.04.7142927970.0917315317.010.04.7142927980.0847256318.010.04.7142927990.912936319.010.04.7142928000.760761320.010.04.7142928010.019167831.01.05.028020.65039732.01.05.028030.1071633.01.05.028040.28311734.01.05.028050.54062335.01.05.028060.57616636.01.05.028070.11572237.01.05.028080.17478438.01.05.028090.62885139.01.05.028100.188283310.01.05.028110.559766311.01.05.028120.17463312.01.05.028130.138878313.01.05.028140.630394314.01.05.028150.122341315.01.05.028160.396679316.01.05.028170.692337317.01.05.028180.38769318.01.05.028190.867985319.01.05.028200.440726320.01.05.028210.72033931.02.05.028220.43178432.02.05.028230.92374433.02.05.028240.38958234.02.05.028250.51858935.02.05.028260.50734536.02.05.028270.58471837.02.05.028280.66281738.02.05.028290.51567639.02.05.028300.178473310.02.05.028310.200476311.02.05.028320.972189312.02.05.028330.669492313.02.05.028340.361834314.02.05.028350.640356315.02.05.028360.271234316.02.05.028370.200332317.02.05.028380.186268318.02.05.028390.850252319.02.05.028400.435133320.02.05.028410.52769331.03.05.028420.19159632.03.05.028430.86119833.03.05.028440.46664434.03.05.028450.96154835.03.05.028460.37376736.03.05.028470.00057135837.03.05.028480.53902238.03.05.028490.097645539.03.05.028500.562217310.03.05.028510.126154311.03.05.028520.341373312.03.05.028530.601876313.03.05.028540.97836314.03.05.028550.269184315.03.05.028560.746459316.03.05.028570.800522317.03.05.028580.482587318.03.05.028590.65448319.03.05.028600.469888320.03.05.028610.7267931.04.05.028620.54170132.04.05.028630.64553733.04.05.028640.78681834.04.05.028650.69961135.04.05.028660.91641136.04.05.028670.70484137.04.05.028680.85703238.04.05.028690.8754439.04.05.028700.920989310.04.05.028710.309455311.04.05.028720.822834312.04.05.028730.768518313.04.05.028740.43245314.04.05.028750.567513315.04.05.028760.916166316.04.05.028770.933941317.04.05.028780.628118318.04.05.028790.0747135319.04.05.028800.889557320.04.05.028810.7546421.05.05.028820.79790522.05.05.028830.77893123.05.05.028840.28744124.05.05.028850.73904725.05.05.028860.22644326.05.05.028870.33521327.05.05.028880.48983728.05.05.028890.73506229.05.05.028900.259396210.05.05.028910.637687211.05.05.028920.999911212.05.05.028930.576003213.05.05.028940.575745214.05.05.028950.20361215.05.05.028960.417422216.05.05.028970.2539217.05.05.028980.460357218.05.05.028990.401898219.05.05.029000.567567220.05.05.029010.79948321.06.05.029020.67526422.06.05.029030.75264423.06.05.029040.39025124.06.05.029050.16972125.06.05.029060.37808126.06.05.029070.95484627.06.05.029080.57530528.06.05.029090.22421929.06.05.029100.839326210.06.05.029110.382998211.06.05.029120.275929212.06.05.029130.383811213.06.05.029140.352971214.06.05.029150.154613215.06.05.029160.805225216.06.05.029170.722065217.06.05.029180.485634218.06.05.029190.306613219.06.05.029200.275518220.06.05.029210.93420531.07.05.029220.14600132.07.05.029230.26918933.07.05.029240.98960834.07.05.029250.86660835.07.05.029260.46084736.07.05.029270.24564937.07.05.029280.21631438.07.05.029290.019231839.07.05.029300.276833310.07.05.029310.939041311.07.05.029320.095393312.07.05.029330.538434313.07.05.029340.291234314.07.05.029350.13161315.07.05.029360.143002316.07.05.029370.967071317.07.05.029380.414194318.07.05.029390.969357319.07.05.029400.401728320.07.05.029410.18357611.08.05.029420.74056612.08.05.029430.53567313.08.05.029440.97175214.08.05.029450.54569115.08.05.029460.11483916.08.05.029470.36335817.08.05.029480.85151918.08.05.029490.81032319.08.05.029500.502421110.08.05.029510.0714933111.08.05.029520.584238112.08.05.029530.36521113.08.05.029540.841723114.08.05.029550.79786115.08.05.029560.770182116.08.05.029570.222368117.08.05.029580.0611734118.08.05.029590.547518119.08.05.029600.166726120.08.05.029610.1860621.09.05.029620.74004422.09.05.029630.72417423.09.05.029640.14784824.09.05.029650.0508725.09.05.029660.99303626.09.05.029670.77668527.09.05.029680.8770628.09.05.029690.3101729.09.05.029700.364157210.09.05.029710.630767211.09.05.029720.522089212.09.05.029730.552769213.09.05.029740.185194214.09.05.029750.891957215.09.05.029760.743912216.09.05.029770.576135217.09.05.029780.277185218.09.05.029790.596008219.09.05.029800.967324220.09.05.029810.54036611.010.05.029820.53319712.010.05.029830.23304313.010.05.029840.11774514.010.05.029850.78426915.010.05.029860.098152916.010.05.029870.016553717.010.05.029880.099711818.010.05.029890.33145919.010.05.029900.484407110.010.05.029910.320814111.010.05.029920.408759112.010.05.029930.701191113.010.05.029940.857079114.010.05.029950.161569115.010.05.029960.543436116.010.05.029970.135289117.010.05.029980.226778118.010.05.029990.562687119.010.05.030000.917285120.010.05.0

In this line we calculate the Mean for each class

fitcube = cubefittable(t, Mean, :values, by=(:classes))\n
3-element YAXArray{Union{Missing, Float64},1} with dimensions: \n  Dim{:classes} Sampled{Int64} Int64[1, 2, 3] ForwardOrdered Irregular Points\nTotal size: 24.0 bytes\n

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.

fitcube = cubefittable(t, Mean, :values, by=(:classes, :time))\n
3\u00d720 YAXArray{Union{Missing, Float64},2} with dimensions: \n  Dim{:classes} Sampled{Int64} Int64[1, 2, 3] ForwardOrdered Irregular Points,\n  Dim{:time} Sampled{Float64} 1.0:1.0:20.0 ForwardOrdered Regular Points\nTotal size: 480.0 bytes\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/HowdoI/switchtodimarray/","title":"Switch to DimensionalData","text":"

The purpose of this section is to show how to switch from the native YAXArray type to the new type based on DimensionalData.jl

"},{"location":"examples/generated/HowdoI/switchtodimarray/#axis-lists-have-to-be-tuples-instead-of-vector","title":"Axis lists have to be Tuples instead of Vector","text":"

When you want to define a YAXArray from scratch the list of Axis has to be given as a Tuple instead of a vector. Otherwise you would run into a DimensionMismatch error.

"},{"location":"examples/generated/HowdoI/switchtodimarray/#dim-instead-of-rangeaxis-and-categoricalaxis","title":"Dim instead of RangeAxis and CategoricalAxis","text":"

The dimensions of a YAXArray are now Dimension types from DimensionalData and there is no difference anymore in the construction for categorical or

"},{"location":"examples/generated/HowdoI/switchtodimarray/#get-the-axes-of-a-yaxarray","title":"Get the axes of a YAXArray","text":"

To get the axes of a YAXArray use the dims function instead of the caxes function

using DimensionalData\nusing YAXArrays\n\naxes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))\narr = YAXArray(axes, reshape(1:10000, (10,10,100)))\n\ndims(arr)\n
Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\nDim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\nDim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points\n

"},{"location":"examples/generated/HowdoI/switchtodimarray/#copy-an-axes-with-the-same-name-but-different-values","title":"Copy an axes with the same name but different values","text":"

Use DD.rebuild(ax, values) instead of axcopy(ax, values)

"},{"location":"examples/generated/HowdoI/switchtodimarray/#subsetting-is-including-not-excluding","title":"Subsetting is including not excluding","text":"

Beware that the subsets in DimensionalData include the bounds. Thereby the size of the subset can differ by one on every bound. a[X=1..4]

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/applyfunctions/","title":"Apply functions on YAXArrays","text":"

How to apply functions on YAXArrays

To apply user defined functions on a YAXArray data type we can use the map function, mapslices function or the mapCube function. Which of these functions should be used depends on the layout of the data, that the user defined function should be applied on.

"},{"location":"examples/generated/UserGuide/applyfunctions/#apply-a-function-on-every-element-of-a-datacube","title":"Apply a function on every element of a datacube","text":"

The map function can be used to apply a function on every entry of a YAXArray without taking the dimensions into account. This will lazily register the mapped function which is applied when the YAXArray is either accessed or when more involved computations are made.

#If we set up a dummy data cube which has all numbers between 1 and 10000.\n\nusing YAXArrays\nusing DimensionalData\naxes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))\noriginal = YAXArray(axes, reshape(1:10000, (10,10,100)))\n
10\u00d710\u00d7100 YAXArray{Int64,3} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points\nTotal size: 78.12 KB\n

with one at the first position:

original[1,:,1]\n
10-element YAXArray{Int64,1} with dimensions: \n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points\nTotal size: 80.0 bytes\n

now we can substract 1 from all elements of this cube

substracted = map(x-> x-1, original)\n
10\u00d710\u00d7100 YAXArray{Int64,3} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points\nTotal size: 78.12 KB\n

substracted is a cube of the same size as original, and the applied function is registered, so that it is applied as soon as the elements of substracted are either accessed or further used in other computations.

substracted[1,:,1]\n
10-element YAXArray{Int64,1} with dimensions: \n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points\nTotal size: 80.0 bytes\n

"},{"location":"examples/generated/UserGuide/applyfunctions/#apply-a-function-along-dimensions-of-a-single-cube","title":"Apply a function along dimensions of a single cube","text":"

If an function should work along a certain dimension of the data you can use the 'mapslices' function to easily apply this function. This doesn't give you the flexibility of the mapCube function but it is easier to use for simple functions.

If we set up a dummy data cube which has all numbers between 1 and 10000.

axes = (Dim{:Lon}(1:10), Dim{:Lat}(1:10), Dim{:Time}(1:100))\noriginal = YAXArray(axes, reshape(1:10000, (10,10,100)))\n
10\u00d710\u00d7100 YAXArray{Int64,3} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points\nTotal size: 78.12 KB\n

and then we would like to compute the sum over the Time dimension:

timesum = mapslices(sum, original, dims=\"Time\")\n
10\u00d710 YAXArray{Union{Missing, Int64},2} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points\nTotal size: 800.0 bytes\n

this reduces over the time dimension and gives us the following values

timesum[:,:]\n
10\u00d710 YAXArray{Union{Missing, Int64},2} with dimensions: \n  Dim{:Lon} Sampled{Int64} 1:10 ForwardOrdered Regular Points,\n  Dim{:Lat} Sampled{Int64} 1:10 ForwardOrdered Regular Points\nTotal size: 800.0 bytes\n

You can also apply a function along multiple dimensions of the same data cube.

lonlatsum = mapslices(sum, original, dims=(\"Lon\", \"Lat\"))\n
100-element YAXArray{Union{Missing, Int64},1} with dimensions: \n  Dim{:Time} Sampled{Int64} 1:100 ForwardOrdered Regular Points\nTotal size: 800.0 bytes\n

"},{"location":"examples/generated/UserGuide/applyfunctions/#how-to-combine-multiple-cubes-in-one-computation","title":"How to combine multiple cubes in one computation","text":""},{"location":"examples/generated/UserGuide/applyfunctions/#compute-the-mean-seasonal-cycle-for-one-sigle-pixel","title":"Compute the Mean Seasonal Cycle for one sigle pixel","text":"
using CairoMakie\nCairoMakie.activate!()\nusing Dates\nusing Statistics\n

We define the data span. For simplicity, three non-leap years were selected.

t =  Date(\"2021-01-01\"):Day(1):Date(\"2023-12-31\")\nNpY = 3\n# create some seasonal dummy data\nx = repeat(range(0, 2\u03c0, length=365), NpY)\nvar = @. sin(x) + 0.1 * randn()\n\nlines(1:length(t), var; color = :purple, linewidth=1.25,\naxis=(; xlabel=\"Time\", ylabel=\"Variable\"),\nfigure = (; resolution = (600,400))\n)\n

Currently makie doesn't support time axis natively, but the following function can do the work for now.

function time_ticks(dates; frac=8)\ntempo = string.(dates)\nlentime = length(tempo)\nslice_dates = range(1, lentime, step=lentime \u00f7 frac)\nreturn slice_dates, tempo[slice_dates]\nend\n\nxpos, ticks = time_ticks(t; frac=8)\n
(1:136:1089, [\"2021-01-01\", \"2021-05-17\", \"2021-09-30\", \"2022-02-13\", \"2022-06-29\", \"2022-11-12\", \"2023-03-28\", \"2023-08-11\", \"2023-12-25\"])\n

In order to apply the previous output, we split the plotting function into his 3 components, figure, axis and plotted object, namely

fig, ax, obj = lines(1:length(t), var; color = :purple, linewidth=1.25,\naxis=(; xlabel=\"Time\", ylabel=\"Variable\"),\nfigure = (; resolution = (600,400))\n)\nax.xticks = (xpos, ticks)\nax.xticklabelrotation = \u03c0 / 4\nax.xticklabelalign = (:right, :center)\nfig\n

"},{"location":"examples/generated/UserGuide/applyfunctions/#define-the-cube","title":"Define the cube","text":"
axes = (Dim{:Time}(t),)\nc = YAXArray(axes, var)\n
1095-element YAXArray{Float64,1} with dimensions: \n  Dim{:Time} Sampled{Date} Date(\"2021-01-01\"):Dates.Day(1):Date(\"2023-12-31\") ForwardOrdered Regular Points\nTotal size: 8.55 KB\n

Let's calculate the mean seasonal cycle of our dummy variable 'var'

function mean_seasonal_cycle(c; ndays = 365)\n# filterig by month-day\nmonthday = map(x->Dates.format(x, \"u-d\"), collect(c.Time))\ndatesid = unique(monthday)\n# number of years\nNpY = Int(size(monthday,1)/ndays)\nidx = Int.(zeros(ndays, NpY))\n# get the day-month indices for data subsetting\nfor i in 1:ndays\nidx[i,:] = Int.(findall(x-> x == datesid[i], monthday))\nend\n# compute the mean seasonal cycle\nmscarray = map(x->var[x], idx)\nmsc = mapslices(mean, mscarray, dims=2)\nreturn msc\nend\n\nmsc = mean_seasonal_cycle(c);\n

"},{"location":"examples/generated/UserGuide/applyfunctions/#plot-results-mean-seasonal-cycle","title":"Plot results: mean seasonal cycle","text":"
xpos, ticks = time_ticks(t[1:365]; frac=8)\n\nfig, ax, obj = lines(1:365, var[1:365]; label=\"2021\", color=:black,\nlinewidth=2.0, linestyle=:dot,\naxis = (;  xlabel=\"Time\", ylabel=\"Variable\"),\nfigure=(; resolution = (600,400))\n)\nlines!(1:365, var[366:730], label=\"2022\", color=:brown,\nlinewidth=1.5, linestyle=:dash\n)\nlines!(1:365, msc[:,1]; label=\"MSC\", color=:dodgerblue, lw=2.5)\naxislegend()\nax.xticks = (xpos, ticks)\nax.xticklabelrotation = \u03c0 / 4\nax.xticklabelalign = (:right, :center)\nfig\ncurrent_figure()\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/creating/","title":"Creating YAXArrays and Datasets","text":""},{"location":"examples/generated/UserGuide/creating/#creating-yaxarrays-and-datasets","title":"Creating YAXArrays and Datasets","text":""},{"location":"examples/generated/UserGuide/creating/#creating-a-yaxarray","title":"Creating a YAXArray","text":"
using YAXArrays\nusing DimensionalData: DimensionalData as DD\nusing DimensionalData\na = YAXArray(rand(10, 20, 5))\n
10\u00d720\u00d75 YAXArray{Float64,3} with dimensions: \n  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,\n  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points\nTotal size: 7.81 KB\n

if not names are defined then default ones will be used, i.e. Dim_1, Dim_2. Get data from each Dimension with

a.Dim_1\n
Dim{:Dim_1} Sampled{Int64} ForwardOrdered Regular Points\nwrapping: Base.OneTo(10)\n

or with

getproperty(a, :Dim_1)\n
Dim{:Dim_1} Sampled{Int64} ForwardOrdered Regular Points\nwrapping: Base.OneTo(10)\n

"},{"location":"examples/generated/UserGuide/creating/#creating-a-yaxarray-with-named-axis","title":"Creating a YAXArray with named axis","text":"

The two most used axis are RangeAxis and CategoricalAxis. Here, we use a combination of them to create a time, lon and lat axis and a Categorical Axis for two variables.

"},{"location":"examples/generated/UserGuide/creating/#axis-definitions","title":"Axis definitions","text":"
using Dates\naxlist = (\nDim{:time}(Date(\"2022-01-01\"):Day(1):Date(\"2022-01-30\")),\nDim{:lon}(range(1, 10, length=10)),\nDim{:lat}(range(1, 5, length=15)),\nDim{:Variable}([\"var1\", \"var2\"])\n)\n
Dim{:time} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\"),\nDim{:lon} 1.0:1.0:10.0,\nDim{:lat} 1.0:0.2857142857142857:5.0,\nDim{:Variable} String[\"var1\", \"var2\"]\n

And the corresponding data

data = rand(30, 10, 15, 2)\nds = YAXArray(axlist, data)\n
30\u00d710\u00d715\u00d72 YAXArray{Float64,4} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,\n  Dim{:Variable} Categorical{String} String[\"var1\", \"var2\"] ForwardOrdered\nTotal size: 70.31 KB\n

"},{"location":"examples/generated/UserGuide/creating/#select-variables","title":"Select variables","text":"
ds[Variable = At(\"var1\"), lon = DD.Between(1,2.1)]\n
30\u00d72\u00d715 YAXArray{Float64,3} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 7.03 KB\n
"},{"location":"examples/generated/UserGuide/creating/#indexing-and-subsetting","title":"Indexing and subsetting","text":"

As for most array types, YAXArray also provides special indexing behavior when using the square brackets for indexing. Assuming that c is a YAXArray, there are 3 different semantics to use the square brackets with, depending on the types of the arguments provided to getindex.

  1. Ranges and Integers only as for example c[1,4:8,:] will access the underlying data according to the provided index in index space and read the

data into memory as a plain Julia Array. It is equivalent to c.data[1,4:8,:].

  1. Keyword arguments with values or Intervals as for example c[longitude = 30..50, time=Date(2005,6,1), variable=\"air_temperature\"].

This always creates a view into the specified subset of the data and return a new YAXArray with new axes without reading the data. Intervals and values are always interpreted in the units as provided by the axis values.

  1. A Tables.jl-compatible object for irregular extraction of a list of points or sub-arrays and random locations.

For example calling c[[(lon=30,lat=42),(lon=-50,lat=2.5)]] will extract data at the specified coordinates and along all additional axes into memory. It returns a new YAXArray with a new Multi-Index axis along the selected longitudes and latitudes.

Info

Overall, selecting elements in YAXArrays is brittle. Hence using DimensionalData.jl and YAXArrayBase.jl is recomended.

"},{"location":"examples/generated/UserGuide/creating/#select-variables-with-dimensionaldatajl","title":"Select variables with DimensionalData.jl","text":"
using DimensionalData, YAXArrayBase\n

First we wrap the yaxarray into a DimArray via

dim = yaxconvert(DimArray, ds)\n
30\u00d710\u00d715\u00d72 DimArray{Float64,4} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,\n  Dim{:Variable} Categorical{String} String[\"var1\", \"var2\"] ForwardOrdered\n[:, :, 1, 1]\n                      1.0       \u2026  8.0        9.0        10.0\n  2022-01-01  0.264379     0.0485374  0.468793    0.389993\n  2022-01-02  0.297533     0.878975   0.440026    0.436568\n  2022-01-03  0.458534     0.266355   0.851548    0.437344\n \u22ee                              \u22f1                         \u22ee\n  2022-01-27  0.897503  \u2026  0.669995   0.328952    0.382058\n  2022-01-28  0.710513     0.300216   0.0925076   0.332528\n  2022-01-29  0.154864     0.160199   0.948726    0.151164\n  2022-01-30  0.690848     0.294271   0.364651    0.00713762\n[and 29 more slices...]\n

Now, the syntax from DimensionalData.jl just works

subset = dim[\ntime = DD.Between( Date(\"2022-01-01\"),  Date(\"2022-01-10\")),\nlon=DD.Between(1,2),\nVariable = At(\"var2\")\n]\n
10\u00d72\u00d715 DimArray{Float64,3} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-10\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nand reference dimensions: \n  Dim{:Variable} Categorical{String} String[\"var2\"] ForwardOrdered\n[:, :, 1]\n                      1.0       2.0\n  2022-01-01  0.400221  0.657645\n  2022-01-02  0.748848  0.139248\n \u22ee                              \n  2022-01-09  0.304694  0.933361\n  2022-01-10  0.81306   0.343546\n[and 14 more slices...]\n

And going back to our YAXArray view is done with

yax = yaxconvert(YAXArray, subset)\n
10\u00d72\u00d715 YAXArray{Float64,3} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-10\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:2.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 2.34 KB\n

This will be supported by default in the next release.

"},{"location":"examples/generated/UserGuide/creating/#properties-attributes","title":"Properties / Attributes","text":"

You might also want to add additional properties to your YAXArray. This can be done via a Dictionary, namely

props = Dict(\n\"time\" => \"days\",\n\"lon\" => \"longitude\",\n\"lat\" => \"latitude\",\n\"var1\" => \"first variable\",\n\"var2\" => \"second variable\",\n)\n
Dict{String, String} with 5 entries:\n  \"lat\"  => \"latitude\"\n  \"var1\" => \"first variable\"\n  \"time\" => \"days\"\n  \"var2\" => \"second variable\"\n  \"lon\"  => \"longitude\"\n

Then the yaxarray with properties is assemble with

ds = YAXArray(axlist, data, props)\n
30\u00d710\u00d715\u00d72 YAXArray{Float64,4} with dimensions: \n  Dim{:time} Sampled{Date} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\") ForwardOrdered Regular Points,\n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points,\n  Dim{:Variable} Categorical{String} String[\"var1\", \"var2\"] ForwardOrdered\nTotal size: 70.31 KB\n

Access these properties with

ds.properties\n
Dict{String, String} with 5 entries:\n  \"lat\"  => \"latitude\"\n  \"var1\" => \"first variable\"\n  \"time\" => \"days\"\n  \"var2\" => \"second variable\"\n  \"lon\"  => \"longitude\"\n

Note that this properties are shared for both variables var1 and var2. Namely, this are global properties for your yaxarray. However, in most cases you will want to pass properties for each variable, here we will do this via Datasets.

"},{"location":"examples/generated/UserGuide/creating/#creating-a-dataset","title":"Creating a Dataset","text":"

Let's define first some range axis

axs = (\nDim{:lon}(range(0,1, length=10)),\nDim{:lat}(range(0,1, length=5)),\n)\n
Dim{:lon} 0.0:0.1111111111111111:1.0,\nDim{:lat} 0.0:0.25:1.0\n

And two toy random YAXArrays to assemble our dataset

t2m = YAXArray(axs, rand(10,5), Dict(\"units\" => \"K\", \"reference\" => \"your references\"))\nprec = YAXArray(axs, rand(10,5), Dict(\"units\" => \"mm\", \"reference\" => \"your references\"))\n\nds = Dataset(t2m=t2m, prec= prec, num = YAXArray(rand(10)),\nproperties = Dict(\"space\"=>\"lon/lat\", \"reference\" => \"your global references\"))\n
YAXArray Dataset\nShared Axes: \n()\nVariables: \n\nt2m\n with dimensions: \n  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points\nprec\n with dimensions: \n  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points\nnum\n with dimensions: \n  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nProperties: Dict(\"reference\" => \"your global references\", \"space\" => \"lon/lat\")\n

Note that the YAXArrays used not necessarily shared the same dimensions. Hence, using a Dataset if more versatile than a plain YAXArray.

"},{"location":"examples/generated/UserGuide/creating/#selected-variables-into-a-data-cube","title":"Selected Variables into a Data Cube","text":"

Being able to collect variables that share dimensions into a data cube is possible with

c = Cube(ds[[\"t2m\", \"prec\"]])\n
10\u00d75\u00d72 YAXArray{Float64,3} with dimensions: \n  Dim{:lon} Sampled{Float64} 0.0:0.1111111111111111:1.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 0.0:0.25:1.0 ForwardOrdered Regular Points,\n  Dim{:Variable} Categorical{String} String[\"t2m\", \"prec\"] ReverseOrdered\nunits: mm\nTotal size: 800.0 bytes\n

or simply the one that does not share all dimensions

Cube(ds[[\"num\"]])\n
10-element YAXArray{Float64,1} with dimensions: \n  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nTotal size: 80.0 bytes\n

"},{"location":"examples/generated/UserGuide/creating/#variable-properties","title":"Variable properties","text":"
# Access to variables properties is done via\nCube(ds[[\"t2m\"]]).properties\n
Dict{String, String} with 2 entries:\n  \"units\"     => \"K\"\n  \"reference\" => \"your references\"\n

and

Cube(ds[[\"prec\"]]).properties\n
Dict{String, String} with 2 entries:\n  \"units\"     => \"mm\"\n  \"reference\" => \"your references\"\n

Note also that the global properties for the Dataset are accessed with

ds.properties\n
Dict{String, String} with 2 entries:\n  \"reference\" => \"your global references\"\n  \"space\"     => \"lon/lat\"\n

Saving and different chunking modes are discussed in here.

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/distributed/","title":"Distributed processes","text":""},{"location":"examples/generated/UserGuide/distributed/#how-to-calculate-a-time-mean","title":"How to calculate a time mean","text":"
using YAXArrays, Statistics, Zarr\nusing DimensionalData\nusing Dates\naxlist = (\nDim{:time}(Date(\"2022-01-01\"):Day(1):Date(\"2022-01-30\")),\nDim{:lon}(range(1, 10, length=10)),\nDim{:lat}(range(1, 5, length=15)),\nDim{:Variable}([\"var1\", \"var2\"])\n)\n
Dim{:time} Date(\"2022-01-01\"):Dates.Day(1):Date(\"2022-01-30\"),\nDim{:lon} 1.0:1.0:10.0,\nDim{:lat} 1.0:0.2857142857142857:5.0,\nDim{:Variable} String[\"var1\", \"var2\"]\n

And the corresponding data

data = rand(30, 10, 15, 2)\nds = YAXArray(axlist, data)\n\nc = ds[Variable = At(\"var1\")] # see OpenNetCDF to get the file\nmapslices(mean \u2218 skipmissing, c, dims=\"Time\")\n
10\u00d715 YAXArray{Union{Missing, Float64},2} with dimensions: \n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 1.17 KB\n

"},{"location":"examples/generated/UserGuide/distributed/#distributed-calculations","title":"Distributed calculations","text":"

It is possible to distribute the calculations over multiple process. The following code does a time mean over all grid points using multiple CPU over a local machine.

#using Distributed\n#addprocs(2)\n#@everywhere using Pkg\n#@everywhere Pkg.activate(\".\")\n#@everywhere begin\n

using NetCDF using YAXArrays using Statistics using Zarr

#end\n#@everywhere function mymean(output, pixel)\n

@show \"doing a mean\" output[:] .= mean(pixel)

#end\n#indims = InDims(\"time\")\n#outdims = OutDims()\n#resultcube = mapCube(mymean, c, indims=indims, outdims=outdims)\n

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

resultcube = mapslices(mean \u2218 skipmissing, c, dims=\"time\")\n
10\u00d715 YAXArray{Union{Missing, Float64},2} with dimensions: \n  Dim{:lon} Sampled{Float64} 1.0:1.0:10.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} 1.0:0.2857142857142857:5.0 ForwardOrdered Regular Points\nTotal size: 1.17 KB\n

"},{"location":"examples/generated/UserGuide/distributed/#slurm-cluster","title":"SLURM cluster","text":"

It is also possible to distribute easily the workload on a cluster, with little modification to the code. The following code does a time mean over all grid points using multiple CPU over a SLURM cluster. To do so, we use the ClusterManagers package.

#using Distributed\n#using ClusterManagers\n#addprocs(SlurmManager(10))\n#@everywhere using Pkg\n#@everywhere Pkg.activate(\".\")\n#@everywhere using ESDL\n#@everywhere using Statistics\n#inpath=\"zg1000_AERday_CanESM5_esm-hist_r6i1p1f1_gn_18500101-20141231.nc\"\n#c = Cube(inpath, \"zg1000\")\n#resultcube = mapslices(mean \u2218 skipmissing, c, dims=\"time\")\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/openNetCDF/","title":"Open NetCDF","text":"

In this example we are going to use a NetCDF file but this should be very similar for other data backends. To open a single data file we first need to load the appropriate backend package via using NetCDF.

using YAXArrays, NetCDF\nusing Downloads\nurl = \"https://www.unidata.ucar.edu/software/netcdf/examples/tos_O1_2001-2002.nc\"\nfilename = Downloads.download(url, \"tos_O1_2001-2002.nc\") # you pick your own path\nc = Cube(filename)\n
180\u00d7170\u00d724 YAXArray{Union{Missing, Float32},3} with dimensions: \n  Dim{:lon} Sampled{Float64} 1.0:2.0:359.0 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} -79.5:1.0:89.5 ForwardOrdered Regular Points,\n  Ti Sampled{CFTime.DateTime360Day} CFTime.DateTime360Day[CFTime.DateTime360Day(2001-01-16T00:00:00), \u2026, CFTime.DateTime360Day(2002-12-16T00:00:00)] ForwardOrdered Irregular Points\nunits: K\nname: tos\nTotal size: 2.8 MB\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/openZarr/","title":"Open Zarr (Store)","text":"
using Zarr, YAXArrays\nstore =\"gs://cmip6/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp585/r1i1p1f1/3hr/tas/gn/v20190710/\"\ng = open_dataset(zopen(store, consolidated=true))\nc = g[\"tas\"]\n
384\u00d7192\u00d7251288 YAXArray{Float32,3} with dimensions: \n  Dim{:lon} Sampled{Float64} 0.0:0.9375:359.0625 ForwardOrdered Regular Points,\n  Dim{:lat} Sampled{Float64} Float64[-89.28422753251364, -88.35700351866494, \u2026, 88.35700351866494, 89.28422753251364] ForwardOrdered Irregular Points,\n  Ti Sampled{DateTime} DateTime[2015-01-01T03:00:00, \u2026, 2101-01-01T00:00:00] ForwardOrdered Irregular Points\nunits: K\nname: tas\nTotal size: 69.02 GB\n

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/saving/","title":"Saving YAXArrays and Datasets","text":""},{"location":"examples/generated/UserGuide/saving/#saving-yaxarrays-and-datasets","title":"Saving YAXArrays and Datasets","text":"

Is possible to save datasets and YAXArray directly to zarr files.

"},{"location":"examples/generated/UserGuide/saving/#saving-a-yaxarray-to-zarr","title":"Saving a YAXArray to Zarr","text":"

One can save any YAXArray using the savecube function. Simply add a path as an argument and the cube will be saved.

using YAXArrays, Zarr\na = YAXArray(rand(10,20))\nf = tempname()\nsavecube(a,f,driver=:zarr)\n
10\u00d720 YAXArray{Float64,2} with dimensions: \n  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points\nTotal size: 1.56 KB\n

"},{"location":"examples/generated/UserGuide/saving/#saving-a-yaxarray-to-netcdf","title":"Saving a YAXArray to NetCDF","text":"

Saving to NetCDF works exactly the same way.

using YAXArrays, Zarr, NetCDF\na = YAXArray(rand(10,20))\nf = tempname()\nsavecube(a,f,driver=:netcdf)\n
10\u00d720 YAXArray{Float64,2} with dimensions: \n  Dim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points\nTotal size: 1.56 KB\n

"},{"location":"examples/generated/UserGuide/saving/#saving-a-dataset","title":"Saving a Dataset","text":"

Saving Datasets can be done using the savedataset function.

using YAXArrays, Zarr\nds = Dataset(x = YAXArray(rand(10,20)), y = YAXArray(rand(10)));\nf = tempname();\nsavedataset(ds,path=f,driver=:zarr)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nVariables: \n\nx\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, \n

"},{"location":"examples/generated/UserGuide/saving/#overwriting-a-dataset","title":"Overwriting a Dataset","text":"

If a path already exists, an error will be thrown. Set overwrite=true to delete the existing dataset

savedataset(ds,path=f,driver=:zarr, overwrite=true)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nVariables: \n\nx\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, \n

Look at the docs for more information

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.

"},{"location":"examples/generated/UserGuide/saving/#appending-to-a-dataset","title":"Appending to a Dataset","text":"

New variables can be added to an existing dataset using the append=true keyword.

ds2 = Dataset(z = YAXArray(rand(10,20,5)))\nsavedataset(ds2, path=f,backend=:zarr,append=true)\nopen_dataset(f, driver=:zarr)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} 1:1:10 ForwardOrdered Regular Points\nVariables: \n\nx\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} 1:1:20 ForwardOrdered Regular Points\nz\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} 1:1:20 ForwardOrdered Regular Points,\n  Dim{:Dim_3} Sampled{Int64} 1:1:5 ForwardOrdered Regular Pointsy, \n

"},{"location":"examples/generated/UserGuide/saving/#datacube-skeleton-without-the-actual-data","title":"Datacube Skeleton without the actual data","text":"

Sometimes one merely wants to create a datacube \"Skeleton\" on disk and gradually fill it with data. Here we create YAXArray and write only the axis data and array metadata to disk, while no actual array data is copied:

using YAXArrays, Zarr\na = YAXArray(zeros(Union{Missing, Int32},10,20))\nf = tempname();\nr = savecube(a,f,driver=:zarr,skeleton=true);\nall(ismissing,r[:,:])\n
true\n

The skeleton argument is also available for savedataset.

This page was generated using Literate.jl.

"},{"location":"examples/generated/UserGuide/setchuncks/","title":"Setting chunks's size","text":""},{"location":"examples/generated/UserGuide/setchuncks/#set-chunks","title":"Set chunks","text":"

To determine the chunk size of the array representation on disk, call the setchunks function prior to saving.

"},{"location":"examples/generated/UserGuide/setchuncks/#chunking-yaxarrays","title":"Chunking YAXArrays","text":"
using YAXArrays, Zarr\na = YAXArray(rand(10,20))\na_chunked = setchunks(a, (5,10))\na_chunked.chunks\n
2\u00d72 DiskArrays.GridChunks{2}:\n (1:5, 1:10)   (1:5, 11:20)\n (6:10, 1:10)  (6:10, 11:20)\n

And the saved file is also splitted into Chunks.

f = tempname()\nsavecube(a_chunked, f, backend=:zarr)\nCube(f).chunks\n
2\u00d72 DiskArrays.GridChunks{2}:\n (1:5, 1:10)   (1:5, 11:20)\n (6:10, 1:10)  (6:10, 11:20)\n

Alternatively chunk sizes can be given by dimension name, so the following results in the same chunks:

a_chunked = setchunks(a, (Dim_2=10, Dim_1=5))\na_chunked.chunks\n
2\u00d72 DiskArrays.GridChunks{2}:\n (1:5, 1:10)   (1:5, 11:20)\n (6:10, 1:10)  (6:10, 11:20)\n

"},{"location":"examples/generated/UserGuide/setchuncks/#chunking-datasets","title":"Chunking Datasets","text":""},{"location":"examples/generated/UserGuide/setchuncks/#set-chunks-by-axis","title":"Set Chunks by Axis","text":"

Set chunk size for each axis occuring in a dataset. This will be applied to all variables in the dataset:

using YAXArrays, Zarr\nds = Dataset(x = YAXArray(rand(10,20)), y = YAXArray(rand(10)), z = YAXArray(rand(10,20,5)))\ndschunked = setchunks(ds, Dict(\"Dim_1\"=>5, \"Dim_2\"=>10, \"Dim_3\"=>2))\nCube(dschunked).chunks\n
2\u00d72\u00d73 DiskArrays.GridChunks{3}:\n[:, :, 1] =\n (1:5, 1:10, 1:2)   (1:5, 11:20, 1:2)\n (6:10, 1:10, 1:2)  (6:10, 11:20, 1:2)\n\n[:, :, 2] =\n (1:5, 1:10, 3:4)   (1:5, 11:20, 3:4)\n (6:10, 1:10, 3:4)  (6:10, 11:20, 3:4)\n\n[:, :, 3] =\n (1:5, 1:10, 5:5)   (1:5, 11:20, 5:5)\n (6:10, 1:10, 5:5)  (6:10, 11:20, 5:5)\n

Saving...

f = tempname()\nsavedataset(dschunked, path=f,driver=:zarr)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nVariables: \n\nx\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, \nz\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,\n  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points\n

"},{"location":"examples/generated/UserGuide/setchuncks/#set-chunking-by-variable","title":"Set chunking by Variable","text":"

The following will set the chunk size for each Variable separately and results in exactly the same chunking as the example above

using YAXArrays, Zarr\nds = Dataset(x = YAXArray(rand(10,20)), y = YAXArray(rand(10)), z = YAXArray(rand(10,20,5)))\ndschunked = setchunks(ds,(x = (5,10), y = Dict(\"Dim_1\"=>5), z = (Dim_1 = 5, Dim_2 = 10, Dim_3 = 2)))\nCube(dschunked).chunks\n
2\u00d72\u00d73 DiskArrays.GridChunks{3}:\n[:, :, 1] =\n (1:5, 1:10, 1:2)   (1:5, 11:20, 1:2)\n (6:10, 1:10, 1:2)  (6:10, 11:20, 1:2)\n\n[:, :, 2] =\n (1:5, 1:10, 3:4)   (1:5, 11:20, 3:4)\n (6:10, 1:10, 3:4)  (6:10, 11:20, 3:4)\n\n[:, :, 3] =\n (1:5, 1:10, 5:5)   (1:5, 11:20, 5:5)\n (6:10, 1:10, 5:5)  (6:10, 11:20, 5:5)\n

saving...

f = tempname()\nsavedataset(dschunked,path=f,driver=:zarr)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points\nVariables: \n\nx\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Pointsy, \nz\n with dimensions: \n  Dim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points,\n  Dim{:Dim_3} Sampled{Int64} Base.OneTo(5) ForwardOrdered Regular Points\n

"},{"location":"examples/generated/UserGuide/setchuncks/#set-chunking-for-all-variables","title":"Set chunking for all variables","text":"
#The following code snippet only works when all member variables of the dataset have\n

the same shape and sets the output chunks for all arrays.

using YAXArrays, Zarr\nds = Dataset(x = YAXArray(rand(10,20)), y = YAXArray(rand(10,20)), z = YAXArray(rand(10,20)))\ndschunked = setchunks(ds,(5,10))\nCube(dschunked).chunks\n
2\u00d72\u00d73 DiskArrays.GridChunks{3}:\n[:, :, 1] =\n (1:5, 1:10, 1:1)   (1:5, 11:20, 1:1)\n (6:10, 1:10, 1:1)  (6:10, 11:20, 1:1)\n\n[:, :, 2] =\n (1:5, 1:10, 2:2)   (1:5, 11:20, 2:2)\n (6:10, 1:10, 2:2)  (6:10, 11:20, 2:2)\n\n[:, :, 3] =\n (1:5, 1:10, 3:3)   (1:5, 11:20, 3:3)\n (6:10, 1:10, 3:3)  (6:10, 11:20, 3:3)\n

saving...

f = tempname()\nsavedataset(dschunked,path=f,driver=:zarr)\n
YAXArray Dataset\nShared Axes: \nDim{:Dim_1} Sampled{Int64} Base.OneTo(10) ForwardOrdered Regular Points,\nDim{:Dim_2} Sampled{Int64} Base.OneTo(20) ForwardOrdered Regular Points\nVariables: \nx, y, z, \n

This page was generated using Literate.jl.

"},{"location":"examples/generated/contribute/contribute/","title":"Contribute to docs","text":""},{"location":"examples/generated/contribute/contribute/#contribute-to-documentation","title":"Contribute to Documentation","text":"

Contributing with examples can be done by first creating a new file example here

new file

  • your_new_file.jl at docs/examples/UserGuide/

Once this is done you need to add a new entry here at the bottom and the appropriate level.

add entry to docs

Your new entry should look like:

  • \"Your title example\" : \"examples/generated/UserGuide/your_new_file.md\"

"},{"location":"examples/generated/contribute/contribute/#build-docs-locally","title":"Build docs locally","text":"

If you want to take a look at the docs locally before doing a PR follow the next steps:

build docs locally

Install the following dependencies in your system via pip, i.e.

  • pip install mkdocs pygments python-markdown-math
  • pip install mkdocs-material pymdown-extensions mkdocstrings
  • pip mknotebooks pytkdocs_tweaks mkdocs_include_exclude_files jinja2 mkdocs-video

Then simply go to your docs env and activate it, i.e.

docs> julia

julia> ]

(docs) pkg> activate .

Next, run the scripts:

Julia env: docs

Generate files and build docs by running:

  • include(\"genfiles.jl\")
  • include(\"make.jl\")

Now go to your terminal in the same path docs> and run:

mkdocs serve

This should ouput http://127.0.0.1:8000, copy/paste this into your browser and you are all set.

This page was generated using Literate.jl.

"},{"location":"tutorials/tutorial/","title":"Tutorial","text":""},{"location":"tutorials/tutorial/#yaxarray-tutorial","title":"YAXArray tutorial","text":"

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.

"},{"location":"tutorials/tutorial/#general-overview-of-the-functionality-of-yaxarrays","title":"General overview of the functionality of YAXArrays","text":"

This tutorial provides a broad overview about the features of YAXArrays.

"},{"location":"tutorials/tutorial/#table-style-iteration-over-yaxarrays","title":"Table-style iteration over YAXArrays","text":"

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.

"},{"location":"tutorials/tutorial/#combining-multiple-tiff-files-into-a-zarr-based-datacube","title":"Combining multiple tiff files into a zarr based datacube","text":""}]} \ No newline at end of file diff --git a/previews/PR298/siteinfo.js b/previews/PR298/siteinfo.js new file mode 100644 index 00000000..c1d7d900 --- /dev/null +++ b/previews/PR298/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "previews/PR298"; diff --git a/previews/PR298/sitemap.xml b/previews/PR298/sitemap.xml new file mode 100644 index 00000000..0f8724ef --- /dev/null +++ b/previews/PR298/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/previews/PR298/sitemap.xml.gz b/previews/PR298/sitemap.xml.gz new file mode 100644 index 00000000..0a1d210b Binary files /dev/null and b/previews/PR298/sitemap.xml.gz differ diff --git a/previews/PR298/stylesheets/custom.css b/previews/PR298/stylesheets/custom.css new file mode 100644 index 00000000..38524c5b --- /dev/null +++ b/previews/PR298/stylesheets/custom.css @@ -0,0 +1,120 @@ +/* Fix /page#foo going to the top of the viewport and being hidden by the navbar */ +html { + scroll-padding-top: 50px; + } + + /* Fit the Twitter handle alongside the GitHub one in the top right. */ + + div.md-header__source { + width: revert; + max-width: revert; + } + + a.md-source { + display: inline-block; + } + + .md-source__repository { + max-width: 100%; + } + + /* Emphasise sections of nav on left hand side */ + + nav.md-nav { + padding-left: 5px; + } + + nav.md-nav--secondary { + border-left: revert !important; + } + + .md-nav__title { + font-size: 0.9rem; + } + + .md-nav__item--section > .md-nav__link { + font-size: 0.9rem; + } + + /* Indent autogenerated documentation */ + + div.doc-contents { + padding-left: 25px; + border-left: 4px solid rgba(230, 230, 230); + } + + /* Increase visibility of splitters "---" */ + + [data-md-color-scheme="default"] .md-typeset hr { + border-bottom-color: rgb(0, 0, 0); + border-bottom-width: 1pt; + } + + [data-md-color-scheme="slate"] .md-typeset hr { + border-bottom-color: rgb(230, 230, 230); + } + + /* More space at the bottom of the page */ + + .md-main__inner { + margin-bottom: 1.5rem; + } + + /* Remove prev/next footer buttons */ + + .md-footer__inner { + display: none; + } + + /* Bugfix: remove the superfluous parts generated when doing: + + ??? Blah + + ::: library.something + */ + + .md-typeset details .mkdocstrings > h4 { + display: none; + } + + .md-typeset details .mkdocstrings > h5 { + display: none; + } + + /* Change default colours for tags */ + + [data-md-color-scheme="default"] { + --md-typeset-a-color: rgb(0, 150, 255) !important; + } + [data-md-color-scheme="slate"] { + --md-typeset-a-color: rgb(0, 150, 255) !important; + } + + /* Highlight functions, classes etc. type signatures. Really helps to make clear where + one item ends and another begins. */ + + [data-md-color-scheme="default"] { + --doc-heading-color: #DDD; + --doc-heading-border-color: #CCC; + --doc-heading-color-alt: #F0F0F0; + } + [data-md-color-scheme="slate"] { + --doc-heading-color: rgb(25,25,33); + --doc-heading-border-color: rgb(25,25,33); + --doc-heading-color-alt: rgb(33,33,44); + --md-code-bg-color: rgb(38,38,50); + } + + h4.doc-heading { + /* NOT var(--md-code-bg-color) as that's not visually distinct from other code blocks.*/ + background-color: var(--doc-heading-color); + border: solid var(--doc-heading-border-color); + border-width: 1.5pt; + border-radius: 2pt; + padding: 0pt 5pt 2pt 5pt; + } + h5.doc-heading, h6.heading { + background-color: var(--doc-heading-color-alt); + border-radius: 2pt; + padding: 0pt 5pt 2pt 5pt; + } \ No newline at end of file diff --git a/previews/PR298/tutorials/intro.jl b/previews/PR298/tutorials/intro.jl new file mode 100644 index 00000000..6561002a --- /dev/null +++ b/previews/PR298/tutorials/intro.jl @@ -0,0 +1,26 @@ +# # Introduction into the EarthDataLab package +# +# In this tutorial we will explore the features of the YAXArrays package. + +using YAXArrays, EarthDataLab, Zarr, NetCDF + +# ## Use data larger than RAM# +# +# - Uses DiskArrays.jl in the background +# - Load only the data that is really needed +# - Use chunks of the data +# - Use NetCDF or Zarr or GDAL to load data +# - Load data locally or from the cloud + + +# Here we use the EarthSystemDataCube a multivariate global dataset with climate and biosphere variables. + +c = esdc(res="low") + +# ## Subsets happen lazily + +europe = subsetcube(c, region="Europe", time=2000:2016, + Variable=["air_temperature_2m", "net_ecosystem", "soil_moisture"]) + + plot(europe.time.values,europe[Variable="air_temperature_2m", lat=50, lon=11].data) + diff --git a/previews/PR298/tutorials/tutorial/index.html b/previews/PR298/tutorials/tutorial/index.html new file mode 100644 index 00000000..c673e322 --- /dev/null +++ b/previews/PR298/tutorials/tutorial/index.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Tutorial - YAXArrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + +

+

+

YAXArray tutorial¤

+

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¤

+ + + + + + +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file