### A Pluto.jl notebook ### # v0.11.14 using Markdown using InteractiveUtils # This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). macro bind(def, element) quote local el = $(esc(element)) global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : missing el end end # ╔═╡ 6747dc00-f6b7-11ea-0f15-87c36b36b915 begin using PlutoUI using Plots using LinearAlgebra # Returns true if row has all zeros. function is_zero_row(A, row, tolerance=10e-16) (m, n) = size(A) return all([abs(A[row,col]) < tolerance for col=1:n]) end # Returns first index of nonzero entry in row, or 0 if none exists. function find_leading(A, row=1, tolerance=10e-16) (m, n) = size(A) for col=1:n if abs(A[row, col]) > tolerance return col end end return 0 end function find_nonzeros_in_column(A, row_start, col, tol=10e-12) (m, n) = size(A) return [i for i=row_start:m if abs(A[i,col]) > tol] end function columns(A) (m, n) = size(A) return n end function rowop_replace(A, source_row, target_row, scalar_factor) @assert source_row != target_row for j=1:columns(A) A[target_row,j] += A[source_row,j] * scalar_factor end return A end function rowop_scale(A, target_row, scalar_factor) @assert scalar_factor != 0 for j=1:columns(A) A[target_row,j] *= scalar_factor end A end function rowop_swap(A, s, t) for j=1:columns(A) A[t,j], A[s,j] = A[s,j], A[t,j] end A end function RREF_with_rowop_count(A, tol=10e-12) rowop_count = 0 A = float(copy(A)) (m, n) = size(A) row = 1 for col=1:n nonzeros = find_nonzeros_in_column(A, row, col, tol) if length(nonzeros) == 0 continue end i = nonzeros[1] if abs(A[i, col] - 1) < tol A[i, col] = 1 else A = rowop_scale(A, i, 1 / A[i, col]) rowop_count += 1 end for j=nonzeros[2:end] A = rowop_replace(A, i, j, -A[j, col]) rowop_count += 1 end if i != row A = rowop_swap(A, row, i) rowop_count += 1 end row += 1 end for row=m:-1:1 l = find_leading(A, row, tol) if l > 0 for k=1:row - 1 if abs(A[k,l]) > tol rowop_replace(A, row, k, -A[k,l]) rowop_count += 1 end end end end # round entries to give nicer output; could omit this step for row=1:m for col=1:n if abs(A[row,col] - round(A[row,col])) < tol A[row,col] = round(A[row,col]) end end end return A, rowop_count end function RREF_RowOpCount(A, tol=10e-12) A, ops = RREF_with_rowop_count(A, tol) return ops end function RREF(A, tol=10e-12) A, ops = RREF_with_rowop_count(A, tol) return A end md"# Notebook 3 -- Math 2121, Fall 2020 In today's notebook we'll try to get some feeling for vectors in $\mathbb{R}^2$ and $\mathbb{R}^3$ and their linear combinations. We'll also think about what a solution to a vector equation means. The code here involves a lot of new plotting functions in Julia." end # ╔═╡ 5ee83624-f6b7-11ea-2d58-87189f8d012d md"## Running *this* notebook (optional) If you have Pluto up and running, you can access the notebook we are currently viewing by entering [this link](http://www.math.ust.hk/~emarberg/teaching/2020/Math2121/julia/03_Math2121_Fall2020.jl) (right click -> Copy Link) in the *Open from file* menu in Pluto. " # ╔═╡ 3a8d2b70-f6b4-11ea-070a-d32002194d8b md"## Vectors in $\mathbb{R}^2$ Let's start out by drawing some vectors in $\mathbb{R}^2$." # ╔═╡ d967006e-f6a4-11ea-0e3c-5b6f279a1441 begin u1_slider = @bind u1 Slider(-10:0.1:10, default=4, show_value=false) u2_slider = @bind u2 Slider(-10:0.1:10, default=8, show_value=false) v1_slider = @bind v1 Slider(-10:0.1:10, default=-10, show_value=false) v2_slider = @bind v2 Slider(-10:0.1:10, default=6, show_value=false) w1_slider = @bind w1 Slider(-10:0.1:10, default=2, show_value=false) w2_slider = @bind w2 Slider(-10:0.1:10, default=-9, show_value=false) md"""**Create some vectors in $$\mathbb{R}^2$$** `u1` = $(u1_slider) `v1` = $(v1_slider) `w1` = $(w1_slider) `u2` = $(u2_slider) `v2` = $(v2_slider) `w2` = $(w2_slider) """ end # ╔═╡ 2db41822-f70a-11ea-021f-e5d09f5851d4 md"The vectors we created:" # ╔═╡ 98dd602c-f6a6-11ea-144f-9b221eb88795 begin s = [string(u1), string(v1), string(w1), string(u2), string(v2), string(w2)] pad = maximum([4, maximum(map(length,s))]) for i=1:length(s) s[i] = " "^(pad - length(s[i])) * s[i] end top = join(["u = [$(s[1])]", "v = [$(s[2])]", "w = [$(s[3])]"], " ") bot = join([" [$(s[4])]", " [$(s[5])]", " [$(s[6])]"], " ") Text(join([top, bot], "\n")) end # ╔═╡ 33895ef0-f6b1-11ea-0e3a-0b30a86db2d3 md"""**Display**: `u` $(@bind uon html"") `v` $(@bind von html"") `w` $(@bind won html"") """ # ╔═╡ e1c4cf42-f6a5-11ea-2a1f-dff25e027eee begin lims = ( -(maximum([1, uon + von + won])) * 10, maximum([1, uon + von + won]) * 10 ) p1 = scatter([0], [0], xlims = lims, ylims = lims, legend = false, label = "origin", aspect_ratio=:equal, title = "Vectors u, v, w") if uon quiver!(quiver = ([u1],[u2]), [0], [0], color = [:blue],) end if von quiver!(quiver = ([v1],[v2]), [0], [0], color = [:orange],) end if won quiver!(quiver = ([w1],[w2]), [0], [0], color = [:green],) end p2 = scatter([0], [0], xlims = lims, ylims = lims, legend = false, label = "origin", aspect_ratio=:equal, title = "Sum of vectors") quiver!( quiver = ([uon*u1 + von*v1 + won*w1],[uon*u2 + von*v2 + won*w2]), [0], [0], color = [:black], ) quiver!( quiver = ([uon*u1],[uon*u2]), [0], [0], color = [:blue], linestyle = :dashdot, ) quiver!( quiver = ([von*v1],[von*v2]), [uon*u1], [uon*u2], color = [:orange], linestyle = :dashdot, ) quiver!( quiver = ([won*w1],[won*w2]), [uon*u1 + von*v1], [uon*u2 + von*v2], color = [:green], linestyle = :dashdot, ) plot(p1, p2, layout=2) end # ╔═╡ 5d6739a2-f70a-11ea-0737-3b3874765845 md"The vector $u$ is shown in blue, $v$ in orange, and $w$ in green. The right hand graph shows the sum of the displayed vectors on the left as the solid arrow. The dotted arrows are just copies of u, v, and w moved around." # ╔═╡ 14f5cc00-f6b4-11ea-2835-b76d6f1e37a3 md"## Linear combinations Now that we have chosen some vectors $u$, $v$, $w$, let's think about the meaning of the linear combination $au + bv + cw$ where $a,b,c \in \mathbb{R}$ are scalars." # ╔═╡ 4bc944f2-f6b2-11ea-37a2-53e73f307768 begin a_slider = @bind a Slider(-10:0.1:10, default=1, show_value=false) b_slider = @bind b Slider(-10:0.1:10, default=1, show_value=false) c_slider = @bind c Slider(-10:0.1:10, default=1, show_value=false) md"""**Choose some scalars in $$\mathbb{R}$$** `a` = $(a_slider) `b` = $(b_slider) `c` = $(c_slider) """ end # ╔═╡ bec5ac22-f70a-11ea-2599-7ff686c7f620 md"The scalars we chose:" # ╔═╡ f1397f22-f6b4-11ea-32b8-0ffb8a145542 Text(join([string("a = ", a), string("b = ", b), string("c = ", c)], " ")) # ╔═╡ 771a53ba-f6b4-11ea-1356-d53f76f17153 begin p3 = scatter([0], [0], xlims = lims, ylims = lims, legend = false, label = "origin", aspect_ratio=:equal, title = "a•u, b•v, and c•w") if uon quiver!(quiver = ([a*u1],[a*u2]), [0], [0], color = [:blue],) end if von quiver!(quiver = ([b*v1],[b*v2]), [0], [0], color = [:orange],) end if won quiver!(quiver = ([c*w1],[c*w2]), [0], [0], color = [:green],) end p4 = scatter([0], [0], xlims = lims, ylims = lims, legend = false, label = "origin", aspect_ratio=:equal, title = "a•u + b•v + c•w") quiver!( quiver = ( [a*uon*u1 + b*von*v1 + c*won*w1], [a*uon*u2 + b*von*v2 + c*won*w2] ), [0], [0], color = [:black], ) quiver!( quiver = ([a*uon*u1],[a*uon*u2]), [0], [0], color = [:blue], linestyle = :dashdot, ) quiver!( quiver = ([b*von*v1],[b*von*v2]), [a*uon*u1], [a*uon*u2], color = [:orange], linestyle = :dashdot, ) quiver!( quiver = ([c*won*w1],[c*won*w2]), [a*uon*u1 + b*von*v1], [a*uon*u2 + b*von*v2], color = [:green], linestyle = :dashdot, ) plot(p3, p4, layout=2) end # ╔═╡ c9c67d22-f70a-11ea-06dd-29444f52a98d md"Varying $a$ among positive values scales the length of the arrow that represents the vector $u$. If $a$ is negative then this scalaing reverses the direction of $u$. The same thing happens to the arrows representing $v$ and $w$ when we change $b$ and $c$." # ╔═╡ 63c9a0c0-f6b6-11ea-08e2-79dd64b9d659 md"## Vector equations Let's now think of $a,b,c$ as the variables $x_1=a$ and $x_2=b$ and $x_3=c$. Choose a target vector $t =\left[\begin{array}{l} t_1 \\ t_2\end{array}\right] \in \mathbb{R}^2$. What does a solution to the equation $x_1 u + x_2 v + x_3 w = t$ mean? We know that the solutions $x = \left[\begin{array}{l} x_1 \\ x_2 \\ x_3\end{array}\right]$ to this equation are the same as the solutions to the linear system whose augmented matrix is $$A = \left[\begin{array}{ccc|c} u_1 & v_1 & w_1 & t_1 \\ u_2 & v_2 & w_2 & t_2 \end{array}\right]$$." # ╔═╡ ca58c60e-f70b-11ea-15e4-252f5aedd5eb md"Let's create a random target vector $t$." # ╔═╡ bfb22812-f70b-11ea-2b93-294dd13f0173 target = rand(-20:0.1:20, 2, 1) # ╔═╡ dcaf837e-f70b-11ea-2489-2fa42527ffc2 md"Here's our coefficient matrix." # ╔═╡ 78fe315e-f6b6-11ea-0b1a-8d6ebd027af3 coefficient_matrix = [u1 v1 w1; u2 v2 w2] # ╔═╡ ed69aba4-f70b-11ea-29e9-85532d4d171b md"Here's our augmented matrix." # ╔═╡ a126f008-f6b6-11ea-332e-2ddd7c48ff18 augmented_matrix = hcat(coefficient_matrix, target) # ╔═╡ f2dfc3fc-f70b-11ea-320c-4fd9aafe03d2 md"To solve the corresponding linear system we compute `RREF(augmented_matrix)`." # ╔═╡ a24ebc82-f6b7-11ea-128a-8bbc70971d7e rref = RREF(augmented_matrix) # ╔═╡ 0ba78366-f70c-11ea-0d41-4d3026d8c9ff md"For typical values of $t$, the pivot positions are (1,1) and (2,2). This means $x_1$ and $x_2$ are basic variables and $x_3$ is a free variable. To get a solution, choose any value for $x_3$, then solve for $x_1$, $x_2$." # ╔═╡ 0591f7bc-f6b8-11ea-3593-6f4d7893bde4 free_variable_value = 0 # ╔═╡ f29f1fc2-f6b7-11ea-0e1c-af44896f05d2 solution = ( rref[1,4] - free_variable_value * rref[1,3], rref[2,4] - free_variable_value * rref[2, 3], free_variable_value ) # ╔═╡ 77c5fc44-f70c-11ea-14d5-8f1a3c63973d md"The meaninng of this solution is that if we set $x_1$, $x_2$, and $x_3$ to the corresponding values, then the linear combination $x_1 u + x_2 v + x_3 w$ should match up with the target vector $t$. We can see this visually below." # ╔═╡ 117f228a-f6b7-11ea-328d-99c1bcad90a4 begin md""" `x1` = $(a_slider) `x2` = $(b_slider) `x3` = $(c_slider) """ end # ╔═╡ 27222d80-f6b7-11ea-15fd-31403c3a4fc3 Text(join([string("x1 = ", a), string("x2 = ", b), string("x3 = ", c)], " ")) # ╔═╡ c126ab46-f6b6-11ea-0998-a5d507105e6c begin p5 = scatter([0 target[1]], [0 target[2]], xlims = (-20,20), ylims = (-20,20), legend = true, label = ["origin" "target"], # aspect_ratio=:equal, title = "x1•u + x2•v + x3•w = ?", ) quiver!( quiver = ([a*uon*u1 + b*von*v1 + c*won*w1],[a*uon*u2 + b*von*v2 + c*won*w2]), [0], [0], color = [:black], ) quiver!( quiver = ([a*uon*u1],[a*uon*u2]), [0], [0], color = [:blue], linestyle = :dashdot, ) quiver!( quiver = ([b*von*v1],[b*von*v2]), [a*uon*u1], [a*uon*u2], color = [:orange], linestyle = :dashdot, ) quiver!( quiver = ([c*won*w1],[c*won*w2]), [a*uon*u1 + b*von*v1], [a*uon*u2 + b*von*v2], color = [:green], linestyle = :dashdot, ) plot(p5) end # ╔═╡ 3e305304-f6b9-11ea-39bc-9bc8b5bccea8 md"## Vectors in $\mathbb{R}^3$ Let's also try to visualize vectors in $\mathbb{R}^3$ and think about their span. This is a little more challenging to display." # ╔═╡ 6d2d8fb4-f706-11ea-12e0-85e0428d422e begin p_slider = @bind _phi Slider(-360:12:360, default=0, show_value=true) q_slider = @bind _psi Slider(-360:12:360, default=0, show_value=true) md"""**Display parameters** (changing these rotates our view):" `phi` = $(p_slider) `psi` = $(q_slider) """ end # ╔═╡ eadc8946-f662-11ea-0c60-5b32a7ff3686 begin a1_slider = @bind a1 Slider(0:1:20, default=4, show_value=false) a2_slider = @bind a2 Slider(0:1:20, default=8, show_value=false) a3_slider = @bind a3 Slider(0:1:20, default=0, show_value=false) b1_slider = @bind b1 Slider(0:1:20, default=10, show_value=false) b2_slider = @bind b2 Slider(0:1:20, default=6, show_value=false) b3_slider = @bind b3 Slider(0:1:20, default=0, show_value=false) md"""**Create some vectors in $$\mathbb{R}^3$$** `v1` = $(a1_slider) `w1` = $(b1_slider) `v2` = $(a2_slider) `w2` = $(b2_slider) `v3` = $(a3_slider) `w3` = $(b3_slider) """ end # ╔═╡ 21f94354-f70d-11ea-298a-91b2b4f84497 md"The vectors we created:" # ╔═╡ 54304a0a-f6bc-11ea-3784-ef7e2c75f3b5 begin _s = [string(a1), string(b1), string(a2), string(b2), string(a3), string(b3)] _pad = maximum([4, maximum(map(length,_s))]) for i=1:length(_s) _s[i] = " "^(_pad - length(_s[i])) * _s[i] end _top = join(["v = [$(_s[1])]", "w = [$(_s[2])]"], " ") _mid = join([" [$(_s[3])]", " [$(_s[4])]"], " ") _bot = join([" [$(_s[5])]", " [$(_s[6])]"], " ") Text(join([_top, _mid, _bot], "\n")) end # ╔═╡ ec16885a-f707-11ea-28bf-dffc2c6c367b md"""show shadows in $xy$-plane: $(@bind nothide html"") """ # ╔═╡ 5b41e866-f703-11ea-3040-93adc7fc1914 md"""draw span: $(@bind span html"") """ # ╔═╡ 7a7dca26-f6bb-11ea-37b8-1f97f11903d9 begin phi = (_phi - 90) / 360 * pi psi = (_psi - 270) / 360 * pi A = [ sin(psi) -cos(psi) 0 cos(phi) * cos(psi) cos(phi) * sin(psi) -sin(phi)] md"" end # ╔═╡ 2b9623ee-f662-11ea-30d4-dd9d4e7db44b begin nlims = (-20,20) p6 = scatter([0], [0], legend = false, label = "origin", aspect_ratio=:equal, grid=nothing, axis=nothing, foreground_color_subplot="white", ) for i=6:6:60 quiver!( quiver = ([100 * A[1,2]], [100 * A[2,2]]), [i * A[1,1]], [i * A[2,1]], color=[:lightgray], linestyle = :dashdot, ) quiver!( quiver = ([100 * A[1,1]], [100 * A[2,1]]), [i * A[1,2]], [i * A[2,2]], color=[:lightgray], linestyle = :dashdot, ) end quiver!( quiver = (100 * A[1:1,1:3], 100 * A[2:2,1:3]), [0, 0, 0], [0, 0, 0], xlims = nlims, ylims = nlims, color = [:grey], ) if nothide x = A * [a1; a2; 0] quiver!( quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue], linestyle = :dashdot, ) y = A * [b1; b2; 0] quiver!( quiver = ([y[1]], [y[2]]), [0], [0], color = [:orange], linestyle = :dashdot, ) end x = A * [a1; a2; a3] y = A * [b1; b2; b3] if norm(x) != 0 nx = x / norm(x) else nx = x end if norm(y) != 0 ny = y / norm(y) else ny = y end if span for i=0:20 for j=0:20 scatter!( [i * nx[1] + j * ny[1]], [i * nx[2] + j * ny[2]], color=[:lightgray], ) end end end quiver!(quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue],) quiver!(quiver = ([y[1]], [y[2]]), [0], [0], color = [:orange],) p7 = scatter([0], [0], legend = false, label = "origin", aspect_ratio=:equal, grid=nothing, axis=nothing, foreground_color_subplot="white" ) for i=6:6:60 quiver!( quiver = ([100 * A[1,2]], [100 * A[2,2]]), [i * A[1,1]], [i * A[2,1]], color=[:lightgray], linestyle = :dashdot, ) quiver!( quiver = ([100 * A[1,1]], [100 * A[2,1]]), [i * A[1,2]], [i * A[2,2]], color=[:lightgray], linestyle = :dashdot, ) end quiver!( quiver = (100 * A[1:1,1:3], 100 * A[2:2,1:3]), [0, 0, 0], [0, 0, 0], xlims = nlims, ylims = nlims, color = [:grey], ) if nothide x = A * [a1; a2; 0] y = A * [b1; b2; 0] quiver!( quiver = ([x[1]], [x[2]]), [0], [0], color = [:grey], linestyle = :dashdot,) quiver!( quiver = ([y[1]], [y[2]]), [x[1]], [x[2]], color = [:grey], linestyle = :dashdot,) quiver!( quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0], color = [:grey]) end x = A * [a1; a2; a3] y = A * [b1; b2; b3] quiver!( quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue], linestyle = :dashdot) quiver!( quiver = ([y[1]], [y[2]]), [x[1]], [x[2]], color = [:orange], linestyle = :dashdot) quiver!( quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0], color = [:black]) plot(p6, p7, layout=2) end # ╔═╡ 328a48f8-f70d-11ea-01ad-134d67559e56 md"The left picture shows that vectors $v$ and $w$. The right picture shows their sum. We can also display the span of the two vectors, denoted $\mathbb{R}\text{-span}\{v,w\}$. For different inputs, we can get $\mathbb{R}\text{-span}\{v,w\}$ to be either a plane, a line, or a single point." # ╔═╡ 13455000-f70f-11ea-039e-61a52527c5c4 md"## Some remarks Of course, these pictures are not actually in $\mathbb{R}^3$! On a flat surface like this screen, we can only draw vectors in $\mathbb{R}^2$. Secretly, we are drawing many vectors $\mathbb{R}^2$ to simulate the appearance of $\mathbb{R}^3$. If we erase those extra vectors and display the usual axes, the plots below are what we are actually showing." # ╔═╡ ed5c9554-f70d-11ea-3b03-834875727f59 begin p8 = scatter([0], [0], legend = false, label = "origin", aspect_ratio=:equal, xlims = nlims, ylims = nlims, ) quiver!(quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue],) quiver!(quiver = ([y[1]], [y[2]]), [0], [0], color = [:orange],) p9 = scatter([0], [0], legend = false, label = "origin", aspect_ratio=:equal, xlims = nlims, ylims = nlims, ) quiver!( quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue], linestyle = :dashdot) quiver!( quiver = ([y[1]], [y[2]]), [x[1]], [x[2]], color = [:orange], linestyle = :dashdot) quiver!( quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0], color = [:black]) plot(p8, p9, layout=2) end # ╔═╡ c0c2ecb6-f70e-11ea-2eb7-0f49cce8ff48 md"How are these vectors in $\mathbb{R}^2$ computed from $v$ and $w$, which we chose to be in $\mathbb{R}^3$? Some kind of transformation is used to change vectors in $\mathbb{R}^3$ to vectors in $\mathbb{R}^2$ that we can display. We'll talk about these kinds of transformations next lecture." # ╔═╡ Cell order: # ╟─6747dc00-f6b7-11ea-0f15-87c36b36b915 # ╟─5ee83624-f6b7-11ea-2d58-87189f8d012d # ╟─3a8d2b70-f6b4-11ea-070a-d32002194d8b # ╟─d967006e-f6a4-11ea-0e3c-5b6f279a1441 # ╟─2db41822-f70a-11ea-021f-e5d09f5851d4 # ╟─98dd602c-f6a6-11ea-144f-9b221eb88795 # ╟─33895ef0-f6b1-11ea-0e3a-0b30a86db2d3 # ╟─e1c4cf42-f6a5-11ea-2a1f-dff25e027eee # ╟─5d6739a2-f70a-11ea-0737-3b3874765845 # ╟─14f5cc00-f6b4-11ea-2835-b76d6f1e37a3 # ╟─4bc944f2-f6b2-11ea-37a2-53e73f307768 # ╟─bec5ac22-f70a-11ea-2599-7ff686c7f620 # ╟─f1397f22-f6b4-11ea-32b8-0ffb8a145542 # ╟─771a53ba-f6b4-11ea-1356-d53f76f17153 # ╟─c9c67d22-f70a-11ea-06dd-29444f52a98d # ╟─63c9a0c0-f6b6-11ea-08e2-79dd64b9d659 # ╟─ca58c60e-f70b-11ea-15e4-252f5aedd5eb # ╠═bfb22812-f70b-11ea-2b93-294dd13f0173 # ╟─dcaf837e-f70b-11ea-2489-2fa42527ffc2 # ╠═78fe315e-f6b6-11ea-0b1a-8d6ebd027af3 # ╟─ed69aba4-f70b-11ea-29e9-85532d4d171b # ╠═a126f008-f6b6-11ea-332e-2ddd7c48ff18 # ╟─f2dfc3fc-f70b-11ea-320c-4fd9aafe03d2 # ╠═a24ebc82-f6b7-11ea-128a-8bbc70971d7e # ╟─0ba78366-f70c-11ea-0d41-4d3026d8c9ff # ╠═0591f7bc-f6b8-11ea-3593-6f4d7893bde4 # ╠═f29f1fc2-f6b7-11ea-0e1c-af44896f05d2 # ╟─77c5fc44-f70c-11ea-14d5-8f1a3c63973d # ╟─117f228a-f6b7-11ea-328d-99c1bcad90a4 # ╟─27222d80-f6b7-11ea-15fd-31403c3a4fc3 # ╟─c126ab46-f6b6-11ea-0998-a5d507105e6c # ╟─3e305304-f6b9-11ea-39bc-9bc8b5bccea8 # ╟─6d2d8fb4-f706-11ea-12e0-85e0428d422e # ╟─eadc8946-f662-11ea-0c60-5b32a7ff3686 # ╟─21f94354-f70d-11ea-298a-91b2b4f84497 # ╟─54304a0a-f6bc-11ea-3784-ef7e2c75f3b5 # ╟─ec16885a-f707-11ea-28bf-dffc2c6c367b # ╟─5b41e866-f703-11ea-3040-93adc7fc1914 # ╟─7a7dca26-f6bb-11ea-37b8-1f97f11903d9 # ╟─2b9623ee-f662-11ea-30d4-dd9d4e7db44b # ╟─328a48f8-f70d-11ea-01ad-134d67559e56 # ╟─13455000-f70f-11ea-039e-61a52527c5c4 # ╟─ed5c9554-f70d-11ea-3b03-834875727f59 # ╟─c0c2ecb6-f70e-11ea-2eb7-0f49cce8ff48