@windborne/grapher 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/dist/744.bundle.cjs +1 -2
  2. package/dist/744.bundle.esm.js +1 -2
  3. package/dist/bundle.cjs +1 -1
  4. package/dist/bundle.cjs.map +1 -1
  5. package/dist/bundle.esm.js +1 -1
  6. package/dist/bundle.esm.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/index.d.ts +19 -1
  9. package/src/index.js +3 -1
  10. package/src/index.mjs +3 -2
  11. package/src/rust/Cargo.lock +1 -1
  12. package/src/rust/pkg/index.js +0 -397
  13. package/src/rust/pkg/index_bg.wasm +0 -0
  14. package/src/state/state_controller.js +1 -1
  15. package/dist/744.bundle.cjs.map +0 -1
  16. package/dist/744.bundle.esm.js.map +0 -1
  17. package/dist/c83ea4ee006f636782a7.wasm +0 -0
  18. package/src/rust/target/.rustc_info.json +0 -1
  19. package/src/rust/target/CACHEDIR.TAG +0 -3
  20. package/src/rust/target/release/.cargo-lock +0 -0
  21. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/dep-lib-bumpalo +0 -0
  22. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/invoked.timestamp +0 -1
  23. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/lib-bumpalo +0 -1
  24. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/lib-bumpalo.json +0 -1
  25. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/dep-lib-cfg_if +0 -0
  26. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/invoked.timestamp +0 -1
  27. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/lib-cfg_if +0 -1
  28. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/lib-cfg_if.json +0 -1
  29. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/build-script-build-script-build +0 -1
  30. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/build-script-build-script-build.json +0 -1
  31. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/dep-build-script-build-script-build +0 -0
  32. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/invoked.timestamp +0 -1
  33. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/dep-lib-log +0 -0
  34. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/invoked.timestamp +0 -1
  35. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/lib-log +0 -1
  36. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/lib-log.json +0 -1
  37. package/src/rust/target/release/.fingerprint/log-e84eaabb9bd44eb4/run-build-script-build-script-build +0 -1
  38. package/src/rust/target/release/.fingerprint/log-e84eaabb9bd44eb4/run-build-script-build-script-build.json +0 -1
  39. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/build-script-build-script-build +0 -1
  40. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/build-script-build-script-build.json +0 -1
  41. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/dep-build-script-build-script-build +0 -0
  42. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/invoked.timestamp +0 -1
  43. package/src/rust/target/release/.fingerprint/proc-macro2-5841341c69f10991/run-build-script-build-script-build +0 -1
  44. package/src/rust/target/release/.fingerprint/proc-macro2-5841341c69f10991/run-build-script-build-script-build.json +0 -1
  45. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/dep-lib-proc_macro2 +0 -0
  46. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/invoked.timestamp +0 -1
  47. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/lib-proc_macro2 +0 -1
  48. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/lib-proc_macro2.json +0 -1
  49. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/dep-lib-quote +0 -0
  50. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/invoked.timestamp +0 -1
  51. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/lib-quote +0 -1
  52. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/lib-quote.json +0 -1
  53. package/src/rust/target/release/.fingerprint/rustversion-33c78623764430e6/run-build-script-build-script-build +0 -1
  54. package/src/rust/target/release/.fingerprint/rustversion-33c78623764430e6/run-build-script-build-script-build.json +0 -1
  55. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/build-script-build-script-build +0 -1
  56. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/build-script-build-script-build.json +0 -1
  57. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/dep-build-script-build-script-build +0 -0
  58. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/invoked.timestamp +0 -1
  59. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/dep-lib-rustversion +0 -0
  60. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/invoked.timestamp +0 -1
  61. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/lib-rustversion +0 -1
  62. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/lib-rustversion.json +0 -1
  63. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/dep-lib-syn +0 -0
  64. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/invoked.timestamp +0 -1
  65. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/lib-syn +0 -1
  66. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/lib-syn.json +0 -1
  67. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/dep-lib-unicode_ident +0 -0
  68. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/invoked.timestamp +0 -1
  69. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/lib-unicode_ident +0 -1
  70. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/lib-unicode_ident.json +0 -1
  71. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/build-script-build-script-build +0 -1
  72. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/build-script-build-script-build.json +0 -1
  73. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/dep-build-script-build-script-build +0 -0
  74. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/invoked.timestamp +0 -1
  75. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/dep-lib-wasm_bindgen_backend +0 -0
  76. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/invoked.timestamp +0 -1
  77. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/lib-wasm_bindgen_backend +0 -1
  78. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/lib-wasm_bindgen_backend.json +0 -1
  79. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/dep-lib-wasm_bindgen_macro +0 -0
  80. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/invoked.timestamp +0 -1
  81. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/lib-wasm_bindgen_macro +0 -1
  82. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/lib-wasm_bindgen_macro.json +0 -1
  83. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/dep-lib-wasm_bindgen_macro_support +0 -0
  84. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/invoked.timestamp +0 -1
  85. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/lib-wasm_bindgen_macro_support +0 -1
  86. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/lib-wasm_bindgen_macro_support.json +0 -1
  87. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-51aa8d774f2c628e/run-build-script-build-script-build +0 -1
  88. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-51aa8d774f2c628e/run-build-script-build-script-build.json +0 -1
  89. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/dep-lib-wasm_bindgen_shared +0 -0
  90. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/invoked.timestamp +0 -1
  91. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/lib-wasm_bindgen_shared +0 -1
  92. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/lib-wasm_bindgen_shared.json +0 -1
  93. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build-script-build +0 -1
  94. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build-script-build.json +0 -1
  95. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/dep-build-script-build-script-build +0 -0
  96. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/invoked.timestamp +0 -1
  97. package/src/rust/target/release/build/log-27022fbed75e0765/build-script-build +0 -0
  98. package/src/rust/target/release/build/log-27022fbed75e0765/build_script_build-27022fbed75e0765 +0 -0
  99. package/src/rust/target/release/build/log-27022fbed75e0765/build_script_build-27022fbed75e0765.d +0 -5
  100. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/invoked.timestamp +0 -1
  101. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/output +0 -2
  102. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/root-output +0 -1
  103. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/stderr +0 -0
  104. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build-script-build +0 -0
  105. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build_script_build-4bfff30b5fc4cb97 +0 -0
  106. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build_script_build-4bfff30b5fc4cb97.d +0 -5
  107. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/invoked.timestamp +0 -1
  108. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/output +0 -16
  109. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/root-output +0 -1
  110. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/stderr +0 -0
  111. package/src/rust/target/release/build/rustversion-33c78623764430e6/invoked.timestamp +0 -1
  112. package/src/rust/target/release/build/rustversion-33c78623764430e6/out/version.expr +0 -5
  113. package/src/rust/target/release/build/rustversion-33c78623764430e6/output +0 -3
  114. package/src/rust/target/release/build/rustversion-33c78623764430e6/root-output +0 -1
  115. package/src/rust/target/release/build/rustversion-33c78623764430e6/stderr +0 -0
  116. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build-script-build +0 -0
  117. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build_script_build-c398d71ca0669ffc +0 -0
  118. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build_script_build-c398d71ca0669ffc.d +0 -6
  119. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build-script-build +0 -0
  120. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build_script_build-8074d255d7357147 +0 -0
  121. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build_script_build-8074d255d7357147.d +0 -5
  122. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/invoked.timestamp +0 -1
  123. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/output +0 -1
  124. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/root-output +0 -1
  125. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/stderr +0 -0
  126. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build +0 -0
  127. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build_script_build-f5ddbf25cd087b9d +0 -0
  128. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build_script_build-f5ddbf25cd087b9d.d +0 -5
  129. package/src/rust/target/release/deps/bumpalo-952aca385c0ec8c7.d +0 -8
  130. package/src/rust/target/release/deps/cfg_if-26f63e0967bee367.d +0 -7
  131. package/src/rust/target/release/deps/libbumpalo-952aca385c0ec8c7.rlib +0 -0
  132. package/src/rust/target/release/deps/libbumpalo-952aca385c0ec8c7.rmeta +0 -0
  133. package/src/rust/target/release/deps/libcfg_if-26f63e0967bee367.rlib +0 -0
  134. package/src/rust/target/release/deps/libcfg_if-26f63e0967bee367.rmeta +0 -0
  135. package/src/rust/target/release/deps/liblog-77a2b15818511956.rlib +0 -0
  136. package/src/rust/target/release/deps/liblog-77a2b15818511956.rmeta +0 -0
  137. package/src/rust/target/release/deps/libproc_macro2-78d2de1a55ac02b2.rlib +0 -0
  138. package/src/rust/target/release/deps/libproc_macro2-78d2de1a55ac02b2.rmeta +0 -0
  139. package/src/rust/target/release/deps/libquote-536d2fed8f9d8732.rlib +0 -0
  140. package/src/rust/target/release/deps/libquote-536d2fed8f9d8732.rmeta +0 -0
  141. package/src/rust/target/release/deps/librustversion-db265df7d80a8662.dylib +0 -0
  142. package/src/rust/target/release/deps/libsyn-4d3d7efa31c6c7f3.rlib +0 -0
  143. package/src/rust/target/release/deps/libsyn-4d3d7efa31c6c7f3.rmeta +0 -0
  144. package/src/rust/target/release/deps/libunicode_ident-717c57863b369186.rlib +0 -0
  145. package/src/rust/target/release/deps/libunicode_ident-717c57863b369186.rmeta +0 -0
  146. package/src/rust/target/release/deps/libwasm_bindgen_backend-8f4a80df1d778f42.rlib +0 -0
  147. package/src/rust/target/release/deps/libwasm_bindgen_backend-8f4a80df1d778f42.rmeta +0 -0
  148. package/src/rust/target/release/deps/libwasm_bindgen_macro-9eb75cc91d1ac47b.dylib +0 -0
  149. package/src/rust/target/release/deps/libwasm_bindgen_macro_support-14689549cd7b65b6.rlib +0 -0
  150. package/src/rust/target/release/deps/libwasm_bindgen_macro_support-14689549cd7b65b6.rmeta +0 -0
  151. package/src/rust/target/release/deps/libwasm_bindgen_shared-873126f2b1566d9c.rlib +0 -0
  152. package/src/rust/target/release/deps/libwasm_bindgen_shared-873126f2b1566d9c.rmeta +0 -0
  153. package/src/rust/target/release/deps/log-77a2b15818511956.d +0 -9
  154. package/src/rust/target/release/deps/proc_macro2-78d2de1a55ac02b2.d +0 -14
  155. package/src/rust/target/release/deps/quote-536d2fed8f9d8732.d +0 -13
  156. package/src/rust/target/release/deps/rustversion-db265df7d80a8662.d +0 -20
  157. package/src/rust/target/release/deps/syn-4d3d7efa31c6c7f3.d +0 -55
  158. package/src/rust/target/release/deps/unicode_ident-717c57863b369186.d +0 -8
  159. package/src/rust/target/release/deps/wasm_bindgen_backend-8f4a80df1d778f42.d +0 -12
  160. package/src/rust/target/release/deps/wasm_bindgen_macro-9eb75cc91d1ac47b.d +0 -5
  161. package/src/rust/target/release/deps/wasm_bindgen_macro_support-14689549cd7b65b6.d +0 -8
  162. package/src/rust/target/release/deps/wasm_bindgen_shared-873126f2b1566d9c.d +0 -11
  163. package/src/rust/target/wasm32-unknown-unknown/CACHEDIR.TAG +0 -3
  164. package/src/rust/target/wasm32-unknown-unknown/release/.cargo-lock +0 -0
  165. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/dep-lib-cfg_if +0 -0
  166. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/invoked.timestamp +0 -1
  167. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/lib-cfg_if +0 -1
  168. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/lib-cfg_if.json +0 -1
  169. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/dep-lib-cfg_if +0 -0
  170. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/invoked.timestamp +0 -1
  171. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/lib-cfg_if +0 -1
  172. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/lib-cfg_if.json +0 -1
  173. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/dep-lib-console_error_panic_hook +0 -0
  174. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/invoked.timestamp +0 -1
  175. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/lib-console_error_panic_hook +0 -1
  176. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/lib-console_error_panic_hook.json +0 -1
  177. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/dep-lib-grapher_rs +0 -0
  178. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/invoked.timestamp +0 -1
  179. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/lib-grapher_rs +0 -1
  180. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/lib-grapher_rs.json +0 -1
  181. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/dep-lib-js_sys +0 -0
  182. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/invoked.timestamp +0 -1
  183. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/lib-js_sys +0 -1
  184. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/lib-js_sys.json +0 -1
  185. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/dep-lib-once_cell +0 -0
  186. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/invoked.timestamp +0 -1
  187. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/lib-once_cell +0 -1
  188. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/lib-once_cell.json +0 -1
  189. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-32de32a3c025e199/run-build-script-build-script-build +0 -1
  190. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-32de32a3c025e199/run-build-script-build-script-build.json +0 -1
  191. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/dep-lib-wasm_bindgen +0 -0
  192. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/invoked.timestamp +0 -1
  193. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/lib-wasm_bindgen +0 -1
  194. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/lib-wasm_bindgen.json +0 -1
  195. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/dep-lib-web_sys +0 -0
  196. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/invoked.timestamp +0 -1
  197. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/lib-web_sys +0 -1
  198. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/lib-web_sys.json +0 -1
  199. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/invoked.timestamp +0 -1
  200. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/output +0 -1
  201. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/root-output +0 -1
  202. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/stderr +0 -0
  203. package/src/rust/target/wasm32-unknown-unknown/release/deps/cfg_if-3a3785674ee249ca.d +0 -7
  204. package/src/rust/target/wasm32-unknown-unknown/release/deps/cfg_if-74574db566dede99.d +0 -7
  205. package/src/rust/target/wasm32-unknown-unknown/release/deps/console_error_panic_hook-be3a0429a6c048b7.d +0 -7
  206. package/src/rust/target/wasm32-unknown-unknown/release/deps/grapher_rs.d +0 -8
  207. package/src/rust/target/wasm32-unknown-unknown/release/deps/grapher_rs.wasm +0 -0
  208. package/src/rust/target/wasm32-unknown-unknown/release/deps/js_sys-6b38aa05f6fa3f57.d +0 -7
  209. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-3a3785674ee249ca.rlib +0 -0
  210. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-3a3785674ee249ca.rmeta +0 -0
  211. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-74574db566dede99.rlib +0 -0
  212. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-74574db566dede99.rmeta +0 -0
  213. package/src/rust/target/wasm32-unknown-unknown/release/deps/libconsole_error_panic_hook-be3a0429a6c048b7.rlib +0 -0
  214. package/src/rust/target/wasm32-unknown-unknown/release/deps/libconsole_error_panic_hook-be3a0429a6c048b7.rmeta +0 -0
  215. package/src/rust/target/wasm32-unknown-unknown/release/deps/libjs_sys-6b38aa05f6fa3f57.rlib +0 -0
  216. package/src/rust/target/wasm32-unknown-unknown/release/deps/libjs_sys-6b38aa05f6fa3f57.rmeta +0 -0
  217. package/src/rust/target/wasm32-unknown-unknown/release/deps/libonce_cell-e662b25eb1a26f16.rlib +0 -0
  218. package/src/rust/target/wasm32-unknown-unknown/release/deps/libonce_cell-e662b25eb1a26f16.rmeta +0 -0
  219. package/src/rust/target/wasm32-unknown-unknown/release/deps/libwasm_bindgen-99ed9f45b86292fd.rlib +0 -0
  220. package/src/rust/target/wasm32-unknown-unknown/release/deps/libwasm_bindgen-99ed9f45b86292fd.rmeta +0 -0
  221. package/src/rust/target/wasm32-unknown-unknown/release/deps/libweb_sys-07c24d9b289e70fd.rlib +0 -0
  222. package/src/rust/target/wasm32-unknown-unknown/release/deps/libweb_sys-07c24d9b289e70fd.rmeta +0 -0
  223. package/src/rust/target/wasm32-unknown-unknown/release/deps/once_cell-e662b25eb1a26f16.d +0 -7
  224. package/src/rust/target/wasm32-unknown-unknown/release/deps/wasm_bindgen-99ed9f45b86292fd.d +0 -21
  225. package/src/rust/target/wasm32-unknown-unknown/release/deps/web_sys-07c24d9b289e70fd.d +0 -13
  226. package/src/rust/target/wasm32-unknown-unknown/release/grapher_rs.d +0 -1
  227. package/src/rust/target/wasm32-unknown-unknown/release/grapher_rs.wasm +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.esm.js","mappings":"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","sources":["webpack://@windborne/grapher/./src/grapher.scss","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://@windborne/grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://@windborne/grapher/./node_modules/prop-types/index.js","webpack://@windborne/grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://@windborne/grapher/./src/renderer/background.frag","webpack://@windborne/grapher/./src/renderer/background.vert","webpack://@windborne/grapher/./src/renderer/circle.frag","webpack://@windborne/grapher/./src/renderer/circle.vert","webpack://@windborne/grapher/./src/renderer/line.frag","webpack://@windborne/grapher/./src/renderer/line.vert","webpack://@windborne/grapher/webpack/bootstrap","webpack://@windborne/grapher/webpack/runtime/compat get default export","webpack://@windborne/grapher/webpack/runtime/define property getters","webpack://@windborne/grapher/webpack/runtime/ensure chunk","webpack://@windborne/grapher/webpack/runtime/get javascript chunk filename","webpack://@windborne/grapher/webpack/runtime/hasOwnProperty shorthand","webpack://@windborne/grapher/webpack/runtime/make namespace object","webpack://@windborne/grapher/webpack/runtime/publicPath","webpack://@windborne/grapher/webpack/runtime/import chunk loading","webpack://@windborne/grapher/webpack/runtime/nonce","webpack://@windborne/grapher/external module \"react\"","webpack://@windborne/grapher/./src/state/data_types.js","webpack://@windborne/grapher/./src/helpers/custom_prop_types.js","webpack://@windborne/grapher/./src/renderer/size_canvas.js","webpack://@windborne/grapher/./src/helpers/colors.js","webpack://@windborne/grapher/./src/helpers/color_to_vector.js","webpack://@windborne/grapher/./src/renderer/paths_from.js","webpack://@windborne/grapher/./src/state/rust_api.js","webpack://@windborne/grapher/./src/renderer/extract_vertices.js","webpack://@windborne/grapher/./src/renderer/create_gl_program.js","webpack://@windborne/grapher/./src/renderer/line_program.js","webpack://@windborne/grapher/./src/eventable.js","webpack://@windborne/grapher/./src/renderer/background_program.js","webpack://@windborne/grapher/./src/renderer/draw_zero_line.js","webpack://@windborne/grapher/./src/renderer/draw_bars.js","webpack://@windborne/grapher/./src/state/infer_type.js","webpack://@windborne/grapher/./src/renderer/graph_body_renderer.js","webpack://@windborne/grapher/./src/renderer/draw_area.js","webpack://@windborne/grapher/./src/renderer/draw_line.js","webpack://@windborne/grapher/./src/renderer/draw_background.js","webpack://@windborne/grapher/./src/helpers/format.js","webpack://@windborne/grapher/./src/helpers/axis_sizes.js","webpack://@windborne/grapher/./src/components/tooltip.jsx","webpack://@windborne/grapher/./src/components/context_menu.jsx","webpack://@windborne/grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://@windborne/grapher/./src/state/calculate_data_bounds.js","webpack://@windborne/grapher/./src/state/merge_bounds.js","webpack://@windborne/grapher/./src/state/expand_bounds.js","webpack://@windborne/grapher/./src/helpers/binary_search.js","webpack://@windborne/grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://@windborne/grapher/./src/renderer/scale_bounds.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://@windborne/grapher/./src/helpers/flatten_simple_data.js","webpack://@windborne/grapher/./src/state/calculate_tooltip_state.js","webpack://@windborne/grapher/./src/state/bound_calculators.js","webpack://@windborne/grapher/./src/state/space_conversions/condense_data_space.js","webpack://@windborne/grapher/./src/helpers/name_for_series.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://@windborne/grapher/./src/state/state_controller.js","webpack://@windborne/grapher/./src/state/get_default_bounds_calculator.js","webpack://@windborne/grapher/./src/helpers/generator_params_equal.js","webpack://@windborne/grapher/./src/state/calculate_annotations_state.js","webpack://@windborne/grapher/./src/state/selection_from_global_bounds.js","webpack://@windborne/grapher/./src/state/find_matching_axis.js","webpack://@windborne/grapher/./src/state/average_loop_times.js","webpack://@windborne/grapher/./src/state/bound_calculator_from_selection.js","webpack://@windborne/grapher/./src/state/hooks.js","webpack://@windborne/grapher/./src/components/annotations.jsx","webpack://@windborne/grapher/./src/components/draggable_points.jsx","webpack://@windborne/grapher/./src/components/vertical_lines.jsx","webpack://@windborne/grapher/./src/components/graph_body.jsx","webpack://@windborne/grapher/./src/grapher.scss?e17f","webpack://@windborne/grapher/./src/helpers/place_grid.js","webpack://@windborne/grapher/./src/components/x_axis.jsx","webpack://@windborne/grapher/./src/components/y_axis.jsx","webpack://@windborne/grapher/./src/components/range_selection_button_base.jsx","webpack://@windborne/grapher/./src/components/range_selection_button.jsx","webpack://@windborne/grapher/./src/components/percentile_button.jsx","webpack://@windborne/grapher/./src/components/options.jsx","webpack://@windborne/grapher/./src/components/range_selection.jsx","webpack://@windborne/grapher/./src/components/range_graph.jsx","webpack://@windborne/grapher/./src/components/series_key_item.jsx","webpack://@windborne/grapher/./src/components/series_key_axis_container.jsx","webpack://@windborne/grapher/./src/components/series_key.jsx","webpack://@windborne/grapher/./src/components/graph_title.jsx","webpack://@windborne/grapher/./src/components/sidebar.jsx","webpack://@windborne/grapher/./src/state/sync_pool.js","webpack://@windborne/grapher/./src/grapher.jsx","webpack://@windborne/grapher/./src/state/multigraph_state_controller.js","webpack://@windborne/grapher/./src/multigrapher.jsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.esm.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = new URL(\"./\", import.meta.url);\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\nvar installChunk = (data) => {\n\tvar {ids, modules, runtime} = data;\n\t// add \"modules\" to the modules object,\n\t// then flag all \"ids\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in modules) {\n\t\tif(__webpack_require__.o(modules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = modules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\tfor(;i < ids.length; i++) {\n\t\tchunkId = ids[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[ids[i]] = 0;\n\t}\n\n}\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// import() chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[1]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n\t\t\t\t\t\tif(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t});\n\t\t\t\t\tvar promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))])\n\t\t\t\t\tpromises.push(installedChunkData[1] = promise);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no external install chunk\n\n// no on chunks loaded","__webpack_require__.nc = undefined;","var x = (y) => {\n\tvar x = {}; __webpack_require__.d(x, y); return x\n} \nvar y = (x) => (() => (x))\nconst __WEBPACK_NAMESPACE_OBJECT__ = x({ [\"default\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__[\"default\"]), [\"useCallback\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useCallback), [\"useEffect\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useEffect), [\"useMemo\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useMemo), [\"useRef\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useRef), [\"useState\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useState) });","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI()) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI().get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI().extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.dataBounds.minY, singleSeries.dataBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n\n if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n \n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight || stateController?.primaryRenderer?.boundingRect?.height}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar.jsx';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","b","URL","url","installedChunks","installChunk","ids","runtime","j","installedChunkData","promise","import","then","race","resolve","nc","y","__WEBPACK_EXTERNAL_MODULE_react__","x","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","type","xKey","yKey","xUnixDates","color","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","Date","startX","endX","lineOnly","Annotations","DraggablePoint","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","pixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","multigrapherSeriesIndex","colorToVector","startsWith","parts","split","part","parseFloat","match","test","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","rustApiModule","RustAPIPromise","default","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","LineProgram","constructor","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","fn","Set","add","off","delete","size","emit","args","arguments","forEach","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","bind","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","zero","hasNegatives","find","tuple","some","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","clearTimeout","_intersectionTimeout","isIntersecting","setTimeout","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","className","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","s","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","position","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","classList","contains","closest","seriesToNearestPoint","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}
1
+ {"version":3,"file":"bundle.esm.js","mappings":"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","sources":["webpack://@windborne/grapher/webpack/runtime/import chunk loading","webpack://@windborne/grapher/./src/grapher.scss","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://@windborne/grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://@windborne/grapher/./node_modules/prop-types/index.js","webpack://@windborne/grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://@windborne/grapher/./src/renderer/background.frag","webpack://@windborne/grapher/./src/renderer/background.vert","webpack://@windborne/grapher/./src/renderer/circle.frag","webpack://@windborne/grapher/./src/renderer/circle.vert","webpack://@windborne/grapher/./src/renderer/line.frag","webpack://@windborne/grapher/./src/renderer/line.vert","webpack://@windborne/grapher/webpack/bootstrap","webpack://@windborne/grapher/webpack/runtime/compat get default export","webpack://@windborne/grapher/webpack/runtime/define property getters","webpack://@windborne/grapher/webpack/runtime/ensure chunk","webpack://@windborne/grapher/webpack/runtime/get javascript chunk filename","webpack://@windborne/grapher/webpack/runtime/hasOwnProperty shorthand","webpack://@windborne/grapher/webpack/runtime/make namespace object","webpack://@windborne/grapher/webpack/runtime/nonce","webpack://@windborne/grapher/external module \"react\"","webpack://@windborne/grapher/./src/state/data_types.js","webpack://@windborne/grapher/./src/helpers/custom_prop_types.js","webpack://@windborne/grapher/./src/renderer/size_canvas.js","webpack://@windborne/grapher/./src/helpers/colors.js","webpack://@windborne/grapher/./src/helpers/color_to_vector.js","webpack://@windborne/grapher/./src/renderer/paths_from.js","webpack://@windborne/grapher/./src/state/rust_api.js","webpack://@windborne/grapher/./src/renderer/extract_vertices.js","webpack://@windborne/grapher/./src/renderer/create_gl_program.js","webpack://@windborne/grapher/./src/renderer/line_program.js","webpack://@windborne/grapher/./src/eventable.js","webpack://@windborne/grapher/./src/renderer/background_program.js","webpack://@windborne/grapher/./src/renderer/draw_zero_line.js","webpack://@windborne/grapher/./src/renderer/draw_bars.js","webpack://@windborne/grapher/./src/state/infer_type.js","webpack://@windborne/grapher/./src/renderer/graph_body_renderer.js","webpack://@windborne/grapher/./src/renderer/draw_area.js","webpack://@windborne/grapher/./src/renderer/draw_line.js","webpack://@windborne/grapher/./src/renderer/draw_background.js","webpack://@windborne/grapher/./src/helpers/format.js","webpack://@windborne/grapher/./src/helpers/axis_sizes.js","webpack://@windborne/grapher/./src/components/tooltip.jsx","webpack://@windborne/grapher/./src/components/context_menu.jsx","webpack://@windborne/grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://@windborne/grapher/./src/state/calculate_data_bounds.js","webpack://@windborne/grapher/./src/state/merge_bounds.js","webpack://@windborne/grapher/./src/state/expand_bounds.js","webpack://@windborne/grapher/./src/helpers/binary_search.js","webpack://@windborne/grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://@windborne/grapher/./src/renderer/scale_bounds.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://@windborne/grapher/./src/helpers/flatten_simple_data.js","webpack://@windborne/grapher/./src/state/calculate_tooltip_state.js","webpack://@windborne/grapher/./src/state/bound_calculators.js","webpack://@windborne/grapher/./src/state/space_conversions/condense_data_space.js","webpack://@windborne/grapher/./src/helpers/name_for_series.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://@windborne/grapher/./src/state/state_controller.js","webpack://@windborne/grapher/./src/state/get_default_bounds_calculator.js","webpack://@windborne/grapher/./src/helpers/generator_params_equal.js","webpack://@windborne/grapher/./src/state/calculate_annotations_state.js","webpack://@windborne/grapher/./src/state/selection_from_global_bounds.js","webpack://@windborne/grapher/./src/state/find_matching_axis.js","webpack://@windborne/grapher/./src/state/average_loop_times.js","webpack://@windborne/grapher/./src/state/bound_calculator_from_selection.js","webpack://@windborne/grapher/./src/state/hooks.js","webpack://@windborne/grapher/./src/components/annotations.jsx","webpack://@windborne/grapher/./src/components/draggable_points.jsx","webpack://@windborne/grapher/./src/components/vertical_lines.jsx","webpack://@windborne/grapher/./src/components/graph_body.jsx","webpack://@windborne/grapher/./src/grapher.scss?e17f","webpack://@windborne/grapher/./src/helpers/place_grid.js","webpack://@windborne/grapher/./src/components/x_axis.jsx","webpack://@windborne/grapher/./src/components/y_axis.jsx","webpack://@windborne/grapher/./src/components/range_selection_button_base.jsx","webpack://@windborne/grapher/./src/components/range_selection_button.jsx","webpack://@windborne/grapher/./src/components/percentile_button.jsx","webpack://@windborne/grapher/./src/components/options.jsx","webpack://@windborne/grapher/./src/components/range_selection.jsx","webpack://@windborne/grapher/./src/components/range_graph.jsx","webpack://@windborne/grapher/./src/components/series_key_item.jsx","webpack://@windborne/grapher/./src/components/series_key_axis_container.jsx","webpack://@windborne/grapher/./src/components/series_key.jsx","webpack://@windborne/grapher/./src/components/graph_title.jsx","webpack://@windborne/grapher/./src/components/sidebar.jsx","webpack://@windborne/grapher/./src/state/sync_pool.js","webpack://@windborne/grapher/./src/grapher.jsx","webpack://@windborne/grapher/./src/state/multigraph_state_controller.js","webpack://@windborne/grapher/./src/multigrapher.jsx"],"sourcesContent":["// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\nvar installChunk = (data) => {\n\tvar {ids, modules, runtime} = data;\n\t// add \"modules\" to the modules object,\n\t// then flag all \"ids\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in modules) {\n\t\tif(__webpack_require__.o(modules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = modules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\tfor(;i < ids.length; i++) {\n\t\tchunkId = ids[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[ids[i]] = 0;\n\t}\n\n}\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// import() chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[1]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n\t\t\t\t\t\tif(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t});\n\t\t\t\t\tvar promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))])\n\t\t\t\t\tpromises.push(installedChunkData[1] = promise);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no external install chunk\n\n// no on chunks loaded","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.esm.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","var x = (y) => {\n\tvar x = {}; __webpack_require__.d(x, y); return x\n} \nvar y = (x) => (() => (x))\nconst __WEBPACK_NAMESPACE_OBJECT__ = x({ [\"default\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__[\"default\"]), [\"useCallback\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useCallback), [\"useEffect\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useEffect), [\"useMemo\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useMemo), [\"useRef\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useRef), [\"useState\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useState) });","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI()) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI().get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI().extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.selectedBounds.minY, singleSeries.selectedBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n\n if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n \n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight || stateController?.primaryRenderer?.boundingRect?.height}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar.jsx';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["installedChunks","installChunk","___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","ids","runtime","j","installedChunkData","promise","import","then","race","resolve","nc","y","__WEBPACK_EXTERNAL_MODULE_react__","x","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","type","xKey","yKey","xUnixDates","color","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","Date","startX","endX","lineOnly","Annotations","DraggablePoint","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","pixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","multigrapherSeriesIndex","colorToVector","startsWith","parts","split","part","parseFloat","match","test","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","rustApiModule","RustAPIPromise","default","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","LineProgram","constructor","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","fn","Set","add","off","delete","size","emit","args","arguments","forEach","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","bind","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","zero","hasNegatives","find","tuple","some","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","clearTimeout","_intersectionTimeout","isIntersecting","setTimeout","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","b","className","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","s","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","position","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","classList","contains","closest","seriesToNearestPoint","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}