### A Pluto.jl notebook ### # v0.17.7 using Markdown using InteractiveUtils # ╔═╡ 6cb3b25b-701f-4eca-bde1-03c7910ec523 begin using Pkg Pkg.activate("../Project.toml") using PolyChaos using LinearAlgebra using DelimitedFiles using StatsPlots using Plots.PlotMeasures using Printf using CSV using DataFrames using NetCDF using Dates using LaTeXStrings using PlutoUI using JLD end # ╔═╡ 7f07c44a-3cad-40bc-bb4b-a738e26f1b95 begin using Revise include("./gsa_utils.jl") end # ╔═╡ 76c3e251-4be0-4419-81c5-fbfa32250b8f ## INCREASE THE CELL WIDTH FOR BIGGER FIGURES html""" """ # ╔═╡ e0bb2c6d-9618-4f7b-bf5d-7142e673fa23 md""" Load required packages (dependencies specified in the `Project.toml` file) """ # ╔═╡ 3e140602-f9e6-4c4c-89bd-fc051b505e33 md""" Include script with different helper functions. If script is changed, this cell will have to be rerun for changes to reflect. """ # ╔═╡ cae9da64-c6d0-45ae-9528-ce8cb46969f8 md""" Note: Figures are plotted here in the order that they appear in the manuscript. """ # ╔═╡ f6cf52cf-c677-40eb-8af6-fceb04e32339 md""" ### Preprocessing """ # ╔═╡ 844a7d5e-71ef-4e76-85ac-db90d1a581bb begin X_design = CSV.read("./data/design/X_background_CR2208_updated.csv", DataFrame) pfss = replace(X_design.PFSS, 1=>"HARMONICS", 2=>"FDIPS") surfaceWaveRefl = replace(X_design.UseSurfaceWaveRefl, 1=>"true", 2=>"false") select!(X_design, Not([:PFSS, :UseSurfaceWaveRefl])) insertcols!(X_design, :PFSS=>pfss, :UseSurfaceWaveRefl=>surfaceWaveRefl) end # ╔═╡ 62fff0a4-82ad-4643-b7f1-561c5644d7e0 md""" Make selected scatterplots - figure 2 (others can be made in the same fashion by selecting appropriate column names in the plotting arguments) """ # ╔═╡ 34f42c83-22ad-414a-ab65-be93a5c9be14 begin FactorB0PF = scatter(X_design[:, "FactorB0"], X_design[:, "PoyntingFluxPerBSi"], # zcolor=shiftWLRMSE.PTRMSE, marker=(:black, :circle, 4), xlabel="FactorB0", ylabel="PoyntingFluxPerBSi", markerstrokewidth=0, label="", dpi = 300, grid=false ) plot!(sort(X_design.FactorB0), 1.2e6 ./ (sort(X_design.FactorB0)), line=(:violet, 3.1), label="") plot!(xlims=(0.54, 2.7)) plot!(ylims=(0.3e6, 1.1e6)) plot!(guidefontsize=30) plot!(tickfontsize=25) plot!(framestyle=:box) plot!(left_margin=5mm) plot!(bottom_margin=5mm) plot!(right_margin=8mm) plot!(yticks=([4e5, 6e5, 8e5, 1e6], ["4e5", "6e5", "8e5", "1e6"])) plot!(size=(800, 600)) end # ╔═╡ 16adf9b7-76ad-4902-81d7-9269318ca26b begin LperpStoch = scatter(X_design[:, "LperpTimesSqrtBSi"], X_design[:, "StochasticExponent"], # zcolor=shiftWLRMSE.PTRMSE, marker=(:black, :circle, 4), xlabel="LperpTimesSqrtBSi", ylabel="StochasticExponent", markerstrokewidth=0, label="", dpi = 300, grid=false ) plot!(guidefontsize=30) plot!(tickfontsize=25) plot!(framestyle=:box) plot!(left_margin=5mm) plot!(bottom_margin=5mm) plot!(right_margin=8mm) plot!(xticks=([1e5, 2e5, 3e5], ["1e5", "2e5", "3e5"])) plot!(size=(800, 600)) end # ╔═╡ a659f1da-1b23-44e8-a9db-c5b8953b3e82 begin chromoLperp = scatter(X_design[:, "nChromoSi_AWSoM"], X_design[:, "LperpTimesSqrtBSi"], # zcolor=shiftWLRMSE.PTRMSE, marker=(:black, :circle, 4), xlabel="nChromoSi_AWSoM", ylabel="LperpTimesSqrtBSi", markerstrokewidth=0, label="", dpi = 300, grid=false ) plot!(guidefontsize=30) plot!(tickfontsize=25) plot!(framestyle=:box) plot!(left_margin=5mm) plot!(bottom_margin=5mm) plot!(right_margin=8mm) plot!(xticks=([1e18, 2e18, 3e18, 4e18, 5e18], ["1e18", "2e18", "3e18", "4e18", "5e18"])) plot!(yticks=([1e5, 2e5, 3e5], ["1e5", "2e5", "3e5"])) plot!(size=(800, 600)) end # ╔═╡ f4ef705e-a7e0-49ef-96e1-48eb87df9340 begin LperpRMin = scatter(X_design[:, "LperpTimesSqrtBSi"], X_design[:, "rMinWaveReflection"], # zcolor=shiftWLRMSE.PTRMSE, marker=(:black, :circle, 4), xlabel="LperpTimesSqrtBSi", ylabel="rMinWaveReflection", markerstrokewidth=0, label="", dpi = 300, grid=false ) plot!(guidefontsize=30) plot!(tickfontsize=25) plot!(framestyle=:box) plot!(left_margin=5mm) plot!(bottom_margin=5mm) plot!(right_margin=8mm) plot!(xticks=([1e5, 2e5, 3e5], ["1e5", "2e5", "3e5"])) plot!(size=(800, 600)) end # ╔═╡ 902b0932-1841-4607-8f4c-b8140edb5cf3 # ╔═╡ bea921ff-cc8e-48e3-806d-78bd52334b8f # ╔═╡ 2acdc135-7a5a-44a1-9390-464307e177a7 # ╔═╡ d7409613-525d-417f-9d66-7bf3abfec64c md""" Scale input parameters to [0-1] range """ # ╔═╡ c93a9dbf-95c9-420c-b5f6-6efc28e66eec begin lbBg = [0.54, 2e17, 0.3e6, 0.3e5, 0.1, 1] ubBg = [2.7, 5e18, 1.1e6, 3e5, 0.34, 1.2] paramsBgScaled = (X_design[!, 1:6] .- lbBg') ./ (ubBg' - lbBg') end # ╔═╡ 195f5770-2391-4101-893a-1c367abff704 inputNames = names(paramsBgScaled) # ╔═╡ 189dc329-5414-4b48-8bf9-94ec4579048e md""" Filter out the single run that failed. """ # ╔═╡ e89f5564-75ed-40e4-a26f-b9e91dc65d8c excludeRunIdx = [159] # ╔═╡ 40222bdc-5e2a-4ca5-8bcb-3adf27cabad5 md""" List all Parameter Combinations for AWSoM that are not used by us. """ # ╔═╡ 8d0da409-7706-4a4c-90e0-18c41e747f7b X_design[excludeRunIdx, :] # ╔═╡ 42145a1f-b99b-4a70-8a37-923682dee2ab finalRuns = setdiff(1:200, excludeRunIdx) # ╔═╡ 2ffe286e-d361-4c75-8529-d148e5f896d7 md""" Extract QoIs and observations """ # ╔═╡ 6035afb9-31da-43cf-816a-36962d3a996c begin fn = "./data/background_sims/bg_CR2208.nc" UrSim = ncread(fn, "UrSim") NpSim = ncread(fn, "NpSim") TSim = ncread(fn, "TSim") BSim = ncread(fn, "BSim") UrObs = ncread(fn, "UrObs") NpObs = ncread(fn, "NpObs") TObs = ncread(fn, "TObs") BObs = ncread(fn, "BObs") startTime = ncgetatt(fn, "time", "startTime") timeElapsed = Dates.Hour.(ncread(fn, "time")) times = timeElapsed .+ Dates.DateTime(startTime, "yyyy_mm_ddTHH:MM:SS") end # ╔═╡ dc675b70-a7d2-435d-afdc-e05cc32a061f md""" Plot the QoIs (figure 3). If we want to plot observations, supply `plotObs=true` as a keyword. """ # ╔═╡ e0a4514a-83fc-4c21-a555-d89407cd436d md""" ### UQ and GSA """ # ╔═╡ 6a8503ed-e59a-4391-9f9a-88b761976e36 md""" Build surrogate """ # ╔═╡ b4f5a355-3625-4f9a-b01b-4355d49ece98 begin XTrainFinal = Matrix(paramsBgScaled[finalRuns, :]) YTrainUr = Array{Float64, 2}(UrSim[:, finalRuns]') YTrainNp = Array{Float64, 2}(NpSim[:, finalRuns]') end # ╔═╡ b4faacd2-4df5-4b30-b928-aeb160049678 XTrainFinal # ╔═╡ de3f0b4e-2d49-4ba5-9b22-799314cc5076 # build coefficient matrix! ATrainFinal = buildCoefficientMatrix(XTrainFinal; pceDegree=2) # ╔═╡ 7b049137-6ec2-43b1-8fb2-95c6799a3cfb begin # set regularization coefficients lambdaUrFinal = 0.4 lambdaNpFinal = 5 end # ╔═╡ 55487f5c-2542-4ecd-9091-92c618a9b3cd begin # Perform ridge regression betaUrFinal = solveRegPCE(ATrainFinal, YTrainUr; λ=lambdaUrFinal) betaNpFinal = solveRegPCE(ATrainFinal, YTrainNp; λ=lambdaNpFinal) end # ╔═╡ cd85f891-6f1e-4cea-9307-bf4231f4a446 md""" Load matrix of test points """ # ╔═╡ 79ca120b-3810-4e8b-9237-c98119aaa736 XTestFinal = load("./data/design/CR2208TestFinal.jld", "XTestFinal")[:, 1:6] # ╔═╡ 232f5599-6d41-4379-9e5f-c6922b1ac2c9 ATest = buildCoefficientMatrix(XTestFinal[:, 1:6]; pceDegree=2); # ╔═╡ 281b69ad-e061-4fd5-9f85-9aae93e280ff begin ATestFinalCoeffs = ATest[:, 2:end] ATestFinalFiltered = ATestFinalCoeffs .- mean(ATestFinalCoeffs, dims=1) yPredNpFinal = betaNpFinal[1, :] .+ Matrix((ATestFinalFiltered * betaNpFinal[2:end, :])'); yPredUrFinal = betaUrFinal[1, :] .+ Matrix((ATestFinalFiltered * betaUrFinal[2:end, :])'); end # ╔═╡ bf6e9034-3eae-4875-8f36-2cc7b31bf3b1 md""" Get mean and standard deviations of Ur and Np """ # ╔═╡ 2017c596-f6dd-4b4b-bb9c-bf05e9980432 begin meanEmpiricalNpFinal = mean(yPredNpFinal; dims=2) stdEmpiricalNpFinal = std(yPredNpFinal; dims=2)[:] meanEmpiricalUrFinal = mean(yPredUrFinal; dims=2) stdEmpiricalUrFinal = std(yPredUrFinal; dims=2)[:] end # ╔═╡ b9ac0fc0-076c-448b-ad2f-18da9ab8e9fa UrSim # ╔═╡ 43d86334-5128-4519-8bc7-d3a47ff8a5f0 md""" Plot predictive uncertainty (figure 5) """ # ╔═╡ 4d4f206c-9e87-4be4-9b14-acc3dd92f4b3 begin plotUncertainty(yPredUrFinal, meanEmpiricalUrFinal, stdEmpiricalUrFinal, UrObs, ylabel="Uᵣ [km/s]", times, nSTD=2, trimIndices=(1, 577)) plot!(guidefontsize=20) plot!(tickfontsize=15) plot!(legend=:topleft) plot!(left_margin=3mm) plot!(bottom_margin=3mm) end # ╔═╡ eb7349b5-c681-436b-8295-48ca47b9af09 begin plotUncertainty(yPredNpFinal, meanEmpiricalNpFinal, stdEmpiricalNpFinal, NpObs, ylabel="Nₚ [cm⁻³]", ylims=(-20, 120), times, nSTD=2, trimIndices=(1, 577)) plot!(guidefontsize=20) plot!(tickfontsize=15) plot!(legend=:topleft) plot!(left_margin=3mm) plot!(bottom_margin=3mm) end # ╔═╡ 656871e0-1b36-4965-8b4d-6da2191d698b md""" Sensitivities """ # ╔═╡ 88d080a3-ad9c-496f-ac24-794e2026c906 begin gsaUrFinal = gsa(XTrainFinal, YTrainUr; regularize=true, pceDegree=2, lambda=lambdaUrFinal) gsaNpFinal = gsa(XTrainFinal, YTrainNp; regularize=true, pceDegree=2, lambda=lambdaNpFinal) end # ╔═╡ aeac3a5e-1d40-4f14-8c79-5488a36e871f # Extract main effects begin gsaMainUrFinal = processMainEffects(gsaUrFinal) gsaMainNpFinal = processMainEffects(gsaNpFinal) end # ╔═╡ 35e569be-5926-4ec6-9cb7-a31be6bee6c3 md""" Plot sensitivities (figures 6 and 7) """ # ╔═╡ 54444b2b-0b62-4bf5-a4e5-de0b274326e1 begin pMainUrFinal = plotMainEffects(gsaMainUrFinal, times, inputNames; title = "", dpi=300, actualStartTime=startTime, tickFormat="dd-m") plot!(grid=false) plot!(ylabel="Sᵢᵗ") plot!(titlefontsize=17) plot!(xtickfontsize=20) plot!(ytickfontsize=20) plot!(guidefontsize=23) plot!(leftmargin=7mm) plot!(rightmargin=5mm) plot!(topmargin=2mm) plot!(bottommargin=8mm) plot!(size=(1200, 600)) end # ╔═╡ 2dbf33e2-14fc-446a-82df-4308307a8922 begin pMainNpFinal = plotMainEffects(gsaMainNpFinal, times, inputNames; title="", dpi=300, actualStartTime=startTime, tickFormat="dd-m") plot!(grid=false) plot!(ylabel="Sᵢᵗ") plot!(titlefontsize=17) plot!(xtickfontsize=20) plot!(ytickfontsize=20) plot!(guidefontsize=23) plot!(leftmargin=7mm) plot!(rightmargin=5mm) plot!(topmargin=2mm) plot!(bottommargin=8mm) plot!(size=(1200, 600)) end # ╔═╡ 623254e2-2d04-48f1-aaf2-e2a43102a34d begin savefig(pMainUrFinal, "/Users/ajivani/Downloads/pMainUrFinal2208.png") savefig(pMainNpFinal, "/Users/ajivani/Downloads/pMainNpFinal2208.png") end # ╔═╡ 1e87d6de-a83a-4fbd-b449-8fa7afcc4782 begin pUrIntMeanFinal = plotInteractionEffects(gsaUrFinal, times, inputNames, dpi=300) # symmetric matrix (interactions are read from either the upper triangle or the lower triangle) plot!(tickfontsize=12) plot!(bottom_margin=9mm) plot!(right_margin=3mm) end # ╔═╡ b4fe4583-7275-494e-a7dd-db1ed034dbf5 begin pNpIntMeanFinal = plotInteractionEffects(gsaNpFinal, times, inputNames, dpi=300) plot!(tickfontsize=12) plot!(bottom_margin=9mm) plot!(right_margin=3mm) end # ╔═╡ 1d80aaf8-f44c-477f-b172-388aeca62e74 # ╔═╡ d790df8c-e0f5-4699-a711-df8a9115cdda md""" Bootstrapping """ # ╔═╡ 5e35ff10-728b-4de7-b006-854f86b00ebb md""" Load saved bootstrap data. Performing the bootstrap can be quite slow, so the actual command for getting the data is commented out. """ # ╔═╡ 903609fb-93b0-464a-93a0-d109b7c99f83 # UrBootstrap = bootstrapGSA(XTrainFinal, YTrainUr; regularize=false, nStart=20, nEnd=140, nStep=20) # NpBootstrap = bootstrapGSA(XTrainFinal, YTrainNp; regularize=false, nStart=20, nEnd=140, nStep=20) # ╔═╡ 0fb17118-ed57-4871-aded-4e71c4688f56 begin UrBootstrap = load("./data/bootstrapping/bootstrapUr2208.jld", "UrBootstrap") avgBootstrapUr = mean(UrBootstrap; dims=2)[:, 1, :, :] avgBootstrapRepsUr = mean(avgBootstrapUr; dims=2)[:, 1, :] stdBootstrapRepsUr = std(avgBootstrapUr; dims=2)[:, 1, :] end # ╔═╡ 97400496-6816-4214-9bbc-bc577cf23097 begin NpBootstrap = load("./data/bootstrapping/bootstrapNp2208.jld", "NpBootstrap") avgBootstrapNp = mean(NpBootstrap; dims=2)[:, 1, :, :] avgBootstrapRepsNp = mean(avgBootstrapNp; dims=2)[:, 1, :] stdBootstrapRepsNp = std(avgBootstrapNp; dims=2)[:, 1, :] end # ╔═╡ d78c1a5e-3ecd-4fc2-b03a-5cb81a94b963 summaryColors = palette(:tab10, rev=true)[6:-1:1] # ╔═╡ 0f8d8031-56c0-4973-b378-310745f5731b md""" Plot summary of bootstrapping results. (figure 9) """ # ╔═╡ 9b95b6dc-5a09-4ed3-aa67-789ed7ce6072 begin pLineSummaryUr = plot() for (idx, eachName) in enumerate(inputNames) meanTrend = avgBootstrapRepsUr[idx, :] errTrend = stdBootstrapRepsUr[idx, :] plot!(20:20:140, meanTrend, yerr=errTrend, linewidth=2.5, linecolor=summaryColors[idx], marker=:circle, markercolor=summaryColors[idx], markerstrokecolor=summaryColors[idx], markerstrokewidth=1.5, label=eachName) end plot!(legend=:topleft) plot!(xticks=(20:20:140, string.(20:20:140))) plot!(xlabel="Sample size n") plot!(ylabel="Sᵢ") plot!(guidefontsize=20) plot!(tickfontsize=16) plot!(leftmargin=5mm) plot!(bottommargin=5mm) plot!(framestyle=:box) plot!(fg_legend=nothing) plot!(bg_legend=nothing) plot!(size=(750, 500)) plot!(ylims=(0, 0.5)) end # ╔═╡ 5ff32208-b48c-4592-826e-a445efdacb1a begin pLineSummaryNp = plot() for (idx, eachName) in enumerate(inputNames) meanTrend = avgBootstrapRepsNp[idx, :] errTrend = stdBootstrapRepsNp[idx, :] plot!(20:20:140, meanTrend, yerr=errTrend, linewidth=2.5, linecolor=summaryColors[idx], marker=:circle, markercolor=summaryColors[idx], markerstrokecolor=summaryColors[idx], markerstrokewidth=1.5, label=eachName) end plot!(legend=:topleft) plot!(xticks=(20:20:140, string.(20:20:140))) plot!(xlabel="Sample size n") plot!(ylabel="Sᵢ") plot!(guidefontsize=20) plot!(tickfontsize=16) plot!(leftmargin=5mm) plot!(bottommargin=5mm) plot!(framestyle=:box) plot!(fg_legend=nothing) plot!(bg_legend=nothing) plot!(size=(750, 500)) plot!(ylims=(0, 0.5)) end # ╔═╡ 36b6cc07-fa03-4155-934c-16561bd0d741 md""" Miscellaneous """ # ╔═╡ 5a63d30b-e0a3-4270-93ba-f5e37b060f0f begin plotArgsUr = Dict(:palette=>:seaborn_bright, :dateFormat=>"dd-mm HH:MM", :tickInterval=>108, # :simIdx => parse.(Int, EachSimID), :simAlpha=>0.6, :simWidth=>1.2, :ylabel=>"Uᵣ[km/s]", :title=>"", :startTime=>startTime, :dpi=>200, :plotLabels=>:false, ) plotArgsNp = Dict(:palette=>:seaborn_bright, :dateFormat=>"dd-mm HH:MM", :tickInterval=>108, # :simIdx => parse.(Int, EachSimID), :simAlpha=>0.6, :simWidth=>1.2, :ylabel=>"Nₚ[cm⁻³]", # :ylabel=>"Np [cm" * L"^{-3}" * "]", :title=>"", :startTime=>startTime, :dpi=>200, :ylims=>(0, 80), :plotLabels=>:false ) plotArgsB = Dict(:palette=>:seaborn_bright, :dateFormat=>"dd-mm HH:MM", :tickInterval=>108, # :simIdx => parse.(Int, EachSimID), :simAlpha=>0.6, :simWidth=>1.2, :ylabel=>"B[nT]", # :ylabel=>"Np [cm" * L"^{-3}" * "]", :title=>"", :startTime=>startTime, :dpi=>200, :ylims=>(0, 20), :plotLabels=>:false, :subtractFactor=>0 ) plotArgsT = Dict(:palette=>:seaborn_bright, :dateFormat=>"dd-mm HH:MM", :tickInterval=>108, # :simIdx => parse.(Int, EachSimID), :simAlpha=>0.6, :simWidth=>1.5, :ylabel=>"T[K]", # :ylabel=>"Np [cm" * L"^{-3}" * "]", :title=>"", :startTime=>startTime, :dpi=>200, :ylims=>(0, 9e5), :plotLabels=>:false, :subtractFactor=>0 ) end # ╔═╡ a8467e8e-9555-4bda-a0bd-da1164c8b232 begin # make plots of the runs that are successful and satisfy the constraints pUrSimObsF = plotSimObs(UrSim, UrObs, times, collect(1:200); simIdx=finalRuns, plotArgsUr..., ylims=(100, 1000), dateFormat="dd-mm") plot!(size=(920, 470)) plot!(guidefontsize=24) plot!(left_margin=7mm) plot!(bottom_margin=7mm) plot!(top_margin=5.5mm) plot!(ytickfontsize=18) plot!(xtickfontsize=18) plot!(dpi=300) end # ╔═╡ 8d64d55c-0068-4d12-9947-e6b5094835ff begin pNpSimObsF = plotSimObs(NpSim, NpObs, times, collect(1:200); simIdx=finalRuns, plotArgsNp..., ylims=(0, 100), dateFormat="dd-mm") plot!(size=(920, 470)) plot!(guidefontsize=24) plot!(left_margin=7mm) plot!(bottom_margin=7mm) plot!(top_margin=5.5mm) plot!(ytickfontsize=18) plot!(xtickfontsize=18) plot!(dpi=300) end # ╔═╡ 720d0ca2-5da3-4c28-ab55-20a778adc7e4 begin pBSimObsF = plotSimObs(BSim, BObs, times, collect(1:200); simIdx=finalRuns, plotArgsB..., dateFormat="dd-mm") plot!(size=(920, 470)) plot!(guidefontsize=24) plot!(left_margin=7mm) plot!(bottom_margin=7mm) plot!(top_margin=5.5mm) plot!(ytickfontsize=18) plot!(xtickfontsize=18) plot!(dpi=300) end # ╔═╡ 1772d4e8-42b4-4932-8d0c-170aae556f2b begin pTSimObsF = plotSimObs(TSim, TObs, times, collect(1:200); simIdx=finalRuns, plotArgsT..., ylims=(0, 10e5), dateFormat="dd-mm") plot!(yticks=(0:2e5:10e5, [0; [@sprintf("%de5", i) for i in 2:2:10]][:])) plot!(size=(920, 470)) plot!(guidefontsize=24) plot!(left_margin=7mm) plot!(bottom_margin=7mm) plot!(top_margin=5.5mm) plot!(ytickfontsize=18) plot!(xtickfontsize=18) plot!(dpi=300) end # ╔═╡ Cell order: # ╠═76c3e251-4be0-4419-81c5-fbfa32250b8f # ╟─e0bb2c6d-9618-4f7b-bf5d-7142e673fa23 # ╠═6cb3b25b-701f-4eca-bde1-03c7910ec523 # ╟─3e140602-f9e6-4c4c-89bd-fc051b505e33 # ╠═7f07c44a-3cad-40bc-bb4b-a738e26f1b95 # ╟─cae9da64-c6d0-45ae-9528-ce8cb46969f8 # ╟─f6cf52cf-c677-40eb-8af6-fceb04e32339 # ╠═844a7d5e-71ef-4e76-85ac-db90d1a581bb # ╟─62fff0a4-82ad-4643-b7f1-561c5644d7e0 # ╠═34f42c83-22ad-414a-ab65-be93a5c9be14 # ╠═16adf9b7-76ad-4902-81d7-9269318ca26b # ╠═a659f1da-1b23-44e8-a9db-c5b8953b3e82 # ╠═f4ef705e-a7e0-49ef-96e1-48eb87df9340 # ╠═902b0932-1841-4607-8f4c-b8140edb5cf3 # ╟─bea921ff-cc8e-48e3-806d-78bd52334b8f # ╠═2acdc135-7a5a-44a1-9390-464307e177a7 # ╟─d7409613-525d-417f-9d66-7bf3abfec64c # ╠═c93a9dbf-95c9-420c-b5f6-6efc28e66eec # ╠═195f5770-2391-4101-893a-1c367abff704 # ╟─189dc329-5414-4b48-8bf9-94ec4579048e # ╠═e89f5564-75ed-40e4-a26f-b9e91dc65d8c # ╟─40222bdc-5e2a-4ca5-8bcb-3adf27cabad5 # ╠═8d0da409-7706-4a4c-90e0-18c41e747f7b # ╠═42145a1f-b99b-4a70-8a37-923682dee2ab # ╟─2ffe286e-d361-4c75-8529-d148e5f896d7 # ╠═6035afb9-31da-43cf-816a-36962d3a996c # ╟─dc675b70-a7d2-435d-afdc-e05cc32a061f # ╠═a8467e8e-9555-4bda-a0bd-da1164c8b232 # ╠═8d64d55c-0068-4d12-9947-e6b5094835ff # ╠═720d0ca2-5da3-4c28-ab55-20a778adc7e4 # ╠═1772d4e8-42b4-4932-8d0c-170aae556f2b # ╟─e0a4514a-83fc-4c21-a555-d89407cd436d # ╟─6a8503ed-e59a-4391-9f9a-88b761976e36 # ╠═b4faacd2-4df5-4b30-b928-aeb160049678 # ╠═b4f5a355-3625-4f9a-b01b-4355d49ece98 # ╠═de3f0b4e-2d49-4ba5-9b22-799314cc5076 # ╠═55487f5c-2542-4ecd-9091-92c618a9b3cd # ╠═7b049137-6ec2-43b1-8fb2-95c6799a3cfb # ╟─cd85f891-6f1e-4cea-9307-bf4231f4a446 # ╠═79ca120b-3810-4e8b-9237-c98119aaa736 # ╠═232f5599-6d41-4379-9e5f-c6922b1ac2c9 # ╠═281b69ad-e061-4fd5-9f85-9aae93e280ff # ╟─bf6e9034-3eae-4875-8f36-2cc7b31bf3b1 # ╠═2017c596-f6dd-4b4b-bb9c-bf05e9980432 # ╠═b9ac0fc0-076c-448b-ad2f-18da9ab8e9fa # ╟─43d86334-5128-4519-8bc7-d3a47ff8a5f0 # ╠═4d4f206c-9e87-4be4-9b14-acc3dd92f4b3 # ╠═eb7349b5-c681-436b-8295-48ca47b9af09 # ╟─656871e0-1b36-4965-8b4d-6da2191d698b # ╠═88d080a3-ad9c-496f-ac24-794e2026c906 # ╠═aeac3a5e-1d40-4f14-8c79-5488a36e871f # ╟─35e569be-5926-4ec6-9cb7-a31be6bee6c3 # ╠═54444b2b-0b62-4bf5-a4e5-de0b274326e1 # ╠═2dbf33e2-14fc-446a-82df-4308307a8922 # ╠═623254e2-2d04-48f1-aaf2-e2a43102a34d # ╠═1e87d6de-a83a-4fbd-b449-8fa7afcc4782 # ╠═b4fe4583-7275-494e-a7dd-db1ed034dbf5 # ╠═1d80aaf8-f44c-477f-b172-388aeca62e74 # ╟─d790df8c-e0f5-4699-a711-df8a9115cdda # ╟─5e35ff10-728b-4de7-b006-854f86b00ebb # ╠═903609fb-93b0-464a-93a0-d109b7c99f83 # ╠═0fb17118-ed57-4871-aded-4e71c4688f56 # ╠═97400496-6816-4214-9bbc-bc577cf23097 # ╠═d78c1a5e-3ecd-4fc2-b03a-5cb81a94b963 # ╟─0f8d8031-56c0-4973-b378-310745f5731b # ╠═9b95b6dc-5a09-4ed3-aa67-789ed7ce6072 # ╠═5ff32208-b48c-4592-826e-a445efdacb1a # ╟─36b6cc07-fa03-4155-934c-16561bd0d741 # ╠═5a63d30b-e0a3-4270-93ba-f5e37b060f0f