text:
using Mimi
using DataFrames
using ProgressMeter

module RICE
    include("../mimi-rice-2010/src/marginaldamage.jl")
end

# 1. Run model and load data
# ==========================

# This function returns a matrix of marginal damages per one t of carbon emission in the
# emissionyear parameter year.
function getmarginaldamages_rice_consumption_based(;emissionyear=2005,datafile=joinpath(dirname(@__FILE__), "..", "data", "RICE_2010_base_000.xlsm"))
    m1, m2 = RICE.getmarginal_rice_models(emissionyear=emissionyear, datafile=datafile)

    run(m1)
    run(m2)

    c1 = m1[:neteconomy, :C]
    c2 = m2[:neteconomy, :C]

    # Calculate the marginal damage between run 1 and 2 for each
    # year/region
    marginaldamage = -(c2.-c1) .* 10^12 / 10^9 / 10

    return marginaldamage
end

function getRICEdata()
    # Convert from $2005 to $2015
    # taken from http://www.bls.gov/data/inflation_calculator.htm
    const priceInflator = 1.22

    rice_regions = ["US", "EU", "Japan", "Russia", "Eurasia", "China", "India", "MidEast", "Africa", "LatAm", "OHI", "OthAsia"]

    RICE_datafile = joinpath(dirname(@__FILE__), "..", "mimi-rice-2010", "data", "RICE_2010_base_000.xlsm")
    m = RICE.getrice(datafile=RICE_datafile)
    run(m)

    pop1 = m[:grosseconomy, :L] .* 10.^6
    cpc1 = m[:neteconomy, :CPC] .* 1000.
    marginaldamage = getmarginaldamages_rice_consumption_based(emissionyear=2015, datafile=RICE_datafile)

    # Interpolate missing years due to 10 year timestep
    marginaldamage = repeat(marginaldamage, inner=[10,1])
    pop1 = repeat(pop1, inner=[10,1])
    cpc1 = repeat(cpc1, inner=[10,1])

    # Remove anything before the year 2015
    cpc1 = cpc1[11:end,:]
    pop1 = pop1[11:end,:]
    marginaldamage = marginaldamage[11:end,:]

    # Adjust price level
    cpc1 = cpc1 .* priceInflator
    marginaldamage = marginaldamage .* priceInflator

    return marginaldamage, cpc1, pop1, rice_regions
end

# This function takes the regional outputs from a model and aggregates them up to global numbers,
# thus emulating an equivalent global model
function getGlobalVersion(marginaldamage, cpc, pop)
    g_md = sum(marginaldamage, 2)
    g_pop = sum(pop, 2)
    g_cpc = sum(cpc .* pop, 2) ./ g_pop

    return g_md, g_cpc, g_pop
end

# This function actually runs all the models, and stores the results in a number of dicts.
function getalldata()
    md_rice, cpc_rice, pop_rice, rice_regions = getRICEdata()
    md_riceg, cpc_riceg, pop_riceg = getGlobalVersion(md_rice, cpc_rice, pop_rice)

    cpcs = Dict{String,Matrix{Float64}}()
    mds = Dict{String,Matrix{Float64}}()
    pops = Dict{String,Matrix{Float64}}()
    regions = Dict{String, Vector{String}}()

    mds["RICE"] = md_rice
    mds["RICEg"] = md_riceg

    cpcs["RICE"] = cpc_rice
    cpcs["RICEg"] = cpc_riceg

    pops["RICE"] = pop_rice
    pops["RICEg"] = pop_riceg

    regions["RICE"] = rice_regions

    return mds, cpcs, pops, regions
end

mds, cpcs, pops, regions = getalldata();

# Write raw maringal damage, consumption per capita and population to output files
writecsv(joinpath(dirname(@__FILE__), "..", "..", "results", "output-marginaldamage.csv"), vcat(hcat(["Year"], reshape(regions["RICE"],(1,12))), hcat(2015:2604, mds["RICE"])))
writecsv(joinpath(dirname(@__FILE__), "..", "..", "results", "output-cpc.csv"), vcat(hcat(["Year"], reshape(regions["RICE"],(1,12))), hcat(2015:2604, cpcs["RICE"])))
writecsv(joinpath(dirname(@__FILE__), "..", "..", "results", "output-population.csv"), vcat(hcat(["Year"], reshape(regions["RICE"],(1,12))), hcat(2015:2604, pops["RICE"])))

# 2. Compute SCC
# ==============

# u, derivative of u and derivative of g function
u(x, η) = η==1. ? log(x) : x^(1-η) / (1-η)
du(x, η) = x^-η
dg(x, γ) = x^-γ

# Marginal welfare function
dSWF(cpc, ρ, γ, η, c₀, t) = dg( u(cpc, η)-u(c₀, η), γ ) * du(cpc, η) * (1.+ρ)^(-t+1)

# Compute the SCC in welfare units. This is the first step for all normalizations
function SCCinWels(cpc, pop, md, ρ, γ, η, c₀)
    # Weight each marginal damage with the corresponding marginal welfare, then sum
    scc = 0.
    for t=1:size(cpc,1), r=1:size(cpc,2)
        scc += md[t,r] * dSWF(cpc[t,r], ρ, γ, η, c₀, t)
    end

    # Convert from $/tC to $/tCO2
    scco2 = scc/(44/12)

    return scco2
end

# Compute the SCC for various normalizations
function SCCinUSD(cpc, pop, md, ρ, γ, η, c₀)
    # First obtain an estimate in wels units
    scc_in_wels = SCCinWels(cpc, pop, md, ρ, γ, η, c₀)

    # Compute world average consumption in period 1
    cons = 0.
    for r=1:size(cpc,2)
        cons += cpc[1,r] * pop[1,r]
    end
    gcpc1 = cons / sum(pop[1,:])

    # First normalize with average per capita consumption at time 1
    scc_in_USD_average = scc_in_wels / dSWF(gcpc1, ρ, γ, η, c₀, 1)
    # Normalize with per capita consumptions of all regions at time 1
    scc_in_USD = [scc_in_wels / dSWF(cpc[1,r], ρ, γ, η, c₀, 1) for r = 1:size(cpc,2)]

    # Normalize with the fair sharing rule
    scc_fair_sharing_rule = scc_in_wels / sum([dSWF(cpc[1,r], ρ, γ, η, c₀, 1) * cpc[1,r] * pop[1,r] / cons for r = 1:size(cpc,2)])

    return scc_in_USD_average, scc_in_USD, scc_fair_sharing_rule, scc_in_wels
end

# This sets up the grid for which we are going to evaluate the SCC
models = ["RICE", "RICEg"]
aggregations = [:Global, :Regional]
ρs = collect(0.:0.005:0.03)
γs = collect(0.:0.25:3.)
ηs = collect(0.:0.25:3.)
# Compute minimum per capita consumption as upper bound for c0 range
min_cpc = minimum([minimum(cpcs[i]) for i in keys(cpcs)])
c₀s = vcat([1.], collect(100.:100.:min_cpc-1.))
if c₀s[end] != min_cpc
    c₀s = vcat(c₀s, [min_cpc-1.])
end;

# Run all parameter combinations, store the results in a DataFrame and write it to disk for the plotting routine
# All numbers are in $/tCO2 in USD2015.

df = DataFrame([String, String, String, Float64, Float64, Float64, Float64, Float64], [:model, :aggregation, :focusregion, :rho, :gamma, :eta, :c0, :SCC], 0)

p = Progress(length(models) * length(ρs) * length(γs) * length(ηs) * length(c₀s), 1)

for model in models, ρ in ρs, γ in γs, η in ηs, c₀ in c₀s
    v_avg, v_foc, scc_fair_sharing, scc_wels = SCCinUSD(cpcs[model], pops[model], mds[model], ρ, γ, η, c₀)
    if model[end] == 'g'
        push!(df, [model[1:end-1], "Global", "Global", ρ, γ, η, c₀, v_avg])
    else
        push!(df, [model, "Regional", "Global-Average", ρ, γ, η, c₀, v_avg])
        push!(df, [model, "Regional", "World-Fair", ρ, γ, η, c₀, scc_fair_sharing])
        push!(df, [model, "Regional", "Utils", ρ, γ, η, c₀, scc_wels])
        for (r,v) in enumerate(v_foc)
            push!(df, [model, "Regional", regions[model][r], ρ, γ, η, c₀, v])
        end
    end
    next!(p)
end
writetable(joinpath(dirname(@__FILE__), "..", "..", "results", "output-scc.csv"), df)

# 3. Other results
# ================

# 3.1. Poorest region
# -------------------

for region in keys(cpcs)
    if !endswith(region, "g")
        poorest_region_index = indmin(cpcs[region][1,:])
        println(region, ": ", regions[region][poorest_region_index])
    end
end
println("Highest C₀: $(c₀s[end])")


text:
csv_dir = Pkg.dir("D4M") * "/examples/1Intro/2EdgeArt/Edge.csv"
print(csv_dir)

E = ReadCSV(csv_dir);                       # Read CSV file into associative array.
Ev = logical( E[:, StartsWith("V,")] );        # Get vertices and convert to numbers.

EvO = Ev[StartsWith("O,"),:];                  # Get orange edges.
EvG = Ev[StartsWith("G,"),:];                  # Get green edges.

AvOG = transpose(EvO) * EvG;                   # Compute vertex adjacency graph.
       print(AvOG);                             # Show empty structure.

       AeOG = EvO * transpose(EvG);                   # Compute edge adjacency graph.
       print(AeOG);                             # Show in tabular form.

       AeOG = CatKeyMul(EvO,transpose(EvG));          # Compute edge adjacency graph preserving pedigree.
       print(AeOG);

ext: jl


text:
"""
    resonance_nonlinear_eigenproblem(sim, k, ka=0, kb=0; kwargs...)
"""
function resonance_nonlinear_eigenproblem(sim::Simulation, k::Number, ka::Number=0, kb::Number=0; kwargs...)
    N,brgs = sim.dis.N,(sim.dis.coordinate_system,sim.bnd.∂Ω,sim.bnd.bc,sim.bnd.bl)
    (∇²,fs,s),defs = laplacian(N,brgs...,k,ka,kb,0)
    for i ∈ eachindex(∇²)
        ∇²[i] = (∇²[i] + SparseMatrixCSC(transpose(∇²[i])))/2
    end
    B = s*spdiagm(0=>sim.sys.ε[:])
    push!(∇²,B)
    push!(fs,k->k^2)
    return SPMF_NEP(∇²,fs; check_consistency=false, kwargs...)
end


text:
# using FWF
using Test

@testset "read" begin
    d, n = FWF.read("data/test1.txt", [8,8,8,8,8])
    @test d == [["     0.8", "   0.103", "  0.3164"],
                ["  0.4093", "  0.4704", "    0.16"],
                ["     0.7", "    0.12", "    0.85"],
                ["  0.4868", "    0.09", "    0.88"],
                ["   0.846", "    0.15", "     0.4"]]
    @test n == [ :a, :bb, :ccc, :dddd, :eeeee]
    @test_warn "Warning: Malformed actual data line number 1" FWF.read("data/test1.txt", [8,8,8,8,8], skipblank=false, skip=1)
    @test_throws ErrorException FWF.read("data/test1.txt", [8,8,8,8,8], skipblank=false, skip=1, errorlevel=:error)
    d, n = FWF.read("data/test1.txt", [8,8,8,8,8], skipblank=false, skip=1, errorlevel=nothing)
    @test d == [["", "     0.8", "   0.103", "  0.3164"],
                ["", "  0.4093", "  0.4704", "    0.16"],
                ["", "     0.7", "    0.12", "    0.85"],
                ["", "  0.4868", "    0.09", "    0.88"],
                ["", "   0.846", "    0.15", "     0.4"]]
    @test n == [:a, :bb, :ccc, :dddd, :eeeee]
    d, n = FWF.read("data/test1.txt", [8,8,8,8,8], stripheader=nothing)
    @test d == [["     0.8", "   0.103", "  0.3164"],
                ["  0.4093", "  0.4704", "    0.16"],
                ["     0.7", "    0.12", "    0.85"],
                ["  0.4868", "    0.09", "    0.88"],
                ["   0.846", "    0.15", "     0.4"]]
    @test n == [Symbol("a       "),
                Symbol("bb      "),
                Symbol("ccc     "),
                Symbol("dddd    "),
                Symbol("eeeee   ")]
    d, n = FWF.read("data/test1.txt", ' ', header=false, skip=2)
    @test d == [["   0.8", " 0.103", "0.3164"],
                ["0.4093", "0.4704", "  0.16"],
                [" 0.7", "0.12", "0.85"],
                ["0.4868", "  0.09", "  0.88"],
                ["0.846", " 0.15", "  0.4"],
                [" 0.79", " 0.15", "0.349"]]
    @test n == [:x1, :x2, :x3, :x4, :x5, :x6]
    @test_warn "Warning: Malformed actual data line number 3" FWF.read("data/test2.txt", [8,8,8,8,8], skipblank=false)
    d, n = FWF.read("data/test2.txt", [8,8,8,8,8], skipblank=false, errorlevel=nothing)
    @test d ==  [["   0.477", "  0.8395", "", "  0.4477"],
                 ["     0.3", "  0.2405", "", "    0.57"],
                 ["  0.2039", "     0.3", "", "       0"],
                 ["     0.5", "   0.526", "", "  0.0512"],
                 ["    0.77", "       1", "", "    0.93"]]
    @test n == [:a, :bb, :ccc, :dddd, :eeeee]
    @test_warn "Warning: Malformed actual data line number 2" FWF.read("data/test3.txt", [1,1,1,1,1],keep=[true,false,true,false,true])
    d, n = FWF.read("data/test3.txt", [1,1,1,1,1],keep=[true,false,true,false,true], errorlevel=nothing)
    @test d ==  [["1", "1", " "], ["2", "2", "2"], ["3", "", "3"]]
    @test n == [:a, :b, :c]
    d, n = FWF.read("data/test3.txt", [1:1, 3:3, 5:5], errorlevel=:no)
    @test d ==  [["1", "1", " "], ["2", "2", "2"], ["3", "", "3"]]
    @test n == [:a, :b, :c]
    d, n = FWF.read("data/test3.txt", ' ', errorlevel=:no)
    @test d ==  [["1", "1", " "], ["2 3", "2", "2 3"]]
    @test n == [:a, Symbol("b c")]
end

@testset "range2width" begin
    @test FWF.range2width(UnitRange{Int}[]) == (width=Int[], keep=Int[])
    @test FWF.range2width([1:1, 3:3, 4:5]) == (width = [1, 1, 1, 2],
                                               keep = Bool[true, false, true, true])

    @test_throws ArgumentError FWF.range2width([-1:3])
    @test_throws ArgumentError FWF.range2width([1:3, 3:4])
    @test_throws ArgumentError FWF.range2width([1:3, 4:3])

    test_widths = rand(1:10, 100)
    test_ranges = [1:test_widths[1]]
    for w in test_widths[2:end]
        push!(test_ranges, (test_ranges[end].stop+1):(test_ranges[end].stop+w))
    end
    w, k = FWF.range2width(test_ranges)
    @test w == test_widths
    @test all(k)

    test_ranges = [2:(test_widths[1]+1)]
    for w in test_widths[2:end]
        push!(test_ranges, (test_ranges[end].stop+2):(test_ranges[end].stop+w+1))
    end
    w, k = FWF.range2width(test_ranges)
    @test w[k] == test_widths
    @test all(w[.!k] .== 1)
end

@testset "impute" begin
    @test FWF.impute(["a", "b", "c"]) == ["a", "b", "c"]
    @test FWF.impute(["a", "b", "NA"]) == ["a", "b", "NA"]
    @test FWF.impute(["1", "2", "3"]) == [1, 2, 3]
    @test eltype(FWF.impute(["1", "2", "3"])) == Int
    @test FWF.impute(["1", "2.0", "3"]) == [1.0, 2.0, 3.0]
    @test eltype(FWF.impute(["1", "2.0", "3"])) == Float64
    @test isequal(FWF.impute(["1", "2", "NA"]), [1, 2, missing])
    @test isequal(FWF.impute(["1", "2", " NA "]), [1, 2, missing])
    @test isequal(FWF.impute(["1", "2.0", ""]), [1.0, 2.0, missing])
    @test isequal(FWF.impute(["1", "2.0", "\t "]), [1.0, 2.0, missing])
    @test FWF.impute(["1", "2.0", "\t ", "a"]) == ["1", "2.0", "\t ", "a"]
end

@testset "scan" begin
    @test FWF.scan("data/test1.txt") == [1:1, 3:19, 21:48]
    @test FWF.scan("data/test1.txt", skip=2) == [3:8, 11:16, 21:24, 27:32, 36:40, 44:48]
    @test FWF.scan("data/test1.txt", [' ';'a':'f']) == [3:8, 11:16, 21:24, 27:32, 36:40, 44:48]
    @test FWF.scan("data/test2.txt") == [1:1, 3:48]
    @test FWF.scan("data/test2.txt", skip=1) == [3:8, 11:16, 19:24, 27:32, 37:40, 43:48]
    @test FWF.scan("data/test2.txt", [' ';'a':'f']) == [3:8, 11:16, 19:24, 27:32, 37:40, 43:48]
    @test FWF.scan("data/test2.txt", nrow=1) == [1:1, 9:10, 17:19, 25:28, 33:37, 41:46]
    @test FWF.scan("data/test2.txt", 'X') == [1:48]
    @test FWF.scan("data/test2.txt", skipblank=false) == [1:48]
    @test isempty(FWF.scan("data/test2.txt", nrow=-1))
    @test FWF.scan("data/test3.txt") == [1:1, 3:5]
    @test FWF.scan("data/test3.txt", nrow=2) == [1:1, 3:3, 5:5]
    @test FWF.scan("data/test3.txt", nrow=3) == [1:1, 3:5]
end

@testset "write" begin
    data = [[1, 2, 31], ["abc", "defg"], [true, false, true], [1, 11, 111]]
    io = IOBuffer()
    FWF.write(io, data)
    @test String(take!(io)) == "1  abc  true  1\n2  defg false 11\n31      true  111\n"

    io = IOBuffer()
    FWF.write(io, data, ['a', 'b', missing, 'd'], space=3, blank='~', na="missing")
    @test String(take!(io)) == "a~~~~b~~~~~~~~~missing~~~d\n1~~~~abc~~~~~~~true~~~~~~1\n2~~~~defg~~~~~~false~~~~~11\n31~~~missing~~~true~~~~~~111\n"

    srand(1)
    data = round.(rand(3,5), 3)
    io = IOBuffer()
    FWF.write(io, data, 'a':'e', space=2, blank='|')
    @test String(take!(io)) == "a||||||b||||||c||||||d||||||e\n0.236||0.008||0.952||0.987||0.425\n0.347||0.489||1.0||||0.556||0.773\n0.313||0.211||0.252||0.437||0.281\n"

    data = convert(Matrix{Union{Missing, Float64}}, data)
    data[1,1] = missing
    data[2,2] = missing
    data[3,5] = missing
    io = IOBuffer()
    FWF.write(io, data, 'a':'e', space=2, blank='|')
    @test String(take!(io)) == "a||||||b||||||c||||||d||||||e\n|||||||0.008||0.952||0.987||0.425\n0.347|||||||||1.0||||0.556||0.773\n0.313||0.211||0.252||0.437||\n"

    io = IOBuffer()
    FWF.write(io, data, 'a':'e', space=2, blank='|', na="missing")
    @test String(take!(io)) == "a||||||||b||||||||c||||||d||||||e\nmissing||0.008||||0.952||0.987||0.425\n0.347||||missing||1.0||||0.556||0.773\n0.313||||0.211||||0.252||0.437||missing\n"

    io = IOBuffer()
    FWF.write(io, data, 'a':'e', space=0, blank='_', na="NA")
    @test String(take!(io)) == "a____b____c____d____e\nNA___0.0080.9520.9870.425\n0.347NA___1.0__0.5560.773\n0.3130.2110.2520.437NA\n"
end

max_stars_repo_name: bkamins/FWF-deprecated

max_issues_repo_name: bkamins/FWF-deprecated

max_forks_repo_name: bkamins/FWF-deprecated


text:
function loadCircleData(num_data)
    center = [5.0, 5.0]
    radiu_inner = 2
    radiu_outer = 4
    num_inner = floor(num_data / 3)
    num_outer = num_data - num_inner

    data = []
    theta = 0.0
    print(1)
    for i in 1:num_inner
        pho = (theta % 360) * pi / 180
        tmp = zeros(1,2)
        tmp[1] = radiu_inner * cos(pho) + rand() + center[1]
        tmp[2] = radiu_inner * sin(pho) + rand() + center[2]
        push!(data,temp)
        theta += 2
    end

    theta = 0.0
    for i in 1:num_outer
        pho = (theta % 360) * pi / 180
        tmp = zeros(1,2)
        tmp[1] = radiu_outer * cos(pho) + rand() + center[1]
        tmp[2] = radiu_outer * sin(pho) + rand() + center[2]
        push!(data,tmp)
        theta += 1
    end

    Mat_Label = zeros(2, 2)
    Mat_Label[1,:] = center + [ 0.5 - radiu_inner , 0]
    Mat_Label[2,:] = center + [ 0.5 - radiu_outer , 0]
    labels = [1, 2]
    Mat_Unlabel = reduce(hcat,data)
    return Mat_Label, labels, Mat_Unlabel
end


text:
using Luxor

Drawing(400, 400, "logo.png")
origin()
background("white")
sethue("black")
squircle(Point(0,0), 150, 150, rt=0.3)
strokepath()
hoffset = 6.25
f(t) = Point(t-hoffset, cos(t)+3)
g(t) = Point(t-hoffset, cos(t+π/2))
h(t) = Point(t-hoffset, cos(t+π)-3)
setline(15)
fontsize(35)
@layer begin
    setopacity(0.4)
    sethue(Luxor.julia_red)
    poly(20f.(range(0, 4π, length=160)), :stroke)
    sethue(Luxor.julia_green)
    poly(20g.(range(0, 4π, length=160)), :stroke)
    sethue(Luxor.julia_purple)
    poly(20h.(range(0, 4π, length=160)), :stroke)
end
fontsize(135)
fontface("Helvetica")
text("WW", halign=:center, valign=:middle)
finish()
preview()


text:
################################################################################
#
#   SQUARE OCTAGON LATTICE
#
################################################################################

# Implementation
# - implementation 1 (simple)
# - labels <: Any
function getUnitcellSquareOctagon(
            unitcell_type  :: Type{U},
            implementation :: Val{1}
        ) :: U where {LS,LB,S<:AbstractSite{LS,2},B<:AbstractBond{LB,2}, U<:AbstractUnitcell{S,B}}

    # return a new Unitcell
    return newUnitcell(
        # Type of the unitcell
        U,
        # Bravais lattice vectors
        Vector{Float64}[
            Float64[3*sqrt(3.0)/4., -3*sqrt(3.0)/4.],
            Float64[3*sqrt(3.0)/4., 3*sqrt(3.0)/4.]
        ],
        # Sites
        S[
            newSite(S, Float64[0.0, 0.0], getDefaultLabelN(LS,1)),
            newSite(S, Float64[0.0, 1/sqrt(3.0)], getDefaultLabelN(LS,2)),
            newSite(S, Float64[-1/sqrt(3.0), 0.0], getDefaultLabelN(LS,3)),
            newSite(S, Float64[-1/sqrt(3.0), 1/sqrt(3.0)], getDefaultLabelN(LS,4)),
        ],
        # Bonds
        B[
            newBond(B, 1, 2, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 2, 4, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 4, 3, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 1, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 2, 1, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 4, 2, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 4, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 1, 3, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 2, getDefaultLabel(LB), ( 0, -1)),
            newBond(B, 2, 3, getDefaultLabel(LB), ( 0, +1)),
            newBond(B, 4, 1, getDefaultLabel(LB), ( -1, 0)),
            newBond(B, 1, 4, getDefaultLabel(LB), ( +1, 0))
        ]
    )
end

# Implementation
# - implementation 2 (scaled shifted simple)
# - labels <: Any
function getUnitcellSquareOctagon(
            unitcell_type  :: Type{U},
            implementation :: Val{2}
        ) :: U where {LS,LB,S<:AbstractSite{LS,2},B<:AbstractBond{LB,2}, U<:AbstractUnitcell{S,B}}

    # return a new Unitcell
    return newUnitcell(
        # Type of the unitcell
        U,
        # Bravais lattice vectors
        Vector{Float64}[
            Float64[1.0 + 1/sqrt(2.0), -(1.0 + 1/sqrt(2.0))],
            Float64[1.0 + 1/sqrt(2.0),  (1.0 + 1/sqrt(2.0))]
        ],
        # Sites
        S[
            newSite(S, Float64[ 0.5, -0.5], getDefaultLabelN(LS,1)),
            newSite(S, Float64[ 0.5,  0.5], getDefaultLabelN(LS,2)),
            newSite(S, Float64[-0.5, -0.5], getDefaultLabelN(LS,3)),
            newSite(S, Float64[-0.5,  0.5], getDefaultLabelN(LS,4)),
        ],
        # Bonds
        B[
            newBond(B, 1, 2, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 2, 4, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 4, 3, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 1, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 2, 1, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 4, 2, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 4, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 1, 3, getDefaultLabel(LB), ( 0, 0)),
            newBond(B, 3, 2, getDefaultLabel(LB), ( 0, -1)),
            newBond(B, 2, 3, getDefaultLabel(LB), ( 0, +1)),
            newBond(B, 4, 1, getDefaultLabel(LB), ( -1, 0)),
            newBond(B, 1, 4, getDefaultLabel(LB), ( +1, 0))
        ]
    )
end

# Implementation
# - implementation 4 (simple Kitaev)
# - labels <: Any
function getUnitcellSquareOctagon(
            unitcell_type  :: Type{U},
            implementation :: Val{4}
        ) :: U where {LS,LB,S<:AbstractSite{LS,2},B<:AbstractBond{LB,2}, U<:AbstractUnitcell{S,B}}

    # return a new Unitcell
    return newUnitcell(
        # Type of the unitcell
        U,
        # Bravais lattice vectors
        Vector{Float64}[
            Float64[3*sqrt(3.0)/4., -3*sqrt(3.0)/4.],
            Float64[3*sqrt(3.0)/4., 3*sqrt(3.0)/4.]
        ],
        # Sites
        S[
            newSite(S, Float64[0.0, 0.0], getDefaultLabelN(LS,1)),
            newSite(S, Float64[0.0, 1/sqrt(3.0)], getDefaultLabelN(LS,2)),
            newSite(S, Float64[-1/sqrt(3.0), 0.0], getDefaultLabelN(LS,3)),
            newSite(S, Float64[-1/sqrt(3.0), 1/sqrt(3.0)], getDefaultLabelN(LS,4)),
        ],
        # Bonds
        B[
            newBond(B, 1, 2, getDefaultLabelX(LB), ( 0, 0)),
            newBond(B, 2, 4, getDefaultLabelY(LB), ( 0, 0)),
            newBond(B, 4, 3, getDefaultLabelX(LB), ( 0, 0)),
            newBond(B, 3, 1, getDefaultLabelY(LB), ( 0, 0)),
            newBond(B, 2, 1, getDefaultLabelX(LB), ( 0, 0)),
            newBond(B, 4, 2, getDefaultLabelY(LB), ( 0, 0)),
            newBond(B, 3, 4, getDefaultLabelX(LB), ( 0, 0)),
            newBond(B, 1, 3, getDefaultLabelY(LB), ( 0, 0)),
            newBond(B, 3, 2, getDefaultLabelZ(LB), ( 0, -1)),
            newBond(B, 2, 3, getDefaultLabelZ(LB), ( 0, +1)),
            newBond(B, 4, 1, getDefaultLabelZ(LB), ( -1, 0)),
            newBond(B, 1, 4, getDefaultLabelZ(LB), ( +1, 0))
        ]
    )
end

# Implementation
# - implementation 5 (scaled shifted simple Kitaev)
# - labels <: Any
function getUnitcellSquareOctagon(
            unitcell_type  :: Type{U},
            implementation :: Val{5}
        ) :: U where {LS,LB,S<:AbstractSite{LS,2},B<:AbstractBond{LB,2}, U<:AbstractUnitcell{S,B}}

    # return a new Unitcell
    return newUnitcell(
        # Type of the unitcell
        U,
        # Bravais lattice vectors
        Vector{Float64}[
            Float64[1.0 + 1/sqrt(2.0), -(1.0 + 1/sqrt(2.0))],
            Float64[1.0 + 1/sqrt(2.0),  (1.0 + 1/sqrt(2.0))]
        ],
        # Sites
        S[
            newSite(S, Float64[ 0.5, -0.5], getDefaultLabelN(LS,1)),
            newSite(S, Float64[ 0.5,  0.5], getDefaultLabelN(LS,2)),
            newSite(S, Float64[-0.5, -0.5], getDefaultLabelN(LS,3)),
            newSite(S, Float64[-0.5,  0.5], getDefaultLabelN(LS,4)),
        ],
        # Bonds
        B[
        newBond(B, 1, 2, getDefaultLabelX(LB), ( 0, 0)),
        newBond(B, 2, 4, getDefaultLabelY(LB), ( 0, 0)),
        newBond(B, 4, 3, getDefaultLabelX(LB), ( 0, 0)),
        newBond(B, 3, 1, getDefaultLabelY(LB), ( 0, 0)),
        newBond(B, 2, 1, getDefaultLabelX(LB), ( 0, 0)),
        newBond(B, 4, 2, getDefaultLabelY(LB), ( 0, 0)),
        newBond(B, 3, 4, getDefaultLabelX(LB), ( 0, 0)),
        newBond(B, 1, 3, getDefaultLabelY(LB), ( 0, 0)),
        newBond(B, 3, 2, getDefaultLabelZ(LB), ( 0, -1)),
        newBond(B, 2, 3, getDefaultLabelZ(LB), ( 0, +1)),
        newBond(B, 4, 1, getDefaultLabelZ(LB), ( -1, 0)),
        newBond(B, 1, 4, getDefaultLabelZ(LB), ( +1, 0))
        ]
    )
end


text:
include("dwt.jl")

function compressaudio(channels, p, l, h, threshold)
    # Split channels
    left = channels[:,1]
    right = channels[:,2]

    # Pad signals with zeros
    len = length(left)
    J = Integer(ceil(log2(length(left))))
    N = 2^J
    left = [left; zeros(N - len)]
    right = [right; zeros(N - len)]

    # Perfom transforms
    wleft, nstop = mallatdecomp(left,l,h,p)
    wright, _ = mallatdecomp(right,l,h,p)

    # Compress
    tleft = threshold * maximum(abs.(wleft))
    ileft = abs.(wleft) .> tleft
    tright = threshold * maximum(abs.(wright))
    iright = abs.(wright) .> tright

    # Generate return values
    wleft = wleft[ileft]
    wright = wright[iright]
    s = sizeof(wleft) + sizeof(wright) + sizeof(ileft) + sizeof(iright) +
        sizeof(nstop) + sizeof(len)
    return ((wleft, ileft, wright, iright, nstop, len), s)
end

function decompressaudio(compression, p, il, ih)
    # Unpack compression
    cleft, ileft, cright, iright, nstop, len = compression

    # Decompress left channel
    wleft = zeros(length(ileft))
    j = 1
    for i = 1:length(wleft)
        if ileft[i]
            wleft[i] = cleft[j]
            j += 1
        end
    end

    # Decompress right channel
    wright = zeros(length(iright))
    j = 1
    for i = 1:length(wright)
        if iright[i]
            wright[i] = cright[j]
            j += 1
        end
    end

    # Perform inverse transforms
    left = mallatrecon(wleft,nstop,il,ih)
    right = mallatrecon(wright,nstop,il,ih)

    # Unpad
    left = left[1:len]
    right = right[1:len]
    return [left right]
end


text:
export bm_count, string4, code_check, random_code

"""
`code_check(c::Int)` checks that `c` is a valid code
(between 0000 and 9999 inclusive). Returns `true`
if valid and throws an error if not.
"""
@inline function code_check(c::Int)::Bool
    (c >= 0) && (c <= 9999)
end

"""
`bad_code_message(c)` creates a string giving an error message
to be used when `c` is invalid.
"""
@inline function bad_code_message(c::Int)::String
    "Code $c is invalid; must be in the range 0000 to 9999."
end

"""
`string4(c::Int)` renders the code number `c` as a four-digit `String`.
```
julia> string4(17)
"0017"
```
"""
function string4(c::Int)::String
    code_check(c)
    cc = reverse(digits(c, pad = 4))
    result = ""
    for i = 1:4
        result *= "$(cc[i])"
    end
    return result
end

"""
`bm_count(c::Int,d::Int)` counts the number of bullets and maggots
when comparing the codes `c` and `d`; this is returned as a
tuple `(b,m)`.
"""
@inline function bm_count(c::Int, d::Int)::Tuple{Int,Int}
    if bm_flag
        return bm_table_fetch(c, d)
    else
        return slow_bm_count(c, d)
    end
end

function slow_bm_count(c::Int, d::Int)::Tuple{Int,Int}

    # break codes into an array of digits
    cc = digits(c, pad = 4)
    dd = digits(d, pad = 4)

    # flags to show if that digit is available to be matched
    c_avail = [true, true, true, true]
    d_avail = [true, true, true, true]

    # counts of bullets & maggots
    b = 0
    m = 0

    # count bullets
    for i = 1:4
        if cc[i] == dd[i]  # we have a bullet; mark digits as used
            b += 1
            c_avail[i] = false
            d_avail[i] = false
        end
    end

    # count maggots
    for i = 1:4
        for j = 1:4
            if i != j && c_avail[i] && d_avail[j] && cc[i] == dd[j]
                m += 1
                c_avail[i] = false
                d_avail[j] = false
            end
        end
    end

    return b, m
end

@inline function random_code()
    mod(rand(Int), 10000)
end

# various first-guess servers

vec2int(v::Vector{Int}) = 1000 * v[1] + 100 * v[2] + 10 * v[3] + v[4]

function rand_digit(exclude::Vector{Int} = Int[])
    d = rand(0:9)
    while in(d, exclude)
        d = rand(0:9)
    end
    return d
end

function guess_distinct()
    v = -ones(Int, 4)
    for j = 1:4
        v[j] = rand_digit(v)
    end
    return vec2int(v)
end

function guess_one_pair()
    v = -ones(Int, 4)
    v[1] = rand_digit()
    v[2] = v[1]
    for i = 3:4
        v[i] = rand_digit(v)
    end
    shuffle!(v)
    return vec2int(v)
end

function guess_two_pairs()
    v = -ones(Int, 4)
    v[1] = rand_digit()
    v[2] = v[1]
    v[3] = rand_digit(v)
    v[4] = v[3]
    shuffle!(v)
    return vec2int(v)
end

guess_any() = rand(0:9999)

export guess_one_pair, guess_two_pairs, guess_any, guess_distinct


text:
struct PointForce{T}
    x :: Tuple{Float64,Float64}
    f0 :: Union{Float64,Tuple{Float64,Float64}}
    t0 :: Float64
    σ :: Float64
    fbuffer :: Union{ScalarData,VectorData}
    ubuffer :: T
    regop :: Regularize
end

"""
    PointForce(u::Union{Nodes,Edges},x0::Tuple{Float64,Float64},f0,t0,σ,sys::NavierStokes)

Constructor function that immerses a point force in the `u`-type data of system `sys`,
of strength `f0` to be applied at physical position `x0`, modulated by a Gaussian
centered at time `t0` with standard deviation `σ`. The data `u` should be of either
`Nodes` or `Edges` type. If `Nodes`, then `f0` should be a scalar; if `Edges`,
then `f0` should be a tuple.

The resulting function is a function of time and generates a field on `u`-type data.
"""
function PointForce(w₀::T,x0::Tuple{Float64,Float64},
                    f0::Union{Float64,Tuple{Float64,Float64}},
                    t0::Float64,σ::Float64,
        sys::NavierStokes) where {T <: Union{Nodes,Edges}}
    Xf = VectorData([x0[1]],[x0[2]])
    Ff = (T <: Nodes) ? ScalarData(Xf) : VectorData(Xf)
    Ff .= f0

    regop = Regularize(Xf,Fields.cellsize(sys);I0=Fields.origin(sys),issymmetric=true)
    PointForce{T}(x0,f0,t0,σ,Ff,T(),regop)
end

(f::PointForce)(t) = f.regop(f.ubuffer,rmul!(deepcopy(f.fbuffer),exp(-(t-f.t0)^2/f.σ^2)))

function Base.show(io::IO,f::PointForce{T}) where {T}
    println(io,"Transient point force applied on the $(T) field.")
    println(io,"   strength = $(f.f0)")
    println(io,"   location = $(f.x)")
    println(io,"   central time = $(f.t0)")
    println(io,"   half-interval = $(f.σ)")
end


text:
export rotate
export getrotation
export applyconfig

rotate(g::Quaternion, q::Quaternion) = g * q
rotate(M::Array{<:Complex,2}, q::ComplexPlane) = ComplexPlane(M * vec(q))
rotate(p::ℝ³, q::Quaternion) = ℝ³(vec(q * Quaternion([0; vec(p)]) * conj(q))[2:4])
rotate(p::Array{ℝ³}, q::Quaternion) = map(x -> rotate(x, q), p)
getrotation(i::ℝ³, n::ℝ³) = begin
    if isapprox(i, n)
        return Quaternion(0, normalize(i))
    end
    u = normalize(cross(i, n))
    θ = acos(dot(normalize(i), normalize(n))) / 2
    Quaternion(θ, u)
end

"""
    applyconfig(p, q)

Apply a rigid body transformation in 3-space with the given array of points `p` and
configuration `q`.
"""
function applyconfig(p::Array{ℝ³}, q::Biquaternion)
    map(x -> x + gettranslation(q), rotate(p, getrotation(q)))
end

max_stars_repo_name: iamazadi/geometrizer

max_issues_repo_name: iamazadi/Porta

max_forks_repo_name: iamazadi/Porta


text:
function insertOn!(quad::Quadtree, shape::Shape, level::Int64 = 0)
    index = get_index(quad, shape)

    if(index == 1)
        if(!isdefined(quad, :ne))
            quad.ne = Quadtree(split!(quad, index))
        end
        level += 1
        insertOn!(quad.ne, shape, level)

    elseif(index == 2)
        if(!isdefined(quad, :nw))
            quad.nw = Quadtree(split!(quad, index))
        end
        level += 1
        insertOn!(quad.nw, shape, level)

    elseif(index == 3)
        if(!isdefined(quad, :sw))
            quad.sw = Quadtree(split!(quad, index))
        end
        level += 1
        insertOn!(quad.sw, shape, level)

    elseif(index == 4)
        if(!isdefined(quad, :se))
            quad.se = Quadtree(split!(quad, index))
        end
        level += 1
        insertOn!(quad.se, shape, level)

    else
        push!(quad.objects, shape)
        max_level_quadtree[1] = max_level_quadtree[1] < level ? level : max_level_quadtree[1]
        level = 0
        return quad.objects
    end

end


text:
using Adapt
using KernelAbstractions

using Oceananigans.Fields: AbstractDataField, FieldStatus, validate_field_data, conditional_compute!
using Oceananigans.Fields: architecture, tracernames
using Oceananigans.Architectures: device
using Oceananigans.Utils: work_layout
using Oceananigans.Grids: new_data

import Oceananigans.Fields: compute!, compute_at!

import Oceananigans: short_show

struct BuoyancyField{B, S, A, D, G, T, C} <: AbstractDataField{Center, Center, Center, A, G, T}
            data :: D
    architecture :: A
            grid :: G
        buoyancy :: B
         tracers :: C
          status :: S

    """
        BuoyancyField(data, grid, buoyancy, tracers)

    Returns a `BuoyancyField` with `data` on `grid` corresponding to
    `buoyancy` computed from `tracers`.
    """
    function BuoyancyField(data::D, arch::A, grid::G, buoyancy::B, tracers::C,
                           recompute_safely::Bool) where {D, A, G, B, C}

        validate_field_data(Center, Center, Center, data, grid)

        status = recompute_safely ? nothing : FieldStatus(zero(eltype(grid)))

        S = typeof(status)
        T = eltype(grid)

        return new{B, S, A, D, G, T, C}(data, arch, grid, buoyancy, tracers, status)
    end

    function BuoyancyField(data::D, arch::A, grid::G, buoyancy::B, tracers::C, status::S) where {D, A, G, B, C, S}
        validate_field_data(Center, Center, Center, data, grid)
        T = eltype(grid)
        return new{B, S, A, D, G, T, C}(data, grid, buoyancy, tracers, status)
    end
end

"""
    BuoyancyField(model; data=nothing, recompute_safely=true)

Returns a `BuoyancyField` corresponding to `model.buoyancy`.
Calling `compute!(b::BuoyancyField)` computes the current buoyancy field
associated with `model` and stores the result in `b.data`.
"""
BuoyancyField(model; data=nothing, recompute_safely=true) =
    _buoyancy_field(model.buoyancy, model.tracers, model.architecture, model.grid, data, recompute_safely)

# Convenience for buoyancy=nothing
_buoyancy_field(::Nothing, args...; kwargs...) = nothing

#####
##### BuoyancyTracer
#####

_buoyancy_field(buoyancy::BuoyancyTracerModel, tracers, arch, grid, args...) =
    BuoyancyField(tracers.b.data, arch, grid, buoyancy, tracers, true)

compute!(::BuoyancyField{<:BuoyancyTracerModel}, time=nothing) = nothing

#####
##### Other buoyancy types
#####

function _buoyancy_field(buoyancy::Buoyancy, tracers, arch, grid,
                         data, recompute_safely)

    if isnothing(data)
        data = new_data(arch, grid, (Center, Center, Center))
        recompute_safely = false
    end

    return BuoyancyField(data, arch, grid, buoyancy, tracers, recompute_safely)
end

"""
    compute!(buoyancy_field::BuoyancyField)

Compute the current `buoyancy_field` associated with `buoyancy_field.tracers` and store
the result in `buoyancy_field.data`.
"""
function compute!(buoyancy_field::BuoyancyField, time=nothing)

    data = buoyancy_field.data
    grid = buoyancy_field.grid
    tracers = buoyancy_field.tracers
    buoyancy = buoyancy_field.buoyancy
    arch = architecture(buoyancy_field)

    workgroup, worksize = work_layout(grid, :xyz)

    compute_kernel! = compute_buoyancy!(device(arch), workgroup, worksize)

    event = compute_kernel!(data, grid, buoyancy, tracers; dependencies=Event(device(arch)))

    wait(device(arch), event)

    return nothing
end

compute_at!(b::BuoyancyField{B, <:FieldStatus}, time) where B =
    conditional_compute!(b, time)

"""Compute an `operation` and store in `data`."""
@kernel function compute_buoyancy!(data, grid, buoyancy, tracers)
    i, j, k = @index(Global, NTuple)
    @inbounds data[i, j, k] = buoyancy_perturbation(i, j, k, grid, buoyancy.model, tracers)
end

#####
##### Adapt
#####

Adapt.adapt_structure(to, buoyancy_field::BuoyancyField) = Adapt.adapt(to, buoyancy_field.data)

#####
##### Show
#####

short_show(field::BuoyancyField) = string("BuoyancyField for ", typeof(field.buoyancy))

show(io::IO, field::BuoyancyField) =
    print(io, "$(short_show(field))\n",
          "├── data: $(typeof(field.data)), size: $(size(field.data))\n",
          "├── grid: $(short_show(field.grid))", '\n',
          "├── buoyancy: $(typeof(field.buoyancy))", '\n',
          "├── tracers: $(tracernames(field.tracers))", '\n',
          "└── status: ", show_status(field.status), '\n')


text:
#!/usr/bin/env julia
using BenchmarkTools
using InteractiveUtils
import JSON

const astring = raw"""
"<datafield xmlns=\\"http://viaf.org/viaf/terms#\\" \n dtype=\\"UNIMARC\\" ind1=\\" \\" ind2=\\" \\" tag=\\"215\\">     <subfield code=\\"7\\">ba0yba0y</subfield> <subfield code=\\"8\\">fre   </subfield>     <subfield code=\\"9\\"> </subfield>     <subfield code=\\"a\\">Djelfa, Wilaya de (Alge\u0301rie)</subfield>   </datafield>"
"""[1:end-1]

# look up ascii characters by byte
const ascii = [Char(i) for i in 1:127]

# lookup the meanings of control characters by byte
const controlchars = "bfnrt"
const escchars = fill(0x00, 127)
for c in controlchars
    escchars[codepoint(c)] = codepoint(Meta.parse("'\\$c'"))
end
for c in "\"\\/"
    escchars[codepoint(c)] = convert(UInt8, ascii[codepoint(c)])
end
const BS = codepoint('\\')

struct JSONStringError <: Exception
    var::String
end
Base.show(io, err::JSONStringError) = print(io, "JSONStringerror: $(err.var)")

codelen(i::UInt32) = 4 - (trailing_zeros(0xff000000 | i) >> 3)

# same as: parse(UInt64, str; base=10), but more than 2x faster.
const errptr = Ref(Ptr{UInt8}(0))
function str2uint64(str::Ptr{UInt8}, base::Integer)
    num = ccall(
        :strtoull, Culonglong,
        (Ptr{UInt8}, Ref{Ptr{UInt8}}, Cint),
        str, errptr, base
    )
    unsafe_load(errptr[]) != 0x00 &&
        error("could not convert $(repr(str)) to base $base")
    num
end
str2uint64(str::String, base::Integer) = str2uint64(pointer(str), base)
str2uint64(str) = str2uint64(str, 10)

# I'm sorry for using pointers like this, but it actually makes a huge
# difference vs. allocating a new string every time.
const str_buff = convert(Ptr{UInt8}, Libc.calloc(5, 1))
# why use @inbounds when you have pointer arithmetic?
@inline function addcodepoint!(bytesp::Ptr{UInt8}, bufferp::Ptr{UInt8})
    unsafe_copyto!(str_buff, bytesp, 4)
    codepoint = convert(UInt32, str2uint64(str_buff, 16))
    # the follwing is modified from string() in substring.jl in base.
    chared = reinterpret(UInt32, Char(codepoint))
    len = codelen(chared)
    x = bswap(chared)
    for i in 1:len
        unsafe_store!(bufferp += 1, x % UInt8)
        x >>= 8
    end
    return len
end

function string_unescape!(str::String, buffer::Vector{UInt8})
    bytes = codeunits(str)
    len = length(bytes)
    length(buffer) < len  && throw(BoundsError(buffer, length(bytes)))
    i = j = 0
    @inbounds while (i += 1) <= len
        byte = bytes[i]
        if byte == BS
            byte = bytes[i += 1]
            byte > 127 && throw(JSONStringError("Invalid escape sequence at byte #$i of input. This looks like unicode higher than ASCII"))
            if ascii[byte] == 'u'
                bytes_written = addcodepoint!(pointer(bytes, i+=1), pointer(buffer, j))
                j += bytes_written
                i += 3
            else
                if (escchar = escchars[byte]) == 0x00
                    badchar = "'\\$(ascii[byte])'"
                    throw(JSONStringError("Invalid escape sequence: $badchar at byte #$i"))
                end
                buffer[j += 1] = escchar
            end
        else
            buffer[j += 1] = byte
        end
    end
    return String(@view buffer[1:j])
end

function main()
    # @btime JSON.parse(astring)
    buffer = zeros(UInt8, 1000)
    @btime string_unescape!("\\u0061", $buffer)
    @btime string_unescape!("\\u00eb", $buffer)
    @btime string_unescape!("\\u00eb\\u0061", $buffer)
    @btime string_unescape!("\\u00eb\\u0061\\u00ef", $buffer)
    @btime string_unescape!(astring, $buffer)
    # @btime JSON.parse(astring)
    index = zeros(UInt64, 1000)
    println(string_unescape!("\\u00eb", buffer))
end
main()


text:
include("EnsembleMethods.jl")

# n = 1000
# p = 20
# X = DataFrame(rand(n, p));
# y = rand([true, false], n);
# wgt = repeat([1], inner = n);

# # @time _split_classifcation_error_loss(y, X, wgt, collect(1:p))

# # testing build_tree_df()
# n = 30
# p = 5
# X = DataFrame(randn(n, p));
# y = randn(n);
# X_mis = add_missing(X, 0.10);
# build_tree_df(y, X_mis)

# test build_tree_df() and apply_tree()
n = 500
p = 10
X = DataFrame(randn(n, p));
β = [0.002, 0.001, 0.003, 0.001, 0.01, 0.03, 40.1, 3.8, 50.0, 112.5]
ε = randn(n)
y = ones(n) .+ Array(X) * β .+ ε
X_mis = add_missing(X, 0.30)

fm1 = build_tree_df(y, X_mis)
# res1 = apply_tree(fm1, X_mis)

# rsq(y, res1)
# mean_squared_error(y, res1)

# testing build_forest_df()
# @time fm2 = build_forest_df_novarimp(y, X_mis, 4, 50; nthreads = 2);

@time fm2 = build_forest_df(y, X_mis, 4, 50; nthreads = 2);

# res = apply_forest(fm2, X)

# ds = dataset("datasets", "airquality")
# ds1 = ds[:, 2:6]
# y = convert(Vector, mean_impute(ds[:, 1]))

# fm1 = build_tree_df(y, ds1)

# fm3 = build_forest_df(y, ds1, 5, 50; nthreads = 2)

# y_hat2 = apply_forest(fm3, convert(Matrix{Any}, ds1))

n = 5000
p = 10
X = DataFrame(randn(n, p));
β = [0.002, 0.001, 0.003, 0.001, 0.01, 0.03, 40.1, 3.8, 50.0, 112.5]
ε = randn(n)
y = ones(n) .+ Array(X) * β .+ ε
X_mis = add_missing(X, 0.30)

@code_warntype _classifcation_error_loss(y)

@code_warntype _split_mse_df(y, X, 3)               # tons of type Any variables
@code_warntype build_tree_df(y, X_mis)              # return type is Union{Leaf, Node}

@time _split_mse_df2(y, X, 3)

n = 1000
x_j = randn(n)
y = randn(n)
domain = quantile(x_j, linspace(0.01, 0.99, 99))
@code_warntype _best_mse_loss(y, x_j, domain)


text:
struct Password

    cmin :: Int
    cmax :: Int
    char :: Char
    pass :: String

end

function read_passwords(filename)

    passwords = Password[]
    open(filename) do f
         for line in eachline(f)
             data = split(line)
             cmin, cmax  = parse.(Int, split(data[1],"-"))
             char = first(data[2])
             pass = data[3]
             push!(passwords, Password(cmin, cmax, char, pass))
         end
         return passwords
    end

end

function check1(p)
    p.cmin <= count(c->(c==p.char), p.pass) <= p.cmax
end

function check2(p)
    ans = ((p.pass[p.cmin] == p.char && p.pass[p.cmax] != p.char) ||
          (p.pass[p.cmin] != p.char && p.pass[p.cmax] == p.char) )
    return ans
end

passwords = read_passwords("input02.txt")
println(count(check1.(passwords)))
println(count(check2.(passwords)))

max_stars_repo_name: pnavaro/AdventOfCode

max_issues_repo_name: pnavaro/AdventOfCode

max_forks_repo_name: pnavaro/AdventOfCode


text:
### A Pluto.jl notebook ###
# v0.15.1

using Markdown
using InteractiveUtils

# ╔═╡ 1e3a3928-eccb-11eb-3acb-6f829eeca032
begin
	using ShallowWaters, IndividualDisplacements, ClimateModels
	using Plots, NetCDF, Printf, CSV, DataFrames
	md"""#### Julia Packages"""
end

# ╔═╡ 90992888-fd0f-44af-bd61-f5f3d750b34b
begin
	md"""# Particle Tracking Tutorial

	###

	Here we employ [IndividualDisplacements.jl](https://juliaclimate.github.io/IndividualDisplacements.jl/dev/) (<https://doi.org/10.21105/joss.02813>) to simulate the advection and dispersion of particles by a turbulent flow field computed using [ShallowWaters.jl](https://github.com/milankl/ShallowWaters.jl) based on an [example provided by Milan Klöwer](https://www.milank.de/turbulent-confetti#main).
	"""
end

# ╔═╡ 650ae02b-4f7b-4afe-9f91-676e3ad2ab01
md"""!!! note "Model Documentation"

	As in the global ocean biogeochemistry tutorial, the  [ClimateModels.jl](https://github.com/gaelforget/ClimateModels.jl) interface is used to run this modeling workflow.
"""

# ╔═╡ 779730d8-557b-41fd-8b46-907ca744f46a
md"""## Model Configuration

The model configuration can be summarized like this:
"""

# ╔═╡ 5fddbd14-b3c6-4c63-a459-b9ce8a3cab98
md"""## Model Run
"""

# ╔═╡ b9c1be88-783b-4873-a5f2-f91e415e9032
md"""## Model Output
"""

# ╔═╡ 72371695-0b7d-4db9-adef-69f71b5a6b05
md"""## Appendices
"""

# ╔═╡ 8f8ddaa8-49bf-4d68-a75b-121d39ce0be2
md"""#### Model (Top Level Function)"""

# ╔═╡ 42459023-cbf6-4f66-94a9-4fa0c917d658
md"""#### Ancillary Functions"""

# ╔═╡ 92f66ca9-e53b-46e0-82c8-86101c96f1bf
function SWM(m)
	# Produce some turbulent flows with ShallowWaters.jl
	nx = m.inputs["nx"]           # parameters
	ny = m.inputs["ny"]
	Lx = m.inputs["Lx"]
	L_ratio = nx/ny
	dx = Lx/nx

	# spin up, starting from rest storing u,v,eta in run0000
	run_model(;nx,Lx,L_ratio,Ndays=100,output=true)    # may take 10min depending on resolution

	# use previous run as initial condition, and advect tracer with readily turbulent flow
	run_model(;nx,Lx,L_ratio,Ndays=50,output=true,initial_cond="ncfile")

	return true
end

# ╔═╡ cb2cc51a-cf1d-4369-b00a-c14057e33a61
function SWM_replay(m)
	nx = m.inputs["nx"]           # parameters
	ny = m.inputs["ny"]
	Lx = m.inputs["Lx"]
	L_ratio = nx/ny
	dx = Lx/nx
	rundir=joinpath(m.folder,string(m.ID))

	# reload model output from file, and process for use in IndividualDisplacements.jl
	ncfile = NetCDF.open(joinpath(rundir,"run0001","u.nc"))
	u = ncfile.vars["u"][:,:,:]
	u /= dx                      # normalise m/s to 1/s by division with grid spacing dx

	ncfile = NetCDF.open(joinpath(rundir,"run0001","v.nc"))
	v = zero(u)                  # pad with zeros
	v[:,2:end,:] .= ncfile.vars["v"][:,:,:]
	v /= dx                      # normalise

	ncfile = NetCDF.open(joinpath(rundir,"run0001","sst.nc"))
	sst = ncfile.vars["sst"][:,:,:]
	t = ncfile.vars["t"][:];      # time

	return (u,v,sst,t)
end

# ╔═╡ 0521fadb-fab7-4415-82a6-76a7a68eaaf3
function update_FlowFields!(F::𝐹_Array2D{T},
                            u0::AbstractMatrix,
                            u1::AbstractMatrix,
                            v0::AbstractMatrix,
                            v1::AbstractMatrix,
                            t::AbstractVector) where {T<:Real}

    @boundscheck size(F.u0) == size(u0) || throw(BoundsError())
    @boundscheck size(F.u1) == size(u1) || throw(BoundsError())
    @boundscheck size(F.v0) == size(v0) || throw(BoundsError())
    @boundscheck size(F.v1) == size(v1) || throw(BoundsError())
    @boundscheck size(t) == (2,) || throw(BoundsError())

    # include type conversion if needed
    F.u0 .= T.(u0)
    F.u1 .= T.(u1)
    F.v0 .= T.(v0)
    F.v1 .= T.(v1)
    F.𝑇 .= T.(t)     # also reset the time
end

# ╔═╡ e9a7f9d5-a12b-4a0d-b96c-6b791054c671
function mymodel(m)

	pth=pwd()
    cd(joinpath(m.folder,string(m.ID)))

	#1) run ShallowWaters.jl
	SWM(m)

	#2) reload output from ShallowWatwers.jl
	(u,v,sst,t)=SWM_replay(m)
	nx = m.inputs["nx"]           # parameters
	ny = m.inputs["ny"]

	#3) set up IndividualDisplacements.jl
	nparticles = 500
	x = nx*0.1 .+ (nx*0.8)*rand(nparticles)    # seed particles a bit away from boundaries
	y = ny*0.1 .+ (ny*0.8)*rand(nparticles);   # in grid coordinates
	F = FlowFields(u[:,:,1],u[:,:,2],v[:,:,1],v[:,:,2],eltype(u).(t[1:2]))
	I = Individuals(F,x,y)

	#4) compute trajectories
	for i in 2:length(t)
	    update_FlowFields!(F,u[:,:,i-1],u[:,:,i],v[:,:,i-1],v[:,:,i],t[i-1:i])
	    ∫!(I)
	end

	#5) save IndividualDisplacements.jl output
    fil=joinpath(m.folder,string(m.ID),"IndividualPositions.csv")
    CSV.write(fil, I.🔴)

    cd(pth)

    return true
end

# ╔═╡ c8d1631a-ffe7-45ac-8223-040dcaa3039f
begin
	m=ModelConfig(model=mymodel,inputs=
		Dict("nx" => 200, "ny" => 100, "Lx" => 2000e3, "nparticles" => 500))
	setup(m)
	build(m)
	m
end

# ╔═╡ ea325591-a0cc-485d-8be6-4731f71e4a99
begin
	launch(m)
	"done"
end

# ╔═╡ cc80f696-4661-44d8-a3b2-ae3d86b7cee1
begin
	nparticles=m.inputs["nparticles"]
	fil=joinpath(m.folder,string(m.ID),"IndividualPositions.csv")
	🔴=DataFrame(CSV.File(fil))
	(u,v,sst,t)=SWM_replay(m)
	randcolours = rand(nparticles)

	function myplot(tstep)
		id_range = 🔴.t .== t[tstep+1]
		f=heatmap(sst[:,:,tstep+1]',c=:grays,legend = nothing)
		scatter!(🔴.x[id_range],🔴.y[id_range],zcolor=randcolours,
		leg=:none,m = (4, 0.8, :viridis, Plots.stroke(0)))
		return f
	end

end

# ╔═╡ 0c1165a8-34b2-4b7d-b3c6-b361865bbf02
begin
	anim = @animate for tstep in 0:length(t)-1
		myplot(tstep)
	end
	gif(anim, joinpath(m.folder,string(m.ID),"anim_fps15.gif"), fps = 15)
end

# ╔═╡ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
ClimateModels = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
IndividualDisplacements = "b92f0c32-5b7e-11e9-1d7b-238b2da8b0e6"
NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9"
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
ShallowWaters = "56019723-2d87-4a65-81ff-59d5d8913e3c"

[compat]
CSV = "~0.8.5"
ClimateModels = "~0.1.9"
DataFrames = "~1.2.1"
IndividualDisplacements = "~0.3.2"
NetCDF = "~0.11.3"
Plots = "~1.19.3"
ShallowWaters = "~0.5.0"
"""

# ╔═╡ 00000000-0000-0000-0000-000000000002
PLUTO_MANIFEST_TOML_CONTENTS = """
# This file is machine-generated - editing it directly is not advised

[[AWS]]
deps = ["Base64", "Compat", "Dates", "GitHub", "HTTP", "IniFile", "JSON", "MbedTLS", "Mocking", "OrderedCollections", "Retry", "Sockets", "URIs", "UUIDs", "XMLDict"]
git-tree-sha1 = "88765c35de693433aaee01e7607d67b47edda13a"
uuid = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc"
version = "1.53.0"

[[Adapt]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
version = "3.3.1"

[[ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"

[[ArnoldiMethod]]
deps = ["LinearAlgebra", "Random", "StaticArrays"]
git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9"
uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
version = "0.1.0"

[[ArrayInterface]]
deps = ["IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"]
git-tree-sha1 = "045ff5e1bc8c6fb1ecb28694abba0a0d55b5f4f5"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
version = "3.1.17"

[[Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"

[[AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
git-tree-sha1 = "a4d07a1c313392a77042855df46c5f534076fab9"
uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
version = "1.0.0"

[[Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[Blosc]]
deps = ["Blosc_jll"]
git-tree-sha1 = "84cf7d0f8fd46ca6f1b3e0305b4b4a37afe50fd6"
uuid = "a74b3585-a348-5f62-a45c-50e91977d574"
version = "0.7.0"

[[Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "e747dac84f39c62aff6956651ec359686490134e"
uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9"
version = "1.21.0+0"

[[Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
version = "1.0.6+5"

[[CFTime]]
deps = ["Dates", "Printf"]
git-tree-sha1 = "bca6cb6ee746e6485ca4535f6cc29cf3579a0f20"
uuid = "179af706-886a-5703-950a-314cd64e0468"
version = "0.1.1"

[[CSV]]
deps = ["Dates", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode"]
git-tree-sha1 = "b83aa3f513be680454437a0eee21001607e5d983"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.8.5"

[[Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
version = "1.16.0+6"

[[CatViews]]
deps = ["Random", "Test"]
git-tree-sha1 = "23d1f1e10d4e24374112fcf800ac981d14a54b24"
uuid = "81a5f4ea-a946-549a-aa7e-2a7f63a27d31"
version = "1.0.0"

[[ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "f53ca8d41e4753c41cdafa6ec5f7ce914b34be54"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
version = "0.10.13"

[[ClimateModels]]
deps = ["AWS", "CFTime", "CSV", "DataFrames", "Dates", "Downloads", "Git", "NetCDF", "OrderedCollections", "Pkg", "Statistics", "Suppressor", "TOML", "Test", "UUIDs", "Zarr"]
git-tree-sha1 = "fa9e9c2d60386e01aae380790b9deea2ef8d7570"
uuid = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
version = "0.1.9"

[[CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.0"

[[ColorSchemes]]
deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random", "StaticArrays"]
git-tree-sha1 = "ed268efe58512df8c7e224d2e170afd76dd6a417"
uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
version = "3.13.0"

[[ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597"
uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
version = "0.11.0"

[[Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
version = "0.12.8"

[[CommonSolve]]
git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f"
uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
version = "0.2.0"

[[CommonSubexpressions]]
deps = ["MacroTools", "Test"]
git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7"
uuid = "bbf7d656-a473-5ed7-a52c-81e309532950"
version = "0.3.0"

[[Compat]]
deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"]
git-tree-sha1 = "dc7dedc2c2aa9faf59a55c622760a25cbefbe941"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
version = "3.31.0"

[[CompilerSupportLibraries_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"

[[ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
version = "1.3.0"

[[Contour]]
deps = ["StaticArrays"]
git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
version = "0.5.7"

[[Crayons]]
git-tree-sha1 = "3f71217b538d7aaee0b69ab47d9b7724ca8afa0d"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
version = "4.0.4"

[[CyclicArrays]]
git-tree-sha1 = "4ab3cb8563aceca605a543a19aacaf09c6781dd3"
uuid = "6023044f-b3ef-4c22-8399-3ec90a0c9b75"
version = "0.5.0"

[[DataAPI]]
git-tree-sha1 = "ee400abb2298bd13bfc3df1c412ed228061a2385"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
version = "1.7.0"

[[DataFrames]]
deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
git-tree-sha1 = "a19645616f37a2c2c3077a44bc0d3e73e13441d7"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
version = "1.2.1"

[[DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.18.9"

[[DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
version = "1.0.0"

[[Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[DelimitedFiles]]
deps = ["Mmap"]
uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"

[[DiffEqBase]]
deps = ["ArrayInterface", "ChainRulesCore", "DataStructures", "DocStringExtensions", "FastBroadcast", "FunctionWrappers", "IterativeSolvers", "LabelledArrays", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "Printf", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "StaticArrays", "Statistics", "SuiteSparse", "ZygoteRules"]
git-tree-sha1 = "932153f62d0508e59733e0fc33361470d293a889"
uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
version = "6.68.1"

[[DiffResults]]
deps = ["StaticArrays"]
git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805"
uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5"
version = "1.0.3"

[[DiffRules]]
deps = ["NaNMath", "Random", "SpecialFunctions"]
git-tree-sha1 = "214c3fcac57755cfda163d91c58893a8723f93e9"
uuid = "b552c78f-8df3-52c6-915a-8e097449b14b"
version = "1.0.2"

[[DiskArrays]]
git-tree-sha1 = "599dc32bae654fa78056b15fed9b2af36f04ee44"
uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3"
version = "0.2.11"

[[Distances]]
deps = ["LinearAlgebra", "Statistics", "StatsAPI"]
git-tree-sha1 = "abe4ad222b26af3337262b8afb28fab8d215e9f8"
uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
version = "0.10.3"

[[Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[DocStringExtensions]]
deps = ["LibGit2"]
git-tree-sha1 = "a32185f5428d3986f47c2ab78b1f216d5e6cc96f"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.8.5"

[[Downloads]]
deps = ["ArgTools", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"

[[EarCut_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "92d8f9f208637e8d2d28c664051a00569c01493d"
uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
version = "2.1.5+1"

[[Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
version = "2.2.10+0"

[[ExponentialUtilities]]
deps = ["ArrayInterface", "LinearAlgebra", "Printf", "Requires", "SparseArrays"]
git-tree-sha1 = "ad435656c49da7615152b856c0f9abe75b0b5dc9"
uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18"
version = "1.8.4"

[[ExprTools]]
git-tree-sha1 = "b7e3d17636b348f005f11040025ae8c6f645fe92"
uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
version = "0.1.6"

[[EzXML]]
deps = ["Printf", "XML2_jll"]
git-tree-sha1 = "0fa3b52a04a4e210aeb1626def9c90df3ae65268"
uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
version = "1.1.0"

[[FFMPEG]]
deps = ["FFMPEG_jll"]
git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
version = "0.4.1"

[[FFMPEG_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "LibVPX_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "4.3.1+4"

[[FastBroadcast]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "26be48918640ce002f5833e8fc537b2ba7ed0234"
uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
version = "0.1.8"

[[FastClosures]]
git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef"
uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a"
version = "0.3.2"

[[FiniteDiff]]
deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"]
git-tree-sha1 = "8b3c09b56acaf3c0e581c66638b85c8650ee9dca"
uuid = "6a86dc24-6348-571c-b903-95158fe2bd41"
version = "2.8.1"

[[FixedPointNumbers]]
deps = ["Statistics"]
git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.4"

[[Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "35895cf184ceaab11fd778b4590144034a167a2f"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.1+14"

[[Formatting]]
deps = ["Printf"]
git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.2"

[[FortranFiles]]
git-tree-sha1 = "f8cec967f151a65f03afd826650c6e91d8b1da16"
uuid = "c58ffaec-ab22-586d-bfc5-781a99fd0b10"
version = "0.6.0"

[[ForwardDiff]]
deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"]
git-tree-sha1 = "e2af66012e08966366a43251e1fd421522908be6"
uuid = "f6369f11-7733-5829-9624-2563aa707210"
version = "0.10.18"

[[FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "cbd58c9deb1d304f5a245a0b7eb841a2560cfec6"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.10.1+5"

[[FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91"
uuid = "559328eb-81f9-559d-9380-de523a88c83c"
version = "1.0.10+0"

[[FunctionWrappers]]
git-tree-sha1 = "241552bc2209f0fa068b6415b1942cc0aa486bcc"
uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e"
version = "1.1.2"

[[Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"

[[GLFW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"]
git-tree-sha1 = "dba1e8614e98949abfa60480b13653813d8f0157"
uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89"
version = "3.3.5+0"

[[GR]]
deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"]
git-tree-sha1 = "9f473cdf6e2eb360c576f9822e7c765dd9d26dbc"
uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
version = "0.58.0"

[[GR_jll]]
deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "eaf96e05a880f3db5ded5a5a8a7817ecba3c7392"
uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
version = "0.58.0+0"

[[GeometryBasics]]
deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
git-tree-sha1 = "15ff9a14b9e1218958d3530cc288cf31465d9ae2"
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
version = "0.3.13"

[[Gettext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "8c14294a079216000a0bdca5ec5a447f073ddc9d"
uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
version = "0.20.1+7"

[[Git]]
deps = ["Git_jll"]
git-tree-sha1 = "d7bffc3fe097e9589145493c08c41297b457e5d0"
uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
version = "1.2.1"

[[GitHub]]
deps = ["Base64", "Dates", "HTTP", "JSON", "MbedTLS", "Sockets", "SodiumSeal"]
git-tree-sha1 = "9e62f3eae4a2514d1de65cc2ac9d1669032a4595"
uuid = "bc5e4493-9b4d-5f90-b8aa-2b2bcaad7a26"
version = "5.6.0"

[[Git_jll]]
deps = ["Artifacts", "Expat_jll", "Gettext_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "33be385f3432a5a5b7f6965af9592d4407f3167f"
uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb"
version = "2.31.0+0"

[[Glib_jll]]
deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "04690cc5008b38ecbdfede949220bc7d9ba26397"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
version = "2.59.0+4"

[[Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
version = "1.0.2"

[[HDF5_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "fd83fa0bde42e01952757f01149dd968c06c4dba"
uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
version = "1.12.0+1"

[[HTTP]]
deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"]
git-tree-sha1 = "c6a1fff2fd4b1da29d3dccaffb1e1001244d844e"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "0.9.12"

[[Hwloc]]
deps = ["Hwloc_jll"]
git-tree-sha1 = "92d99146066c5c6888d5a3abc871e6a214388b91"
uuid = "0e44f5e4-bd66-52a0-8798-143a42290a1d"
version = "2.0.0"

[[Hwloc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "3395d4d4aeb3c9d31f5929d32760d8baeee88aaf"
uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
version = "2.5.0+0"

[[IfElse]]
git-tree-sha1 = "28e837ff3e7a6c3cdb252ce49fb412c8eb3caeef"
uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
version = "0.1.0"

[[IndividualDisplacements]]
deps = ["CFTime", "CSV", "CyclicArrays", "DataFrames", "Dates", "MITgcmTools", "MeshArrays", "NetCDF", "OceanStateEstimation", "OrdinaryDiffEq", "Pkg", "Random", "UnPack"]
git-tree-sha1 = "9ed924aa20af7b021de752aac4b3c14b91eafc12"
uuid = "b92f0c32-5b7e-11e9-1d7b-238b2da8b0e6"
version = "0.3.2"

[[Inflate]]
git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c"
uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
version = "0.1.2"

[[IniFile]]
deps = ["Test"]
git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8"
uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f"
version = "0.5.0"

[[InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[Interpolations]]
deps = ["AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
git-tree-sha1 = "1470c80592cf1f0a35566ee5e93c5f8221ebc33a"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
version = "0.13.3"

[[InvertedIndices]]
deps = ["Test"]
git-tree-sha1 = "15732c475062348b0165684ffe28e85ea8396afc"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
version = "1.0.0"

[[IterTools]]
git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
version = "1.3.0"

[[IterativeSolvers]]
deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"]
git-tree-sha1 = "1a8c6237e78b714e901e406c096fc8a65528af7d"
uuid = "42fd0dbc-a981-5370-80f2-aaf504508153"
version = "0.9.1"

[[IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"

[[JLLWrappers]]
deps = ["Preferences"]
git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.3.0"

[[JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.1"

[[JpegTurbo_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943"
uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
version = "2.1.0+0"

[[LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
version = "3.100.1+0"

[[LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6"
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
version = "2.10.1+0"

[[LaTeXStrings]]
git-tree-sha1 = "c7f1c695e06c01b95a67f0cd1d34994f3e7db104"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
version = "1.2.1"

[[LabelledArrays]]
deps = ["ArrayInterface", "LinearAlgebra", "MacroTools", "StaticArrays"]
git-tree-sha1 = "5e38cfdd771c34821ade5515f782fe00865d60b3"
uuid = "2ee39098-c373-598a-b85f-a56591580800"
version = "1.6.2"

[[Latexify]]
deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"]
git-tree-sha1 = "a4b12a1bd2ebade87891ab7e36fdbce582301a92"
uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
version = "0.15.6"

[[LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"

[[LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"

[[LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"

[[LibVPX_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "12ee7e23fa4d18361e7c2cde8f8337d4c3101bc7"
uuid = "dd192d2f-8180-539f-9fb4-cc70b1dcf69a"
version = "1.10.0+0"

[[Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[Libffi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "761a393aeccd6aa92ec3515e428c26bf99575b3b"
uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
version = "3.2.2+0"

[[Libgcrypt_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"]
git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae"
uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
version = "1.8.7+0"

[[Libglvnd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"]
git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf"
uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
version = "1.3.0+3"

[[Libgpg_error_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9"
uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
version = "1.42.0+0"

[[Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
version = "1.16.1+1"

[[Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
version = "2.35.0+0"

[[Libtiff_jll]]
deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9"
uuid = "89763e89-9b03-5906-acba-b20f662cd828"
version = "4.3.0+0"

[[Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
version = "2.36.0+0"

[[LightGraphs]]
deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6"
uuid = "093fc24a-ae57-5d10-9952-331d41423f4d"
version = "1.3.5"

[[LineSearches]]
deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"]
git-tree-sha1 = "f27132e551e959b3667d8c93eae90973225032dd"
uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
version = "7.1.1"

[[LinearAlgebra]]
deps = ["Libdl"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[[LogExpFunctions]]
deps = ["DocStringExtensions", "LinearAlgebra"]
git-tree-sha1 = "7bd5f6565d80b6bf753738d2bc40a5dfea072070"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
version = "0.2.5"

[[Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[LoopVectorization]]
deps = ["ArrayInterface", "DocStringExtensions", "IfElse", "LinearAlgebra", "OffsetArrays", "Polyester", "Requires", "SLEEFPirates", "Static", "StrideArraysCore", "ThreadingUtilities", "UnPack", "VectorizationBase"]
git-tree-sha1 = "06c91d5495c32bca6b843551a1331c3cd2fb23d0"
uuid = "bdcacae8-1622-11e9-2a5c-532679323890"
version = "0.12.53"

[[Lz4_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "5d494bc6e85c4c9b626ee0cab05daa4085486ab1"
uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
version = "1.9.3+0"

[[MITgcmTools]]
deps = ["ClimateModels", "DataFrames", "Dates", "MeshArrays", "NetCDF", "OrderedCollections", "Pkg", "Printf", "SparseArrays", "Suppressor", "UUIDs"]
git-tree-sha1 = "f2d9079dd0d34f7c3135fd91597f79ef6a786a7b"
uuid = "62725fbc-3a66-4df3-9000-e33e85b3a198"
version = "0.1.23"

[[MacroTools]]
deps = ["Markdown", "Random"]
git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0"
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.6"

[[ManualMemory]]
git-tree-sha1 = "71c64ebe61a12bad0911f8fc4f91df8a448c604c"
uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667"
version = "0.1.4"

[[Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"]
git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.0.3"

[[MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"

[[Measures]]
git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f"
uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
version = "0.3.1"

[[MeshArrays]]
deps = ["CatViews", "NearestNeighbors", "Pkg", "Printf", "SparseArrays", "Statistics", "Unitful"]
git-tree-sha1 = "74dc3449aa61cd8a65304ba2b5ce614e9669ffba"
uuid = "cb8c808f-1acf-59a3-9d2b-6e38d009f683"
version = "0.2.19"

[[Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "4ea90bd5d3985ae1f9a908bd4500ae88921c5ce7"
uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
version = "1.0.0"

[[Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"

[[Mocking]]
deps = ["ExprTools"]
git-tree-sha1 = "916b850daad0d46b8c71f65f719c49957e9513ed"
uuid = "78c3b35d-d492-501b-9361-3d52fe80e533"
version = "0.7.1"

[[MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"

[[MuladdMacro]]
git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68"
uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
version = "0.2.2"

[[NLSolversBase]]
deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"]
git-tree-sha1 = "50608f411a1e178e0129eab4110bd56efd08816f"
uuid = "d41bc354-129a-5804-8e4c-c37616107c6c"
version = "7.8.0"

[[NLsolve]]
deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"]
git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1"
uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
version = "4.5.1"

[[NaNMath]]
git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
version = "0.3.5"

[[NearestNeighbors]]
deps = ["Distances", "StaticArrays"]
git-tree-sha1 = "16baacfdc8758bc374882566c9187e785e85c2f0"
uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
version = "0.4.9"

[[NetCDF]]
deps = ["DiskArrays", "Formatting", "NetCDF_jll"]
git-tree-sha1 = "23b0e32fde256a4e2e497e678abcf956ed26204b"
uuid = "30363a11-5582-574a-97bb-aa9a979735b9"
version = "0.11.3"

[[NetCDF_jll]]
deps = ["Artifacts", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Pkg", "Zlib_jll", "nghttp2_jll"]
git-tree-sha1 = "0cf4d1bf2ef45156aed85c9ac5f8c7e697d9288c"
uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3"
version = "400.702.400+0"

[[NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"

[[NonlinearSolve]]
deps = ["ArrayInterface", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"]
git-tree-sha1 = "ef18e47df4f3917af35be5e5d7f5d97e8a83b0ec"
uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
version = "0.3.8"

[[OceanStateEstimation]]
deps = ["Downloads", "FortranFiles", "MITgcmTools", "MeshArrays", "Pkg", "Statistics"]
git-tree-sha1 = "1b0fc64e4a8ef28225a2dc718e02455fbaaf8ce9"
uuid = "891f6deb-a4f5-4bc5-a2e3-1e8f649cdd2c"
version = "0.1.9"

[[OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "4f825c6da64aebaa22cc058ecfceed1ab9af1c7e"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.10.3"

[[Ogg_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7937eda4681660b4d6aeeecc2f7e1c81c8ee4e2f"
uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
version = "1.3.5+0"

[[OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "15003dcb7d8db3c6c857fda14891a539a8f2705a"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "1.1.10+0"

[[OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"

[[Opus_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720"
uuid = "91d4177d-7536-5919-b921-800302f37372"
version = "1.3.2+0"

[[OrderedCollections]]
git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.4.1"

[[OrdinaryDiffEq]]
deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "NLsolve", "Polyester", "RecursiveArrayTools", "Reexport", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"]
git-tree-sha1 = "379ed10814cba5087978bce9df31161a496620d3"
uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
version = "5.60.1"

[[PCRE2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"

[[PCRE_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488"
uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc"
version = "8.44.0+0"

[[Parameters]]
deps = ["OrderedCollections", "UnPack"]
git-tree-sha1 = "2276ac65f1e236e0a6ea70baff3f62ad4c625345"
uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
version = "0.12.2"

[[Parsers]]
deps = ["Dates"]
git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "1.1.0"

[[Pixman_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
version = "0.40.1+0"

[[Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"

[[PlotThemes]]
deps = ["PlotUtils", "Requires", "Statistics"]
git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d"
uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
version = "2.0.1"

[[PlotUtils]]
deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"]
git-tree-sha1 = "501c20a63a34ac1d015d5304da0e645f42d91c9f"
uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
version = "1.0.11"

[[Plots]]
deps = ["Base64", "Contour", "Dates", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs"]
git-tree-sha1 = "1bbbb5670223d48e124b388dee62477480e23234"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
version = "1.19.3"

[[Polyester]]
deps = ["ArrayInterface", "IfElse", "ManualMemory", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities", "VectorizationBase"]
git-tree-sha1 = "f5a74523ebc205723baefb95874f708741199d70"
uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
version = "0.3.4"

[[PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "cde4ce9d6f33219465b55162811d8de8139c0414"
uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
version = "1.2.1"

[[Preferences]]
deps = ["TOML"]
git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
version = "1.2.2"

[[PrettyTables]]
deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"]
git-tree-sha1 = "0d1245a357cc61c8cd61934c07447aa569ff22e6"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
version = "1.1.0"

[[Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[Qt5Base_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"]
git-tree-sha1 = "16626cfabbf7206d60d84f2bf4725af7b37d4a77"
uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1"
version = "5.15.2+0"

[[REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[Random]]
deps = ["Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[Ratios]]
git-tree-sha1 = "37d210f612d70f3f7d57d488cb3b6eff56ad4e41"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
version = "0.4.0"

[[RecipesBase]]
git-tree-sha1 = "b3fb709f3c97bfc6e948be68beeecb55a0b340ae"
uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
version = "1.1.1"

[[RecipesPipeline]]
deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"]
git-tree-sha1 = "2a7a2469ed5d94a98dea0e85c46fa653d76be0cd"
uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c"
version = "0.3.4"

[[RecursiveArrayTools]]
deps = ["ArrayInterface", "ChainRulesCore", "DocStringExtensions", "LinearAlgebra", "RecipesBase", "Requires", "StaticArrays", "Statistics", "ZygoteRules"]
git-tree-sha1 = "e64c9777fcd2d9859e1a685ffba36d1b2abf3ea7"
uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
version = "2.15.0"

[[RecursiveFactorization]]
deps = ["LinearAlgebra", "LoopVectorization"]
git-tree-sha1 = "2e1a88c083ebe8ba69bc0b0084d4b4ba4aa35ae0"
uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
version = "0.1.13"

[[Reexport]]
git-tree-sha1 = "5f6c21241f0f655da3952fd60aa18477cf96c220"
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
version = "1.1.0"

[[Requires]]
deps = ["UUIDs"]
git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
version = "1.1.3"

[[Retry]]
git-tree-sha1 = "41ac127cd281bb33e42aba46a9d3b25cd35fc6d5"
uuid = "20febd7b-183b-5ae2-ac4a-720e7ce64774"
version = "0.4.1"

[[SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"

[[SLEEFPirates]]
deps = ["IfElse", "Static", "VectorizationBase"]
git-tree-sha1 = "da6d214ffc85b1292f300649ef86d3c4f9aaf25d"
uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa"
version = "0.6.22"

[[SciMLBase]]
deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"]
git-tree-sha1 = "f0bf114650476709dd04e690ab2e36d88368955e"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
version = "1.18.2"

[[Scratch]]
deps = ["Dates"]
git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda"
uuid = "6c6a2e73-6563-6170-7368-637461726353"
version = "1.1.0"

[[SentinelArrays]]
deps = ["Dates", "Random"]
git-tree-sha1 = "35927c2c11da0a86bcd482464b93dadd09ce420f"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
version = "1.3.5"

[[Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[Setfield]]
deps = ["ConstructionBase", "Future", "MacroTools", "Requires"]
git-tree-sha1 = "d5640fc570fb1b6c54512f0bd3853866bd298b3e"
uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
version = "0.7.0"

[[ShallowWaters]]
deps = ["Dates", "Interpolations", "NetCDF", "Parameters", "Printf"]
git-tree-sha1 = "d4f6acebbf11c5dda6c4c9036f21dc934ea4aad9"
uuid = "56019723-2d87-4a65-81ff-59d5d8913e3c"
version = "0.5.0"

[[SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"

[[Showoff]]
deps = ["Dates", "Grisu"]
git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"

[[SimpleTraits]]
deps = ["InteractiveUtils", "MacroTools"]
git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231"
uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
version = "0.9.4"

[[Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[SodiumSeal]]
deps = ["Base64", "Libdl", "libsodium_jll"]
git-tree-sha1 = "80cef67d2953e33935b41c6ab0a178b9987b1c99"
uuid = "2133526b-2bfb-4018-ac12-889fb3908a75"
version = "0.1.1"

[[SortingAlgorithms]]
deps = ["DataStructures"]
git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
version = "1.0.1"

[[SparseArrays]]
deps = ["LinearAlgebra", "Random"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[[SparseDiffTools]]
deps = ["Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "LightGraphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"]
git-tree-sha1 = "bdaa461dbfebb839b740f4582e8728f0f92ca375"
uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804"
version = "1.15.0"

[[SpecialFunctions]]
deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"]
git-tree-sha1 = "a50550fa3164a8c46747e62063b4d774ac1bcf49"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "1.5.1"

[[Static]]
deps = ["IfElse"]
git-tree-sha1 = "2740ea27b66a41f9d213561a04573da5d3823d4b"
uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
version = "0.2.5"

[[StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "1b9a0f17ee0adde9e538227de093467348992397"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.2.7"

[[Statistics]]
deps = ["LinearAlgebra", "SparseArrays"]
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[[StatsAPI]]
git-tree-sha1 = "1958272568dc176a1d881acb797beb909c785510"
uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
version = "1.0.0"

[[StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "2f6792d523d7448bbe2fec99eca9218f06cc746d"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.33.8"

[[StrideArraysCore]]
deps = ["ArrayInterface", "ManualMemory", "Requires", "ThreadingUtilities", "VectorizationBase"]
git-tree-sha1 = "2525850b6887e217c3cc149ab29eb2a7a6360d37"
uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da"
version = "0.1.16"

[[StructArrays]]
deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"]
git-tree-sha1 = "000e168f5cc9aded17b6999a560b7c11dda69095"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
version = "0.6.0"

[[SuiteSparse]]
deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"

[[Suppressor]]
git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787"
uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
version = "0.2.0"

[[TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"

[[TableTraits]]
deps = ["IteratorInterfaceExtensions"]
git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
version = "1.0.1"

[[Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"]
git-tree-sha1 = "8ed4a3ea724dac32670b062be3ef1c1de6773ae8"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.4.4"

[[Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"

[[Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[[ThreadingUtilities]]
deps = ["ManualMemory"]
git-tree-sha1 = "593009385e6536dc50baedc2c8bc1a3717ef358f"
uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5"
version = "0.4.5"

[[TranscodingStreams]]
deps = ["Random", "Test"]
git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.9.5"

[[TreeViews]]
deps = ["Test"]
git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6"
uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7"
version = "0.3.0"

[[URIs]]
git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
version = "1.3.0"

[[UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[UnPack]]
git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
version = "1.0.2"

[[Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[Unitful]]
deps = ["ConstructionBase", "Dates", "LinearAlgebra", "Random"]
git-tree-sha1 = "a981a8ef8714cba2fd9780b22fd7a469e7aaf56d"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.9.0"

[[VectorizationBase]]
deps = ["ArrayInterface", "Hwloc", "IfElse", "Libdl", "LinearAlgebra", "Static"]
git-tree-sha1 = "ddeac5d8aad03c17bdc8efd45246e82fc52d12f4"
uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
version = "0.20.24"

[[VertexSafeGraphs]]
deps = ["LightGraphs"]
git-tree-sha1 = "b9b450c99a3ca1cc1c6836f560d8d887bcbe356e"
uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f"
version = "0.1.2"

[[Wayland_jll]]
deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23"
uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89"
version = "1.19.0+0"

[[Wayland_protocols_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll"]
git-tree-sha1 = "2839f1c1296940218e35df0bbb220f2a79686670"
uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91"
version = "1.18.0+4"

[[WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "59e2ad8fd1591ea019a5259bd012d7aee15f995c"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
version = "0.5.3"

[[XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
version = "2.9.12+0"

[[XMLDict]]
deps = ["EzXML", "IterTools", "OrderedCollections"]
git-tree-sha1 = "d9a3faf078210e477b291c79117676fca54da9dd"
uuid = "228000da-037f-5747-90a9-8195ccbf91a5"
version = "0.4.1"

[[XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a"
uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
version = "1.1.34+0"

[[Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
version = "1.6.9+4"

[[Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
version = "1.0.9+4"

[[Xorg_libXcursor_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"]
git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd"
uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724"
version = "1.2.0+4"

[[Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
version = "1.1.3+4"

[[Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
version = "1.3.4+4"

[[Xorg_libXfixes_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4"
uuid = "d091e8ba-531a-589c-9de9-94069b037ed8"
version = "5.0.3+4"

[[Xorg_libXi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"]
git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246"
uuid = "a51aa0fd-4e3c-5386-b890-e753decda492"
version = "1.7.10+4"

[[Xorg_libXinerama_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"]
git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123"
uuid = "d1454406-59df-5ea1-beac-c340f2130bc3"
version = "1.1.4+4"

[[Xorg_libXrandr_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"]
git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631"
uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484"
version = "1.5.2+4"

[[Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96"
uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
version = "0.9.10+4"

[[Xorg_libpthread_stubs_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb"
uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
version = "0.1.0+3"

[[Xorg_libxcb_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
version = "1.13.0+3"

[[Xorg_libxkbfile_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2"
uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a"
version = "1.1.0+4"

[[Xorg_xcb_util_image_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97"
uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b"
version = "0.4.0+1"

[[Xorg_xcb_util_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"]
git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1"
uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5"
version = "0.4.0+1"

[[Xorg_xcb_util_keysyms_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00"
uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7"
version = "0.4.0+1"

[[Xorg_xcb_util_renderutil_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e"
uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e"
version = "0.3.9+1"

[[Xorg_xcb_util_wm_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67"
uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361"
version = "0.4.1+1"

[[Xorg_xkbcomp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"]
git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b"
uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4"
version = "1.4.2+4"

[[Xorg_xkeyboard_config_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"]
git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d"
uuid = "33bec58e-1273-512f-9401-5d533626f822"
version = "2.27.0+4"

[[Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
version = "1.4.0+3"

[[Zarr]]
deps = ["AWS", "Blosc", "CodecZlib", "DataStructures", "Dates", "DiskArrays", "HTTP", "JSON", "OffsetArrays", "Pkg"]
git-tree-sha1 = "529286dc65b4b8f4d7a6b4534e8778209be6c2ee"
uuid = "0a941bbe-ad1d-11e8-39d9-ab76183a1d99"
version = "0.6.2"

[[Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"

[[Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.0+0"

[[ZygoteRules]]
deps = ["MacroTools"]
git-tree-sha1 = "9e7a1e8ca60b742e508a315c17eef5211e7fbfd7"
uuid = "700de1a5-db45-46bc-99cf-38207098b444"
version = "0.2.1"

[[libass_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "acc685bcf777b2202a904cdcb49ad34c2fa1880c"
uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
version = "0.14.0+4"

[[libfdk_aac_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7a5780a0d9c6864184b3a2eeeb833a0c871f00ab"
uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
version = "0.1.6+4"

[[libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.38+0"

[[libsodium_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e"
uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8"
version = "1.0.20+0"

[[libvorbis_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
git-tree-sha1 = "c45f4e40e7aafe9d086379e5578947ec8b95a8fb"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.7+0"

[[nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"

[[p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"

[[x264_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d713c1ce4deac133e3334ee12f4adff07f81778f"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
version = "2020.7.14+2"

[[x265_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "487da2f8f2f0c8ee0e83f39d13037d6bbf0a45ab"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
version = "3.0.0+3"

[[xkbcommon_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"]
git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6"
uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd"
version = "0.9.1+5"
"""

# ╔═╡ Cell order:
# ╟─90992888-fd0f-44af-bd61-f5f3d750b34b
# ╟─650ae02b-4f7b-4afe-9f91-676e3ad2ab01
# ╟─779730d8-557b-41fd-8b46-907ca744f46a
# ╟─c8d1631a-ffe7-45ac-8223-040dcaa3039f
# ╟─5fddbd14-b3c6-4c63-a459-b9ce8a3cab98
# ╟─ea325591-a0cc-485d-8be6-4731f71e4a99
# ╟─b9c1be88-783b-4873-a5f2-f91e415e9032
# ╟─0c1165a8-34b2-4b7d-b3c6-b361865bbf02
# ╟─72371695-0b7d-4db9-adef-69f71b5a6b05
# ╟─1e3a3928-eccb-11eb-3acb-6f829eeca032
# ╟─8f8ddaa8-49bf-4d68-a75b-121d39ce0be2
# ╟─e9a7f9d5-a12b-4a0d-b96c-6b791054c671
# ╟─42459023-cbf6-4f66-94a9-4fa0c917d658
# ╟─92f66ca9-e53b-46e0-82c8-86101c96f1bf
# ╟─cb2cc51a-cf1d-4369-b00a-c14057e33a61
# ╟─0521fadb-fab7-4415-82a6-76a7a68eaaf3
# ╟─cc80f696-4661-44d8-a3b2-ae3d86b7cee1
# ╟─00000000-0000-0000-0000-000000000001
# ╟─00000000-0000-0000-0000-000000000002