Þ ¥bonds€¬cell_resultsÞ 1Ù$ca7d2270-193d-11eb-3dd6-e1f6d2678a21Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ€<div class="markdown"><p>High resolution: <bond def="highres" unique_id="d06MJ09AkxKl"><input type="checkbox"></bond></p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚþ…K8°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$ca7d2270-193d-11eb-3dd6-e1f6d2678a21¹depends_on_disabled_cellsÂ§runtimeÎ¹2Oµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cc03530-1910-11eb-3404-15f5c8f69f8fŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ+propagate (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„i¾+°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cc03530-1910-11eb-3404-15f5c8f69f8f¹depends_on_disabled_cellsÂ§runtimeÎ 3&‹µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$45a028a0-190f-11eb-355d-ad3c55fb1e2fŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ\Þè°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$45a028a0-190f-11eb-355d-ad3c55fb1e2f¹depends_on_disabled_cellsÂ§runtimeÎ ‘Ÿµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ(refract (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ².o°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663¹depends_on_disabled_cellsÂ§runtimeÎ ýàµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c67b4f0-1910-11eb-0efe-5f123cc14d53Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ(reflect (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒÈr¬°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c67b4f0-1910-11eb-0efe-5f123cc14d53¹depends_on_disabled_cellsÂ§runtimeÎ æ£µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cd93b70-1910-11eb-050a-5713b545f28eŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ,pixel_color (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„h¬d°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cd93b70-1910-11eb-050a-5713b545f28e¹depends_on_disabled_cellsÂ§runtimeÎ ygµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8d1e5abe-1910-11eb-2a84-79f43f4a7e65Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ(objects (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ…m°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8d1e5abe-1910-11eb-2a84-79f43f4a7e65¹depends_on_disabled_cellsÂ§runtimeÎ àµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8e89388e-1914-11eb-0f2f-619c7fe79430Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþi8Ûs°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8e89388e-1914-11eb-0f2f-619c7fe79430¹depends_on_disabled_cellsÂ§runtimeÍ#�µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$c1f06690-1914-11eb-2426-29e3027f4f32Š¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix§Float64¨elements“’’§10002.0ªtext/plain’’£0.0ªtext/plain’’£0.0ªtext/plain¤type¥Array¬prefix_short ¨objectid°17e098aeedf4a4a1¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚþ„MZW°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$c1f06690-1914-11eb-2426-29e3027f4f32¹depends_on_disabled_cellsÂ§runtimeÎzå
µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c1acd70-1910-11eb-24e6-333b3aa1e91fŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ1sphere_normal_at (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ˜‡µ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c1acd70-1910-11eb-24e6-333b3aa1e91f¹depends_on_disabled_cellsÂ§runtimeÎ ÃÓµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c99c170-1910-11eb-2e24-49ed98b4dd2cŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ-intersection (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒõr†°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c99c170-1910-11eb-2e24-49ed98b4dd2c¹depends_on_disabled_cellsÂ§runtimeÎ (�;µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8989d43e-190e-11eb-3e48-7d10df903b5dŠ¦queuedÂ¤logs‘ˆ¤lineÿ£msg’ÚE„[32m[1m  Activating[22m[39m new project at `/tmp/jl_UC5bFu`
[32m[1m    Updating[22m[39m registry at `~/.julia/registries/General.toml`
[32m[1m   Resolving[22m[39m package versions...
[32m[1m   Installed[22m[39m ImageMagick â”€â”€â”€â”€â”€â”€ v1.3.0
[32m[1m   Installed[22m[39m Accessors â”€â”€â”€â”€â”€â”€â”€â”€ v0.1.41
[32m[1m   Installed[22m[39m Referenceables â”€â”€â”€ v0.1.3
[32m[1m   Installed[22m[39m InitialValues â”€â”€â”€â”€ v0.3.1
[32m[1m   Installed[22m[39m GR_jll â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.72.8+0
[32m[1m   Installed[22m[39m Images â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.23.3
[32m[1m   Installed[22m[39m DefineSingletons â”€ v0.1.2
[32m[1m   Installed[22m[39m SpecialFunctions â”€ v1.8.8
[32m[1m   Installed[22m[39m MicroCollections â”€ v0.2.0
[32m[1m   Installed[22m[39m StatsBase â”€â”€â”€â”€â”€â”€â”€â”€ v0.33.21
[32m[1m   Installed[22m[39m BangBang â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.4.3
[32m[1m   Installed[22m[39m ArgCheck â”€â”€â”€â”€â”€â”€â”€â”€â”€ v2.4.0
[32m[1m   Installed[22m[39m Libtiff_jll â”€â”€â”€â”€â”€â”€ v4.4.0+0
[32m[1m   Installed[22m[39m ImageShow â”€â”€â”€â”€â”€â”€â”€â”€ v0.2.3
[32m[1m   Installed[22m[39m ColorVectorSpace â”€ v0.8.7
[32m[1m   Installed[22m[39m CompositionsBase â”€ v0.1.2
[32m[1m   Installed[22m[39m ThreadsX â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.1.12
[32m[1m   Installed[22m[39m OpenSSL_jll â”€â”€â”€â”€â”€â”€ v1.1.23+1
[32m[1m   Installed[22m[39m ColorTypes â”€â”€â”€â”€â”€â”€â”€ v0.10.12
[32m[1m   Installed[22m[39m Transducers â”€â”€â”€â”€â”€â”€ v0.4.84
[32m[1m   Installed[22m[39m Plots â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ v1.40.7
[32m[1m   Installed[22m[39m WoodburyMatrices â”€ v0.5.6
[32m[1m   Installed[22m[39m SplittablesBase â”€â”€ v0.1.15
[32m[1m   Installed[22m[39m Baselet â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.1.1
[32m[1m   Installed[22m[39m Interpolations â”€â”€â”€ v0.13.6
[32m[1m   Installed[22m[39m GR â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ v0.72.8
[32m[1m   Installed[22m[39m FFMPEG_jll â”€â”€â”€â”€â”€â”€â”€ v4.4.2+2
[32m[1m    Updating[22m[39m `/tmp/jl_UC5bFu/Project.toml`
 [90m [6218d12a] [39m[92m+ ImageMagick v1.3.0[39m
 [90m [916415d5] [39m[92m+ Images v0.23.3[39m
 [90m [91a5bcdd] [39m[92m+ Plots v1.40.7[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.6.11[39m
 [90m [ac1d9e8a] [39m[92m+ ThreadsX v0.1.12[39m
[32m[1m    Updating[22m[39m `/tmp/jl_UC5bFu/Manifest.toml`
 [90m [621f4979] [39m[92m+ AbstractFFTs v1.5.0[39m
 [90m [7d9f7c33] [39m[92m+ Accessors v0.1.41[39m
 [90m [79e6a3ab] [39m[92m+ Adapt v4.3.0[39m
 [90m [dce04be8] [39m[92m+ ArgCheck v2.4.0[39m
 [90m [13072b0f] [39m[92m+ AxisAlgorithms v1.0.1[39m
 [90m [39de3d68] [39m[92m+ AxisArrays v0.4.7[39m
 [90m [198e06fe] [39m[92m+ BangBang v0.4.3[39m
 [90m [9718e550] [39m[92m+ Baselet v0.1.1[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [aafaddc9] [39m[92m+ CatIndices v0.2.2[39m
 [90m [d360d2e6] [39m[92m+ ChainRulesCore v1.25.1[39m
 [90m [9e997f8a] [39m[92m+ ChangesOfVariables v0.1.10[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [35d6a980] [39m[92m+ ColorSchemes v3.26.0[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.10.12[39m
 [90m [c3611d14] [39m[92m+ ColorVectorSpace v0.8.7[39m
 [90m [5ae59095] [39m[92m+ Colors v0.12.11[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
 [90m [ed09eef8] [39m[92m+ ComputationalResources v0.3.2[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
 [90m [d38c429a] [39m[92m+ Contour v0.6.3[39m
 [90m [150eb455] [39m[92m+ CoordinateTransformations v0.6.3[39m
 [90m [dc8bdbbb] [39m[92m+ CustomUnitRanges v1.0.2[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
 [90m [b4f34e82] [39m[92m+ Distances v0.10.12[39m
 [90m [ffbed154] [39m[92m+ DocStringExtensions v0.9.5[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [c87230d0] [39m[92m+ FFMPEG v0.4.2[39m
 [90m [4f61f5a4] [39m[92m+ FFTViews v0.3.2[39m
 [90m [7a1cc6ca] [39m[92m+ FFTW v1.9.0[39m
 [90m [5789e2e9] [39m[92m+ FileIO v1.17.0[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [1fa38f19] [39m[92m+ Format v1.3.7[39m
 [90m [28b8d3ca] [39m[92m+ GR v0.72.8[39m
 [90m [a2bd30eb] [39m[92m+ Graphics v1.1.3[39m
 [90m [42e2da0e] [39m[92m+ Grisu v1.0.2[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [bbac6d45] [39m[92m+ IdentityRanges v0.3.1[39m
 [90m [2803e5a7] [39m[92m+ ImageAxes v0.6.9[39m
 [90m [f332f351] [39m[92m+ ImageContrastAdjustment v0.3.7[39m
 [90m [a09fc81d] [39m[92m+ ImageCore v0.8.22[39m
 [90m [51556ac3] [39m[92m+ ImageDistances v0.2.13[39m
 [90m [6a3955dd] [39m[92m+ ImageFiltering v0.6.21[39m
 [90m [6218d12a] [39m[92m+ ImageMagick v1.3.0[39m
 [90m [bc367c6b] [39m[92m+ ImageMetadata v0.9.5[39m
 [90m [787d08f9] [39m[92m+ ImageMorphology v0.2.11[39m
 [90m [2996bd0c] [39m[92m+ ImageQualityIndexes v0.2.2[39m
 [90m [4e3cecfd] [39m[92m+ ImageShow v0.2.3[39m
 [90m [02fcd773] [39m[92m+ ImageTransformations v0.8.13[39m
 [90m [916415d5] [39m[92m+ Images v0.23.3[39m
 [90m [9b13fd28] [39m[92m+ IndirectArrays v0.5.1[39m
 [90m [22cec73e] [39m[92m+ InitialValues v0.3.1[39m
 [90m [a98d9a8b] [39m[92m+ Interpolations v0.13.6[39m
 [90m [8197267c] [39m[92m+ IntervalSets v0.7.11[39m
 [90m [3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
 [90m [92d709cd] [39m[92m+ IrrationalConstants v0.1.1[39m
 [90m [c8e1da08] [39m[92m+ IterTools v1.4.0[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [1019f520] [39m[92m+ JLFzf v0.1.11[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [23fbe1c1] [39m[92m+ Latexify v0.16.8[39m
 [90m [2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.28[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
 [90m [dbb5928d] [39m[92m+ MappedArrays v0.4.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [442fdcdd] [39m[92m+ Measures v0.3.2[39m
 [90m [128add7d] [39m[92m+ MicroCollections v0.2.0[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [e94cdb99] [39m[92m+ MosaicViews v0.3.4[39m
 [90m [77ba4419] [39m[92m+ NaNMath v1.0.3[39m
 [90m [6fe1bfb0] [39m[92m+ OffsetArrays v1.17.0[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [5432bcbf] [39m[92m+ PaddedViews v0.5.12[39m
 [90m [d96e819e] [39m[92m+ Parameters v0.12.3[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [ccf2f8ad] [39m[92m+ PlotThemes v3.3.0[39m
 [90m [995b91a9] [39m[92m+ PlotUtils v1.4.3[39m
 [90m [91a5bcdd] [39m[92m+ Plots v1.40.7[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.6.11[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [94ee1d12] [39m[92m+ Quaternions v0.7.6[39m
 [90m [b3c3ace0] [39m[92m+ RangeArrays v0.3.2[39m
 [90m [c84ed2f1] [39m[92m+ Ratios v0.4.5[39m
 [90m [c1ae055f] [39m[92m+ RealDot v0.1.0[39m
 [90m [3cdcf5f2] [39m[92m+ RecipesBase v1.3.4[39m
 [90m [01d81517] [39m[92m+ RecipesPipeline v0.6.12[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [42d2dcc6] [39m[92m+ Referenceables v0.1.3[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [ae029012] [39m[92m+ Requires v1.3.1[39m
 [90m [6038ab10] [39m[92m+ Rotations v1.7.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [efcf1570] [39m[92m+ Setfield v1.1.2[39m
 [90m [992d4aef] [39m[92m+ Showoff v1.0.3[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [699a6c99] [39m[92m+ SimpleTraits v0.9.4[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [276daf66] [39m[92m+ SpecialFunctions v1.8.8[39m
 [90m [171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
 [90m [860ef19b] [39m[92m+ StableRNGs v1.0.3[39m
 [90m [cae243ae] [39m[92m+ StackViews v0.1.2[39m
 [90m [90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
 [90m [1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
 [90m [82ae8749] [39m[92m+ StatsAPI v1.7.1[39m
 [90m [2913bbd2] [39m[92m+ StatsBase v0.33.21[39m
 [90m [fd094767] [39m[92m+ Suppressor v0.2.8[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [ac1d9e8a] [39m[92m+ ThreadsX v0.1.12[39m
 [90m [06e1c1a7] [39m[92m+ TiledIteration v0.3.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [28d57a85] [39m[92m+ Transducers v0.4.84[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [3a884ed6] [39m[92m+ UnPack v1.0.2[39m
 [90m [1cfade01] [39m[92m+ UnicodeFun v0.4.1[39m
 [90m [1986cc42] [39m[92m+ Unitful v1.23.1[39m
 [90m [45397f5d] [39m[92m+ UnitfulLatexify v1.7.0[39m
 [90m [41fe7b60] [39m[92m+ Unzip v0.2.0[39m
 [90m [efce3f68] [39m[92m+ WoodburyMatrices v0.5.6[39m
 [90m [6e34b625] [39m[92m+ Bzip2_jll v1.0.9+0[39m
 [90m [83423d85] [39m[92m+ Cairo_jll v1.18.5+0[39m
 [90m [ee1fde0b] [39m[92m+ Dbus_jll v1.16.2+0[39m
 [90m [2702e6a9] [39m[92m+ EpollShim_jll v0.0.20230411+1[39m
 [90m [2e619515] [39m[92m+ Expat_jll v2.6.5+0[39m
 [90m [b22a6f82] [39m[92m+ FFMPEG_jll v4.4.2+2[39m
 [90m [f5851436] [39m[92m+ FFTW_jll v3.3.11+0[39m
 [90m [a3f928ae] [39m[92m+ Fontconfig_jll v2.16.0+0[39m
 [90m [d7e528f0] [39m[92m+ FreeType2_jll v2.13.4+0[39m
 [90m [559328eb] [39m[92m+ FriBidi_jll v1.0.17+0[39m
 [90m [0656b61e] [39m[92m+ GLFW_jll v3.4.0+2[39m
 [90m [d2c73de3] [39m[92m+ GR_jll v0.72.8+0[39m
 [90m [78b55507] [39m[92m+ Gettext_jll v0.21.0+0[39m
 [90m [7746bdde] [39m[92m+ Glib_jll v2.84.0+0[39m
 [90m [3b182d85] [39m[92m+ Graphite2_jll v1.3.15+0[39m
 [90m [2e76f6c2] [39m[92m+ HarfBuzz_jll v8.5.1+0[39m
 [90m [c73af94c] [39m[92m+ ImageMagick_jll v6.9.10-12+3[39m
 [90m [1d5cc7b8] [39m[92m+ IntelOpenMP_jll v2025.0.4+0[39m
 [90m [aacddb02] [39m[92m+ JpegTurbo_jll v3.1.1+0[39m
 [90m [c1c5ebd0] [39m[92m+ LAME_jll v3.100.2+0[39m
 [90m [88015f11] [39m[92m+ LERC_jll v3.0.0+1[39m
 [90m [1d63c593] [39m[92m+ LLVMOpenMP_jll v18.1.8+0[39m
 [90m [dd4b983a] [39m[92m+ LZO_jll v2.10.3+0[39m
 [90m [e9f186c6] [39m[92m+ Libffi_jll v3.4.7+0[39m
 [90m [7e76a0d4] [39m[92m+ Libglvnd_jll v1.7.1+1[39m
 [90m [94ce4f54] [39m[92m+ Libiconv_jll v1.18.0+0[39m
 [90m [4b2f31a3] [39m[92m+ Libmount_jll v2.41.0+0[39m
 [90m [89763e89] [39m[92m+ Libtiff_jll v4.4.0+0[39m
 [90m [38a345b3] [39m[92m+ Libuuid_jll v2.41.0+0[39m
 [90m [856f044c] [39m[92m+ MKL_jll v2025.0.1+1[39m
 [90m [e7412a2a] [39m[92m+ Ogg_jll v1.3.5+1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v1.1.23+1[39m
 [90m [efe28fd5] [39m[92m+ OpenSpecFun_jll v0.5.6+0[39m
 [90m [91d4177d] [39m[92m+ Opus_jll v1.3.3+0[39m
 [90m [36c8627f] [39m[92m+ Pango_jll v1.56.3+0[39m
 [90m [30392449] [39m[92m+ Pixman_jll v0.44.2+0[39m
 [90m [ea2cea3b] [39m[92m+ Qt5Base_jll v5.15.3+2[39m
 [90m [a2964d1f] [39m[92m+ Wayland_jll v1.23.1+0[39m
 [90m [2381bf8a] [39m[92m+ Wayland_protocols_jll v1.44.0+0[39m
 [90m [02c8fc9c] [39m[92m+ XML2_jll v2.13.6+1[39m
 [90m [4f6342f7] [39m[92m+ Xorg_libX11_jll v1.8.12+0[39m
 [90m [0c0b7dd1] [39m[92m+ Xorg_libXau_jll v1.0.13+0[39m
 [90m [935fb764] [39m[92m+ Xorg_libXcursor_jll v1.2.4+0[39m
 [90m [a3789734] [39m[92m+ Xorg_libXdmcp_jll v1.1.6+0[39m
 [90m [1082639a] [39m[92m+ Xorg_libXext_jll v1.3.7+0[39m
 [90m [d091e8ba] [39m[92m+ Xorg_libXfixes_jll v6.0.1+0[39m
 [90m [a51aa0fd] [39m[92m+ Xorg_libXi_jll v1.8.3+0[39m
 [90m [d1454406] [39m[92m+ Xorg_libXinerama_jll v1.1.6+0[39m
 [90m [ec84b674] [39m[92m+ Xorg_libXrandr_jll v1.5.5+0[39m
 [90m [ea2f1a96] [39m[92m+ Xorg_libXrender_jll v0.9.12+0[39m
 [90m [c7cfdc94] [39m[92m+ Xorg_libxcb_jll v1.17.1+0[39m
 [90m [cc61e674] [39m[92m+ Xorg_libxkbfile_jll v1.1.3+0[39m
 [90m [12413925] [39m[92m+ Xorg_xcb_util_image_jll v0.4.1+0[39m
 [90m [2def613f] [39m[92m+ Xorg_xcb_util_jll v0.4.1+0[39m
 [90m [975044d2] [39m[92m+ Xorg_xcb_util_keysyms_jll v0.4.1+0[39m
 [90m [0d47668e] [39m[92m+ Xorg_xcb_util_renderutil_jll v0.3.10+0[39m
 [90m [c22f9ab0] [39m[92m+ Xorg_xcb_util_wm_jll v0.4.2+0[39m
 [90m [35661453] [39m[92m+ Xorg_xkbcomp_jll v1.4.7+0[39m
 [90m [33bec58e] [39m[92m+ Xorg_xkeyboard_config_jll v2.44.0+0[39m
 [90m [c5fb5394] [39m[92m+ Xorg_xtrans_jll v1.6.0+0[39m
 [90m [3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
 [90m [214eeab7] [39m[92m+ fzf_jll v0.61.1+0[39m
 [90m [a4ae2306] [39m[92m+ libaom_jll v3.11.0+0[39m
 [90m [0ac62f75] [39m[92m+ libass_jll v0.15.2+0[39m
 [90m [1183f4f0] [39m[92m+ libdecor_jll v0.2.2+0[39m
 [90m [f638f0a6] [39m[92m+ libfdk_aac_jll v2.0.3+0[39m
 [90m [b53b4c65] [39m[92m+ libpng_jll v1.6.49+0[39m
 [90m [f27f6e37] [39m[92m+ libvorbis_jll v1.3.7+2[39m
 [90m [1317d2d5] [39m[92m+ oneTBB_jll v2022.0.0+0[39m
 [90m [1270edf5] [39m[92m+ x264_jll v2021.5.5+0[39m
 [90m [dfaa095f] [39m[92m+ x265_jll v3.5.0+0[39m
 [90m [d8fb68d0] [39m[92m+ xkbcommon_jll v1.8.1+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8bb1440f] [39m[92m+ DelimitedFiles[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [4af54fe1] [39m[92m+ LazyArtifacts[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [1a1011a3] [39m[92m+ SharedArrays[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [05823500] [39m[92m+ OpenLibm_jll[39m
 [90m [efcefdf7] [39m[92m+ PCRE2_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mPrecompiling[22m[39m project...
[32m  âœ“ [39m[90mCompositionsBase[39m
[32m  âœ“ [39m[90mArgCheck[39m
[32m  âœ“ [39m[90mWoodburyMatrices[39m
[32m  âœ“ [39m[90mDefineSingletons[39m
[32m  âœ“ [39m[90mInitialValues[39m
[32m  âœ“ [39m[90mReferenceables[39m
[32m  âœ“ [39m[90mOpenSSL_jll[39m
[32m  âœ“ [39m[90mBaselet[39m
[32m  âœ“ [39m[90mSplittablesBase[39m
[32m  âœ“ [39m[90mLibtiff_jll[39m
[32m  âœ“ [39m[90mAxisAlgorithms[39m
[32m  âœ“ [39m[90mOpenSSL[39m
[32m  âœ“ [39m[90mAccessors[39m
[32m  âœ“ [39m[90mQt5Base_jll[39m
[32m  âœ“ [39m[90mFFMPEG_jll[39m
[32m  âœ“ [39m[90mStatsBase[39m
[32m  âœ“ [39m[90mImageMagick_jll[39m
[32m  âœ“ [39m[90mBangBang[39m
[32m  âœ“ [39m[90mFFMPEG[39m
[32m  âœ“ [39m[90mSpecialFunctions[39m
[32m  âœ“ [39m[90mGR_jll[39m
[32m  âœ“ [39m[90mMicroCollections[39m
[32m  âœ“ [39m[90mHTTP[39m
[32m  âœ“ [39m[90mInterpolations[39m
[32m  âœ“ [39m[90mColorTypes[39m
[32m  âœ“ [39m[90mTransducers[39m
[32m  âœ“ [39m[90mGR[39m
[32m  âœ“ [39mThreadsX
[32m  âœ“ [39m[90mColors[39m
[32m  âœ“ [39m[90mGraphics[39m
[32m  âœ“ [39m[90mColorVectorSpace[39m
[32m  âœ“ [39m[90mImageCore[39m
[32m  âœ“ [39m[90mImageShow[39m
[32m  âœ“ [39m[90mImageAxes[39m
[32m  âœ“ [39m[90mImageMorphology[39m
[32m  âœ“ [39mImageMagick
[32m  âœ“ [39m[90mImageMetadata[39m
[32m  âœ“ [39m[90mImageTransformations[39m
[32m  âœ“ [39m[90mImageDistances[39m
[32m  âœ“ [39m[90mColorSchemes[39m
[32m  âœ“ [39m[90mImageContrastAdjustment[39m
[32m  âœ“ [39m[90mPlotUtils[39m
[32m  âœ“ [39m[90mPlotThemes[39m
[32m  âœ“ [39m[90mRecipesPipeline[39m
[32m  âœ“ [39m[90mImageFiltering[39m
[32m  âœ“ [39m[90mImageQualityIndexes[39m
[32m  âœ“ [39mImages
[32m  âœ“ [39mPlots
  48 dependencies successfully precompiled in 81 seconds (161 already precompiled)
ªtext/plain§cell_idÙ$8989d43e-190e-11eb-3e48-7d10df903b5d¦kwargs�¢id´PlutoRunner_d1acb81e¤fileÙP/home/runner/.julia/packages/Pluto/6smog/src/runner/PlutoRunner/src/io/stdout.jl¥group¦stdout¥level®LogLevel(-555)§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ‚ëÛð°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8989d43e-190e-11eb-3e48-7d10df903b5d¹depends_on_disabled_cellsÂ§runtimeÏ   å%-µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcfŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ/convert_to_img (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„uxÿ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcf¹depends_on_disabled_cellsÂ§runtimeÎ Ê|µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c09b670-1910-11eb-378a-7b49a6e0e0faŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ.ColoredSphere (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ�Õþ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c09b670-1910-11eb-378a-7b49a6e0e0fa¹depends_on_disabled_cellsÂ§runtimeÎ å8µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8d079e70-1910-11eb-01df-e5817d349353Š¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix·Main.workspace#5.SkyBox¨elements‘’’…¦prefix¦SkyBox¨elements’’¡p’…¦prefix§Float64¨elements“’’£0.0ªtext/plain’’£0.0ªtext/plain’’£0.0ªtext/plain¤type¥Array¬prefix_short ¨objectid¯484a4b5d1bcb92fÙ!application/vnd.pluto.tree+object’¡r’¦1000.0ªtext/plain¤type¦struct¬prefix_short¦SkyBox¨objectid°cf5e8602622a825dÙ!application/vnd.pluto.tree+object¤type¥Array¬prefix_short ¨objectid°783619af33af81a4¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee£sky²last_run_timestampËAÚþ„ÄŒ�°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8d079e70-1910-11eb-01df-e5817d349353¹depends_on_disabled_cellsÂ§runtimeÍCeµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ+inside_of (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ¤ªŸ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10¹depends_on_disabled_cellsÂ§runtimeÎ }Ïµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c45ae00-1910-11eb-0726-79ba8d8e8085Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ²‰ß°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c45ae00-1910-11eb-0726-79ba8d8e8085¹depends_on_disabled_cellsÂ§runtimeÎ òµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþi9WK°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5¹depends_on_disabled_cellsÂ§runtimeÎ æµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bccfb90-1910-11eb-07e2-89c2354c0ec5Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒdL­°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bccfb90-1910-11eb-07e2-89c2354c0ec5¹depends_on_disabled_cellsÂ§runtimeÎ ùßµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$0bc3e570-1939-11eb-1e86-e97a9b07ea7cŠ¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msg¼UndefVarError: t not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙn/home/runner/work/disorganised-mess/disorganised-mess/raytracing_3d.jl#==#0bc3e570-1939-11eb-1e86-e97a9b07ea7c®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ8raytracing_3d.jl#==#0bc3e570-1939-11eb-1e86-e97a9b07ea7c¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚþ„ûkÂ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$0bc3e570-1939-11eb-1e86-e97a9b07ea7c¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$b766c970-1910-11eb-1457-9f5986c4807fŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ)as_image (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„¨.©°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b766c970-1910-11eb-1457-9f5986c4807f¹depends_on_disabled_cellsÂ§runtimeÎ ¬dµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ1ReflectingSphere (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ‚8°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2¹depends_on_disabled_cellsÂ§runtimeÎ µµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$b1537ff0-1911-11eb-01c4-39237e7c8123Š¦queuedÂ¤logs�§runningÂ¦output†¤body´CartesianIndex(1, 2)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„†¸k°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b1537ff0-1911-11eb-01c4-39237e7c8123¹depends_on_disabled_cellsÂ§runtimeÍ-¬µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$0bba2172-1939-11eb-3822-95510610cd6fŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþi8íÀ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$0bba2172-1939-11eb-3822-95510610cd6f¹depends_on_disabled_cellsÂ§runtimeÎ 8÷µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c63e460-1910-11eb-3a9f-cf493ae0a063Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*is_behind (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ¾°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c63e460-1910-11eb-3a9f-cf493ae0a063¹depends_on_disabled_cellsÂ§runtimeÎ Þäµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c7f3490-1910-11eb-3e86-d36bf13976d0Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ,draw_circle (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒÓòk°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c7f3490-1910-11eb-3e86-d36bf13976d0¹depends_on_disabled_cellsÂ§runtimeÎ þXµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cf0e220-1910-11eb-1237-23da08615addŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*ray_trace (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„œÉ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cf0e220-1910-11eb-1237-23da08615add¹depends_on_disabled_cellsÂ§runtimeÎ þ¸µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cb27992-1910-11eb-3602-1ba932c81088Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ.intersection (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒõ³Õ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cb27992-1910-11eb-3602-1ba932c81088¹depends_on_disabled_cellsÂ§runtimeÎ ÞÓµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8d079e70-1910-11eb-0f98-95762a22a7f2Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ(spheres (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ…‰°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8d079e70-1910-11eb-0f98-95762a22a7f2¹depends_on_disabled_cellsÂ§runtimeÎ þeµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bc95210-1910-11eb-1617-6553c4a38187Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒd�°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bc95210-1910-11eb-1617-6553c4a38187¹depends_on_disabled_cellsÂ§runtimeÎ ½úµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒŽ	°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7¹depends_on_disabled_cellsÂ§runtimeÎ ÔBµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bec1c50-1910-11eb-2f63-9151c9c3cb3bŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ%Lens (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒv@>°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bec1c50-1910-11eb-2f63-9151c9c3cb3b¹depends_on_disabled_cellsÂ§runtimeÎ �¾µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c99c170-1910-11eb-054a-1b007276a744Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ%step (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒéæ`°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c99c170-1910-11eb-054a-1b007276a744¹depends_on_disabled_cellsÂ§runtimeÎ zoµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c45ae00-1910-11eb-2908-ede9e1c04a53Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ²[î°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c45ae00-1910-11eb-2908-ede9e1c04a53¹depends_on_disabled_cellsÂ§runtimeÎ `Ìµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$210789e0-1912-11eb-11b6-bdb806bee14dŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÈ.©‰PNG

   IHDR   È   P   Ó­ç   gAMA  ±�üa    cHRM  z&  €„  ú   €è  u0  ê`  :˜  pœºQ<   bKGD ÿ ÿ ÿ ½§“  ."IDATxÚµ}yÔ5GYç³Tu÷½ïöí!d#	²È(«PÑ�ŒŠ£™ðÌ è Y”À ÌÑ� P‘#àÆ"™pˆ2� 
	DÍ—äÛÂ—o_ÞåÞÛ]Ï3Tï]Ý÷¾1S§Ï}»«Ÿª®®úõïyê©åÅo>ò½ª 
 

 
Å%†"A›—Å]/ Í$ª €yd-‰( ñ!lÄ×ÎËäULýnë¼([3Ú1µCæ	ä‚ÌèÄh¯@û\‘XÔg©þ°�4“C#“"U)_æì¼–¤¸Ôæeq7B7‰(’Ç ”ÙQydQÐâj	1”O•$�­² DÍKV¥ÒvÕEyå_êQÍœ›Oi½Kón3Üš+�ýØŒAhTÂÐ¹jqRÔeçZ	×*¦ï)ùe­îw5¿Ô
(�$µ„zŠi×e:EÍ¡oÉvö�6†Úê˜¨e‹�Œò2Ö  Eª6ª‚�ëœöæGn7”™`èÖƒÀV%ßÁVIªÚ‡lmáC»
”S[‘mbÁ®þXS«÷µ³N‘æ™iÙÎ%ßä·zÑžw[t•ßÕÆ[ô¢J[Ù¶Î#ªE Õ•Áäq0²º,Þ%ÀUõÈùØj%oB-Œ¡Ê¢)SÕX>´õ"½lW½ŽPÌ5� ”MÝVQ5l&Äþí¥ôš¼-]¿@¿‹*,ž¢¡§Å43‚\W±c�L^µÕÂ‚�°U{`¸Ökà[” !@6M™6†j—aØy3®²±°�¬áÐ©Œ´ tÚm_e¨Ø@bPŸÖ×>i3Yý¤Yo¹dýkï¼B FzB;õhØa¢*ª^ë)íºžêb«ÄGï­NÁjñy‹a­åzÈ& Ê†:�S(!•¨Ñªæ­ãZÐAÔ<UãsŸcÚçW"˜š¡ªÖd•@×¢¯
½(¤pøöPƒzPëÅØUZÂ®�¼ƒ-‘“6Á7Ç<o½LÛ;Ð®>mâµZÀjðM@ÕÚëÀ¯Ëö˜ö!´!Ð`„ÝÖl¡³ý9´ ¨¡k‡�>l�l0»¼Úöµöb«R	½Æ\ç3™grUizÌóFAzó¯7{�¦†XþíÖÖ©¦aJ×["¤n°Õš=}ì¾CuÒ„Kí»8ìGUG/‡^4ø"¡ûI¶bkð
Ó@¶Ê?Z¯Ç¢j²T¯•­åËê¸\ªËRÕ¤ ¨‹„¬kí¯k­ÙõmÕ]†ë¼úPç®(OU¤wÅ ŒªfÎÍ×ì+êâ¡mc5à¥½�×g³Wœ¡ƒØ
çÜ¯øBÏ­L«vMØõ-^l¾©¶TaÃ¦iÖN³=B½³†d»WˆÍš×
�ÐCW!GW^ *”%öAjNÇ°ïnÅRºfð2�¬ìåy�oC§ÅRÚª°ÎÓu¨WXË2ì¡…†ÍWÓ©VDhwÕµ]è°°òª¢mÓ#¦A*5S¾ùmÏ§Õºìšl:<Û³±:	[]0‘Së²A`s}Wå-gÛ*SØÒo:ˆÑ ?•¹†Hº`¬Ž™´¥°ÞeèVs°ßÕg§óÑŽY6:¨xtWf U>¿­þBØyßa'{;~¡¢(À G`È¢ï•iJ,å �¯l†_ ÐkÐ‡ÖB+GƒeÒ2ÅB–Y¯+«IW!T-rî£!øÖ"ö¿ð%Ñic'dS2­ ˆP-«1jc‰VÝ½|K;a§¢uql…�­Ê¢ ­k©{T|%D´™O83iÄb³žzY¡°–B)íÖC-íË!ÅÔ1ò©q1C¾yûó¯�NÚh“í·vRJèQ°ªRˆ•+èW£‘‹vd_ûó›ù´�XÚŽ\[Ýòõš8õäv…âé§®°ÞjÏÐ-Óc05XªÕKÇêo-ëþžcŸq]£«�ß¡FWƒþˆp+„j/Ôz©Ûžs]|ÊFw¯ñ”)%r„ŽPP½ïý¡J*$jÔ�wÆ=åé¯�×²¿ýø­*nöÃVW 	mß
½hgàúuVø¡�¼ú^ªñ¸V›&z°â–ª[@9VYBIíÐîBö<´þôaKn^Í˜O<÷õ££Qtp•§L3¦Ì£
Qs(AUß¨PÃ–°8#´%Ù¦ûá§_ŸìNÿú#oªžÕbˆ!Ëº&8 ‚…Ì²ðÛöàl«?Áf*Í¯*±°ƒ4èHlétàÒìmA³Û6Dþr1º
¹ø·gf5àþñgÝ�Ü»b6O™SâŒÉ!Šç*@C¡æ¤……Nd‘TÜLÜÔ¥“ìYWßð‰[µ·	·m`ªlˆ´ZOì¡É6ý×{¯½„¶¯»—À ‚ý!äšïØÝe4ôLÛjËÕ½Y�ì{»1uá¬Þ÷²–¾'Ç–Ì–¡)s¡þÈ)À?rÚÈµ…-VÉDŒ¸Ì¹T²4»æ‡o]8ýÀŸ]×l›y&Ë0Ÿ»l}Y—sú×-»¾ƒíM5‡À 4Ñ¯:í£¨pŽý.ÍPþ‹
7í°P%<%¨ðžçß4þæŠ9gxbhÊœe„ŽÈsUAW €õ3?-´¡–¨’Šˆ8q"Î¹,Ëf™ý¹ÿxóû>zm­ºP:Ýê
k­¿47Ÿ2»Å…ƒ“aB%XLOËô�jŸpßÈO%Tž~äšWí8iÆ3N#ÅˆÀ2£�E÷fk¿ÿÖÎ#„ìà9 (¼ó¹o_ºoÉž·fËð”8ãU¹„:Wu{bùpUR!U©‚S“©KÕ¾èš[Þõ±—õÞÓ‹“Vè•V_ùªôPDëÌS234ZA+ƒÆ¤‰‘åqö‰ÛÞÒÖ.ÃÝ…n­Í)Xw\qs‰bÆ|qPt	´ÙX(�]�æŠÆÂŠw=óõ{ˆ–¶Ì(£X(VŠ -¢%°†Õ5V89ZÉÜ…³ô–7Wë :Ë.Â«'†–TÀÍ?ÿ+ûãÑYo™xÊ6£(#ãÈ:4BFÑ²¢Q`@ö¿ ¬À ŒÀ ””*“TCjY©5YE.NÜh%_8»å#/V€ráCu—QGV'ºùÜ7âiK›l&Ì32š�C+`"U^’·g;ÖÒ÷}é�PfâÙ7´D¢vK[·Z ­[Zžã—ßÐÆM^ÍH¢g X¿óÔ7ï9­Lì(åÄQ¬•¨B09°À°²QcÄDÂ±ð8£ÕL>=ñö7ÌÖ"kuàOÿÀøŒM69žr”²ÍÈæ¨B£dYÁ(²bvÉ·Íî3ÑÒ4Ž\ŒE3c7b:µ¶yè1€±…-±¬–Å‰ŒD±KFn´š.]6»éƒ¿Ð^r³ÈyÏÉÑçÿž²¼ax‹ÍŒxF&#ãÐ84Œ€Q°ªV!�@"’„ddÜr’íÜ9{ç×¯[X5„ušhkü,œd½š¦q£í»
t	;©~ÿÊßÙw÷Žå™e\Y@hÁ0+³²QN…gbfÂSÇ›Ù#ž{Ó½xe;çAÍxÛÕ¶t"1[†gL)QF”Õì*ATÜÚñ�ôQ÷™}ëñÚŒÆb%£Œ`£ã)Çgwž=JÇ—'÷\´~òbEUU%UPQu ‚Î¡dÄ³#@ÂEÝ†+ à¾—Ý¨÷Çtÿ*o˜2ÌSÂ]Fè Q ?
]�ÈÁ–ÈFöâË~÷¼<øÜFÕŠ4ßLÔòþ�—¿u�œ š«´T§«Ž€¼áÉo¿ðH²ºi–R3r\©? h¢A0”LZð–jÑ™Äñ’ãµT.›ÜõÖW<hººáš/ßoÇçM<áxFQÊQ†VÈät…Fð�«¾L—ž‹öÌ’57ZÒQ¬##‚q$�8Lfoa¼AÑYÃ'"=²rðïžbP™ Wˆ$†52b�Ä‘Ä‰-eK{Ó?ýŸ%ª®ºó…ïÀcŸ7fÓð”ÌŒMŠœ‘qÈ9W!KÎXFÀª «jA"Ð%&±[·š¤{÷Í®¿ó%å#ZTÔPva®Ò°~,.ù¥;ŸÙ¶þ†¾þ ^;Äö†Ç¼û‚#K+ëÉx'i99k�5j=lX<Šòƒü/0+{‹‹=ÒÄ°ãl´evõ—�~éÉÐéêK{ïMÖ#;±ÑÌ˜ÌÇ,†³0Ÿ¸äÀ±§}K½I—:{!Ø½lw±Ýaìªµ+&Z¶vÙØ%kÇÆŽ9s4¦x	FË²oßÉÌ�?»›€�‘€ˆ€‰‘è™O½ó¶;¨;�wN¾þ¨ÇÆx.¡Í˜¦Î"J-e3C™AgÈYt†œA1è…k¿þ„Af¬™‘-ûÝþùÓOÊ{¬­'¿ÚŠé@9Üh�¶]6ƒè	6mÎÝ×}×?ìþ•ñÄ$)GŽ­�Qb d@F$B$B@Äœºý/çÝy E8‚ˆ1ºêÚ?úÒÛ^0¿$Íb_ÿcŸ^>ñÔ°×€~Ä¦
<øèœ|ïqsIF{	vX\!EH‰‘
-“Î §@ËÀK`—ÈŒÝxtri¬÷þã£TTA$W‹$.Çä6)=NyõmÃM�é…àcK°ni‹uBš2¤¨)©Ãâ T�Bƒ¨?TT �:�”<¾œÛtî´‹Þ|ùû_wßóŠéÜ’Ì¨r0–ýíö.ë/ìŸ]pÿxe+Oã8³‘X+6kÔ5ŒÃÊ9?snbµOÊËüPf5&3—þÔ×þí÷äúCš‘¯}ñ­K‡¢dÃFScSc3ÃÎa£ÌÊ}Ï¹'ž‚+2ópŒö˜h§‰Vm´Eã(G6‰lÙÈÚØÚÈÁ¿l-Ç–Æ±,»é©“»	‘ÐóùsFd"Fü±«îþÜ·¯Tn¨KXÊüÍKþ��è|L[M#J-¥†2KÎø�!á’ŸHÙÿ’)£2*“ø¢ü£0	ÃÌ<ç²o|úÔãªRÕ	¬—¥
—^¿€Y€…BØÝµçÈòxÓÄ3¶ž«„xí€˜S"� " JUª†âFÔÜ"%Á-‡lÍa[V~Ã7SäÐêFÄcÞ24cÊ˜¡`i°~øwN}ïyºùÂw)®"�‰$K¾gAEQQÀ)d 3«`«!4€Q¶¥›Ç¾PATQÕ©’HF.7¥ôI+è^ò‘Ÿ}Í_â�1m˜˜¤AFš!8T‡à <W	ª xÆROZšó¨¨'2u H*jD¦ê¶Ô�:jû1ðà±Ñ¬P4Öµ±†…^½ûÖ½g’xjlFF˜Y‰<¤ 1Wˆ9¼ 	@ØÊ¿)§Pb+U Æá9sõ/ýõ­¿÷c¾·Y�xfØkÀšo¿ó„3zÆD¸[qi™(AŠˆ,çœ“;ßP  S0 F�È{è�D)>lkýÀ!VUUQAGB*™¸¹MúÍÿò_ó§ÿfÁ¶Q€ì�±Ý°0aHR‚Á”Ö� *¨G¼xÃTTUs€«æØ,âP3•TeªnÍoí¼õ5§Ÿ.AÕÚ:,°0°ÚˆD\~áÊÏ^zÈ£Š�#ãQ¥H�‰  ó_  ôn  UððBib‹2U˜:Ø<k~üõŸùÔõÏ¾m}äûÕÿáöµC§Þ½Žä=ìŠ¨øõ}ÏäR°D°Kqi…h„”Y"ƒD”ó z §Ê ¬@š�ê€¢(e`f`7ðûžrøk_½Ì·§*î‘ŒÜ”³SmK«§c ð©—ÎÜ?‚	ÃŒ!%pÎÿ–À¿ÚyWlyRÁ«Ä–€:š©¤ StëæÝ—}ö…dAÄ/‚™ °ª·,æëõgTd^bç±Q21QFÆ1R�*`Uþ¤Ì!'&ÿmH[¢àœB¦�	Ìn2ã�1é²Hæ|D3®¸ª`>¹´yþr�¬Ýiph	iD4"Š-!#R+È2( Pm¬DÕ)dJS0´r±^|ïÆÑÓ+ªà‡UTœH¦’:·E!íŸ¼ñoô›‰×€˜qŽª&WöÚ>4ÿ("xO[®A¦äÎž44ÏTÏ—¯êËBGkˆâ¿^ù•Ñf¥‘É"Ë‘XRKjQ-ªñjjP€A0XœƒöÄ‚XpœÕÌjé4†õä§¯ÿrU�=…ä-Ë¾C.†Ä äOßÿ=çfÝÃJBK#�(Q4ÂhDvDf„&A“ ¡IÀ$`FàOìHm6Q›@4Òd£ŒG¸œðŽ8Ùc.¹bâi”UüaTŒdÖMíÍ×>n¨V‹I�Œ`3†YYÎ‚‹P,úzðÕ"µúiÕ˜WÕšÿªzW¼QµªVÔˆQëÄ:e.š¥ñd+~ÿe·×K²Èî`µc!ÆÚ~P €µãI”²qÄBuºÊÉ	¡˜‚‚ù-È¥œÃP´ ê	 §®L ˜
Ÿàáò¿ì5Wìúü=è(Ÿe•w×/$ÙÙ¥% QŒEH†Ð "áž7œMŽ
ž:½ôý�¹.÷ý–ÛÑ©ïÍ«Æ
‰ÂXqx—÷(7ØBT<o¥—d‹Ô¹®'^bFà=Q•¿Pì§VÖVé×f¿ù �:R'’9�ÍÜùS\5Á¿8˜>³¬‹›¹!ÙŠMF,D‚$X™VPxª°0Ê¡˜äT"*!•GVÀò<î²À–ÂL`sX
øp¡Ì�£bL>sáÎ+ÏÍv[^%+&ˆbDd‘¢!b|úÑ_9¾óÌù‹ï°´ËüíùÚ¿ï£×ÖêÍÏ™j¤+Ž€—wð÷^¹ñ­{Vµ€ŸÇ–
‰Ó­ËŠîoÂ_ÿ�ôO¤ŒÁO¸(Œ*ìŽ!×ÆBêƒ2Z#ÁU°ü}P'’f<™ÈB-½�Ch;t7t\ó]÷Ù42.W¨Áb®û¬×€•ÖËç
˜B ¿›ßÊõˆ'v®^r�¨bU,dLãç¼åž *ñµ_¤è¬w=ƒôó€Ï\€n%úîKÞŒI©ûä9!ŠŸ}âç÷˜��K|
¢ÓdÏ˜äT²|lÏ£ïþÍ¿`%Ê±?ÀÄ`ùÒµ›Ñ‹p›åhm7)x#ŸA9×GbÔúÝÏtMS•ËÙf:.‚ºúk«<V`ßG…úo^“F‹ª.î²‚QðúÑ
õjQ¬“(M£?â¾‡
B†áº|:6Žr¢RDoð=<D,‘žG†>lµÊÏ¿òâÓó¶|ªtnˆ´ö^)SgrÅÜ=…ÉšÕ1îOïH¿ü³+Ïþ�wYù�ëþé§¿õÈ£³h*”)Š/)Zä¶ö]9ŠTAI� 8ï$*ëjtÄ¹­£Oþ©‹Ž~&^ñß†˜)¨KT3�[ç:‰ #pÚÔ€%KåœÔYt—à-B¡DUDEôÒŸ|Áæÿp�ˆ¶h[ÒU!;ÇÓýèß¿êšÂT¯éà?#ö¦zƒ“ vhí·ðßœO²è�Åi<ðÝœ|Å7°¢½rJ§KÑãŸsõ4;51Ç<Q!'H1R|üâïLí9GB[ŠSÀ	à„pB´eÌF2:ûº»¯Œ cÀHsöŠ�cKgŒž[žœ¤(¶£¨ “|6—ÖxëÏ‹ç|ñi�X‹¥m^°NENÐ¬´âÐïP >Oå¹Êó–—j¬¨]›þÜ¡»¸y>"ãà~>º¡›¨¶Ø,@s÷–lTì¹õÞ§­û~hýs¬8Ì;þ`� Prº‚‚)½¬Dññs8IÎ�È‡&ñ9Ç™ h±tÞá dDkf+;f€ ¨%ðÓSÏ£8“ÁÛ^÷¤—ýü·ÖÜ˜Q·›¥¢”Ì³ß]„R³¥|ï'ÌI�U2õû5Áð^@ªÕbdUMàØE4}¨ð°`
Nél†›¨hAœ›gS$[•çLK¦¦t/¸�r2KÏ«ªÀ0É;­ àh#ß³²6™;Þ	ÑØ)@Ô¼áO7ž|þäx9Á�Yh‘ž*ò<`iÔ HaÛj)E¶DJØ3žŒÉw†ï0>dŒp X¿âC‚oæúåûÂ,À ÀRSf«3S¤þ:þ…òÜ(L‹u€å~‚ é<#Ä†ýÿ#Ôßñ$ WßÌ¿,lXƒb9kôœânmnÕØ“B«<¼Q÷OäíŽ€ „ ›ýe6Õ¢9ÌÇ9—g€.Žì1DK0Ý�¶ª ÀrÁ€Ô¼"eŸ]T²4X«Š[XÐ
'X	¾ºròÜîõIÚ¬/ïÂ@T·‚N]6‚Ró!´è3\a¡–jL­ë¬Ï,ÖêådìôäTb€=ý¥‚ÅÃCÆXwG—ðŒâ ôb¾�oÕ�Â..hw2ÖêsH!"‚A€�¾R)oÏ±E³xïê'ië–J’;É@5™žãh”;Is<z{DœJš¥çÏlÂ®Ë!w´B¾_Pô¼RœwíOš¦rv’¢²ÝêÚT&Ym;–PàHI
<åõY›O×i2,ôTgÆ^C ¼ð’Xz'pìˆ€Ý	Ìö“„�ø…K~ô	7‰ J14ë7Z)0¤PWýØAUwPñ…1Xk!�*F�‡Ü»ûÓŸ}bÎUXùíFôºzõ±Ÿ¦ì¼ºD�ªó>LÝ{ø;Ç¹‡)&0ˆ¹ÂU—eÙdkë†G>\NT¨ÅH°ÃTÎ8­'“µYœn9€iÉxyÇÀÂ—~ žó=ÛHÀo@‚Åü¨¡ªdRhlT\™(¯ÐÜóâ¯üÌ B<þ‘KþÛ{Oí)Óöüñc­ïŒ³N¨À–ªæÛ§yœUïèÁÔgâ´Ìýò[/:g¾2€Á’¬½Âñý²Â¦œ† ~�ArÖ¦›ñ•öŽ?øzMU3Í±Åú–GýÌóNþÉú®! ô0Í²Édrlÿ	x|„ŠXà	óÎÍŽ /?ì«?+[2=ŸrÅ¬ùàƒ7þç¯‘Ä$#À~šÖ>ŒR¡ÃX|,5ÒjÂ¡¡ï¼ŒŸQ’ÏZBô“~â¯xÃ©¾Bm'°>öÏ÷½Â^™±ˆÕ[ù²§â·ö©åöIóŸA­š'”~ AÌºîŸ[YïM�è2[%Q*&º€ÀŽpó|ô­Co_„:SIU2Q£êTP>¼çÿîèïLvî˜Ú� Ë²Édrbÿ±×>áÕ9E	¢�*ÈR¤ï¿69	ºnÝ�=é¸â…UŒòËŸ�Û¾:Ú©h-†œ²VO]åÜ�ÆonY4QU%kÐÖÐXL„ó…""&²–ž}ßþ‡°æ~Bó¿1 €É(Î&Îe"$åB¨jjPµ Òï}Pãó²zê*²n— BQ@L`"‚ñà‡� ÷‹#,Šªùª(PÔÇí_?ñø�r.Ò�¨ÐDÔª°©‚èç/xMBzÑ�×Á(ÉD7NoüàcÞ?üŒÍR˜!¤ˆ)âaŠºn]Ó3é7öŸ0Ä9ca­GÍÞ
Ï~ý]}ÑãÀ:e�â«ð‡J‡½Pó½ù«–ÂŽy®˜hÞ+AÏUÄ„Öp’0¤4ó\•øPLMn ïìÞd×z–¥Î‰8‘b¢¬–ÿ[+ÃK±flU¡QÕôH…*K³Ûc‡ËËo]þkOµÊ",J’ëDT@]þm\Á.–%�XÅ¨°ŠøÕ¤Jzââ›Ô‡\¶À)(¢€¬©qŠ0AØD]WwVÖ�9@®Œ*D$$Bb"Kph¡Ù¸œÀ™¬S#�‰ðÿÜÁÛOX^9ûskaIäv•Ÿ�o˜¢ˆWv8¯óq³Xï‹B­%÷'û¿òÊåïŸ¥Y¦â2ç
Ò*±%Xð–=rmXÃVX…dF4„–1fX6ýëÈ7²î¼S!R%QE½ò›çîºtvE°„ƒïpa-€Z²t 1ÈS„áaË£
ÜÉN¤‡î™ råQÍ­$ÃÓ+ßö¸a–õÁ^4ÒS3ØÊ`*ÀXÕÔ%~J-äxTš±¦±ŒÀ&]!�_‚@ª,'#~þ�/·
²Êiãqcÿ»\;ÃÚ€Áé}£•i:’,Vç@D+l	”sy+m¨E¥TSZ|MQá£¢ªÀ†ˆtlÜ¾h`#Ü2:[‰äL&ç--EQRUÝ½1Y¹W¶vYX2a,PñE6ZÈ½}ïå÷ë2Äâ=ªpá<ÈHOdë‡g‡OmXâ\ýyºb"Cd‰G�ýÏ{êõY¯¾í“/ÿØHaê4u�	°‚“\'úŠl›\uoL�® )$$†UÖróÚnZioåÝ€P}/¬Á&„÷îÿ?¯Þ}õØe‰fH&ÎxlÕI«V) ‚±´…*)&0ˆ†!f±®Ù¿¾þÓ}X¯ÿ«¼ÿò+ozÚUn+“TÔ‰ˆˆŸe€úÄ¿;ðµ½ÿJ—"°¤Œ¹](*‘ˆõ¤•¯�W€|Á‚ fˆ)Àq‚¸‰¸Žzä4d'\z¿ûÊí‡qeXùU`Ld˜c6»LËÀÂþÑšŸxûgoý¹«ašBêÀ9p¬ã¢XŠž«·j"e½3˜[ë~KÎUˆŒdˆ¬á8â¥eó¢Ÿ™¦10X¡¯IÛ�´7žüßo\}V¢Y„Î:ç|7Ô�0‹JP©NZ~WÉO*G%èUnWAÂºjoý½¿ZüƒÈ–#·Anæ$s^¡(‰ªê…æÄx	m¤Dª(¢’‰$*VÄ¨pa“A>cB0Cœ"l!l€žC=¥î¸KËño¯#rÛ®b"C1�ùµú……K`.ÃdiYNÀ[­"ž´ü(9RáÀ);A¾ä© +DRô¨b@bÄU–ÇcóšÓŸê)AÍ�Øó¯K¶¬í…F&'.ZNM#Ìì,3N˜ò‰ßÎƒ§¦…€°�*õ¨ò;¹äû¹}ÀˆuÄºjÓ‹ã€†.¾„îðÿôÒxtŽd–IFâDE„ÄO¾øþcò�ÕNP#u¤)Èd¤‹ZU£B¹C.W…@
0C˜ lx®Òì˜ËÉ¹»¶î9|Ì�)ì*D&d$Ãl‰ccw˜`°ú„±ù£¿õÑÛ^ò3˜Î Ë@üÍÿuÝQ“�h”éH‘H‘ Š%-Ä€ÉYæØòhdv=,‚»µ]e¡fÝVà—î|jµ‰á0Ä™
 ?~âŽ¿ºôûâ2°Af$Îû¾oË”ïià?gF""ÏÍŒdˆÙ4†Œ¥ÈRd)‰h)ÂµD/ñÆ÷WÏëü7ïn	ŸñÕýŸ{Ü£Í�Cb%"ER" Ý'N§é²Fc†È¨5b�³ÆY“Y“Z“Z3‹ÌÌš‰5k¶¬Ù´fÃšs–Ï>Eð ºƒîì·Ïíÿ§ýÅ+±a6ÌÆ°1ÆÆ&Jl²Ã^ÿ©[<¯E^vû�GžöJ™„ü"f"`Rj®'f,b�™Ñ4ŒlÈX²–Œe±�M4Š¢åQ¼{ïèÕ÷üiñÐú8lç7‰m�*~éÎÚúÉF{ôŒn‡Â5õŒ“ÿðÉË N‰ýÛbŽ!BöH#bDSœbƒÌÄŒ¦„”!k±‰*¹x|ûo¿g¡’4KõCwßý…G>ÖdÈ’/ud ÿÐÎ§à¼U^f�r<ÍŒ™Ùž¶¬Ù4fÝšóÖœ5|ŠéÁw4»/=ýÍãï¹‡ýû`Øcld¢ÄDËvôðø¶;ï
”|X pñ×¾ñÀS¯¢ŒHª	ê'„ÍßUŒeUK6b›˜hGËãx÷ÞÑîy_åâéAÏ<xaP  
Ã–UÓä
«Ûfì¯ßõî7<ùåtdB›¥9G"¤B âmtñ›~!1(KÅ,iÌš°,±[³éeÉ]oýí9°ÖÞò¤»“lšJ–9q¢,êü"ao­ì;|Ð<ðÀUWÑ¥«°ÇèëjŒjA	UÔ©ÎT¶ÔmHv6ÓÙäÈæÁ¿»Ý 2™Â®"ßDCd‰"æÄØ5{ýŸ¤ÿ;ìœwÂÿè=w¾ð¥H3¤1CD—/’$E§ˆ@¢(@D@¬~/Bd h‘,QÌœX^Nìî}Ñ›î|g»=1PÀ¶½Ñ>ÿß¼óòWæ¶_ßŽ~…'÷çt÷Çª]¶ÎýÉï]ù+këéò,e.‰U"jÁÏb[î�Åh<}bK&&1/ÚÝû�››31Ô>‘Wÿç¥éh#‹§.šI”‰ÍÄŠ˜b­�Q�î¸0}Ô#Ì¾åx-JÆœÄ82˜ $¢IªñÔÅÎœ�ÑñõÉ=GÖOöÓåå‡%²ŒÖRl9Ž)›ÑóöÏÿEi5Š´ÍÝ"ï}ù«õþ)�Íx33SÇ31©˜L9ãÀˆ¿?V¾©Z@ë§Q#ÅÄ#¦qdÖÆö¼½»VëZ—ÅN¿
åeà·Ìï¸üZ€!H…0§Ûß*ò×ö�­LÒQê'±J¤A¾š§¶UdÁÝqL<6´jäáñ‰·ÿz=f«Èç�Ï¤É¦‹§.J�ÍÄ:±Î£JŒ¨ŸÎªÙ%�5»wDKqqŒ‹D³ÌnLéÔÙÍCw öÛ"2¡_6f-“5ŠbNF<ZµK—E7}ð½ùRê‡f«È_ÅS)od¼åÌLx&&ãÔ8­m‰V!Œ€"¢„hdx91;wFïüú[‚jƒ£qƒèéƒ ˜&Ùu¦_Ìé,Úkøå/ü/ x×3¯ßóÀÌme’ywR>¯<ï2ê�dÄ´bÜ…QzË¯õÿ�»m5—™^>ŽöO�f2'(Š"(êTEòþ"ÄGþ™ƒ_ÆŸ*À,ßÜ™ã€Pó‚"åø¢ˆ9a³lìÑÍ|WG�r^¸àý7(âæsßˆ§SÚtfâx&&S“©qZln‹0Œ‰ÃK±Ù±fß÷¥7Â½Û2O»‡Ø…€w\ñŠKi—ŠZ„T»T(Mè�Ô_óÖ'³ñÌ%¢‘j±7rL4&ÝkÖ~ÿ¿7ÉOµÅ@Ž´ TõÏ}ùÒÁÙè|oeÑT¢ÌÙLŒ+jÄ“–_ËâWâU‹`Êõ�\îžêéŠÐz/6Sd)Š8J8Y6ã}Ñ»>öŽ‚l°QŒKWeV  +¯¼)=4£uÇS135™ZQ+R˜Z›OÜv]1+Zº¬/šòÐ”l[>2ÙÀ;®ø•>õE‹†Œ­&Î´ˆëlCZF6ì°š­V6?tQRÓªµõyR	‡ªÂ»ŸÿªñÁir.‹'Y4uÞØ2®²·üZ-¿´ÜŽÛøµc€ÆZÖL+�*k)²'&^6£¢÷}ôm5LÔ€õ/RˆØÒ_­yG-y(Ýµ¥‚°»õhÐ´ªoƒß¿dçU}ü¦­Ó
ÅP¢9’	k#•òÙ¶~Q@xÒ?|ñöÿ³A¬~/HÊ½kÈ~"	þ‘ò¤<˜y‚?Œac�µ&ŠllíR­ÆÉEã÷èÆp	·ïn¨�7gÃ…1 ?(Sþbÿ­V*,Åû2¬ý/�3¥ºÕ1ÇÂ#?ó2¬’7G‘çÏÜibÐÝÐx2Âny³ |ìY¯ãÓ)ofnê8Íœ¸Ê3¯Å
æê	ØšbåÇ‰qÌ<2fÕ~ìÖßÐGsv7PÒ…²*äçüï¡H�lÓ¾JÐWŒš3¢5Ñ¯ŸZÞÓF|'•öeÕ¼ÌsÓàÝ@ÝhW&Œ§^œUåÿéO¾ù¯ž{=�Ñzæ¦ŽfŽ2Q'ùø[µ‡³×ýd˜rÚBÂ<6v·ýäGþg°¢¬¿ÿ{kàGC2Íñì`:9c½ ª³éµj4E +¨#Ï´ÀT¡h>�iÿ­@ÂüÊ¡ü^¸WØx üäÿ‡|þ9oáS)of2u~„:QiZ‹Õ ."ÌG—GÆ¬™Û>þºn½ÛuN!‘!\¥
TG\´'‡šÌ|Š*§¯Vc­4�Àšòþd¥Áü;Ê´Y’ÒBpU°Vûi²õR?ü¡×*ÀWžÿ6:™ò¦“™ÓTÊ¥;Z‚ª`&Kh‰GÌ;ÌíþªvÉO"�ÞFí1"‡èªŒÂ…ýA¸`÷¢p¬QT ÝÌlÑk0Õ�ÑQWƒÔ~\�Šêé\nÐ�§îS ó ÂÆxÊû_á»?w¿ð�|:Ó‰xx�ø©ÕÞËŽ­òþ?~™¶Ê± Q-¢»/†=íS	=tYƒ\ðŸbGñ…3��ÇÍù/öµæR|åO§ùÛ™h a1]m_2eW!nÛÀÈqßÿ½*\ùž_R¿qí˜Lj—½MØh£Nwc{fVU½=Ç&g5éªž†tT­^Qkùß)œI³ô¦Ã%µ?ˆÌU|ó¬Ÿánà"ÿ›µU¢¾ÂÀlä Ã9 Ö+îWÍI´�æû�Ne¯%}tÛÚè3šn^a°W� :`–Uyh4*²Fæ�´±5ðÐ¢Zš&ö<ÿÅƒµ†ûú.ë¨ÂN†è
ë­Õ«L¡kçÕô`1]“z0×( ´0fÚ­ÝÓü!³E!ÙxLcŸ�<²g§ïaüuuPç`¡K€nµô>{ ¤õØîÍQU�jn¢4H­FC~¿áÍjº$|•cû4òª´n_©AÅWDûoUß{ÈZêa¾Ž«K6Û®# íªjŠÁ˜úß´.±ý0hÕ68¿{X¡*·¢[’5±pÎÃÞ¬zÖõVh7Å`Ï±Go~‡i=´ê»§a4Ø–]†ÙìýŠµ[tœÎÃV»‚¯‹�«¡€Áë0QÍWˆª{:àë¡«}N‡\�†Ë3Ç–jÕe;=ôln›LƒŸu÷Ãné£>Ð
id‹ aâkwm§ÂV`¦ã ¼B�Ñæô½ó¸Vß¾U%yôËºxya;½Ès¸´¾læßHØ,a;Ï°‚]³Î*£Ë>|È‚¯AGƒ†z‹MS=ìÕn×³B ¨<ça$õ¦ƒ7z˜‡d±¬¨öÝ†±¨Ã†dÍ¦	ØãMt¶KÕVŽUç³q4”s®“»XÏõq§–ªAh…ôKY�ŽyÞg××!ß@öPEHëõb«SoxÕ{„ÂÖ)j0y§âMQÏ¢°¯Ká‹ª�*Ëëâ
èôö
‹)Á—­Ryöªód1¤ÓJ™0o¶ÙøÓ“¿“Oqve—ó‡Z¹ß¿P@Y{(0P;ÁÂÏ-öæÚ•ˆÄ+m†›áPG]·µUCOPŽE!z,ôBÝÕ³­ñaÐ>É-°®k@aõ)Ç
DÚN8ÐºªApÔSb­$ýØªÕN[-nS†ZbnX RÁNY[²Žª9>­ n4¶Ó+3¼´ÿJÛCŸToŸ ñ:¦—FO­mÐh7²HØ‡¡†/c©õò–œ7Œ­Àã%Èp«?8_C»ŠçÝ %BUa¶GýŠ´u`ý»†{­H…´v"¡D[=§ÀD¿ZÛwÌõ ì2ÏÃ¦•vÌ¦fß­y6`uÁ0¶:ªz0Ôc‘÷†¹d°±Ú�ù°pÙÆ]T5_êýÍ]õ©¿aÖiìˆÔ‚N» ­áêZ>ÿ…Á�´V³:ø    IEND®B`‚¤mime©image/png¬rootassigneeÀ²last_run_timestampËAÚþ†*Ï%°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$210789e0-1912-11eb-11b6-bdb806bee14d¹depends_on_disabled_cellsÂ§runtimeÎ6«ã8µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8d20cbc0-1910-11eb-0d98-31a55e7becdeŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ%doit (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ…—°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8d20cbc0-1910-11eb-0d98-31a55e7becde¹depends_on_disabled_cellsÂ§runtimeÎ \Aµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830eŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ]Û+°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830e¹depends_on_disabled_cellsÂ§runtimeÎ #µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c809420-1910-11eb-2f0d-e17ea7a04a51Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*plot_rays (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒßwÿ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c809420-1910-11eb-2f0d-e17ea7a04a51¹depends_on_disabled_cellsÂ§runtimeÎ )…Çµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$25ab9680-1912-11eb-0650-6361aaf781ecŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþi93f°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$25ab9680-1912-11eb-0650-6361aaf781ec¹depends_on_disabled_cellsÂ§runtimeÍ!lµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c1d3e70-1910-11eb-10af-7dd208f70eddŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*inside_of (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ£ä°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c1d3e70-1910-11eb-10af-7dd208f70edd¹depends_on_disabled_cellsÂ§runtimeÎ Šäµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþi9EÔ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403¹depends_on_disabled_cellsÂ§runtimeÎ bµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cc03530-1910-11eb-107e-3db62b460115Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*propagate (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„^@:°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cc03530-1910-11eb-107e-3db62b460115¹depends_on_disabled_cellsÂ§runtimeÎÄŒØµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bc95210-1910-11eb-2af9-cb247912835aŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒcáÎ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bc95210-1910-11eb-2af9-cb247912835a¹depends_on_disabled_cellsÂ§runtimeÎ îµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$4417b3e0-190f-11eb-1efe-53d279a306e6Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒ[m¹°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$4417b3e0-190f-11eb-1efe-53d279a306e6¹depends_on_disabled_cellsÂ§runtimeÎ ^Šµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$853789be-1911-11eb-1121-679f89fe62dbŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙÍ<div class="markdown"><h1>0123456789 www</h1>
<p>Pluto notebook adaptation of https://github.com/leios/simuleios/tree/master/raytracing</p>
<p>See https://www.youtube.com/watch?v&#61;JwyQezsQkkw</p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚþƒ[>Š°persist_js_stateÃ·has_pluto_hook_featuresÂ§cell_idÙ$853789be-1911-11eb-1121-679f89fe62db¹depends_on_disabled_cellsÂ§runtimeÎ Wzµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒfq2°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0¹depends_on_disabled_cellsÂ§runtimeÎ 
µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$88865f70-1939-11eb-2941-c538b8c9175bŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙn<bond def="T" unique_id="qdbK1I2tpFuS"><input 
type="range" 
min="1" 
step="1" 
max="200" 
value="1"

></bond>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚþ…DH²°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$88865f70-1939-11eb-2941-c538b8c9175b¹depends_on_disabled_cellsÂ§runtimeÎnÞµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8bdfe750-1910-11eb-1eb6-c9c61b3333cfŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþƒdh°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8bdfe750-1910-11eb-1eb6-c9c61b3333cf¹depends_on_disabled_cellsÂ§runtimeÎ Òµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8cf0e220-1910-11eb-0933-b168f7031f46Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*init_rays (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚþ„‘E¢°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8cf0e220-1910-11eb-0933-b168f7031f46¹depends_on_disabled_cellsÂ§runtimeÎ  ÒÍµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂ±cell_dependenciesÞ 1Ù$ca7d2270-193d-11eb-3dd6-e1f6d2678a21„´precedence_heuristic	§cell_idÙ$ca7d2270-193d-11eb-3dd6-e1f6d2678a21´downstream_cells_map�§highres‘Ù$210789e0-1912-11eb-11b6-bdb806bee14d²upstream_cells_mapŠ¤Core�§@md_str�¤Base�·PlutoRunner.create_bond�«PlutoRunner�¨CheckBox�¯Core.applicable�¥@bind�¨Base.get�¨getindex�Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f„´precedence_heuristic	§cell_idÙ$8cc03530-1910-11eb-3404-15f5c8f69f8f´downstream_cells_map�©propagate‘Ù$8cf0e220-1910-11eb-1237-23da08615add²upstream_cells_mapÞ £sum�¨isapprox�¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0¡!�¡>�£RGB�¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf¦isless�§println�¬intersection’Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cb27992-1910-11eb-3602-1ba932c81088§nothing�¦length�¡<�£dot�¦Vector�§refract‘Ù$8c36e0f0-1910-11eb-1a50-6526ea1a9663¡/�¡^�¢!=�§reflect‘Ù$8c67b4f0-1910-11eb-0efe-5f123cc14d53£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187¦SkyBox‘Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7¢==�¡:�£Inf�¥zeros�°sphere_normal_at‘Ù$8c1acd70-1910-11eb-24e6-333b3aa1e91f¦Mirror‘Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085«pixel_color‘Ù$8cd93b70-1910-11eb-050a-5713b545f28e£isa�¡+�Ù$45a028a0-190f-11eb-355d-ad3c55fb1e2f„´precedence_heuristic§cell_idÙ$45a028a0-190f-11eb-355d-ad3c55fb1e2f´downstream_cells_map�¤Test�²upstream_cells_map€Ù$8c36e0f0-1910-11eb-1a50-6526ea1a9663„´precedence_heuristic	§cell_idÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663´downstream_cells_map�§refract‘Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map�¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0¤sqrt�¡>�¦isless�°sphere_normal_at‘Ù$8c1acd70-1910-11eb-24e6-333b3aa1e91f¨reflect!�¡<�£dot�¡-�¡^�¡+�¡*�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8c67b4f0-1910-11eb-0efe-5f123cc14d53„´precedence_heuristic	§cell_idÙ$8c67b4f0-1910-11eb-0efe-5f123cc14d53´downstream_cells_map�§reflect‘Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map…£dot�¡-�¡+�¡*�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8cd93b70-1910-11eb-050a-5713b545f28e„´precedence_heuristic	§cell_idÙ$8cd93b70-1910-11eb-050a-5713b545f28e´downstream_cells_map�«pixel_color‘Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map‰¡<�£RGB�¡-�¡>�¡/�¦isless�¡+�¡*�§println�Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65„´precedence_heuristic	§cell_idÙ$8d1e5abe-1910-11eb-2a84-79f43f4a7e65´downstream_cells_map�§objects‘Ù$8d20cbc0-1910-11eb-0d98-31a55e7becde²upstream_cells_mapƒ§spheres‘Ù$8d079e70-1910-11eb-0f98-95762a22a7f2¤vcat�£sky‘Ù$8d079e70-1910-11eb-01df-e5817d349353Ù$8e89388e-1914-11eb-0f2f-619c7fe79430„´precedence_heuristic	§cell_idÙ$8e89388e-1914-11eb-0f2f-619c7fe79430´downstream_cells_map€²upstream_cells_map€Ù$c1f06690-1914-11eb-2426-29e3027f4f32„´precedence_heuristic	§cell_idÙ$c1f06690-1914-11eb-2426-29e3027f4f32´downstream_cells_map€²upstream_cells_map„£RGB�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187¬intersection’Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cb27992-1910-11eb-3602-1ba932c81088¦SkyBox‘Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7Ù$8c1acd70-1910-11eb-24e6-333b3aa1e91f„´precedence_heuristic	§cell_idÙ$8c1acd70-1910-11eb-24e6-333b3aa1e91f´downstream_cells_map�°sphere_normal_at’Ù$8c36e0f0-1910-11eb-1a50-6526ea1a9663Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map‚¡-�©normalize�Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2c„´precedence_heuristic	§cell_idÙ$8c99c170-1910-11eb-2e24-49ed98b4dd2c´downstream_cells_map�¬intersection’Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_mapÞ §minimum�¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0¤sqrt�¡>�¦isless�§nothing�¡<�£dot�¡-�¡/�¡+�¥Union�¡*�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187¦SkyBox‘Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7§maximum�Ù$8989d43e-190e-11eb-3e48-7d10df903b5d„´precedence_heuristic§cell_idÙ$8989d43e-190e-11eb-3e48-7d10df903b5d´downstream_cells_map…£Pkg‘Ù$8989d43e-190e-11eb-3e48-7d10df903b5d¦Images�§PlutoUI�¥Plots‘Ù$8c7f3490-1910-11eb-3e86-d36bf13976d0¨ThreadsX�²upstream_cells_map…§Pkg.add�£Pkg‘Ù$8989d43e-190e-11eb-3e48-7d10df903b5d¬Pkg.activate�¯Pkg.PackageSpec�©mktempdir�Ù$8cd93b70-1910-11eb-39eb-a7dd6c180bcf„´precedence_heuristic	§cell_idÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcf´downstream_cells_map�®convert_to_img�²upstream_cells_mapˆ¦length�¡:�£RGB�¥undef�¤save�¤size�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187¥Array�Ù$8c09b670-1910-11eb-378a-7b49a6e0e0fa„´precedence_heuristic	§cell_idÙ$8c09b670-1910-11eb-378a-7b49a6e0e0fa´downstream_cells_map�­ColoredSphere�²upstream_cells_map„£RGB�¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0§Surface‘Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5¤RGBA�Ù$8d079e70-1910-11eb-01df-e5817d349353„´precedence_heuristic	§cell_idÙ$8d079e70-1910-11eb-01df-e5817d349353´downstream_cells_map�£sky‘Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65²upstream_cells_map�¦SkyBox‘Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7Ù$8c29e89e-1910-11eb-0ab3-bd8039bb7f10„´precedence_heuristic	§cell_idÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10´downstream_cells_map�©inside_of�²upstream_cells_map„¢<=�¡-�¡^�¡+�Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085„´precedence_heuristic	§cell_idÙ$8c45ae00-1910-11eb-0726-79ba8d8e8085´downstream_cells_map�¦Mirror’Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map„£new�¤Wall‘Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53§Float64�¦Vector�Ù$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5„´precedence_heuristic	§cell_idÙ$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5´downstream_cells_map€²upstream_cells_map€Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5„´precedence_heuristic	§cell_idÙ$8bccfb90-1910-11eb-07e2-89c2354c0ec5´downstream_cells_map�§Surface”Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3bÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2Ù$8c09b670-1910-11eb-378a-7b49a6e0e0fa²upstream_cells_map‡£new�¨isapprox�¥error�¡!�¤RGBA�¡+�§Float64�Ù$0bc3e570-1939-11eb-1e86-e97a9b07ea7c„´precedence_heuristic	§cell_idÙ$0bc3e570-1939-11eb-1e86-e97a9b07ea7c´downstream_cells_map€²upstream_cells_map�¡t�Ù$b766c970-1910-11eb-1457-9f5986c4807f„´precedence_heuristic	§cell_idÙ$b766c970-1910-11eb-1457-9f5986c4807f´downstream_cells_map�¨as_image‘Ù$8d20cbc0-1910-11eb-0d98-31a55e7becde²upstream_cells_map‚¥Array�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8bfbfad0-1910-11eb-1c82-17966c89f2b2„´precedence_heuristic	§cell_idÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2´downstream_cells_map�°ReflectingSphere‘Ù$8d079e70-1910-11eb-0f98-95762a22a7f2²upstream_cells_mapƒ¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0§Surface‘Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5¤RGBA�Ù$b1537ff0-1911-11eb-01c4-39237e7c8123„´precedence_heuristic	§cell_idÙ$b1537ff0-1911-11eb-01c4-39237e7c8123´downstream_cells_map€²upstream_cells_map�®CartesianIndex�Ù$0bba2172-1939-11eb-3822-95510610cd6f„´precedence_heuristic	§cell_idÙ$0bba2172-1939-11eb-3822-95510610cd6f´downstream_cells_map€²upstream_cells_map€Ù$8c63e460-1910-11eb-3a9f-cf493ae0a063„´precedence_heuristic	§cell_idÙ$8c63e460-1910-11eb-3a9f-cf493ae0a063´downstream_cells_map�©is_behind�²upstream_cells_mapƒ£dot�¡-�¢>=�Ù$8c7f3490-1910-11eb-3e86-d36bf13976d0„´precedence_heuristic	§cell_idÙ$8c7f3490-1910-11eb-3e86-d36bf13976d0´downstream_cells_map�«draw_circle‘Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51²upstream_cells_map…³Plots.partialcircle�¥Plots‘Ù$8989d43e-190e-11eb-3e48-7d10df903b5d¡+�¡*�¢pi�Ù$8cf0e220-1910-11eb-1237-23da08615add„´precedence_heuristic	§cell_idÙ$8cf0e220-1910-11eb-1237-23da08615add´downstream_cells_map�©ray_trace‘Ù$8d20cbc0-1910-11eb-0d98-31a55e7becde²upstream_cells_map…©propagate’Ù$8cc03530-1910-11eb-107e-3db62b460115Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f¦Camera‘Ù$8bc95210-1910-11eb-2af9-cb247912835a¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf©init_rays‘Ù$8cf0e220-1910-11eb-0933-b168f7031f46¦Vector�Ù$8cb27992-1910-11eb-3602-1ba932c81088„´precedence_heuristic	§cell_idÙ$8cb27992-1910-11eb-3602-1ba932c81088´downstream_cells_map�¬intersection’Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_mapŽ¡>�¦isless�§nothing�¡<�£dot�¤Wall‘Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53¡-�¨isfinite�¡/�¡*�¢!=�¢==�£NaN�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8d079e70-1910-11eb-0f98-95762a22a7f2„´precedence_heuristic	§cell_idÙ$8d079e70-1910-11eb-0f98-95762a22a7f2´downstream_cells_map�§spheres‘Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65²upstream_cells_map‰¡-�¡/�¡+�¡*�¤Lens‘Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3b£cos�¢pi�°ReflectingSphere‘Ù$8bfbfad0-1910-11eb-1c82-17966c89f2b2£sin�Ù$8bc95210-1910-11eb-1617-6553c4a38187„´precedence_heuristic	§cell_idÙ$8bc95210-1910-11eb-1617-6553c4a38187´downstream_cells_map�£RayœÙ$8c1d3e70-1910-11eb-10af-7dd208f70eddÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663Ù$8c67b4f0-1910-11eb-0efe-5f123cc14d53Ù$8c99c170-1910-11eb-054a-1b007276a744Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cb27992-1910-11eb-3602-1ba932c81088Ù$8cc03530-1910-11eb-107e-3db62b460115Ù$8cc03530-1910-11eb-3404-15f5c8f69f8fÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcfÙ$8cf0e220-1910-11eb-0933-b168f7031f46Ù$b766c970-1910-11eb-1457-9f5986c4807f²upstream_cells_mapƒ£RGB�§Float64�¦Vector�Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7„´precedence_heuristic	§cell_idÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7´downstream_cells_map�¦SkyBox”Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cc03530-1910-11eb-3404-15f5c8f69f8fÙ$8d079e70-1910-11eb-01df-e5817d349353²upstream_cells_mapƒ¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf§Float64�¦Vector�Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3b„´precedence_heuristic	§cell_idÙ$8bec1c50-1910-11eb-2f63-9151c9c3cb3b´downstream_cells_map�¤Lens‘Ù$8d079e70-1910-11eb-0f98-95762a22a7f2²upstream_cells_mapƒ¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0§Surface‘Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5¤RGBA�Ù$8c99c170-1910-11eb-054a-1b007276a744„´precedence_heuristic	§cell_idÙ$8c99c170-1910-11eb-054a-1b007276a744´downstream_cells_map�¤step�²upstream_cells_mapƒ¡+�¡*�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53„´precedence_heuristic	§cell_idÙ$8c45ae00-1910-11eb-2908-ede9e1c04a53´downstream_cells_map�¤Wall’Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085Ù$8cb27992-1910-11eb-3602-1ba932c81088²upstream_cells_map�¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cfÙ$210789e0-1912-11eb-11b6-bdb806bee14d„´precedence_heuristic	§cell_idÙ$210789e0-1912-11eb-11b6-bdb806bee14d´downstream_cells_map€²upstream_cells_mapƒ¤doit‘Ù$8d20cbc0-1910-11eb-0d98-31a55e7becde¡T‘Ù$88865f70-1939-11eb-2941-c538b8c9175b§highres‘Ù$ca7d2270-193d-11eb-3dd6-e1f6d2678a21Ù$8d20cbc0-1910-11eb-0d98-31a55e7becde„´precedence_heuristic	§cell_idÙ$8d20cbc0-1910-11eb-0d98-31a55e7becde´downstream_cells_map�¤doit‘Ù$210789e0-1912-11eb-11b6-bdb806bee14d²upstream_cells_mapŒ¡:�©transpose�£RGB�§objects‘Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65¦Camera‘Ù$8bc95210-1910-11eb-2af9-cb247912835a¢|>�¦repeat�¡/�¨as_image‘Ù$b766c970-1910-11eb-1457-9f5986c4807f¥undef�¥Array�©ray_trace‘Ù$8cf0e220-1910-11eb-1237-23da08615addÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830e„´precedence_heuristic	§cell_idÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830e´downstream_cells_map�­Base.isapprox�²upstream_cells_map‚¤Base�§Nothing�Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51„´precedence_heuristic	§cell_idÙ$8c809420-1910-11eb-2f0d-e17ea7a04a51´downstream_cells_map�©plot_rays�²upstream_cells_map�¡:�¦Sphere‘Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf¦typeof�¥zeros�¤size�«draw_circle‘Ù$8c7f3490-1910-11eb-3e86-d36bf13976d0¦Mirror‘Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085¦Vector�¡-�¤plot�¥plot!�¡+�¡*�¢==�Ù$25ab9680-1912-11eb-0650-6361aaf781ec„´precedence_heuristic	§cell_idÙ$25ab9680-1912-11eb-0650-6361aaf781ec´downstream_cells_map€²upstream_cells_map€Ù$8c1d3e70-1910-11eb-10af-7dd208f70edd„´precedence_heuristic	§cell_idÙ$8c1d3e70-1910-11eb-10af-7dd208f70edd´downstream_cells_map�©inside_of�²upstream_cells_map�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187Ù$8be2dea0-193e-11eb-0591-c3dcc4c84403„´precedence_heuristic	§cell_idÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403´downstream_cells_map€²upstream_cells_map€Ù$8cc03530-1910-11eb-107e-3db62b460115„´precedence_heuristic	§cell_idÙ$8cc03530-1910-11eb-107e-3db62b460115´downstream_cells_map�©propagate‘Ù$8cf0e220-1910-11eb-1237-23da08615add²upstream_cells_mapÞ ®Base.Threads.*�£pop�¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf°Threads.@threads�®Base.Threads.-�¦Vector�¦length�®Base.Threads.+�®Base.Threads.>�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187¯Base.Threads.!=�¡:�ºBase.Threads.threading_run�¾Base.Threads.Base.invokelatest�µBase.Threads.nthreads�µBase.Threads.threadid�³Base.Threads.divrem�¤Base�·Base.Threads.firstindex�³Base.Threads.length�¥Array�®Base.Threads.:�¯Base.Threads.<=�¯Base.Threads.==�¥ccall�Ù$8bc95210-1910-11eb-2af9-cb247912835a„´precedence_heuristic	§cell_idÙ$8bc95210-1910-11eb-2af9-cb247912835a´downstream_cells_map�¦Camera“Ù$8cf0e220-1910-11eb-0933-b168f7031f46Ù$8cf0e220-1910-11eb-1237-23da08615addÙ$8d20cbc0-1910-11eb-0d98-31a55e7becde²upstream_cells_map‚§Float64�¦Vector�Ù$4417b3e0-190f-11eb-1efe-53d279a306e6„´precedence_heuristic§cell_idÙ$4417b3e0-190f-11eb-1efe-53d279a306e6´downstream_cells_map�­LinearAlgebra�²upstream_cells_map€Ù$853789be-1911-11eb-1121-679f89fe62db„´precedence_heuristic	§cell_idÙ$853789be-1911-11eb-1121-679f89fe62db´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0„´precedence_heuristic	§cell_idÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0´downstream_cells_map�¦Sphere—Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3bÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2Ù$8c09b670-1910-11eb-378a-7b49a6e0e0faÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cc03530-1910-11eb-3404-15f5c8f69f8f²upstream_cells_map„§Surface‘Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5¦Object‘Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf§Float64�¦Vector�Ù$88865f70-1939-11eb-2941-c538b8c9175b„´precedence_heuristic	§cell_idÙ$88865f70-1939-11eb-2941-c538b8c9175b´downstream_cells_map�¡T‘Ù$210789e0-1912-11eb-11b6-bdb806bee14d²upstream_cells_map‰¤Core�¤Base�¡:�·PlutoRunner.create_bond�«PlutoRunner�¯Core.applicable�¥@bind�¨Base.get�¦Slider�Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cf„´precedence_heuristic	§cell_idÙ$8bdfe750-1910-11eb-1eb6-c9c61b3333cf´downstream_cells_map�¦Object—Ù$8bea95b0-1910-11eb-3850-9f624fa3e6c0Ù$8c0b3d10-1910-11eb-26cc-234b48fb81b7Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51Ù$8cc03530-1910-11eb-107e-3db62b460115Ù$8cc03530-1910-11eb-3404-15f5c8f69f8fÙ$8cf0e220-1910-11eb-1237-23da08615add²upstream_cells_map€Ù$8cf0e220-1910-11eb-0933-b168f7031f46„´precedence_heuristic	§cell_idÙ$8cf0e220-1910-11eb-0933-b168f7031f46´downstream_cells_map�©init_rays‘Ù$8cf0e220-1910-11eb-1237-23da08615add²upstream_cells_map‹°CartesianIndices�£RGB�©normalize�¦Camera‘Ù$8bc95210-1910-11eb-2af9-cb247912835a¤size�£map�¡-�¡/�¡+�¡*�£Ray‘Ù$8bc95210-1910-11eb-1617-6553c4a38187´cell_execution_orderÜ 1Ù$8989d43e-190e-11eb-3e48-7d10df903b5dÙ$4417b3e0-190f-11eb-1efe-53d279a306e6Ù$45a028a0-190f-11eb-355d-ad3c55fb1e2fÙ$853789be-1911-11eb-1121-679f89fe62dbÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830eÙ$8bc95210-1910-11eb-2af9-cb247912835aÙ$8bc95210-1910-11eb-1617-6553c4a38187Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cfÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3bÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2Ù$8c09b670-1910-11eb-378a-7b49a6e0e0faÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7Ù$8c1acd70-1910-11eb-24e6-333b3aa1e91fÙ$8c1d3e70-1910-11eb-10af-7dd208f70eddÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10Ù$8c36e0f0-1910-11eb-1a50-6526ea1a9663Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085Ù$8c63e460-1910-11eb-3a9f-cf493ae0a063Ù$8c67b4f0-1910-11eb-0efe-5f123cc14d53Ù$8c7f3490-1910-11eb-3e86-d36bf13976d0Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51Ù$8c99c170-1910-11eb-054a-1b007276a744Ù$8e89388e-1914-11eb-0f2f-619c7fe79430Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cb27992-1910-11eb-3602-1ba932c81088Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8cc03530-1910-11eb-107e-3db62b460115Ù$8cd93b70-1910-11eb-050a-5713b545f28eÙ$8cc03530-1910-11eb-3404-15f5c8f69f8fÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcfÙ$b1537ff0-1911-11eb-01c4-39237e7c8123Ù$8cf0e220-1910-11eb-0933-b168f7031f46Ù$8cf0e220-1910-11eb-1237-23da08615addÙ$b766c970-1910-11eb-1457-9f5986c4807fÙ$8d079e70-1910-11eb-01df-e5817d349353Ù$0bc3e570-1939-11eb-1e86-e97a9b07ea7cÙ$0bba2172-1939-11eb-3822-95510610cd6fÙ$8d079e70-1910-11eb-0f98-95762a22a7f2Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65Ù$8d20cbc0-1910-11eb-0d98-31a55e7becdeÙ$88865f70-1939-11eb-2941-c538b8c9175bÙ$ca7d2270-193d-11eb-3dd6-e1f6d2678a21Ù$210789e0-1912-11eb-11b6-bdb806bee14dÙ$25ab9680-1912-11eb-0650-6361aaf781ecÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403Ù$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5´last_hot_reload_timeË        ©shortpath°raytracing_3d.jl®process_status¥ready¤pathÙF/home/runner/work/disorganised-mess/disorganised-mess/raytracing_3d.jl­pluto_version¨v0.19.47®last_save_timeËAÚþi4Íûªcell_orderÜ 1Ù$853789be-1911-11eb-1121-679f89fe62dbÙ$8989d43e-190e-11eb-3e48-7d10df903b5dÙ$4417b3e0-190f-11eb-1efe-53d279a306e6Ù$45a028a0-190f-11eb-355d-ad3c55fb1e2fÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830eÙ$8bc95210-1910-11eb-2af9-cb247912835aÙ$8bc95210-1910-11eb-1617-6553c4a38187Ù$8bccfb90-1910-11eb-07e2-89c2354c0ec5Ù$8bdfe750-1910-11eb-1eb6-c9c61b3333cfÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0Ù$8bec1c50-1910-11eb-2f63-9151c9c3cb3bÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2Ù$8c09b670-1910-11eb-378a-7b49a6e0e0faÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7Ù$8c1acd70-1910-11eb-24e6-333b3aa1e91fÙ$8c1d3e70-1910-11eb-10af-7dd208f70eddÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10Ù$8c36e0f0-1910-11eb-1a50-6526ea1a9663Ù$8c45ae00-1910-11eb-2908-ede9e1c04a53Ù$8c45ae00-1910-11eb-0726-79ba8d8e8085Ù$8c63e460-1910-11eb-3a9f-cf493ae0a063Ù$8c67b4f0-1910-11eb-0efe-5f123cc14d53Ù$8c7f3490-1910-11eb-3e86-d36bf13976d0Ù$8c809420-1910-11eb-2f0d-e17ea7a04a51Ù$8c99c170-1910-11eb-054a-1b007276a744Ù$c1f06690-1914-11eb-2426-29e3027f4f32Ù$8e89388e-1914-11eb-0f2f-619c7fe79430Ù$8c99c170-1910-11eb-2e24-49ed98b4dd2cÙ$8cb27992-1910-11eb-3602-1ba932c81088Ù$8cc03530-1910-11eb-107e-3db62b460115Ù$8cc03530-1910-11eb-3404-15f5c8f69f8fÙ$8cd93b70-1910-11eb-050a-5713b545f28eÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcfÙ$b1537ff0-1911-11eb-01c4-39237e7c8123Ù$8cf0e220-1910-11eb-0933-b168f7031f46Ù$8cf0e220-1910-11eb-1237-23da08615addÙ$b766c970-1910-11eb-1457-9f5986c4807fÙ$8d079e70-1910-11eb-01df-e5817d349353Ù$8d1e5abe-1910-11eb-2a84-79f43f4a7e65Ù$0bc3e570-1939-11eb-1e86-e97a9b07ea7cÙ$0bba2172-1939-11eb-3822-95510610cd6fÙ$8d079e70-1910-11eb-0f98-95762a22a7f2Ù$8d20cbc0-1910-11eb-0d98-31a55e7becdeÙ$88865f70-1939-11eb-2941-c538b8c9175bÙ$ca7d2270-193d-11eb-3dd6-e1f6d2678a21Ù$210789e0-1912-11eb-11b6-bdb806bee14dÙ$25ab9680-1912-11eb-0650-6361aaf781ecÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403Ù$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5±published_objects€¥nbpkgŠ¯install_time_nsÀ¬instantiatedÃ²installed_versions€°terminal_outputs€§enabledÂ·restart_recommended_msgÀ´restart_required_msgÀ­busy_packages�¶waiting_for_permissionÂÙ,waiting_for_permission_but_probably_disabledÂ«cell_inputsÞ 1Ù$ca7d2270-193d-11eb-3dd6-e1f6d2678a21„§cell_idÙ$ca7d2270-193d-11eb-3dd6-e1f6d2678a21¤codeÙ>let
	# T
	md"High resolution: $(@bind highres CheckBox())"
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8cc03530-1910-11eb-3404-15f5c8f69f8f„§cell_idÙ$8cc03530-1910-11eb-3404-15f5c8f69f8f¤codeÚ3function propagate(ray::Ray, objects::Vector{O},
                   num_intersections) where {O <: Object}

    for i = 1:num_intersections
        if ray.v != zeros(length(ray.v))
            intersect_final = [Inf, Inf]
            intersected_object = nothing
			
			
            for object in objects
                intersect = intersection(ray, object)
                if intersect != nothing &&
                   sum(intersect[:].^2) < sum(intersect_final[:].^2)
                    intersect_final = intersect
                    intersected_object = object
                end
            end

            if intersected_object != nothing
                ray.p .+= intersect_final
				
                if intersected_object isa Sphere
                    if !isapprox(intersected_object.s.t, 0)
                        ior = 1/intersected_object.s.ior
                        if dot(ray.v,
                               sphere_normal_at(ray,
                                                intersected_object)) > 0
                            ior = intersected_object.s.ior
                        end

                        ray = refract(ray, intersected_object, ior)
                    elseif !isapprox(intersected_object.s.r, 0)
                        n = sphere_normal_at(ray, intersected_object)
                        ray = reflect(ray, n)
                    elseif !isapprox(intersected_object.s.c.alpha, 0)
                        ray_color = RGB(intersected_object.s.c)
                        ray_vel = zeros(length(ray.v))
                        ray = Ray(ray_vel, ray.p, ray_color)
                    end

                elseif intersected_object isa Mirror
                    ray = reflect(ray, intersected_object.n)
				
                elseif intersected_object isa SkyBox
                    ray_color = pixel_color(ray.p)
                    ray_vel = zeros(length(ray.v))
                    ray = Ray(ray_vel, ray.p, ray_color)
                end
            else
                println("hit nothing")
            end
        end
    end

    return ray
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$45a028a0-190f-11eb-355d-ad3c55fb1e2f„§cell_idÙ$45a028a0-190f-11eb-355d-ad3c55fb1e2f¤codeªusing Test¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663„§cell_idÙ$8c36e0f0-1910-11eb-1a50-6526ea1a9663¤codeÚAfunction refract(ray, lens::Sphere, ior)
	# note: light moves at a particular speed with respect to the medium it is
	#       moving through, so...
	#       n_2*v = n_1*l + (n_1*cos(theta_1) - n_2*cos(theta_2))*n
	#       Other approximations: ior = n_1/n_2, c = -n*l
	
    n = sphere_normal_at(ray, lens)

    if dot(n, ray.v) > 0
        n .*= -1
    end
    c = dot(-n, ray.v);
    d = 1.0 - ior^2 * (1.0 - c^2);

    if (d < 0.0)
        reflect!(ray, n)
        return
    end

    ray_vel = ior * ray.v + (ior * c - sqrt(d)) * n;
    return Ray(ray_vel, ray.p, ray.c)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c67b4f0-1910-11eb-0efe-5f123cc14d53„§cell_idÙ$8c67b4f0-1910-11eb-0efe-5f123cc14d53¤codeÚ,# note: for reflection, l_x -> l_x, but l_y -> -l_y
#       In this case, the y component of l = cos(theta)*n
#       so new vector: v = l + 2cos(theta)*n
function reflect(ray, n)
    ray_vel = ray.v .- 2*dot(ray.v, n).*n
    ray_pos = ray.p .+ 0.001*ray.v
    return Ray(ray_vel, ray_pos, ray.c)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8cd93b70-1910-11eb-050a-5713b545f28e„§cell_idÙ$8cd93b70-1910-11eb-050a-5713b545f28e¤codeÚ-function pixel_color(position)
    extents = 1000.0
    c = RGB(0)
    if position[1] < extents && position[1] > -extents
        c += RGB((position[1]+extents)/(2.0*extents), 0, 0)
    else
        println(position)
    end

    if position[2] < extents && position[2] > -extents
        c += RGB(0,0,(position[2]+extents)/(2.0*extents))
    else
        println(position)
    end

    if position[3] < extents && position[3] > -extents
        c += RGB(0,(position[3]+extents)/(2.0*extents), 0)
    else
        println(position)
    end

    return c
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8d1e5abe-1910-11eb-2a84-79f43f4a7e65„§cell_idÙ$8d1e5abe-1910-11eb-2a84-79f43f4a7e65¤codeÙ"objects(t) = vcat(sky, spheres(t))¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8e89388e-1914-11eb-0f2f-619c7fe79430„§cell_idÙ$8e89388e-1914-11eb-0f2f-619c7fe79430¤codeÚl# begin
# 	function intersection(ray::Ray, skybox::SkyBox;
# 						  threshold = 0.01)

# 		return skybox.r * ray.v
# 	end
	
# 	function intersection(ray::Ray, sphere::Sphere;
# 						  threshold = 0.01)
# 		relative_dist = ray.p-sphere.p

# 		a = dot(ray.v, ray.v)
# 		b = 2.0 * dot(relative_dist, ray.v)
# 		c = dot(relative_dist, relative_dist) - sphere.r*sphere.r
# 		discriminant = b*b - 4*a*c

# 		if discriminant < 0
# 			return nothing
# 		elseif discriminant > 0
# 			roots = [(-b + sqrt(discriminant)) / (2*a),
# 					 (-b - sqrt(discriminant)) / (2*a)]
# 			min = minimum(roots)
# 			max = maximum(roots)

# 			if min > threshold
# 				return (min)*ray.v
# 			elseif max > threshold
# 				return (max)*ray.v
# 			else
# 				return nothing
# 			end
# 		else
# 			# Returns nothing if tangential
# 			return nothing
# 			#return (-b/(2*a))*ray.v
# 		end 
# 	end
# end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$c1f06690-1914-11eb-2426-29e3027f4f32„§cell_idÙ$c1f06690-1914-11eb-2426-29e3027f4f32¤codeÙ]intersection(
	Ray([1.0, 0.0, 0.0], [0.0, 0.0, 0.0], RGB(0,0,0)),
	SkyBox([2.0,0,0], 10000)
)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c1acd70-1910-11eb-24e6-333b3aa1e91f„§cell_idÙ$8c1acd70-1910-11eb-24e6-333b3aa1e91f¤codeÙ]function sphere_normal_at(ray, sphere)
    n = normalize(ray.p .- sphere.p)

    return n
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c99c170-1910-11eb-2e24-49ed98b4dd2c„§cell_idÙ$8c99c170-1910-11eb-2e24-49ed98b4dd2c¤codeÚbfunction intersection(ray::Ray, sphere::S;
                      threshold = 0.01) where
                      {S <: Union{Sphere, SkyBox}}
    relative_dist = ray.p-sphere.p
	
    a = dot(ray.v, ray.v)
    b = 2.0 * dot(relative_dist, ray.v)
    c = dot(relative_dist, relative_dist) - sphere.r*sphere.r
    discriminant = b*b - 4*a*c

    if discriminant < 0
        return nothing
    elseif discriminant > 0
        roots = [(-b + sqrt(discriminant)) / (2*a),
                 (-b - sqrt(discriminant)) / (2*a)]
        min = minimum(roots)
        max = maximum(roots)
		
        if min > threshold
            return (min)*ray.v
        elseif max > threshold
            return (max)*ray.v
        else
            return nothing
        end
    else
        # Returns nothing if tangential
        return nothing
        #return (-b/(2*a))*ray.v
    end 
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8989d43e-190e-11eb-3e48-7d10df903b5d„§cell_idÙ$8989d43e-190e-11eb-3e48-7d10df903b5d¤codeÚcbegin
	import Pkg
	Pkg.activate(mktempdir())
	Pkg.add([
			Pkg.PackageSpec(name="Plots", version="1"),
			Pkg.PackageSpec(name="Images", version="0.23"),
			Pkg.PackageSpec(name="ImageMagick"),
			Pkg.PackageSpec(name="PlutoUI", version="0.6.8-0.6"),
			Pkg.PackageSpec(name="ThreadsX"),
			])
	using Images
	using Plots
	using PlutoUI
	using ThreadsX
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcf„§cell_idÙ$8cd93b70-1910-11eb-39eb-a7dd6c180bcf¤codeÙèfunction convert_to_img(rays::Array{Ray}, filename)
    color_array = Array{RGB}(undef, size(rays)[2], size(rays)[1])
    for i = 1:length(color_array)
         color_array[i] = rays[i].c
    end

    save(filename, color_array)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c09b670-1910-11eb-378a-7b49a6e0e0fa„§cell_idÙ$8c09b670-1910-11eb-378a-7b49a6e0e0fa¤codeÙYfunction ColoredSphere(p, r, c::RGB)
    return Sphere(p, r, Surface(0,0,RGBA(c), 0))
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8d079e70-1910-11eb-01df-e5817d349353„§cell_idÙ$8d079e70-1910-11eb-01df-e5817d349353¤codeÙ%sky = [SkyBox([0.0, 0.0, 0.0], 1000)]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10„§cell_idÙ$8c29e89e-1910-11eb-0ab3-bd8039bb7f10¤codeÙ¸function inside_of(pos, sphere)
    x = sphere.p[1] - pos[1]
    y = sphere.p[2] - pos[2]
    if (x^2 + y^2 <= sphere.r^2)
        return true
    else
        return false
    end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c45ae00-1910-11eb-0726-79ba8d8e8085„§cell_idÙ$8c45ae00-1910-11eb-0726-79ba8d8e8085¤codeÙÒmutable struct Mirror <: Wall
    # Normal vector
    n::Vector{Float64}

    # Position of mirror
    p::Vector{Float64}

    # Mirror size
    scale::Float64

    Mirror(in_n, in_p) = new(in_n, in_p, 2.5)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5„§cell_idÙ$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5¤code ¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8bccfb90-1910-11eb-07e2-89c2354c0ec5„§cell_idÙ$8bccfb90-1910-11eb-07e2-89c2354c0ec5¤codeÚÎstruct Surface

    # Reflectivity
    r::Float64

    # Transmission
    t::Float64

    # Color
    c::RGBA

    # index of refraction
    ior::Float64

    function Surface(in_r, in_t, in_c, in_ior)
        if !isapprox(in_r+in_t+in_c.alpha, 1)
            error("invalid surface definition, RTC < 1")
        end
        new(in_r,in_t,in_c, in_ior)
    end

    Surface(in_r, in_t, in_c::Float64, in_ior) =
         new(in_r, in_t, RGBA(0,0,0,0), in_ior)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$0bc3e570-1939-11eb-1e86-e97a9b07ea7c„§cell_idÙ$0bc3e570-1939-11eb-1e86-e97a9b07ea7c¤code¡t¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$b766c970-1910-11eb-1457-9f5986c4807f„§cell_idÙ$b766c970-1910-11eb-1457-9f5986c4807f¤codeÙ<function as_image(rays::Array{Ray})
	[r.c for r in rays]
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2„§cell_idÙ$8bfbfad0-1910-11eb-1c82-17966c89f2b2¤codeÙWfunction ReflectingSphere(p, r)
    return Sphere(p,r,Surface(1,0,RGBA(0,0,0,0),0))
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$b1537ff0-1911-11eb-01c4-39237e7c8123„§cell_idÙ$b1537ff0-1911-11eb-01c4-39237e7c8123¤code³CartesianIndex(1,2)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$0bba2172-1939-11eb-3822-95510610cd6f„§cell_idÙ$0bba2172-1939-11eb-3822-95510610cd6f¤code ¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c63e460-1910-11eb-3a9f-cf493ae0a063„§cell_idÙ$8c63e460-1910-11eb-3a9f-cf493ae0a063¤codeÙˆfunction is_behind(ray, mirror)
    if dot(ray.p.-mirror.p, mirror.n) >= 0
        return true
    else
        return false
    end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c7f3490-1910-11eb-3e86-d36bf13976d0„§cell_idÙ$8c7f3490-1910-11eb-3e86-d36bf13976d0¤codeÙofunction draw_circle(p, r, res)
    return [x .+ (p[1], p[2]) for x in Plots.partialcircle(0, 2pi, res, r)]
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8cf0e220-1910-11eb-1237-23da08615add„§cell_idÙ$8cf0e220-1910-11eb-1237-23da08615add¤codeÚfunction ray_trace(objects::Vector{O}, cam::Camera; filename="check.png",
                   num_intersections = 10) where {O <: Object}

    rays = init_rays(cam)

    rays = propagate(rays, objects, num_intersections)

    # convert_to_img(rays, filename)

    return rays
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8cb27992-1910-11eb-3602-1ba932c81088„§cell_idÙ$8cb27992-1910-11eb-3602-1ba932c81088¤codeÚ-function intersection(ray::Ray, wall::W) where {W <: Wall}
    intersection_pt = -dot((ray.p .- wall.p),wall.n)/dot(ray.v, wall.n)

    if isfinite(intersection_pt) && intersection_pt > 0 &&
       intersection_pt != NaN
        return intersection_pt*ray.v
    else
        return nothing
    end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8d079e70-1910-11eb-0f98-95762a22a7f2„§cell_idÙ$8d079e70-1910-11eb-0f98-95762a22a7f2¤codeÚ”spheres(t) = [
	ReflectingSphere([0,0,-25], 10),
	# ColoredSphere([0,0,-25], 5, RGB(0.75, .65, 0.1)),
	# ReflectingSphere([50 * sin(t), 0, 50 * cos(t) - 25], 15),
	Lens([50 * sin(t), 0, 50 * cos(t) - 25], 15, 1.5),
	Lens([-50 * sin(t), 0, -50*cos(t) - 25], 15, 1.5),
	Lens([-50 * sin(t + 2pi/3), 0, -50*cos(t + 2pi/3) - 25], 15, 1.5),
	Lens([-50 * sin(t + 4pi/3), 0, -50*cos(t + 4pi/3) - 25], 15, 1.5),
]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8bc95210-1910-11eb-1617-6553c4a38187„§cell_idÙ$8bc95210-1910-11eb-1617-6553c4a38187¤codeÙ�struct Ray
    # Velocity vector
    v::Vector{Float64}

    # Position vector
    p::Vector{Float64}

    # Color
    c::RGB
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7„§cell_idÙ$8c0b3d10-1910-11eb-26cc-234b48fb81b7¤codeÙtmutable struct SkyBox <: Object
    # Skybox position
    p::Vector{Float64}

    # Skybox radius
    r::Float64
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8bec1c50-1910-11eb-2f63-9151c9c3cb3b„§cell_idÙ$8bec1c50-1910-11eb-2f63-9151c9c3cb3b¤codeÙTfunction Lens(p, r, ior)
    return Sphere(p, r, Surface(0,1,RGBA(0,0,0,0),ior))
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c99c170-1910-11eb-054a-1b007276a744„§cell_idÙ$8c99c170-1910-11eb-054a-1b007276a744¤codeÙIfunction step(ray::Ray, dt)
    ray.p .+= .+ ray.v.*dt
    return ray
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c45ae00-1910-11eb-2908-ede9e1c04a53„§cell_idÙ$8c45ae00-1910-11eb-2908-ede9e1c04a53¤codeÙ!abstract type Wall <: Object end;¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$210789e0-1912-11eb-11b6-bdb806bee14d„§cell_idÙ$210789e0-1912-11eb-11b6-bdb806bee14d¤code°doit(T, highres)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8d20cbc0-1910-11eb-0d98-31a55e7becde„§cell_idÙ$8d20cbc0-1910-11eb-0d98-31a55e7becde¤codeÚ8doit(T, highres) = let
	
	
	
	# blank_img = Array{RGB}(undef, 1920,1080)
	blank_img = if highres
		Array{RGB}(undef, 800, 320)
	else
		Array{RGB}(undef, 200, 80)
	end
	repeat
	blank_img[:] .= RGB(0)

	cam = Camera(blank_img, [16,6], -10, [0,0,100])

	ray_trace(objects(T / 100), cam) |> as_image
end |> transpose¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830e„§cell_idÙ$f4c96d10-190e-11eb-0e8e-11ded1c8830e¤codeÙÆ# TODO: get refraction to work without offsets in quadratic / inside_of fxs
#       Also, use dot product to see if exiting lens

function Base.isapprox(n1::Nothing, n2::Nothing)
    return true
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8c809420-1910-11eb-2f0d-e17ea7a04a51„§cell_idÙ$8c809420-1910-11eb-2f0d-e17ea7a04a51¤codeÚLfunction plot_rays(positions, objects::Vector{O},
                   filename) where {O <: Object}
    plt = plot(background_color=:black, aspect_ratio=:equal, legend=false)

    for i = 1:size(positions)[1]
        plot!(plt, (positions[i,:,1], positions[i,:,2]); label = "ray",
              linecolor=:white)
    end

    for object in objects
        if typeof(object) == Mirror
            dir = [-object.n[2], object.n[1]]
            extents = zeros(2,2)
            extents[1,:] .= object.p .- object.scale * dir
            extents[2,:] .= object.p .+ object.scale * dir
            plot!(plt, (extents[:,1], extents[:,2]), label = "mirror")
        elseif typeof(object) == Sphere
            circle = draw_circle(object.p, object.r, 100)
            plot!(circle; label="lens", linecolor=:lightblue)
        end 
    end

    plt
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$25ab9680-1912-11eb-0650-6361aaf781ec„§cell_idÙ$25ab9680-1912-11eb-0650-6361aaf781ec¤codeÙ&# [doit() for _ in 1:10];

# 3.1
# 2.8¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8c1d3e70-1910-11eb-10af-7dd208f70edd„§cell_idÙ$8c1d3e70-1910-11eb-10af-7dd208f70edd¤codeÙLfunction inside_of(ray::Ray, sphere)
    return inside_of(ray.p, sphere)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403„§cell_idÙ$8be2dea0-193e-11eb-0591-c3dcc4c84403¤code ¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8cc03530-1910-11eb-107e-3db62b460115„§cell_idÙ$8cc03530-1910-11eb-107e-3db62b460115¤codeÙýfunction propagate(rays::Array{Ray}, objects::Vector{O},
                    num_intersections) where {O <: Object}
    Threads.@threads for j = 1:length(rays)
        rays[j] = propagate(rays[j], objects, num_intersections)
    end

    return rays
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8bc95210-1910-11eb-2af9-cb247912835a„§cell_idÙ$8bc95210-1910-11eb-2af9-cb247912835a¤codeÚ+# For now, all cameras are aligned on the z axis
struct Camera
    # Set of all pixels, counts as scene resolution
    pixels

    # physical size of aperture
    size::Vector{Float64}

    # camera's distance from screen
    focal_length::Float64

    # camera's position
    p::Vector{Float64}
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$4417b3e0-190f-11eb-1efe-53d279a306e6„§cell_idÙ$4417b3e0-190f-11eb-1efe-53d279a306e6¤code³using LinearAlgebra¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$853789be-1911-11eb-1121-679f89fe62db„§cell_idÙ$853789be-1911-11eb-1121-679f89fe62db¤codeÙ£md"""
# 0123456789 www

Pluto notebook adaptation of https://github.com/leios/simuleios/tree/master/raytracing

See
https://www.youtube.com/watch?v=JwyQezsQkkw
"""¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0„§cell_idÙ$8bea95b0-1910-11eb-3850-9f624fa3e6c0¤codeÙxstruct Sphere <: Object
    # Lens position
    p::Vector{Float64}

    # Lens radius
    r::Float64

    s::Surface
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$88865f70-1939-11eb-2941-c538b8c9175b„§cell_idÙ$88865f70-1939-11eb-2941-c538b8c9175b¤codeµ@bind T Slider(1:200)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8bdfe750-1910-11eb-1eb6-c9c61b3333cf„§cell_idÙ$8bdfe750-1910-11eb-1eb6-c9c61b3333cf¤code¸abstract type Object end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8cf0e220-1910-11eb-0933-b168f7031f46„§cell_idÙ$8cf0e220-1910-11eb-0933-b168f7031f46¤codeÚÿfunction init_rays(cam::Camera)

    res = size(cam.pixels)
    dim = cam.size

    pixel_width = dim ./ res

    # create a set of rays that go through every pixel in our grid.
	rays = map(CartesianIndices(cam.pixels)) do I
		pixel_loc = [cam.p[1] + 0.5*dim[1] - I[1]*dim[1]/res[1] + 
					 0.5*pixel_width[1],
					 cam.p[2] + 0.5*dim[2] - I[2]*dim[2]/res[2] +
					 0.5*pixel_width[2],
					 cam.p[3]+cam.focal_length]
		l = normalize(pixel_loc - cam.p)
		Ray(l, pixel_loc, RGB(0))
	end

    return rays

end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂ«notebook_idÙ$51a16ad8-4aa1-11f0-2e48-1b0a0cd88c7c«in_temp_dirÂ¨metadata€