From 4ceba42d2c2b10ac630f26acbcc7dd85db043ac9 Mon Sep 17 00:00:00 2001 From: Robin Ohs Date: Wed, 13 Mar 2024 15:41:38 +0100 Subject: [PATCH] ~= Change to mixed Rust/Python layout. --- Cargo.lock | 272 ++-- Cargo.toml | 6 +- LICENSE | 619 ++++++++ README.rst | 1 + pyproject.toml | 25 +- python/cstl_ntwkx/__init__.py | 5 + .../cstl_ntwkx/cstl_ntwkx.pyi | 0 python/cstl_ntwkx/plot.py | 2 + python/cstl_ntwkx/plot.pyi | 2 + python/cstl_ntwkx/py.typed | 0 src/groundstation.rs | 12 +- src/lib.rs | 2 +- src/satellite.rs | 3 +- test.ipynb | 1279 +++++++++-------- 14 files changed, 1473 insertions(+), 755 deletions(-) create mode 100644 LICENSE create mode 100644 README.rst create mode 100644 python/cstl_ntwkx/__init__.py rename constellation_networkx.pyi => python/cstl_ntwkx/cstl_ntwkx.pyi (100%) create mode 100644 python/cstl_ntwkx/plot.py create mode 100644 python/cstl_ntwkx/plot.pyi create mode 100644 python/cstl_ntwkx/py.typed diff --git a/Cargo.lock b/Cargo.lock index 338b4ea..b27ace7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "approx" @@ -102,15 +102,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "bytes" @@ -120,12 +120,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -135,16 +132,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits 0.2.18", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -171,7 +168,7 @@ dependencies = [ "lazy_static", "nom 5.1.3", "rust-ini", - "serde 1.0.196", + "serde 1.0.197", "serde-hjson", "serde_json", "toml 0.5.11", @@ -191,21 +188,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "constellation-networkx" -version = "0.1.0" -dependencies = [ - "chrono", - "itertools 0.12.1", - "nyx-space", - "once_cell", - "pyo3", - "rayon", - "serde 1.0.196", - "serde_json", - "uom", -] - [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -265,6 +247,21 @@ dependencies = [ "typenum", ] +[[package]] +name = "cstl_ntwkx" +version = "0.1.0" +dependencies = [ + "chrono", + "itertools 0.12.1", + "nyx-space", + "once_cell", + "pyo3", + "rayon", + "serde 1.0.197", + "serde_json", + "uom", +] + [[package]] name = "csv" version = "1.3.0" @@ -274,7 +271,7 @@ dependencies = [ "csv-core", "itoa", "ryu", - "serde 1.0.196", + "serde 1.0.197", ] [[package]] @@ -413,6 +410,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -430,7 +433,7 @@ checksum = "ddfa293cb148cb8596c0c676888eb3a39c263178be021534b5677d4db990616b" dependencies = [ "num-traits 0.2.18", "regex", - "serde 1.0.196", + "serde 1.0.197", "serde_derive", ] @@ -478,9 +481,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown", @@ -501,9 +504,9 @@ dependencies = [ [[package]] name = "indoc" -version = "1.0.9" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" [[package]] name = "indxvec" @@ -537,9 +540,9 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -599,9 +602,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "matrixmultiply" @@ -659,9 +662,9 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.32.3" +version = "0.32.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +checksum = "4541eb06dce09c0241ebbaab7102f0a01a0c8994afed2e5d0d66775016e25ac2" dependencies = [ "approx", "matrixmultiply", @@ -811,7 +814,7 @@ dependencies = [ "regex", "rstats", "rust-embed", - "serde 1.0.196", + "serde 1.0.197", "serde_derive", "thiserror", "toml 0.7.8", @@ -854,6 +857,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -872,9 +881,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -904,9 +913,9 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.19.2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38" +checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" dependencies = [ "cfg-if", "chrono", @@ -914,6 +923,7 @@ dependencies = [ "libc", "memoffset", "parking_lot", + "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", @@ -922,9 +932,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.19.2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5" +checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" dependencies = [ "once_cell", "target-lexicon", @@ -932,9 +942,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.19.2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9" +checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" dependencies = [ "libc", "pyo3-build-config", @@ -942,25 +952,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.19.2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1" +checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 1.0.109", + "syn 2.0.52", ] [[package]] name = "pyo3-macros-backend" -version = "0.19.2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536" +checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" dependencies = [ + "heck 0.4.1", "proc-macro2", + "pyo3-build-config", "quote", - "syn 1.0.109", + "syn 2.0.52", ] [[package]] @@ -1041,9 +1053,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -1082,9 +1094,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1129,7 +1141,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.49", + "syn 2.0.52", "walkdir", ] @@ -1164,9 +1176,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "safe_arch" @@ -1200,9 +1212,9 @@ checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -1221,24 +1233,24 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", - "serde 1.0.196", + "serde 1.0.197", ] [[package]] @@ -1247,7 +1259,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ - "serde 1.0.196", + "serde 1.0.197", ] [[package]] @@ -1311,9 +1323,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -1322,15 +1334,15 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -1358,22 +1370,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -1382,7 +1394,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "serde 1.0.196", + "serde 1.0.197", ] [[package]] @@ -1391,7 +1403,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ - "serde 1.0.196", + "serde 1.0.197", "serde_spanned", "toml_datetime", "toml_edit", @@ -1403,7 +1415,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ - "serde 1.0.196", + "serde 1.0.197", ] [[package]] @@ -1413,7 +1425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", - "serde 1.0.196", + "serde 1.0.197", "serde_spanned", "toml_datetime", "winnow", @@ -1445,9 +1457,9 @@ checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unindent" -version = "0.1.11" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" [[package]] name = "uom" @@ -1473,9 +1485,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -1489,9 +1501,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1499,24 +1511,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1524,22 +1536,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wide" @@ -1588,7 +1600,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -1597,7 +1609,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -1617,17 +1629,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -1638,9 +1650,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -1650,9 +1662,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -1662,9 +1674,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -1674,9 +1686,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -1686,9 +1698,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -1698,9 +1710,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -1710,9 +1722,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" @@ -1754,7 +1766,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c0b0a4701f203ebaecce4971a6bb8575aa07b617bdc39ddfc6ffeff3a38530d" dependencies = [ - "heck", + "heck 0.3.3", "log", "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 8c0a67d..c076fb1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,15 @@ [package] -name = "constellation-networkx" +name = "cstl_ntwkx" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] -name = "constellation_networkx" +name = "cstl_ntwkx" crate-type = ["cdylib"] [dependencies] -pyo3 = { version = "0.19.0", features = ["chrono"] } +pyo3 = { version = "0.20.3", features = ["chrono"] } nyx-space = "1.1.2" once_cell = "1.19.0" rayon = "1.8.1" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f4aa842 --- /dev/null +++ b/LICENSE @@ -0,0 +1,619 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..5570c7f --- /dev/null +++ b/README.rst @@ -0,0 +1 @@ +# Hello \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f013a91..64d227c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,15 +3,36 @@ requires = ["maturin>=1.4,<2.0"] build-backend = "maturin" [project] -name = "constellation-networkx" -dependencies = ["networkx==3.2.1"] +name = "cstl_ntwkx" +description = "Encode Walker constellations into networkx graphs suitable for Reinforcement Learning." +readme = "README.rst" requires-python = ">=3.8" +license = { file = "LICENSE" } +keywords = [ + "walker-star", + "walker-delta", + "walker constellations", + "constellations", + "reinforcement learning", + "constellation to networkx", + "cstl to networkx", + "encode constellations", +] +authors = [{ name = "Robin Ohs", email = "ohs@depend.uni-saarland.de" }] +maintainers = [{ name = "Robin Ohs", email = "ohs@depend.uni-saarland.de" }] classifiers = [ "Programming Language :: Rust", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] +dependencies = ["networkx==3.2.1"] dynamic = ["version"] +[project.urls] +homepage = "https://depend.cs.uni-saarland.de/" +documentation = "https://github.com/robinohs/constellation_networkx" +repository = "https://github.com/robinohs/constellation_networkx" + [tool.maturin] features = ["pyo3/extension-module"] +python-source = "python" diff --git a/python/cstl_ntwkx/__init__.py b/python/cstl_ntwkx/__init__.py new file mode 100644 index 0000000..fc5a595 --- /dev/null +++ b/python/cstl_ntwkx/__init__.py @@ -0,0 +1,5 @@ +from .cstl_ntwkx import * + +__doc__ = cstl_ntwkx.__doc__ +if hasattr(cstl_ntwkx, "__all__"): + __all__ = cstl_ntwkx.__all__ \ No newline at end of file diff --git a/constellation_networkx.pyi b/python/cstl_ntwkx/cstl_ntwkx.pyi similarity index 100% rename from constellation_networkx.pyi rename to python/cstl_ntwkx/cstl_ntwkx.pyi diff --git a/python/cstl_ntwkx/plot.py b/python/cstl_ntwkx/plot.py new file mode 100644 index 0000000..5aebfae --- /dev/null +++ b/python/cstl_ntwkx/plot.py @@ -0,0 +1,2 @@ +def test(): + print("TEST bestanden") \ No newline at end of file diff --git a/python/cstl_ntwkx/plot.pyi b/python/cstl_ntwkx/plot.pyi new file mode 100644 index 0000000..e33f3e6 --- /dev/null +++ b/python/cstl_ntwkx/plot.pyi @@ -0,0 +1,2 @@ +def test() -> any: + pass \ No newline at end of file diff --git a/python/cstl_ntwkx/py.typed b/python/cstl_ntwkx/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/groundstation.rs b/src/groundstation.rs index 3fc081e..9e4512c 100644 --- a/src/groundstation.rs +++ b/src/groundstation.rs @@ -55,12 +55,12 @@ impl Groundstation { pub fn is_visible(&self, sat: &Satellite) -> bool { let (elevation, _, _) = self.groundstation.elevation_of(&sat.get_orbit()); let elevation: Angle = Angle::new::(elevation); - println!( - "Elevation between GS({}) and Sat({}) is {}", - self.get_id(), - sat.get_id(), - elevation.get::() - ); + // println!( + // "Elevation between GS({}) and Sat({}) is {}", + // self.get_id(), + // sat.get_id(), + // elevation.get::() + // ); elevation >= self.min_elevation } diff --git a/src/lib.rs b/src/lib.rs index 097ab8f..de44a4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,7 +99,7 @@ fn project_3d_positions<'a>( /// A Python module implemented in Rust. #[pymodule] -fn constellation_networkx(_py: Python, m: &PyModule) -> PyResult<()> { +fn cstl_ntwkx(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_function(wrap_pyfunction!(create_constellation, m)?)?; diff --git a/src/satellite.rs b/src/satellite.rs index e55ca15..ce50626 100644 --- a/src/satellite.rs +++ b/src/satellite.rs @@ -206,8 +206,7 @@ impl Node for Satellite { } fn get_lat(&self) -> Angle { - let lat = self.orbit.geodetic_latitude(); - Angle::new::(lat) + Angle::new::(self.orbit.geodetic_latitude()) } fn get_lon(&self) -> Angle { diff --git a/test.ipynb b/test.ipynb index b10d7c8..cd9ff09 100644 --- a/test.ipynb +++ b/test.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "outputs": [], "source": [ - "import constellation_networkx\n", + "import cstl_ntwkx\n", "import matplotlib.pyplot as plt\n", "import gymnasium as gym\n", "import networkx as nx\n", @@ -33,11 +33,22 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'cstl_ntwkx' has no attribute 'plot'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[8], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m inclination \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m86.0\u001b[39m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mtype\u001b[39m \u001b[38;5;241m=\u001b[39m cstl_ntwkx\u001b[38;5;241m.\u001b[39mConstellationType\u001b[38;5;241m.\u001b[39mStar\n\u001b[0;32m---> 11\u001b[0m \u001b[43mcstl_ntwkx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot\u001b[49m\u001b[38;5;241m.\u001b[39mtest()\n\u001b[1;32m 13\u001b[0m ground_stations: List[Tuple[\u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mfloat\u001b[39m, \u001b[38;5;28mfloat\u001b[39m, \u001b[38;5;28mfloat\u001b[39m]] \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# (Name, lat, lon, alt)\u001b[39;00m\n\u001b[1;32m 15\u001b[0m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSaarbrücken\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m49.233\u001b[39m, \u001b[38;5;241m7.0\u001b[39m, \u001b[38;5;241m0.23\u001b[39m),\n\u001b[1;32m 16\u001b[0m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWashington DC\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m38.889805\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m77.009056\u001b[39m, \u001b[38;5;241m0.125\u001b[39m),\n\u001b[1;32m 17\u001b[0m ]\n", + "\u001b[0;31mAttributeError\u001b[0m: module 'cstl_ntwkx' has no attribute 'plot'" + ] + } + ], "source": [ - "\n", "from typing import List, Tuple\n", "\n", "\n", @@ -46,14 +57,24 @@ "ipc = 1\n", "altitude = 1200\n", "inclination = 86.0\n", - "type = constellation_networkx.ConstellationType.Star\n", + "type = cstl_ntwkx.ConstellationType.Star\n", + "\n", + "cstl_ntwkx.plot.test()\n", "\n", "ground_stations: List[Tuple[str, float, float, float]] = [\n", " # (Name, lat, lon, alt)\n", - " # (\"Saarbrücken\", 49.233, 7.0, 0.23),\n", + " (\"Saarbrücken\", 49.233, 7.0, 0.23),\n", + " (\"Washington DC\", 38.889805, -77.009056, 0.125),\n", "]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -100,140 +121,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Adding link 0<->1\n", - "Adding link 0<->10\n", - "Adding link 1<->2\n", - "Adding link 1<->11\n", - "Adding link 2<->3\n", - "Adding link 3<->4\n", - "Adding link 4<->5\n", - "Adding link 4<->14\n", - "Adding link 5<->6\n", - "Adding link 5<->15\n", - "Adding link 6<->7\n", - "Adding link 6<->16\n", - "Adding link 7<->8\n", - "Adding link 8<->9\n", - "Adding link 9<->0\n", - "Adding link 9<->19\n", - "Adding link 10<->11\n", - "Adding link 10<->20\n", - "Adding link 11<->12\n", - "Adding link 11<->21\n", - "Adding link 12<->13\n", - "Adding link 13<->14\n", - "Adding link 13<->23\n", - "Adding link 14<->15\n", - "Adding link 14<->24\n", - "Adding link 15<->16\n", - "Adding link 15<->25\n", - "Adding link 16<->17\n", - "Adding link 16<->26\n", - "Adding link 17<->18\n", - "Adding link 18<->19\n", - "Adding link 18<->28\n", - "Adding link 19<->10\n", - "Adding link 19<->29\n", - "Adding link 20<->21\n", - "Adding link 20<->30\n", - "Adding link 21<->22\n", - "Adding link 21<->31\n", - "Adding link 22<->23\n", - "Adding link 23<->24\n", - "Adding link 23<->33\n", - "Adding link 24<->25\n", - "Adding link 24<->34\n", - "Adding link 25<->26\n", - "Adding link 25<->35\n", - "Adding link 26<->27\n", - "Adding link 26<->36\n", - "Adding link 27<->28\n", - "Adding link 28<->29\n", - "Adding link 28<->38\n", - "Adding link 29<->20\n", - "Adding link 29<->39\n", - "Adding link 30<->31\n", - "Adding link 31<->32\n", - "Adding link 32<->33\n", - "Adding link 33<->34\n", - "Adding link 34<->35\n", - "Adding link 35<->36\n", - "Adding link 36<->37\n", - "Adding link 37<->38\n", - "Adding link 38<->39\n", - "Adding link 39<->30\n", - "Adding link 0<->1\n", - "Adding link 0<->10\n", - "Adding link 1<->2\n", - "Adding link 2<->3\n", - "Adding link 3<->4\n", - "Adding link 3<->13\n", - "Adding link 4<->5\n", - "Adding link 4<->14\n", - "Adding link 5<->6\n", - "Adding link 5<->15\n", - "Adding link 6<->7\n", - "Adding link 7<->8\n", - "Adding link 8<->9\n", - "Adding link 8<->18\n", - "Adding link 9<->0\n", - "Adding link 9<->19\n", - "Adding link 10<->11\n", - "Adding link 10<->20\n", - "Adding link 11<->12\n", - "Adding link 12<->13\n", - "Adding link 13<->14\n", - "Adding link 13<->23\n", - "Adding link 14<->15\n", - "Adding link 14<->24\n", - "Adding link 15<->16\n", - "Adding link 15<->25\n", - "Adding link 16<->17\n", - "Adding link 17<->18\n", - "Adding link 18<->19\n", - "Adding link 18<->28\n", - "Adding link 19<->10\n", - "Adding link 19<->29\n", - "Adding link 20<->21\n", - "Adding link 20<->30\n", - "Adding link 21<->22\n", - "Adding link 22<->23\n", - "Adding link 22<->32\n", - "Adding link 23<->24\n", - "Adding link 23<->33\n", - "Adding link 24<->25\n", - "Adding link 24<->34\n", - "Adding link 25<->26\n", - "Adding link 25<->35\n", - "Adding link 26<->27\n", - "Adding link 27<->28\n", - "Adding link 27<->37\n", - "Adding link 28<->29\n", - "Adding link 28<->38\n", - "Adding link 29<->20\n", - "Adding link 29<->39\n", - "Adding link 30<->31\n", - "Adding link 31<->32\n", - "Adding link 32<->33\n", - "Adding link 33<->34\n", - "Adding link 34<->35\n", - "Adding link 35<->36\n", - "Adding link 36<->37\n", - "Adding link 37<->38\n", - "Adding link 38<->39\n", - "Adding link 39<->30\n" - ] - } - ], + "outputs": [], "source": [ - "cstl = constellation_networkx.create_constellation(\n", + "cstl = cstl_ntwkx.create_constellation(\n", " sats, planes, ipc, altitude, inclination, 10.0, type\n", ")\n", "\n", @@ -241,7 +133,7 @@ "for (name, lat, lon, alt) in ground_stations:\n", " cstl.add_groundstation(name, lat, lon, alt)\n", "\n", - "cstl.propagate(500_000)" + "cstl.propagate(25_520_000)" ] }, { @@ -253,13 +145,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "G: nx.Graph = constellation_networkx.extract_graph(cstl)\n", + "G: nx.Graph = cstl_ntwkx.extract_graph(cstl)\n", "\n", - "node_positions = constellation_networkx.project_3d_positions(cstl)" + "node_positions = cstl_ntwkx.project_3d_positions(cstl)\n" ] }, { @@ -271,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -287,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -304,12 +196,12 @@ }, "type": "scatter", "x": [ - 4.605129960049352, - 17.63568494387629 + 392.3850488069782, + 399.2787184097786 ], "y": [ - 261.0594157652669, - 340.598510946091 + 109.5934026426842, + 189.64966255662648 ] }, { @@ -318,12 +210,12 @@ }, "type": "scatter", "x": [ - 4.605129960049352, - 106.54639516939577 + 392.3850488069782, + 494.5301651801155 ], "y": [ - 261.0594157652669, - 281.0410365077145 + 109.5934026426842, + 129.55254591899504 ] }, { @@ -332,12 +224,12 @@ }, "type": "scatter", "x": [ - 798.6594983067316, - 800 + 392.3850488069782, + 363.61817793397387 ], "y": [ - 180.8669998277387, - 220.96320779650281 + 109.5934026426842, + 30.79437579852159 ] }, { @@ -346,12 +238,12 @@ }, "type": "scatter", "x": [ - 0, - 4.605129960049352 + 399.2787184097786, + 405.40902333679077 ], "y": [ - 220.96320779650281, - 261.0594157652669 + 189.64966255662648, + 269.8130293465034 ] }, { @@ -360,12 +252,12 @@ }, "type": "scatter", "x": [ - 17.63568494387629, - 349.3079366826632 + 399.2787184097786, + 500.6767182574812 ], "y": [ - 340.598510946091, - 377.4047411413715 + 189.64966255662648, + 209.71342257537614 ] }, { @@ -374,12 +266,12 @@ }, "type": "scatter", "x": [ - 349.3079366826632, - 391.26039250559455 + 405.40902333679077, + 421.09672738315066 ], "y": [ - 377.4047411413715, - 299.12755688921703 + 269.8130293465034, + 349.20166199609815 ] }, { @@ -388,12 +280,12 @@ }, "type": "scatter", "x": [ - 391.26039250559455, - 398.6594983067317 + 405.40902333679077, + 507.5386236768951 ], "y": [ - 299.12755688921703, - 219.13300017226126 + 269.8130293465034, + 289.7737789839157 ] }, { @@ -402,12 +294,12 @@ }, "type": "scatter", "x": [ - 391.26039250559455, - 493.6505724228276 + 405.40902333679077, + 415.5555555555556 ], "y": [ - 299.12755688921703, - 279.19193440090095 + 269.8130293465034, + 309.4066666666667 ] }, { @@ -416,12 +308,12 @@ }, "type": "scatter", "x": [ - 398.6594983067317, - 404.60512996004934 + 421.09672738315066, + 763.618177933972 ], "y": [ - 219.13300017226126, - 138.94058423473305 + 349.20166199609815, + 369.20562420147974 ] }, { @@ -430,12 +322,12 @@ }, "type": "scatter", "x": [ - 398.6594983067317, - 500.064622275535 + 421.09672738315066, + 415.5555555555556 ], "y": [ - 219.13300017226126, - 199.0706385346516 + 349.20166199609815, + 309.4066666666667 ] }, { @@ -444,12 +336,12 @@ }, "type": "scatter", "x": [ - 404.60512996004934, - 417.6356849438763 + 763.618177933972, + 792.3850488069785 ], "y": [ - 138.94058423473305, - 59.40148905390904 + 369.20562420147974, + 290.4065973573137 ] }, { @@ -458,82 +350,102 @@ }, "type": "scatter", "x": [ - 404.60512996004934, - 506.54639516939585 + 792.3850488069785, + 799.2787184097789 ], "y": [ - 138.94058423473305, - 118.95896349228548 + 290.4065973573137, + 210.35033744337005 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 417.6356849438763, - 749.3079366826631 + 792.3850488069785, + 800 ], "y": [ - 59.40148905390904, - 22.59525885862846 + 290.4065973573137, + 280.4270257191504 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 749.3079366826631, - 791.2603925055945 + 0, + 94.53016518011692 ], "y": [ - 22.59525885862846, - 100.87244311078291 + 280.4270257191504, + 270.44745408098703 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 791.2603925055945, - 798.6594983067316 + 799.2787184097789, + 800 ], "y": [ - 100.87244311078291, - 180.8669998277387 + 210.35033744337005, + 170.26865404842434 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 791.2603925055945, + 0, + 5.409023336792479 + ], + "y": [ + 170.26865404842434, + 130.18697065347862 + ] + }, + { + "line": { + "color": "red" + }, + "mode": "lines", + "type": "scatter", + "x": [ + 799.2787184097789, 800 ], "y": [ - 100.87244311078291, - 110.84025435494098 + 210.35033744337005, + 200.31845743399577 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ 0, - 93.65057242282761 + 100.67671825748108 ], "y": [ - 110.84025435494098, - 120.80806559909905 + 200.31845743399577, + 190.28657742462153 ] }, { @@ -542,12 +454,12 @@ }, "type": "scatter", "x": [ - 798.6594983067316, - 800 + 5.409023336792479, + 21.09672738314853 ], "y": [ - 180.8669998277387, - 190.89818064654355 + 130.18697065347862, + 50.79833800390623 ] }, { @@ -556,12 +468,12 @@ }, "type": "scatter", "x": [ - 0, - 100.06462227553496 + 5.409023336792479, + 107.53862367689622 ], "y": [ - 190.89818064654355, - 200.92936146534842 + 130.18697065347862, + 110.22622101607418 ] }, { @@ -570,12 +482,12 @@ }, "type": "scatter", "x": [ - 106.54639516939577, - 127.58723947772808 + 21.09672738314853, + 363.61817793397387 ], "y": [ - 281.0410365077145, - 360.16993053005757 + 50.79833800390623, + 30.79437579852159 ] }, { @@ -584,12 +496,12 @@ }, "type": "scatter", "x": [ - 106.54639516939577, - 208.996858178866 + 494.5301651801155, + 500.6767182574812 ], "y": [ - 281.0410365077145, - 300.9713359699023 + 129.55254591899504, + 209.71342257537614 ] }, { @@ -598,12 +510,12 @@ }, "type": "scatter", "x": [ - 106.54639516939577, - 100.06462227553496 + 494.5301651801155, + 596.2961653946198 ], "y": [ - 281.0410365077145, - 200.92936146534842 + 129.55254591899504, + 149.5563639734004 ] }, { @@ -612,12 +524,12 @@ }, "type": "scatter", "x": [ - 127.58723947772808, - 473.70716922294304 + 494.5301651801155, + 478.6091701348222 ], "y": [ - 360.16993053005757, - 358.3710268282775 + 129.55254591899504, + 50.176216829730244 ] }, { @@ -626,12 +538,12 @@ }, "type": "scatter", "x": [ - 473.70716922294304, - 493.6505724228276 + 500.6767182574812, + 507.5386236768951 ], "y": [ - 358.3710268282775, - 279.19193440090095 + 209.71342257537614, + 289.7737789839157 ] }, { @@ -640,12 +552,12 @@ }, "type": "scatter", "x": [ - 493.6505724228276, - 500.064622275535 + 500.6767182574812, + 602.1086999553942 ], "y": [ - 279.19193440090095, - 199.0706385346516 + 209.71342257537614, + 229.77061684769882 ] }, { @@ -654,12 +566,12 @@ }, "type": "scatter", "x": [ - 493.6505724228276, - 595.5574653661959 + 507.5386236768951, + 535.6323111872836 ], "y": [ - 279.19193440090095, - 259.2061961913386 + 289.7737789839157, + 368.600420073175 ] }, { @@ -668,40 +580,42 @@ }, "type": "scatter", "x": [ - 500.064622275535, - 506.54639516939585 + 507.5386236768951, + 610.324062861111 ], "y": [ - 199.0706385346516, - 118.95896349228548 + 289.7737789839157, + 309.6770568030986 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 500.064622275535, - 601.472972428916 + 535.6323111872836, + 800 ], "y": [ - 199.0706385346516, - 179.00890627093878 + 368.600420073175, + 359.21210162172804 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 506.54639516939585, - 527.5872394777281 + 0, + 78.60917013481588 ], "y": [ - 118.95896349228548, - 39.8300694699424 + 359.21210162172804, + 349.82378317028116 ] }, { @@ -710,12 +624,12 @@ }, "type": "scatter", "x": [ - 506.54639516939585, - 608.996858178866 + 78.60917013481588, + 94.53016518011692 ], "y": [ - 118.95896349228548, - 99.02866403009763 + 349.82378317028116, + 270.44745408098703 ] }, { @@ -724,12 +638,12 @@ }, "type": "scatter", "x": [ - 527.5872394777281, - 800 + 78.60917013481588, + 185.48815074698823 ], "y": [ - 39.8300694699424, - 40.72952132083246 + 349.82378317028116, + 330.1301941937019 ] }, { @@ -738,12 +652,12 @@ }, "type": "scatter", "x": [ - 0, - 73.70716922294301 + 94.53016518011692, + 100.67671825748108 ], "y": [ - 40.72952132083246, - 41.62897317172252 + 270.44745408098703, + 190.28657742462153 ] }, { @@ -752,12 +666,12 @@ }, "type": "scatter", "x": [ - 73.70716922294301, - 93.65057242282761 + 94.53016518011692, + 196.29616539461975 ], "y": [ - 41.62897317172252, - 120.80806559909905 + 270.44745408098703, + 250.44363602660192 ] }, { @@ -766,12 +680,12 @@ }, "type": "scatter", "x": [ - 93.65057242282761, - 100.06462227553496 + 100.67671825748108, + 107.53862367689622 ], "y": [ - 120.80806559909905, - 200.92936146534842 + 190.28657742462153, + 110.22622101607418 ] }, { @@ -780,12 +694,12 @@ }, "type": "scatter", "x": [ - 93.65057242282761, - 195.55746536619588 + 100.67671825748108, + 202.1086999553956 ], "y": [ - 120.80806559909905, - 140.79380380866132 + 190.28657742462153, + 170.22938315228262 ] }, { @@ -794,12 +708,12 @@ }, "type": "scatter", "x": [ - 100.06462227553496, - 201.47297242891602 + 107.53862367689622, + 135.6323111872667 ], "y": [ - 200.92936146534842, - 220.99109372906116 + 110.22622101607418, + 31.39957992683839 ] }, { @@ -808,12 +722,12 @@ }, "type": "scatter", "x": [ - 208.996858178866, - 255.12147023927855 + 107.53862367689622, + 210.32406286111444 ], "y": [ - 300.9713359699023, - 379.08699968317086 + 110.22622101607418, + 90.32294319688093 ] }, { @@ -822,12 +736,12 @@ }, "type": "scatter", "x": [ - 208.996858178866, - 312.3743978867819 + 135.6323111872667, + 478.6091701348222 ], "y": [ - 300.9713359699023, - 320.8343271275399 + 31.39957992683839, + 50.176216829730244 ] }, { @@ -836,12 +750,12 @@ }, "type": "scatter", "x": [ - 208.996858178866, - 201.47297242891602 + 478.6091701348222, + 585.488150746979 ], "y": [ - 300.9713359699023, - 220.99109372906116 + 50.176216829730244, + 69.8698058062621 ] }, { @@ -850,12 +764,12 @@ }, "type": "scatter", "x": [ - 255.12147023927855, - 582.9799706197826 + 596.2961653946198, + 602.1086999553942 ], "y": [ - 379.08699968317086, - 338.77335362078117 + 149.5563639734004, + 229.77061684769882 ] }, { @@ -864,12 +778,12 @@ }, "type": "scatter", "x": [ - 582.9799706197826, - 595.5574653661959 + 596.2961653946198, + 697.8444700222236 ], "y": [ - 338.77335362078117, - 259.2061961913386 + 149.5563639734004, + 169.59289702610982 ] }, { @@ -878,12 +792,12 @@ }, "type": "scatter", "x": [ - 582.9799706197826, - 687.996310038285 + 596.2961653946198, + 585.488150746979 ], "y": [ - 338.77335362078117, - 318.9977140895695 + 149.5563639734004, + 69.8698058062621 ] }, { @@ -892,12 +806,12 @@ }, "type": "scatter", "x": [ - 595.5574653661959, - 601.472972428916 + 602.1086999553942, + 610.324062861111 ], "y": [ - 259.2061961913386, - 179.00890627093878 + 229.77061684769882, + 309.6770568030986 ] }, { @@ -906,12 +820,12 @@ }, "type": "scatter", "x": [ - 595.5574653661959, - 697.185904897341 + 602.1086999553942, + 703.6519884726372 ], "y": [ - 259.2061961913386, - 239.18249765246017 + 229.77061684769882, + 249.8079884664014 ] }, { @@ -920,12 +834,12 @@ }, "type": "scatter", "x": [ - 601.472972428916, - 608.996858178866 + 610.324062861111, + 690.3578801213123 ], "y": [ - 179.00890627093878, - 99.02866403009763 + 309.6770568030986, + 386.4638434091541 ] }, { @@ -934,40 +848,42 @@ }, "type": "scatter", "x": [ - 601.472972428916, - 702.9569117844757 + 610.324062861111, + 714.3516891384601 ], "y": [ - 179.00890627093878, - 158.96126725586953 + 309.6770568030986, + 329.50247406018326 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 608.996858178866, - 655.1214702392784 + 690.3578801213123, + 800 ], "y": [ - 99.02866403009763, - 20.913000316829166 + 386.4638434091541, + 358.297018801428 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ - 608.996858178866, - 712.374397886782 + 0, + 185.48815074698823 ], "y": [ - 99.02866403009763, - 79.16567287246012 + 358.297018801428, + 330.1301941937019 ] }, { @@ -976,12 +892,12 @@ }, "type": "scatter", "x": [ - 655.1214702392784, - 800 + 185.48815074698823, + 196.29616539461975 ], "y": [ - 20.913000316829166, - 41.069823348024 + 330.1301941937019, + 250.44363602660192 ] }, { @@ -990,12 +906,26 @@ }, "type": "scatter", "x": [ - 0, - 182.97997061978265 + 185.48815074698823, + 289.5716246355356 + ], + "y": [ + 330.1301941937019, + 310.30778407151007 + ] + }, + { + "line": { + "color": "red" + }, + "type": "scatter", + "x": [ + 185.48815074698823, + 228.86876444444445 ], "y": [ - 41.069823348024, - 61.22664637921883 + 330.1301941937019, + 286.4217888888889 ] }, { @@ -1004,12 +934,12 @@ }, "type": "scatter", "x": [ - 182.97997061978265, - 195.55746536619588 + 196.29616539461975, + 202.1086999553956 ], "y": [ - 61.22664637921883, - 140.79380380866132 + 250.44363602660192, + 170.22938315228262 ] }, { @@ -1018,12 +948,12 @@ }, "type": "scatter", "x": [ - 182.97997061978265, - 287.996310038285 + 196.29616539461975, + 297.84447002222475 ], "y": [ - 61.22664637921883, - 81.00228591043046 + 250.44363602660192, + 230.40710297387727 ] }, { @@ -1032,12 +962,12 @@ }, "type": "scatter", "x": [ - 195.55746536619588, - 201.47297242891602 + 196.29616539461975, + 228.86876444444445 ], "y": [ - 140.79380380866132, - 220.99109372906116 + 250.44363602660192, + 286.4217888888889 ] }, { @@ -1046,12 +976,12 @@ }, "type": "scatter", "x": [ - 195.55746536619588, - 297.185904897341 + 202.1086999553956, + 210.32406286111444 ], "y": [ - 140.79380380866132, - 160.8175023475399 + 170.22938315228262, + 90.32294319688093 ] }, { @@ -1060,12 +990,12 @@ }, "type": "scatter", "x": [ - 201.47297242891602, - 302.95691178447566 + 202.1086999553956, + 303.6519884726368 ], "y": [ - 220.99109372906116, - 241.03873274413039 + 170.22938315228262, + 150.19201153360024 ] }, { @@ -1074,12 +1004,12 @@ }, "type": "scatter", "x": [ - 312.3743978867819, - 513.2326145951381 + 210.32406286111444, + 290.3578801211995 ], "y": [ - 320.8343271275399, - 391.11312283653785 + 90.32294319688093, + 13.536156590859669 ] }, { @@ -1088,12 +1018,12 @@ }, "type": "scatter", "x": [ - 312.3743978867819, - 302.95691178447566 + 210.32406286111444, + 314.3516891384493 ], "y": [ - 320.8343271275399, - 241.03873274413039 + 90.32294319688093, + 70.49752593986051 ] }, { @@ -1102,12 +1032,12 @@ }, "type": "scatter", "x": [ - 513.2326145951381, - 687.996310038285 + 290.3578801211995, + 585.488150746979 ], "y": [ - 391.11312283653785, - 318.9977140895695 + 13.536156590859669, + 69.8698058062621 ] }, { @@ -1116,12 +1046,12 @@ }, "type": "scatter", "x": [ - 687.996310038285, - 697.185904897341 + 585.488150746979, + 689.5716246355365 ], "y": [ - 318.9977140895695, - 239.18249765246017 + 69.8698058062621, + 89.69221592849463 ] }, { @@ -1130,12 +1060,12 @@ }, "type": "scatter", "x": [ - 697.185904897341, - 702.9569117844757 + 697.8444700222236, + 703.6519884726372 ], "y": [ - 239.18249765246017, - 158.96126725586953 + 169.59289702610982, + 249.8079884664014 ] }, { @@ -1144,12 +1074,12 @@ }, "type": "scatter", "x": [ - 702.9569117844757, - 712.374397886782 + 697.8444700222236, + 689.5716246355365 ], "y": [ - 158.96126725586953, - 79.16567287246012 + 169.59289702610982, + 89.69221592849463 ] }, { @@ -1158,26 +1088,42 @@ }, "type": "scatter", "x": [ - 712.374397886782, + 703.6519884726372, + 714.3516891384601 + ], + "y": [ + 249.8079884664014, + 329.50247406018326 + ] + }, + { + "line": { + "color": "red" + }, + "mode": "lines", + "type": "scatter", + "x": [ + 714.3516891384601, 800 ], "y": [ - 79.16567287246012, - 44.02627501796111 + 329.50247406018326, + 358.2188229229752 ] }, { "line": { "color": "red" }, + "mode": "lines", "type": "scatter", "x": [ 0, - 113.232614595138 + 205.61181689034584 ], "y": [ - 44.02627501796111, - 8.8868771634621 + 358.2188229229752, + 386.9351717857672 ] }, { @@ -1186,12 +1132,12 @@ }, "type": "scatter", "x": [ - 113.232614595138, - 287.996310038285 + 205.61181689034584, + 289.5716246355356 ], "y": [ - 8.8868771634621, - 81.00228591043046 + 386.9351717857672, + 310.30778407151007 ] }, { @@ -1200,12 +1146,12 @@ }, "type": "scatter", "x": [ - 287.996310038285, - 297.185904897341 + 289.5716246355356, + 297.84447002222475 ], "y": [ - 81.00228591043046, - 160.8175023475399 + 310.30778407151007, + 230.40710297387727 ] }, { @@ -1214,12 +1160,68 @@ }, "type": "scatter", "x": [ - 297.185904897341, - 302.95691178447566 + 289.5716246355356, + 228.86876444444445 ], "y": [ - 160.8175023475399, - 241.03873274413039 + 310.30778407151007, + 286.4217888888889 + ] + }, + { + "line": { + "color": "red" + }, + "type": "scatter", + "x": [ + 297.84447002222475, + 303.6519884726368 + ], + "y": [ + 230.40710297387727, + 150.19201153360024 + ] + }, + { + "line": { + "color": "red" + }, + "type": "scatter", + "x": [ + 303.6519884726368, + 314.3516891384493 + ], + "y": [ + 150.19201153360024, + 70.49752593986051 + ] + }, + { + "line": { + "color": "red" + }, + "type": "scatter", + "x": [ + 314.3516891384493, + 605.6118168902582 + ], + "y": [ + 70.49752593986051, + 13.064828214222327 + ] + }, + { + "line": { + "color": "red" + }, + "type": "scatter", + "x": [ + 605.6118168902582, + 689.5716246355365 + ], + "y": [ + 13.064828214222327, + 89.69221592849463 ] } ], @@ -1233,9 +1235,9 @@ }, "showarrow": false, "text": "0", - "x": 4.605129960049352, - "y": 261.0594157652669, - "yshift": 0 + "x": 392.3850488069782, + "y": 109.5934026426842, + "yshift": -10 }, { "font": { @@ -1245,9 +1247,9 @@ }, "showarrow": false, "text": "1", - "x": 17.63568494387629, - "y": 340.598510946091, - "yshift": 0 + "x": 399.2787184097786, + "y": 189.64966255662648, + "yshift": -10 }, { "font": { @@ -1257,9 +1259,9 @@ }, "showarrow": false, "text": "2", - "x": 349.3079366826632, - "y": 377.4047411413715, - "yshift": 0 + "x": 405.40902333679077, + "y": 269.8130293465034, + "yshift": -10 }, { "font": { @@ -1269,9 +1271,9 @@ }, "showarrow": false, "text": "3", - "x": 391.26039250559455, - "y": 299.12755688921703, - "yshift": 0 + "x": 421.09672738315066, + "y": 349.20166199609815, + "yshift": -10 }, { "font": { @@ -1281,9 +1283,9 @@ }, "showarrow": false, "text": "4", - "x": 398.6594983067317, - "y": 219.13300017226126, - "yshift": 0 + "x": 763.618177933972, + "y": 369.20562420147974, + "yshift": -10 }, { "font": { @@ -1293,9 +1295,9 @@ }, "showarrow": false, "text": "5", - "x": 404.60512996004934, - "y": 138.94058423473305, - "yshift": 0 + "x": 792.3850488069785, + "y": 290.4065973573137, + "yshift": -10 }, { "font": { @@ -1305,9 +1307,9 @@ }, "showarrow": false, "text": "6", - "x": 417.6356849438763, - "y": 59.40148905390904, - "yshift": 0 + "x": 799.2787184097789, + "y": 210.35033744337005, + "yshift": -10 }, { "font": { @@ -1317,9 +1319,9 @@ }, "showarrow": false, "text": "7", - "x": 749.3079366826631, - "y": 22.59525885862846, - "yshift": 0 + "x": 5.409023336792479, + "y": 130.18697065347862, + "yshift": -10 }, { "font": { @@ -1329,9 +1331,9 @@ }, "showarrow": false, "text": "8", - "x": 791.2603925055945, - "y": 100.87244311078291, - "yshift": 0 + "x": 21.09672738314853, + "y": 50.79833800390623, + "yshift": -10 }, { "font": { @@ -1341,9 +1343,9 @@ }, "showarrow": false, "text": "9", - "x": 798.6594983067316, - "y": 180.8669998277387, - "yshift": 0 + "x": 363.61817793397387, + "y": 30.79437579852159, + "yshift": -10 }, { "font": { @@ -1353,9 +1355,9 @@ }, "showarrow": false, "text": "10", - "x": 106.54639516939577, - "y": 281.0410365077145, - "yshift": 0 + "x": 494.5301651801155, + "y": 129.55254591899504, + "yshift": -10 }, { "font": { @@ -1365,9 +1367,9 @@ }, "showarrow": false, "text": "11", - "x": 127.58723947772808, - "y": 360.16993053005757, - "yshift": 0 + "x": 500.6767182574812, + "y": 209.71342257537614, + "yshift": -10 }, { "font": { @@ -1377,9 +1379,9 @@ }, "showarrow": false, "text": "12", - "x": 473.70716922294304, - "y": 358.3710268282775, - "yshift": 0 + "x": 507.5386236768951, + "y": 289.7737789839157, + "yshift": -10 }, { "font": { @@ -1389,9 +1391,9 @@ }, "showarrow": false, "text": "13", - "x": 493.6505724228276, - "y": 279.19193440090095, - "yshift": 0 + "x": 535.6323111872836, + "y": 368.600420073175, + "yshift": -10 }, { "font": { @@ -1401,9 +1403,9 @@ }, "showarrow": false, "text": "14", - "x": 500.064622275535, - "y": 199.0706385346516, - "yshift": 0 + "x": 78.60917013481588, + "y": 349.82378317028116, + "yshift": -10 }, { "font": { @@ -1413,9 +1415,9 @@ }, "showarrow": false, "text": "15", - "x": 506.54639516939585, - "y": 118.95896349228548, - "yshift": 0 + "x": 94.53016518011692, + "y": 270.44745408098703, + "yshift": -10 }, { "font": { @@ -1425,9 +1427,9 @@ }, "showarrow": false, "text": "16", - "x": 527.5872394777281, - "y": 39.8300694699424, - "yshift": 0 + "x": 100.67671825748108, + "y": 190.28657742462153, + "yshift": -10 }, { "font": { @@ -1437,9 +1439,9 @@ }, "showarrow": false, "text": "17", - "x": 73.70716922294301, - "y": 41.62897317172252, - "yshift": 0 + "x": 107.53862367689622, + "y": 110.22622101607418, + "yshift": -10 }, { "font": { @@ -1449,9 +1451,9 @@ }, "showarrow": false, "text": "18", - "x": 93.65057242282761, - "y": 120.80806559909905, - "yshift": 0 + "x": 135.6323111872667, + "y": 31.39957992683839, + "yshift": -10 }, { "font": { @@ -1461,9 +1463,9 @@ }, "showarrow": false, "text": "19", - "x": 100.06462227553496, - "y": 200.92936146534842, - "yshift": 0 + "x": 478.6091701348222, + "y": 50.176216829730244, + "yshift": -10 }, { "font": { @@ -1473,9 +1475,9 @@ }, "showarrow": false, "text": "20", - "x": 208.996858178866, - "y": 300.9713359699023, - "yshift": 0 + "x": 596.2961653946198, + "y": 149.5563639734004, + "yshift": -10 }, { "font": { @@ -1485,9 +1487,9 @@ }, "showarrow": false, "text": "21", - "x": 255.12147023927855, - "y": 379.08699968317086, - "yshift": 0 + "x": 602.1086999553942, + "y": 229.77061684769882, + "yshift": -10 }, { "font": { @@ -1497,9 +1499,9 @@ }, "showarrow": false, "text": "22", - "x": 582.9799706197826, - "y": 338.77335362078117, - "yshift": 0 + "x": 610.324062861111, + "y": 309.6770568030986, + "yshift": -10 }, { "font": { @@ -1509,9 +1511,9 @@ }, "showarrow": false, "text": "23", - "x": 595.5574653661959, - "y": 259.2061961913386, - "yshift": 0 + "x": 690.3578801213123, + "y": 386.4638434091541, + "yshift": -10 }, { "font": { @@ -1521,9 +1523,9 @@ }, "showarrow": false, "text": "24", - "x": 601.472972428916, - "y": 179.00890627093878, - "yshift": 0 + "x": 185.48815074698823, + "y": 330.1301941937019, + "yshift": -10 }, { "font": { @@ -1533,9 +1535,9 @@ }, "showarrow": false, "text": "25", - "x": 608.996858178866, - "y": 99.02866403009763, - "yshift": 0 + "x": 196.29616539461975, + "y": 250.44363602660192, + "yshift": -10 }, { "font": { @@ -1545,9 +1547,9 @@ }, "showarrow": false, "text": "26", - "x": 655.1214702392784, - "y": 20.913000316829166, - "yshift": 0 + "x": 202.1086999553956, + "y": 170.22938315228262, + "yshift": -10 }, { "font": { @@ -1557,9 +1559,9 @@ }, "showarrow": false, "text": "27", - "x": 182.97997061978265, - "y": 61.22664637921883, - "yshift": 0 + "x": 210.32406286111444, + "y": 90.32294319688093, + "yshift": -10 }, { "font": { @@ -1569,9 +1571,9 @@ }, "showarrow": false, "text": "28", - "x": 195.55746536619588, - "y": 140.79380380866132, - "yshift": 0 + "x": 290.3578801211995, + "y": 13.536156590859669, + "yshift": -10 }, { "font": { @@ -1581,9 +1583,9 @@ }, "showarrow": false, "text": "29", - "x": 201.47297242891602, - "y": 220.99109372906116, - "yshift": 0 + "x": 585.488150746979, + "y": 69.8698058062621, + "yshift": -10 }, { "font": { @@ -1593,9 +1595,9 @@ }, "showarrow": false, "text": "30", - "x": 312.3743978867819, - "y": 320.8343271275399, - "yshift": 0 + "x": 697.8444700222236, + "y": 169.59289702610982, + "yshift": -10 }, { "font": { @@ -1605,9 +1607,9 @@ }, "showarrow": false, "text": "31", - "x": 513.2326145951381, - "y": 391.11312283653785, - "yshift": 0 + "x": 703.6519884726372, + "y": 249.8079884664014, + "yshift": -10 }, { "font": { @@ -1617,9 +1619,9 @@ }, "showarrow": false, "text": "32", - "x": 687.996310038285, - "y": 318.9977140895695, - "yshift": 0 + "x": 714.3516891384601, + "y": 329.50247406018326, + "yshift": -10 }, { "font": { @@ -1629,9 +1631,9 @@ }, "showarrow": false, "text": "33", - "x": 697.185904897341, - "y": 239.18249765246017, - "yshift": 0 + "x": 205.61181689034584, + "y": 386.9351717857672, + "yshift": -10 }, { "font": { @@ -1641,9 +1643,9 @@ }, "showarrow": false, "text": "34", - "x": 702.9569117844757, - "y": 158.96126725586953, - "yshift": 0 + "x": 289.5716246355356, + "y": 310.30778407151007, + "yshift": -10 }, { "font": { @@ -1653,9 +1655,9 @@ }, "showarrow": false, "text": "35", - "x": 712.374397886782, - "y": 79.16567287246012, - "yshift": 0 + "x": 297.84447002222475, + "y": 230.40710297387727, + "yshift": -10 }, { "font": { @@ -1665,9 +1667,9 @@ }, "showarrow": false, "text": "36", - "x": 113.232614595138, - "y": 8.8868771634621, - "yshift": 0 + "x": 303.6519884726368, + "y": 150.19201153360024, + "yshift": -10 }, { "font": { @@ -1677,9 +1679,9 @@ }, "showarrow": false, "text": "37", - "x": 287.996310038285, - "y": 81.00228591043046, - "yshift": 0 + "x": 314.3516891384493, + "y": 70.49752593986051, + "yshift": -10 }, { "font": { @@ -1689,9 +1691,9 @@ }, "showarrow": false, "text": "38", - "x": 297.185904897341, - "y": 160.8175023475399, - "yshift": 0 + "x": 605.6118168902582, + "y": 13.064828214222327, + "yshift": -10 }, { "font": { @@ -1701,9 +1703,33 @@ }, "showarrow": false, "text": "39", - "x": 302.95691178447566, - "y": 241.03873274413039, - "yshift": 0 + "x": 689.5716246355365, + "y": 89.69221592849463, + "yshift": -10 + }, + { + "font": { + "color": "white", + "family": "sans serif", + "size": 18 + }, + "showarrow": false, + "text": "40", + "x": 415.5555555555556, + "y": 309.4066666666667, + "yshift": -10 + }, + { + "font": { + "color": "white", + "family": "sans serif", + "size": 18 + }, + "showarrow": false, + "text": "41", + "x": 228.86876444444445, + "y": 286.4217888888889, + "yshift": -10 } ], "dragmode": false, @@ -1714,360 +1740,378 @@ "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.00575641245006169, + "x": 0.4904813110087228, "xanchor": "center", - "y": 0.6526485394131674, + "y": 0.2739835066067105, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.02204460617984536, + "x": 0.4990983980122233, "xanchor": "center", - "y": 0.8514962773652275, + "y": 0.4741241563915662, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.43663492085332894, + "x": 0.5067612791709885, "xanchor": "center", - "y": 0.9435118528534288, + "y": 0.6745325733662585, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.4890754906319932, + "x": 0.5263709092289384, "xanchor": "center", - "y": 0.7478188922230425, + "y": 0.8730041549902454, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.4983243728834146, + "x": 0.9545227224174649, "xanchor": "center", - "y": 0.5478325004306531, + "y": 0.9230140605036994, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.5057564124500616, + "x": 0.990481311008723, "xanchor": "center", - "y": 0.34735146058683264, + "y": 0.7260164933932842, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.5220446061798454, + "x": 0.9990983980122236, "xanchor": "center", - "y": 0.1485037226347726, + "y": 0.5258758436084251, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.9366349208533289, + "x": 0.006761279170990599, "xanchor": "center", - "y": 0.05648814714657115, + "y": 0.32546742663369654, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.9890754906319932, + "x": 0.026370909228935663, "xanchor": "center", - "y": 0.2521811077769573, + "y": 0.12699584500976557, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.9983243728834146, + "x": 0.45452272241746733, "xanchor": "center", - "y": 0.45216749956934676, + "y": 0.07698593949630397, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.1331829939617447, + "x": 0.6181627064751444, "xanchor": "center", - "y": 0.7026025912692864, + "y": 0.3238813647974876, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.1594840493471601, + "x": 0.6258458978218515, "xanchor": "center", - "y": 0.9004248263251439, + "y": 0.5242835564384404, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.5921339615286788, + "x": 0.6344232795961189, "xanchor": "center", - "y": 0.8959275670706937, + "y": 0.7244344474597892, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.6170632155285345, + "x": 0.6695403889841044, "xanchor": "center", - "y": 0.6979798360022523, + "y": 0.9215010501829375, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.6250807778444187, + "x": 0.09826146266851986, "xanchor": "center", - "y": 0.49767659633662903, + "y": 0.8745594579257029, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.6331829939617448, + "x": 0.11816270647514615, "xanchor": "center", - "y": 0.2973974087307137, + "y": 0.6761186352024675, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.6594840493471601, + "x": 0.12584589782185135, "xanchor": "center", - "y": 0.09957517367485601, + "y": 0.47571644356155385, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.09213396152867877, + "x": 0.13442327959612027, "xanchor": "center", - "y": 0.1040724329293063, + "y": 0.27556555254018544, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.1170632155285345, + "x": 0.16954038898408338, "xanchor": "center", - "y": 0.3020201639977476, + "y": 0.07849894981709597, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.1250807778444187, + "x": 0.5982614626685278, "xanchor": "center", - "y": 0.502323403663371, + "y": 0.12544054207432562, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.2612460727235825, + "x": 0.7453702067432748, "xanchor": "center", - "y": 0.7524283399247559, + "y": 0.373890909933501, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.3189018377990982, + "x": 0.7526358749442428, "xanchor": "center", - "y": 0.9477174992079271, + "y": 0.574426542119247, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.7287249632747284, + "x": 0.7629050785763888, "xanchor": "center", - "y": 0.846933384051953, + "y": 0.7741926420077465, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.7444468317077448, + "x": 0.8629473501516404, "xanchor": "center", - "y": 0.6480154904783465, + "y": 0.9661596085228853, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.751841215536145, + "x": 0.2318601884337353, "xanchor": "center", - "y": 0.447522265677347, + "y": 0.8253254854842548, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.7612460727235825, + "x": 0.24537020674327467, "xanchor": "center", - "y": 0.24757166007524406, + "y": 0.6261090900665048, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.8189018377990981, + "x": 0.2526358749442445, "xanchor": "center", - "y": 0.05228250079207292, + "y": 0.42557345788070655, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.2287249632747283, + "x": 0.26290507857639306, "xanchor": "center", - "y": 0.15306661594804707, + "y": 0.22580735799220233, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.24444683170774487, + "x": 0.36294735015149937, "xanchor": "center", - "y": 0.3519845095216533, + "y": 0.03384039147714917, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.251841215536145, + "x": 0.7318601884337238, "xanchor": "center", - "y": 0.5524777343226529, + "y": 0.17467451451565524, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.39046799735847737, + "x": 0.8723055875277795, "xanchor": "center", - "y": 0.8020858178188497, + "y": 0.42398224256527456, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.6415407682439226, + "x": 0.8795649855907964, "xanchor": "center", - "y": 0.9777828070913447, + "y": 0.6245199711660036, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.8599953875478562, + "x": 0.8929396114230751, "xanchor": "center", - "y": 0.7974942852239237, + "y": 0.8237561851504581, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.8714823811216762, + "x": 0.2570147711129323, "xanchor": "center", - "y": 0.5979562441311504, + "y": 0.967337929464418, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.8786961397305946, + "x": 0.3619645307944195, "xanchor": "center", - "y": 0.3974031681396738, + "y": 0.7757694601787752, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.8904679973584776, + "x": 0.372305587527781, "xanchor": "center", - "y": 0.1979141821811503, + "y": 0.5760177574346932, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.1415407682439225, + "x": 0.379564985590796, "xanchor": "center", - "y": 0.022217192908655252, + "y": 0.37548002883400056, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.35999538754785626, + "x": 0.3929396114230616, "xanchor": "center", - "y": 0.20250571477607615, + "y": 0.17624381484965126, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.37148238112167625, + "x": 0.7570147711128227, "xanchor": "center", - "y": 0.4020437558688497, + "y": 0.032662070535555816, "yanchor": "middle" }, { "sizex": 0.04, "sizey": 0.04, "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAASCAMAAAAewWyUAAADAFBMVEULC64MDK4ZG6MfHJ8gHJ8hHJ8gHZ8hHZ8iHZ5NU1ZPVFdPVVlMV1tNV1tQVllOV1pRVlpRV1pQWFxTV1tNWl9SWV1TWVxRWl1UWlxTWl9TW15UW15RXGFUW19WXF5LYGhVXWFXXWBWXmJWX2RaaD1cYWNaYmVdYWZaY2c+eE9fY2dcZmthZmhhZmlXcUteaG1faW1faW9gaW1haW5jaW1iam5lamtlam5obXFnb3JqbnFmcHNpb3JOjSlscXNscXRrcXdle1RrcnZtcndqdHl0ekJWil5ueX1zd3xyeH1SjWV0eHp1eXt3en14fH1pkTh6foB2gYV7h1t4gYV7gIZ8gYR9gYKAg4aAhIWBhIZ2kGh/iIyFh4iDiY+Dio6Eio+HiouGi4yGjZKHjpKLjY+IjpSMjo91riuNkJGQkpONk5uRk5SOlJeSlZaUlpeUl5mTmKCZnJ2anJ2bnZ6dnp+foKGhoqOeo6qbpK6gpKeipKWkpqamp6ijqK+hq7akrLerrK2prrOprrSnr7qnsLyvsLCxsbKys7Ottb6stsG0tbW2t7ewucW7vLy9vb25w8+8xtO+yNX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98Uj6bAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAATFJREFUeJxj+I8Jumsa+jAEGTDV2XAqinFpFRJWyNnS0VgZytdOWGFPc5ZHk0UxkQodcolU6JkA5fa194IVdldVleZlpqSkhIf5+XnbWUV0c/aDFDpzSkkLc4KBLkglQx6nqIKGtr6BkYt7YHB0Tj5nGudEkMICLxYoYLPUAapk6JNkRAEMrpwTgAprY1VtWZjBAKjWrA/oxjwmdjCAqUz3rwMqLI9TdwOqAKljAyo17wN6RpYVopKDgwOsPqoTpDA+5b8TD8RuGSFOzgygwiBNdiTAyOhoCFKYFPm/11TZ2No3JqWkurUbFDx9nCp68iK8QO/xiyupmdhz1oMUpvphhmORbmJmWXVbN3I4YlWILcDLk4lQWAFUGMKdTVBhAKeEnICgTy9Bhf+7qqpqetEFAY1syYLCyyh/AAAAAElFTkSuQmCC", - "x": 0.37869613973059457, + "x": 0.8619645307944206, + "xanchor": "center", + "y": 0.22423053982123659, + "yanchor": "middle" + }, + { + "sizex": 0.04, + "sizey": 0.04, + "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAhCAYAAAAlK6DZAAAHmklEQVR4nKWXe2wUxx3HvzN7u3c++2zfy+9nbJ42mJpAwYEQ1NBCwSmgXNJSURCq2qQSCRJNaaoocgVKREVDUhW1JVKiINpUoglKIQgExkACxPiBH3GLAd8Z1z4f97Dv/drdmf5hfNhgg4R/0ki7O7/Zz8zv953fzhLM0I4e/ayo+0bXZzd6e5dqNCJEjYCqBdXBxlMnzRcuXFCmGkNmAty1e89+p8v1hiRJZEVdHYxGI+SkjNbrbaCU9rc3X5k1FVjzpMDXd++5PDA0WLd2zfdRs3ABwAHGGFSmomZBNf7y4eEygyX3PQCvPTiWPgnwjd++dc05PFy3/adb8XRtLQQqTOglkBUZr+/cCQLySr3NtmLG0D2/e/vz/oGBJVu3bEFJafFEVsoURYXFbEZ5WXmCMPLBjKC/37d/622HY5Nt8yaUl5VO60cFAZxzrFi+PINSOq9+88vLJvZrGhoOWNq6r3kkUUJBYcGohtJeQumh9/a/c3Si44EDfy7t6On8ZNWKFaiaXwXG1GmhkiRBURRQSmEymRWPx7MdwDfj/QQAXtv9G+7o70eOxYp4Is5D4QiRJBGZBgPT6/UhQul/IuHowszMjPRf7NgBPkE0TGUPXVusFuj1ejQ3t6B/4A4uff21+9//+mfupPD+6Y9/IIUFhYgn4qhZuIhUFJdVzK6Y9dfsLOOQqrL00dHR5R6vO72i4il8efoMLl/9BncGB8FUhvuzv5/UjIwMhEMhMM6Qm5MDAMZJ4R2/yDJnlUaikTt3Bvoxq3J2XywUrXhn79uvNjU1aQKhWMBkMupdLjd8Iz74RkYx5HQiIctI1+tRmJ+P6vnzAACCQKCVJAwODYNzDq1WC86ZaLPZMo4dOxaeBN3f0DDw6zff2mF3OD4yZRuRl5fXt3fvwe8NDnrW5+bn6QoL8pGXmwfG1LFwqgzhSAS+ER9isXgqWZlZ2VAUBV6fF4TcX70sCxYA4VR4U2J5d9/HVnPO6a6eHgQCAVhysxqTLLGrpLiAAuSh+qVPS0NBfj7KS+8rOTsrGz7fCDjnqQYAfr9rcFJOJ9rfDh1cZzKZB9quX+fhSBSKzGhnZ/cEj+krp1ang1Yr4pbdngLG43EIlMoTy+GU+7Q031Kh0+nktvY2RGIxBMNBNF28NC1s3MwmEwKhEELBIDjj4IzD5/MBlMQm+k0JbWhoUMwW8wlFVZFjtSASScDt9uL4Fyce8h1XrUYjIF2vx+1bfWCMgXEGzjlcbjcI4HwsFAAi4fCGlXV16L15C/PmzkZhQT7isTjONjaNwSZGmQBGkxHhUBhDTmcqtIwzOIeHFEVRDz8W+v6hw0u8Pp921bMrse4Ha3Dp8mXMmTMLq1etxKh/FC3t18cEMg7mQCyWQGt7+yQB+QMBBIMhQUf5h4+FOp2DO43GbFjMZhQVFGD5d5fiTON55ORYUb9+He66PTh/8Ssoypg2REmE2+2BPxCYBHU4HBAEwT6+Px8JTSbltU+Vlqfuq+fPw8KqajDOkZaWhnVrngelFGcaz4MxDkII7A77JCDnHHaHnTNVbXjw/VNCR0Z85lmVFZOeLayugqgZqyWCIGD1sytRu6gGujQdbvbegizLqTxyzuEPBlUAhBMsfiz0+PGm7EAwSCsrK6eaz6RdWpifD5frLtw+z5hi2RhQVpLo7vmWlRSVJCihP38s1P6/G+WMMZhNpkll7EG1yooCWVbQe7N3bE/eC2kikURHR2fMkGHA3LlztIQQXf2LL697JHTcgqHgFGsbs0QiAUGgaG1tg6qqKaBzeBhnG89h6ZJlWo0gcEnSoqiwUEMJefOR0NoFc/+7aEENjhz9+5STiUZjEEURLa1tiMVjKeDtvj7W0dUJQRC4yhRqzDYJnDGUlZSBM/7Mxo0bs6eFrl69Or64tvaa2+tFc0tL6rmsKIjH46ACxdUrzQgGg+CcIxwO4asrl2O37X0UAH71y1eJy3VX0adrBcY5MjMzIWklVRHEbePvmvIIKgq6Hy1d/LTz4yNHSMAfgMlsRm5uDpiioqWtFSN+P7w+X9TtdscSiYSB3/uUbPvZNoiSBIATnagDZwwcQElRsWh3OPYA+GDqhN2zkydPP3/q3NnPo+GINhwJC4lkcuI5MwkCBzj5BwjaCccXz61aRWtqFsHjdaO7q1vOy80TKaWglCIRT6Dx4nlAEqwnPv3UO+1he8OGtecAZI7fP7d9uy7bH89Limr81LFjLgD4oc2WJ4LeKioqRtX8KnDG0NnZJWslSeCcgXOAc0CXpkN6eoYSiUb2AXhlRr8VG1/6SZder5+/5cdbBFHUgBCCEye/TJaXlEiCIGB8pZRSOF1OdH3b4w94hq1PdMIHgPoXXzrIOarq168XBErAGUc0HIEiJ5McY5WJcZ5qubn54JxnGqzWZ54I+sJm2wvg2FX7nUXUYDCAcQ7OGa42X41brVY95/zeR5ylGgVgMhohEM27T/QDxQQhgzCG1rY2fr2jgxsys9jsygrN4NAwLy4soK5oFKqqICnLUBR1rHolk8lgOKRhqrp8Rjm12WwZSUaWMUI2iRphjaKopQASBCQGwqPg8DPABw4vIdzLAA8Y7/k/rxDcqBSVIq0AAAAASUVORK5CYII=", + "x": 0.5194444444444445, "xanchor": "center", - "y": 0.602596831860326, + "y": 0.7735166666666667, + "yanchor": "middle" + }, + { + "sizex": 0.04, + "sizey": 0.04, + "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAhCAYAAAAlK6DZAAAHmklEQVR4nKWXe2wUxx3HvzN7u3c++2zfy+9nbJ42mJpAwYEQ1NBCwSmgXNJSURCq2qQSCRJNaaoocgVKREVDUhW1JVKiINpUoglKIQgExkACxPiBH3GLAd8Z1z4f97Dv/drdmf5hfNhgg4R/0ki7O7/Zz8zv953fzhLM0I4e/ayo+0bXZzd6e5dqNCJEjYCqBdXBxlMnzRcuXFCmGkNmAty1e89+p8v1hiRJZEVdHYxGI+SkjNbrbaCU9rc3X5k1FVjzpMDXd++5PDA0WLd2zfdRs3ABwAHGGFSmomZBNf7y4eEygyX3PQCvPTiWPgnwjd++dc05PFy3/adb8XRtLQQqTOglkBUZr+/cCQLySr3NtmLG0D2/e/vz/oGBJVu3bEFJafFEVsoURYXFbEZ5WXmCMPLBjKC/37d/622HY5Nt8yaUl5VO60cFAZxzrFi+PINSOq9+88vLJvZrGhoOWNq6r3kkUUJBYcGohtJeQumh9/a/c3Si44EDfy7t6On8ZNWKFaiaXwXG1GmhkiRBURRQSmEymRWPx7MdwDfj/QQAXtv9G+7o70eOxYp4Is5D4QiRJBGZBgPT6/UhQul/IuHowszMjPRf7NgBPkE0TGUPXVusFuj1ejQ3t6B/4A4uff21+9//+mfupPD+6Y9/IIUFhYgn4qhZuIhUFJdVzK6Y9dfsLOOQqrL00dHR5R6vO72i4il8efoMLl/9BncGB8FUhvuzv5/UjIwMhEMhMM6Qm5MDAMZJ4R2/yDJnlUaikTt3Bvoxq3J2XywUrXhn79uvNjU1aQKhWMBkMupdLjd8Iz74RkYx5HQiIctI1+tRmJ+P6vnzAACCQKCVJAwODYNzDq1WC86ZaLPZMo4dOxaeBN3f0DDw6zff2mF3OD4yZRuRl5fXt3fvwe8NDnrW5+bn6QoL8pGXmwfG1LFwqgzhSAS+ER9isXgqWZlZ2VAUBV6fF4TcX70sCxYA4VR4U2J5d9/HVnPO6a6eHgQCAVhysxqTLLGrpLiAAuSh+qVPS0NBfj7KS+8rOTsrGz7fCDjnqQYAfr9rcFJOJ9rfDh1cZzKZB9quX+fhSBSKzGhnZ/cEj+krp1ang1Yr4pbdngLG43EIlMoTy+GU+7Q031Kh0+nktvY2RGIxBMNBNF28NC1s3MwmEwKhEELBIDjj4IzD5/MBlMQm+k0JbWhoUMwW8wlFVZFjtSASScDt9uL4Fyce8h1XrUYjIF2vx+1bfWCMgXEGzjlcbjcI4HwsFAAi4fCGlXV16L15C/PmzkZhQT7isTjONjaNwSZGmQBGkxHhUBhDTmcqtIwzOIeHFEVRDz8W+v6hw0u8Pp921bMrse4Ha3Dp8mXMmTMLq1etxKh/FC3t18cEMg7mQCyWQGt7+yQB+QMBBIMhQUf5h4+FOp2DO43GbFjMZhQVFGD5d5fiTON55ORYUb9+He66PTh/8Ssoypg2REmE2+2BPxCYBHU4HBAEwT6+Px8JTSbltU+Vlqfuq+fPw8KqajDOkZaWhnVrngelFGcaz4MxDkII7A77JCDnHHaHnTNVbXjw/VNCR0Z85lmVFZOeLayugqgZqyWCIGD1sytRu6gGujQdbvbegizLqTxyzuEPBlUAhBMsfiz0+PGm7EAwSCsrK6eaz6RdWpifD5frLtw+z5hi2RhQVpLo7vmWlRSVJCihP38s1P6/G+WMMZhNpkll7EG1yooCWVbQe7N3bE/eC2kikURHR2fMkGHA3LlztIQQXf2LL697JHTcgqHgFGsbs0QiAUGgaG1tg6qqKaBzeBhnG89h6ZJlWo0gcEnSoqiwUEMJefOR0NoFc/+7aEENjhz9+5STiUZjEEURLa1tiMVjKeDtvj7W0dUJQRC4yhRqzDYJnDGUlZSBM/7Mxo0bs6eFrl69Or64tvaa2+tFc0tL6rmsKIjH46ACxdUrzQgGg+CcIxwO4asrl2O37X0UAH71y1eJy3VX0adrBcY5MjMzIWklVRHEbePvmvIIKgq6Hy1d/LTz4yNHSMAfgMlsRm5uDpiioqWtFSN+P7w+X9TtdscSiYSB3/uUbPvZNoiSBIATnagDZwwcQElRsWh3OPYA+GDqhN2zkydPP3/q3NnPo+GINhwJC4lkcuI5MwkCBzj5BwjaCccXz61aRWtqFsHjdaO7q1vOy80TKaWglCIRT6Dx4nlAEqwnPv3UO+1he8OGtecAZI7fP7d9uy7bH89Limr81LFjLgD4oc2WJ4LeKioqRtX8KnDG0NnZJWslSeCcgXOAc0CXpkN6eoYSiUb2AXhlRr8VG1/6SZder5+/5cdbBFHUgBCCEye/TJaXlEiCIGB8pZRSOF1OdH3b4w94hq1PdMIHgPoXXzrIOarq168XBErAGUc0HIEiJ5McY5WJcZ5qubn54JxnGqzWZ54I+sJm2wvg2FX7nUXUYDCAcQ7OGa42X41brVY95/zeR5ylGgVgMhohEM27T/QDxQQhgzCG1rY2fr2jgxsys9jsygrN4NAwLy4soK5oFKqqICnLUBR1rHolk8lgOKRhqrp8Rjm12WwZSUaWMUI2iRphjaKopQASBCQGwqPg8DPABw4vIdzLAA8Y7/k/rxDcqBSVIq0AAAAASUVORK5CYII=", + "x": 0.28608595555555555, + "xanchor": "center", + "y": 0.7160544722222222, "yanchor": "middle" }, { @@ -2969,7 +3013,7 @@ " y=y_canvas,\n", " text=sat,\n", " showarrow=False,\n", - " yshift=0,\n", + " yshift=-10,\n", " font=dict(family=\"sans serif\", size=18, color=\"white\"),\n", " )\n", "\n", @@ -3004,13 +3048,26 @@ " cut_point = min(left_y, right_y) + (cut_point / 2)\n", " # print(f\"{src}({src_y_canvas}) -> {dst}({dst_y_canvas}) (CP: {cut_point})\")\n", " fig.add_trace(\n", - " go.Scatter(x=[right_x, img_width], y=[right_y, cut_point], line_color=\"red\")\n", + " go.Scatter(\n", + " x=[right_x, img_width],\n", + " y=[right_y, cut_point],\n", + " line_color=\"red\",\n", + " mode=\"lines\",\n", + " )\n", " )\n", " fig.add_trace(\n", - " go.Scatter(x=[0, left_x], y=[cut_point, left_y], line_color=\"red\")\n", + " go.Scatter(\n", + " x=[0, left_x], y=[cut_point, left_y], line_color=\"red\", mode=\"lines\"\n", + " )\n", " )\n", " else:\n", - " fig.add_trace(go.Scatter(x=[src_x_canvas, dst_x_canvas], y=[src_y_canvas, dst_y_canvas], line_color=\"red\"))\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=[src_x_canvas, dst_x_canvas],\n", + " y=[src_y_canvas, dst_y_canvas],\n", + " line_color=\"red\",\n", + " )\n", + " )\n", "\n", " # print(f\"({src}-{dst}) = Simple: {simple_distance}; Modulo: {modulo_distance}\")\n", "\n", @@ -3057,7 +3114,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -3067,7 +3124,7 @@ "# for plane in range(planes)\n", "# ]\n", "\n", - "# cstl = constellation_networkx.propagate(cstl, 1000)\n", + "# cstl = cstl_ntwkx.propagate(cstl, 1000)\n", "\n", "\n", "# print(G)\n", @@ -3161,7 +3218,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.2" + "version": "3.10.12" } }, "nbformat": 4,