diff --git a/.gitattributes b/.gitattributes
index 057442e5f490c131c98574f12bb63a9117867fdc..492945f45c9815180642382aef2fa7b5ad3a5001 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,4 @@
* linguist-vendored
*.py linguist-vendored=false
text eol=lf
+openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/Terminal_icon.png filter=lfs diff=lfs merge=lfs -text
diff --git a/openbb_platform/obbject_extensions/charting/README.md b/openbb_platform/obbject_extensions/charting/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b87d86d226e5c20f754e0048f762b219b31ee38
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/README.md
@@ -0,0 +1,174 @@
+# OpenBB Charting extension
+
+This extension provides a charting library for OpenBB Platform.
+
+The library includes:
+
+- a charting infrastructure based on Plotly
+- a set of charting components
+- prebuilt charts for a set of commands that are built-in OpenBB extensions
+
+>[!NOTE]
+> The charting library is an `OBBject` extension which means you'll have the functionality it exposes on every command result.
+
+## Installation
+
+To install the extension, run the following command in this folder:
+
+```bash
+pip install openbb-charting
+```
+
+## PyWry dependency on Linux
+
+The PyWry dependency handles the display of interactive charts and tables in a separate window. It is installed automatically with the OpenBB Charting extension.
+
+When using Linux distributions, the PyWry dependency requires certain dependencies to be installed first.
+
+- Debian-based / Ubuntu / Mint:
+`sudo apt install libwebkit2gtk-4.0-dev`
+
+- Arch Linux / Manjaro:
+`sudo pacman -S webkit2gtk`
+
+- Fedora:
+`sudo dnf install gtk3-devel webkit2gtk3-devel`
+
+## Usage
+
+To use the extension, run any of the OpenBB Platform endpoints with the `chart` argument set to `True`.
+
+Here's an example of how it would look like in a python interface:
+
+```python
+from openbb import obb
+equity_data = obb.equity.price.historical(symbol="TSLA", chart=True)
+```
+
+This results in a `OBBject` object containing a `chart` attribute, which contains Plotly JSON data.
+
+In order to display the chart, you need to call the `show()` method:
+
+```python
+equity_data.show()
+```
+
+> Note: The `show()` method currently works either in a Jupyter Notebook or in a standalone python script with a PyWry based backend properly initialized.
+
+Alternatively, you can use the fact that the `openbb-charting` is an `OBBject` extension and use its available methods.
+
+```python
+from openbb import obb
+res = obb.equity.price.historical("AAPL")
+res.charting.show()
+```
+
+The above code will produce the same effect as the previous example.
+
+### Discovering available charts
+
+Not all the endpoints are currently supported by the charting extension. To discover which endpoints are supported, you can run the following command:
+
+```python
+from openbb_charting import Charting
+Charting.functions()
+```
+
+### Using the `to_chart` method
+
+The `to_chart` function should be taken as an advanced feature, as it requires the user to have a good understanding of the charting extension and the `OpenBBFigure` class.
+
+The user can use any number of `**kwargs` that will be passed to the `PlotlyTA` class in order to build custom visualizations with custom indicators and similar.
+
+> Note that, this method will only work to some limited extent with data that is not standardized.
+> Also, it is currently designed only to handle time series (OHLCV) data.
+
+Example usage:
+
+- Plotting a time series with TA indicators
+
+ ```python
+
+ from openbb import obb
+ res = obb.equity.price.historical("AAPL")
+
+ indicators = dict(
+ sma=dict(length=[20,30,50]),
+ adx=dict(length=14),
+ rsi=dict(length=14),
+ macd=dict(fast=12, slow=26, signal=9),
+ bbands=dict(length=20, std=2),
+ stoch=dict(length=14),
+ ema=dict(length=[20,30,50]),
+ )
+ res.charting.to_chart(**{"indicators": indicators})
+
+ ```
+
+- Get all the available indicators
+
+ ```python
+
+ # if you have a command result already
+ res.charting.indicators
+
+ # or if you want to know in standalone fashion
+ from openbb_charting import Charting
+ Charting.indicators()
+
+ ```
+
+## Add a visualization to an existing Platform command
+
+To add a visualization to an existing command, you'll need to add a `poetry` plugin to your `pyproject.toml` file. The syntax should be the following:
+
+```toml
+[tool.poetry.plugins."openbb_charting_extension"]
+my_extension = "openbb_my_extension.my_extension_views:MyExtensionViews"
+```
+
+Where the `openbb_charting_extension` is **mandatory**, otherwise the charting extension won't be able to find the visualization.
+
+And the suggested structure for the `my_extension_views` module is the following:
+
+```python
+"""Views for MyExtension."""
+
+from typing import Any, Dict, Tuple
+
+from openbb_charting.charts.price_historical import price_historical
+from openbb_charting.core.openbb_figure import OpenBBFigure
+
+
+class MyExtensionViews:
+ """MyExtension Views."""
+
+ @staticmethod
+ def my_extension_price_historical(
+ **kwargs,
+ ) -> Tuple[OpenBBFigure, Dict[str, Any]]:
+ """MyExtension Price Historical Chart."""
+ return price_historical(**kwargs)
+```
+
+> Note that `my_extension_views` lives under the `openbb_my_extension` package.
+
+Afterwards, you'll need to add the visualization to your new `MyExtensionViews` class. The convention to match the endpoint with the respective charting function is the following:
+
+- `/equity/price/historical` -> `equity_price_historical`
+- `/technical/ema` -> `technical_ema`
+- `/my_extension/price_historical` -> `my_extension_price_historical`
+
+When you spot the charting function on the charting router file, you can add the visualization to it.
+
+The implementation should leverage the already existing classes and methods to do so, namely:
+
+- `OpenBBFigure`
+- `PlotlyTA`
+
+Note that the return of each charting function should respect the already defined return types: `Tuple[OpenBBFigure, Dict[str, Any]]`.
+
+The returned tuple contains a `OpenBBFigure` that is an interactive plotly figure which can be used in a Python interpreter, and a `Dict[str, Any]` that contains the raw data leveraged by the API.
+
+After you're done implementing the charting function, you can use either the Python interface or the API to get the chart. To do so, you'll only need to set the already available `chart` argument to `True`.
+Or accessing the `charting` attribute of the `OBBject` object: `my_obbject.charting.show()`.
diff --git a/openbb_platform/obbject_extensions/charting/examples.md b/openbb_platform/obbject_extensions/charting/examples.md
new file mode 100644
index 0000000000000000000000000000000000000000..e2cb239b9780f02505b337104de32d873c138928
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/examples.md
@@ -0,0 +1,166 @@
+---
+title: Examples
+sidebar_position: 1
+description: This page provides examples of creating charts with the `openbb-charting` extension.
+keywords:
+- tutorial
+- OpenBB Platform
+- Python client
+- Fast API
+- getting started
+- extensions
+- charting
+- view
+- Plotly
+- toolkits
+- how-to
+- generic
+- figure
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Overview
+
+This page will walk through creating different charts using the `openbb-charting` extension.
+The perspective for this content is from the Python Interface,
+and the examples will assume that the OpenBB Platform is installed with all optional packages.
+
+```python
+from datetime import datetime, timedelta
+from openbb import obb
+```
+
+## Cumulative Returns
+
+The historical (equity) prices can be requested for multiple symbols.
+The extension will attempt to handle variations accordingly.
+By default, more than three symbols will draw the chart as cumulative returns from the beginning of the series.
+
+### Default View
+
+The tickers below are a collection of State Street Global Advisors SPDR funds, representing S&P 500 components.
+The data is looking back five years.
+
+```python
+SPDRS = [
+ "SPY",
+ "XLE",
+ "XLB",
+ "XLI",
+ "XHB",
+ "XLP",
+ "XLY",
+ "XRT",
+ "XLF",
+ "XLV",
+ "XLK",
+ "XLC",
+ "XLU",
+ "XLRE",
+]
+start_date = (datetime.now() - timedelta(weeks=52*5)).date()
+spdrs = obb.equity.price.historical(SPDRS, start_date=start_date, provider="yfinance", chart=True)
+
+spdrs.show()
+```
+
+
+
+### Redraw as YTD
+
+The `charting` attribute of the command output has methods for creating the chart again.
+The `data` parameter allows modifications to the data before creating the figure.
+In this example, the length of the data is trimmed to the beginning of the year.
+
+```python
+new_data = spdrs.to_df().loc[datetime(2024,12,29).date():]
+spdrs.charting.to_chart(data=new_data, title="YTD")
+```
+
+:::note
+This replaces the chart that was already created.
+:::
+
+
+
+## Price Performance Bar Chart
+
+The `obb.equity.price.performance` endpoint will create a bar chart over intervals.
+
+```python
+price_performance = obb.equity.price.performance(SPDRS, chart=True)
+price_performance.show()
+```
+
+
+
+### Create Bar Chart
+
+This example uses the `create_bar_chart()` method, which does not replace the existing chart, in `price_performance.chart`.
+It isolates the one-month performance and orients the layout as horizontal.
+
+```python
+new_data = price_performance.to_df().set_index("symbol").multiply(100).reset_index()
+price_performance.charting.create_bar_chart(
+ data=new_data,
+ x="symbol",
+ y="one_month",
+ orientation="h",
+ title="One Month Price Performance",
+ xtitle="Percent (%)"
+)
+```
+
+
+
+## Create Your Own
+
+This example analyzes the share volume turnover of the S&P 500 Energy Sector constituents, year-to-date.
+
+```python
+symbols = [
+ 'XOM',
+ 'CVX',
+ 'COP',
+ 'WMB',
+ 'EOG',
+ 'KMI',
+ 'OKE',
+ 'MPC',
+ 'PSX',
+ 'SLB',
+ 'VLO',
+ 'BKR',
+ 'HES',
+ 'TRGP',
+ 'EQT',
+ 'OXY',
+ 'TPL',
+ 'FANG',
+ 'EXE',
+ 'DVN',
+ 'HAL',
+ 'CTRA',
+ 'APA',
+]
+data = obb.equity.price.historical(symbols, start_date="2025-01-01", provider="yfinance")
+create_bar_chart = data.charting.create_bar_chart
+volume = data.to_df().groupby("symbol").sum()["volume"]
+shares = obb.equity.profile(
+ symbols, provider="yfinance"
+).to_df().set_index("symbol")["shares_float"]
+df = volume.to_frame().join(shares)
+df["Turnover"] = (df.volume/df.shares_float).round(4)
+df = df.sort_values(by="Turnover", ascending=False).reset_index()
+create_bar_chart(
+ data=df,
+ x="symbol",
+ y="Turnover",
+ title="S&P Energy Sector YTD Turnover Rate",
+)
+```
+
+
diff --git a/openbb_platform/obbject_extensions/charting/index.md b/openbb_platform/obbject_extensions/charting/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ca1703066009869ffbdca88915fc9234004c50d
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/index.md
@@ -0,0 +1,359 @@
+---
+title: OpenBB Charting
+sidebar_position: 1
+description: This page introduces the optional openbb-charting extension.
+keywords:
+- explanation
+- OpenBB Platform
+- Python client
+- Fast API
+- getting started
+- extensions
+- charting
+- view
+- Plotly
+- toolkits
+- community
+- Plotly
+- OpenBBFigure
+- PyWry
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Overview
+
+The `openbb-charting` extension provides elements for building and displaying interactive charts, tables, dashboards, and more, directly from the OpenBB Platform's Python Interface and FAST API.
+
+It allows users to create a custom view, without any previous experience working with Plotly, from any response served by the OpenBB Platform.
+
+The Python Interface includes a custom [PyWry](https://github.com/OpenBB-finance/pywry) backend for displaying any content, in a WebKit HTML window served over `localhost`. In an IDE setting, they will be rendered inline.
+
+To install, follow the instructions [here](installation). The sections below provide a general explanation of the extension.
+
+## How Does It Work?
+
+It works by extending the `OBBject` class with a new attribute, `charting`. When it is installed, every response from the OpenBB Platform will be equipped with these tools.
+
+For functions that have pre-defined views, it serves as an intermediary between the user request and the response, activated when `chart=True`. When a chart is created, it will populate the existing, `chart`, attribute of the `OBBject`. This is where it is served by the FAST API from the function request. In the Python Interface, charts can be generated post-request, regardless of `chart=True`.
+
+The `chart` attribute in the OBBject contains three items, responses from the API have two:
+
+- `fig`: The OpenBBFigure object - an extended Plotly GraphObjects class. Not included in the API response.
+- `content`: The Plotly JSON representation of the chart - Returned to the API.
+- `format`: The format of the chart - 'plotly' is currently the only charting library.
+
+There is one OBBject class method, `show()`, which will display the contents of the `chart` attribute, if populated.
+
+The new `charting` attribute that binds to the OBBject also has a `show()` method. This differs in that it overwrites the existing chart, effectively a 'reset' for the view.
+
+The extension has a docstring, and it lists the class methods within `charting`.
+
+```python
+from openbb import obb
+data = obb.equity.price.historical("AAPL")
+data.charting?
+```
+
+```console
+Charting extension.
+
+Methods
+-------
+show
+ Display chart and save it to the OBBject.
+to_chart
+ Redraw the chart and save it to the OBBject, with an optional entry point for Data.
+functions
+ Return a list of Platform commands with charting functions.
+get_params
+ Return the charting parameters for the function the OBBject was created from.
+indicators
+ Return the list of the available technical indicators to use with the `to_chart` method and OHLC+V data.
+table
+ Display an interactive table.
+create_line_chart
+ Create a line chart from external data.
+create_bar_chart
+ Create a bar chart, on a single x-axis with one or more values for the y-axis, from external data.
+```
+
+:::note
+When creating a chart directly from the OpenBB Platform endpoint, chart parameters must be passed as a nested dictionary under the name, `chart_params`.
+
+```python
+chart_params = dict(
+ title="AAPL 50/200 Day EMA",
+ indicators=dict(
+ ema=dict(length=[50,200]),
+ ),
+)
+params = dict(
+ symbol="AAPL",
+ start_date="2022-01-01",
+ provider="yfinance",
+ chart=True,
+ chart_params=chart_params,
+)
+data = obb.equity.price.historical(**params)
+```
+
+`chart_params` are sent in the body of the request when using the API.
+:::
+
+Passing only `chart=True` will return a default view which can be modified and drawn again post-request, via the `OBBject`.
+
+```console
+OBBject
+
+id: 06614d74-7443-7201-8000-a65f358136a3
+results: [{'date': datetime.date(2022, 1, 3), 'open': 177.8300018310547, 'high': 18...
+provider: yfinance
+warnings: None
+chart: {'content': {'data': [{'close': [182.00999450683594, 179.6999969482422, 174....
+extra: {'metadata': {'arguments': {'provider_choices': {'provider': 'yfinance'}, 's...
+```
+
+```python
+data.show()
+```
+
+
+
+### No Render
+
+The charts can be created without opening the PyWry window, and this is the default behaviour when `chart=True`.
+With the `charting.show()` and `charting.to_chart()` methods, the default is `render=True`.
+Setting as `False` will return the chart to itself, populating the `chart` attribute of OBBject.
+
+## What Endpoints Have Charts?
+
+The OpenBB Platform router, open_api.json, function signatures, and documentation are all generated based on your specific configuration. When the `openbb-charting` extension is installed, any function found in the "[charting_router](https://github.com/OpenBB-finance/OpenBB/blob/develop/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py)" adds `chart: bool = False` to the command on build. For example, `obb.index.price.historical?`
+
+```python
+Signature:
+obb.index.price.historical(
+ symbol: Annotated[Union[str, List[str]], OpenBBCustomParameter(description='Symbol to get data for. Multiple comma separated items allowed for provider(s): cboe, fmp, intrinio, polygon, yfinance.')],
+ ...
+ chart: typing.Annotated[bool, OpenBBCustomParameter(description='Whether to create a chart or not, by default False.')] = False,
+ **kwargs,
+) -> openbb_core.app.model.obbject.OBBject
+```
+
+### Charting Functions
+
+The `charting` attribute of every command output has methods for identifying the charting functions and parameters.
+While able to serve JSON-serializable charts, the `openbb-charting` extension is best-suited for use with the Python Interface. Much of the functionality is realized post-request.
+
+Examine the extension by returning any command at all.
+
+```python
+from openbb import obb
+
+data = obb.equity.price.historical("SPY,QQQ,XLK,BTC-USD", provider="yfinance")
+
+data.charting.functions()
+```
+
+```console
+['crypto_price_historical',
+ 'currency_price_historical',
+ 'economy_fred_series',
+ 'equity_price_historical',
+ 'equity_price_performance',
+ 'etf_historical',
+ 'etf_holdings',
+ 'etf_price_performance',
+ 'index_price_historical',
+ 'technical_adx',
+ 'technical_aroon',
+ 'technical_cones',
+ 'technical_ema',
+ 'technical_hma',
+ 'technical_macd',
+ 'technical_rsi',
+ 'technical_sma',
+ 'technical_wma',
+ 'technical_zlma']
+```
+
+:::tip
+The list above should, as shown here, should not be considered as the source of truth. It's just a sample.
+:::
+
+If the `OBBject` in question has a dedicated charting function associated with it, parameters are detailed by the `get_params()` method.
+
+```console
+EquityPriceHistoricalChartQueryParams
+
+ Parameters
+ ----------
+
+ data : Union[Data, list[Data], NoneType]
+ Filtered versions of the data contained in the original `self.results`.
+ Columns should be the same as the original data.
+ Example use is to reduce the number of columns, or the length of data, to plot.
+
+ title : Union[str, NoneType]
+ Title of the chart.
+
+ target : Union[str, NoneType]
+ The specific column to target.
+ If supplied, this will override the candles and volume parameters.
+
+ multi_symbol : bool
+ Flag to indicate whether the data contains multiple symbols.
+ This is mostly handled automatically, but if the chart fails to generate try setting this to True.
+
+ same_axis : bool
+ If True, forces all data to be plotted on the same axis.
+
+ normalize : bool
+ If True, the data will be normalized and placed on the same axis.
+
+ returns : bool
+ If True, the cumulative returns for the length of the time series will be calculated and plotted.
+
+ candles : bool
+ If True, and OHLC exists, and there is only one symbol in the data, candles will be plotted.
+
+ heikin_ashi : bool
+ If True, and `candles=True`, Heikin Ashi candles will be plotted.
+
+ volume : bool
+ If True, and volume exists, and `candles=True`, volume will be plotted.
+
+ indicators : Union[ChartIndicators, dict[str, dict[str, Any]], NoneType]
+ Indicators to be plotted, formatted as a dictionary.
+ Data containing multiple symbols will ignore indicators.
+ Example:
+ indicators = dict(
+ sma=dict(length=[20,30,50]),
+ adx=dict(length=14),
+ rsi=dict(length=14),
+ )
+```
+
+Not all commands will have the same `chart_params`, and some less than others, but it is always possible to redraw the chart with a different combination post-request. Here's what the default chart is from the output of the command above.
+
+If `chart=True` was not specified, it will need to be created.
+
+```python
+data.charting.to_chart()
+```
+
+
+
+The extension recognized that multiple symbols were within the object, and made a determination to display cumulative returns by default.
+
+A candlestick chart will draw only when there is one symbol in the data.
+
+```python
+obb.equity.price.historical(
+ symbol="XLK",
+ start_date="2024-01-01",
+ provider="yfinance",
+ chart=True,
+ chart_params=dict(title="XLK YTD", heikin_ashi=True)
+).show()
+```
+
+
+
+## Endpoints Without Charts
+
+Most functions do not have dedicated charts. However, it's still possible to generate one automatically. Using the `data` above, we can try passing it through a quantitative analysis command.
+
+```python
+data = obb.equity.price.historical(
+ symbol="XLK",
+ start_date="2023-01-01",
+ provider="yfinance",
+)
+qa = obb.quantitative.rolling.stdev(data.results, target="close")
+
+qa.charting.show(title="XLK Rolling 21 Day Standard Deviation")
+```
+
+
+
+## Charts From Any Data
+
+There are methods for creating a generic chart from any external data.
+They will bypass any data contained in the parent object, unless specifically fed into itself.
+
+- charting.create_bar_chart()
+- charting.create_line_chart()
+
+They can also be used as standalone components by initializing an empty instance of the OBBject class.
+
+```python
+from openbb import obb
+from openbb_core.app.model.obbject import OBBject
+create_bar_chart = OBBject(results=None).charting.create_bar_chart
+
+create_bar_chart?
+````
+
+```console
+Create a bar chart on a single x-axis with one or more values for the y-axis.
+
+Parameters
+----------
+data : Union[list, dict, pd.DataFrame, List[pd.DataFrame], pd.Series, List[pd.Series], np.ndarray, Data]
+ Data to plot.
+x : str
+ The x-axis column name.
+y : Union[str, List[str]]
+ The y-axis column name(s).
+barmode : Literal["group", "stack", "relative", "overlay"], optional
+ The bar mode, by default "group".
+xtype : Literal["category", "multicategory", "date", "log", "linear"], optional
+ The x-axis type, by default "category".
+title : Optional[str], optional
+ The title of the chart, by default None.
+xtitle : Optional[str], optional
+ The x-axis title, by default None.
+ytitle : Optional[str], optional
+ The y-axis title, by default None.
+orientation : Literal["h", "v"], optional
+ The orientation of the chart, by default "v".
+colors: Optional[List[str]], optional
+ Manually set the colors to cycle through for each column in 'y', by default None.
+layout_kwargs : Optional[Dict[str, Any]], optional
+ Additional keyword arguments to apply with figure.update_layout(), by default None.
+
+Returns
+-------
+OpenBBFigure
+ The OpenBBFigure object.
+```
+
+## Tables
+
+The `openbb-charting` extension is equipped with interactive tables, utilizing the React framework. They are displayed by using the `table` method.
+
+```python
+data = obb.equity.price.quote("AAPL,MSFT,GOOGL,META,TSLA,AMZN", provider="yfinance")
+data.charting.table()
+```
+
+
+
+External data can also be supplied, providing an opportunity to filter or apply Pandas operations before display.
+
+```python
+new_df = df.to_df().T
+new_df.index.name="metric"
+new_df.columns = new_df.loc["symbol"]
+new_df.drop("symbol", inplace=True)
+data.charting.table(data=new_df)
+```
+
+
+
+:::important
+This does not alter the contents of the original object, the displayed data is a copy.
+:::
diff --git a/openbb_platform/obbject_extensions/charting/indicators.md b/openbb_platform/obbject_extensions/charting/indicators.md
new file mode 100644
index 0000000000000000000000000000000000000000..635cb71ce260b09cd9dfb6e6eb4d3ffe2e3c63d3
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/indicators.md
@@ -0,0 +1,384 @@
+---
+title: Indicators
+sidebar_position: 2
+description: A tutorial of the technical indicators included with the openbb-charting library, including how to get started using them.
+keywords:
+- tutorial
+- OpenBB Platform
+- getting started
+- extensions
+- charting
+- view
+- Plotly
+- toolkits
+- indicators
+- Plotly
+- OpenBBFigure
+- PyWry
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## Introduction
+
+Select indicators (technical) can be added to a chart where the data is OHLC+V prices over time, and the data is for one symbol only.
+They are meant as quick visualizations, and a way to build more complex charts.
+As starting points, they can be refined to perfection by manipulating the figure object directly.
+
+```python
+from datetime import datetime, timedelta
+from openbb import obb
+data = obb.equity.price.historical(
+ "TSLA",
+ provider="yfinance",
+ interval="15m",
+ start_date=(datetime.now()-timedelta(days=21)).date(),
+ chart=True,
+ chart_params=dict(
+ heikin_ashi=True,
+ indicators=(dict(
+ ema=dict(length=[8,32]),
+ srlines={}, # For indicators, an empty dictionary implies the default state.
+ rsi=dict(length=32)
+ ))
+ )
+)
+data.show()
+```
+
+
+
+## Available Indicators
+
+To get all the indicators, use the `charting.indicators()` method.
+The object returned is a Pydantic model where each indicator is field.
+If you don't catch it, it will print as a docstring to the console.
+
+:::danger
+Some indicators, like RSI and MACD, create subplots. Only 4 subplots (not including the main candles + volume) can be created within the same view.
+:::
+
+```python
+data.charting.indicators()
+```
+
+```console
+SMA:
+
+ Parameters
+ ----------
+
+ length : Union[int, list[int]]
+ Window length for the moving average, by default is 50.
+ The number is relative to the interval of the time series data.
+
+ offset : int
+ Number of periods to offset for the moving average, by default is 0.
+
+EMA:
+
+ Parameters
+ ----------
+
+ length : Union[int, list[int]]
+ Window length for the moving average, by default is 50.
+ The number is relative to the interval of the time series data.
+
+ offset : int
+ Number of periods to offset for the moving average, by default is 0.
+
+HMA:
+
+ Parameters
+ ----------
+
+ length : Union[int, list[int]]
+ Window length for the moving average, by default is 50.
+ The number is relative to the interval of the time series data.
+
+ offset : int
+ Number of periods to offset for the moving average, by default is 0.
+
+WMA:
+
+ Parameters
+ ----------
+
+ length : Union[int, list[int]]
+ Window length for the moving average, by default is 50.
+ The number is relative to the interval of the time series data.
+
+ offset : int
+ Number of periods to offset for the moving average, by default is 0.
+
+ZLMA:
+
+ Parameters
+ ----------
+
+ length : Union[int, list[int]]
+ Window length for the moving average, by default is 50.
+ The number is relative to the interval of the time series data.
+
+ offset : int
+ Number of periods to offset for the moving average, by default is 0.
+
+AD:
+
+ Parameters
+ ----------
+
+ offset : int
+ Offset value for the AD, by default is 0.
+
+AD Oscillator:
+
+ Parameters
+ ----------
+
+ fast : int
+ Number of periods to use for the fast calculation, by default 3.
+
+ slow : int
+ Number of periods to use for the slow calculation, by default 10.
+
+ offset : int
+ Offset to be used for the calculation, by default is 0.
+
+ADX:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the ADX, by default is 50.
+
+ scalar : float
+ Scalar to multiply the ADX by, default is 100.
+
+ drift : int
+ Drift value for the ADX, by default is 1.
+
+Aroon:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the Aroon, by default is 50.
+
+ scalar : float
+ Scalar to multiply the Aroon by, default is 100.
+
+ATR:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the ATR, by default is 14.
+
+ mamode : Literal[rma, ema, sma, wma]
+ The mode to use for the moving average calculation.
+
+ drift : int
+ The difference period.
+
+ offset : int
+ Number of periods to offset the result, by default is 0.
+
+CCI:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the CCI, by default is 14.
+
+ scalar : float
+ Scalar to multiply the CCI by, default is 0.015.
+
+Clenow:
+
+ Parameters
+ ----------
+
+ period : int
+ The number of periods for the momentum, by default 90.
+
+Demark:
+
+ Parameters
+ ----------
+
+ show_all : bool
+ Show 1 - 13.
+ If set to False, show 6 - 9.
+
+ offset : int
+ Number of periods to offset the result, by default is 0.
+
+Donchian:
+
+ Parameters
+ ----------
+
+ lower : Union[int, NoneType]
+ Window length for the lower band, by default is 20.
+
+ upper : Union[int, NoneType]
+ Window length for the upper band, by default is 20.
+
+ offset : Union[int, NoneType]
+ Number of periods to offset the result, by default is 0.
+
+Fib:
+
+ Parameters
+ ----------
+
+ period : int
+ The period to calculate the Fibonacci Retracement, by default 120.
+
+ start_date : Union[str, NoneType]
+ The start date for the Fibonacci Retracement.
+
+ end_date : Union[str, NoneType]
+ The end date for the Fibonacci Retracement.
+
+Fisher:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the Fisher Transform, by default is 14.
+
+ signal : int
+ Fisher Signal Period
+
+Ichimoku:
+
+ Parameters
+ ----------
+
+ conversion : int
+ The conversion line period, by default 9.
+
+ base : int
+ The base line period, by default 26.
+
+ lagging : int
+ The lagging line period, by default 52.
+
+ offset : int
+ The offset period, by default 26.
+
+ lookahead : bool
+ Drops the Chikou Span Column to prevent potential data leak
+
+KC:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the Keltner Channel, by default is 20.
+
+ scalar : float
+ Scalar to multiply the ATR, by default is 2.
+
+ mamode : Literal[ema, sma, wma, hna, zlma, rma]
+ The mode to use for the moving average calculation, by default is ema.
+
+ offset : int
+ Number of periods to offset the result, by default is 0.
+
+MACD:
+
+ Parameters
+ ----------
+
+ fast : Union[int, NoneType]
+ Window length for the fast EMA, by default is 12.
+
+ slow : Union[int, NoneType]
+ Window length for the slow EMA, by default is 26.
+
+ signal : Union[int, NoneType]
+ Window length for the signal line, by default is 9.
+
+ scalar : Union[float, NoneType]
+ Scalar to multiply the MACD by, default is 100.
+
+OBV:
+
+ Parameters
+ ----------
+
+ offset : int
+ Number of periods to offset the result, by default is 0.
+
+RSI:
+
+ Parameters
+ ----------
+
+ length : int
+ Window length for the RSI, by default is 14.
+
+ scalar : float
+ Scalar to multiply the RSI by, default is 100.
+
+ drift : int
+ Drift value for the RSI, by default is 1.
+
+SRLines:
+
+ Parameters
+ ----------
+
+ show : bool
+ Show the support and resistance lines.
+
+Stoch:
+
+ Parameters
+ ----------
+
+ fast_k : int
+ The fast K period, by default 14.
+
+ slow_d : int
+ The slow D period, by default 3.
+
+ slow_k : int
+ The slow K period, by default 3.
+```
+
+The model can be converted to a dictionary and then passed through the `indicators` params.
+
+The chart below is built from the same object as the one above.
+
+```python
+indicators = data.charting.indicators().dict()
+macd=indicators.get("macd")
+kc=indicators.get("kc")
+chart_params=dict(
+ candles=False,
+ title="My New Chart",
+ indicators=(dict(
+ macd=macd,
+ kc=kc,
+ ))
+)
+data.charting.to_chart(**chart_params)
+```
+
+
+
+:::tip
+Data can be exported directly from the chart as a CSV. Use the button at the bottom-right of the mode bar.
+:::
diff --git a/openbb_platform/obbject_extensions/charting/installation.md b/openbb_platform/obbject_extensions/charting/installation.md
new file mode 100644
index 0000000000000000000000000000000000000000..2282d777aebb84003408c56b3cdc5919297155b3
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/installation.md
@@ -0,0 +1,71 @@
+---
+title: Installation
+sidebar_position: 1
+description: This page outlines the installation of the openbb-charting extension.
+keywords:
+- tutorial
+- OpenBB Platform
+- Installation
+- Python client
+- Fast API
+- getting started
+- extensions
+- charting
+- view
+- Plotly
+- toolkit
+- community
+- Plotly
+- OpenBBFigure
+- PyWry
+---
+
+import HeadTitle from '@site/src/components/General/HeadTitle.tsx';
+
+
+
+## PyPI
+
+To install the extension, run the following command in this folder:
+
+```bash
+pip install openbb-charting
+```
+
+> Find the latest version on [PyPI](https://pypi.org/project/openbb-charting/).
+
+## Editable Mode
+
+To install from source in editable mode, navigate into the folder, `~/openbb_platform/extensions/charting`, and enter:
+
+```console
+pip install -e .
+```
+
+After installation, the Python interface will automatically rebuild on initialization. This process can also be triggered manually with:
+
+```python
+import openbb
+openbb.build()
+```
+
+The Python interpreter may need to be restarted.
+
+## PyWry Dependency In Linux
+
+When using Linux distributions, the PyWry dependency requires certain dependencies to be installed first.
+
+- Debian-based / Ubuntu / Mint:
+`sudo apt install libwebkit2gtk-4.0-dev`
+
+- Arch Linux / Manjaro:
+`sudo pacman -S webkit2gtk`
+
+- Fedora:
+`sudo dnf install gtk3-devel webkit2gtk3-devel`
+
+If Rust (Cargo) is required, install it:
+
+```console
+curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
+```
diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..7076f5728f5610bbdcad78cccfe3e5e339ac4828
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py
@@ -0,0 +1,908 @@
+"""Integration tests for charting API."""
+
+import base64
+import json
+
+import pytest
+import requests
+from extensions.tests.conftest import parametrize
+from openbb_core.env import Env
+from openbb_core.provider.utils.helpers import get_querystring
+
+
+@pytest.fixture(scope="session")
+def headers():
+ """Headers fixture."""
+ return get_headers()
+
+
+# pylint:disable=redefined-outer-name
+
+data: dict = {}
+
+
+def get_headers():
+ """Get headers for requests."""
+ if "headers" in data:
+ return data["headers"]
+
+ userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}"
+ userpass_bytes = userpass.encode("ascii")
+ base64_bytes = base64.b64encode(userpass_bytes)
+
+ data["headers"] = {"Authorization": f"Basic {base64_bytes.decode('ascii')}"}
+ return data["headers"]
+
+
+def get_equity_data():
+ """Get equity data."""
+ if "stocks_data" in data:
+ return data["stocks_data"]
+
+ url = "http://0.0.0.0:8000/api/v1/equity/price/historical?symbol=AAPL&provider=fmp"
+ result = requests.get(url, headers=get_headers(), timeout=10)
+ data["stocks_data"] = result.json()["results"]
+
+ return data["stocks_data"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "AAPL",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_price_historical(params, headers):
+ """Test chart equity price historical.."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/equity/price/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=40)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "USDGBP",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_currency_price_historical(params, headers):
+ """Test chart currency price historical."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/currency/price/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=40)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "QQQ",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_historical(params, headers):
+ """Test chart etf historical."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/etf/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=40)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "NDX",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_index_price_historical(params, headers):
+ """Test chart index price historical."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/index/price/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=40)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "BTCUSD",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_crypto_price_historical(params, headers):
+ """Test chart crypto price historical."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/crypto/price/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=40)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "index": "date",
+ "length": "60",
+ "scalar": "90.0",
+ "drift": "2",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_adx(params, headers):
+ """Test chart ta adx."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/adx?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [{"data": "", "index": "date", "length": "30", "scalar": "110", "chart": True}],
+)
+@pytest.mark.integration
+def test_charting_technical_aroon(params, headers):
+ """Test chart ta aroon."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/aroon?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "",
+ "length": "60",
+ "offset": "10",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_ema(params, headers):
+ """Test chart ta ema."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/ema?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "2",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_hma(params, headers):
+ """Test chart ta hma."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/hma?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "fast": "10",
+ "slow": "30",
+ "signal": "10",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_macd(params, headers):
+ """Test chart ta macd."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/macd?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "16",
+ "scalar": "90.0",
+ "drift": "2",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_rsi(params, headers):
+ """Test chart ta rsi."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/rsi?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "2",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_sma(params, headers):
+ """Test chart ta sma."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/sma?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "60",
+ "offset": "10",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_wma(params, headers):
+ """Test chart ta wma."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/wma?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "5",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_zlma(params, headers):
+ """Test chart ta zlma."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/zlma?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "model": "yang_zhang",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_cones(params, headers):
+ """Test chart ta cones."""
+ params = {p: v for p, v in params.items() if v}
+ body = json.dumps(get_equity_data())
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/technical/cones?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "DGS10",
+ "transform": "pc1",
+ "chart": True,
+ "provider": "fred",
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_economy_fred_series(params, headers):
+ """Test chart ta cones."""
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/economy/fred_series?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "study": "price",
+ "benchmark": "SPY",
+ "long_period": 252,
+ "short_period": 21,
+ "window": 21,
+ "trading_periods": 252,
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_relative_rotation(params):
+ params = {p: v for p, v in params.items() if v}
+ data_params = dict(
+ symbol="AAPL,MSFT,GOOGL,AMZN,SPY",
+ provider="yfinance",
+ start_date="2022-01-01",
+ end_date="2024-01-01",
+ )
+ data_query_str = get_querystring(data_params, [])
+ data_url = f"http://0.0.0.0:8000/api/v1/equity/price/historical?{data_query_str}"
+ data_result = requests.get(data_url, headers=get_headers(), timeout=10).json()[
+ "results"
+ ]
+ body = json.dumps({"data": data_result})
+ query_str = get_querystring(params, ["data"])
+ url = f"http://0.0.0.0:8000/api/v1/technical/relative_rotation?{query_str}"
+ result = requests.post(url, headers=get_headers(), timeout=10, data=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK",
+ "chart": True,
+ "provider": "finviz",
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_price_performance(params, headers):
+ """Test chart equity price performance."""
+ params = {p: v for p, v in params.items() if v}
+ body = (
+ json.dumps(
+ {"extra_params": {"chart_params": {"limit": 4, "orientation": "h"}}}
+ ),
+ )
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/equity/price/performance?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK",
+ "chart": True,
+ "provider": "fmp",
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_price_performance(params, headers):
+ """Test chart equity price performance."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"orientation": "v"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/etf/price_performance?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT",
+ "chart": True,
+ "provider": "fmp",
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_holdings(params, headers):
+ """Test chart etf holdings."""
+ params = {p: v for p, v in params.items() if v}
+ body = (
+ json.dumps(
+ {"extra_params": {"chart_params": {"orientation": "v", "limit": 10}}}
+ ),
+ )
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/etf/holdings?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "econdb",
+ "country": "united_kingdom",
+ "date": None,
+ "chart": True,
+ }
+ ),
+ (
+ {
+ "provider": "fred",
+ "date": "2023-05-10,2024-05-10",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_fixedincome_government_yield_curve(params, headers):
+ """Test chart fixedincome government yield curve."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/fixedincome/government/yield_curve?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "provider": "yfinance",
+ "symbol": "ES",
+ "start_date": "2022-01-01",
+ "end_date": "2022-02-01",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_derivatives_futures_historical(params, headers):
+ """Test chart derivatives futures historical."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/historical?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "ES",
+ "date": None,
+ "chart": True,
+ }
+ ),
+ (
+ {
+ "provider": "cboe",
+ "symbol": "VX",
+ "date": "2024-06-25",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_derivatives_futures_curve(params, headers):
+ """Test chart derivatives futures curve."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/curve?{query_str}"
+ result = requests.get(url, headers=headers, timeout=30, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "provider": "fmp",
+ "symbol": "AAPL",
+ "start_date": "2024-01-01",
+ "end_date": "2024-06-30",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_historical_market_cap(params, headers):
+ """Test chart equity historical market cap."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/equity/historical_market_cap?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "bls",
+ "symbol": "APUS49D74714,APUS49D74715,APUS49D74716",
+ "start_date": "2014-01-01",
+ "end_date": "2024-07-01",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_economy_survey_bls_series(params, headers):
+ """Test chart economy survey bls series."""
+ params = {p: v for p, v in params.items() if v}
+ body = (json.dumps({"extra_params": {"chart_params": {"title": "test chart"}}}),)
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/economy/survey/bls_series?{query_str}"
+ result = requests.get(url, headers=headers, timeout=10, json=body)
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "method": "pearson",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_econometrics_correlation_matrix(params, headers):
+ """Test chart econometrics correlation matrix."""
+ # pylint:disable=import-outside-toplevel
+ from pandas import DataFrame
+
+ url = "http://0.0.0.0:8000/api/v1/equity/price/historical?symbol=AAPL,MSFT,GOOG&provider=yfinance"
+ result = requests.get(url, headers=headers, timeout=10)
+ df = DataFrame(result.json()["results"])
+ df = df.pivot(index="date", columns="symbol", values="close").reset_index()
+ body = df.to_dict(orient="records")
+
+ params = {p: v for p, v in params.items() if v}
+
+ query_str = get_querystring(params, [])
+ url = f"http://0.0.0.0:8000/api/v1/econometrics/correlation_matrix?{query_str}"
+ result = requests.post(url, headers=headers, timeout=10, data=json.dumps(body))
+
+ assert isinstance(result, requests.Response)
+ assert result.status_code == 200
+
+ chart = result.json()["chart"]
+ fig = chart.pop("fig", {})
+
+ assert chart
+ assert not fig
+ assert list(chart.keys()) == ["content", "format"]
diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d9481278ba6fe039ad456265a35b88920af5fe5
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py
@@ -0,0 +1,747 @@
+"""Test charting extension."""
+
+import pytest
+from extensions.tests.conftest import parametrize
+from openbb_charting.core.openbb_figure import OpenBBFigure
+from openbb_core.app.model.obbject import OBBject
+
+
+# pylint:disable=inconsistent-return-statements
+@pytest.fixture(scope="session")
+def obb(pytestconfig):
+ """Fixture to setup obb."""
+ if pytestconfig.getoption("markexpr") != "not integration":
+ import openbb # pylint:disable=import-outside-toplevel
+
+ return openbb.obb
+
+
+# pylint:disable=redefined-outer-name
+
+data: dict = {}
+
+
+def get_equity_data():
+ """Get equity data."""
+ import openbb # pylint:disable=import-outside-toplevel
+
+ if "stocks_data" in data:
+ return data["stocks_data"]
+
+ symbol = "AAPL"
+ provider = "fmp"
+
+ data["stocks_data"] = openbb.obb.equity.price.historical(
+ symbol=symbol, provider=provider
+ ).results
+ return data["stocks_data"]
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "AAPL",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_price_historical(params, obb):
+ """Test chart equity price historical."""
+ result = obb.equity.price.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "JPYUSD",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_currency_price_historical(params, obb):
+ """Test chart currency price historical."""
+ result = obb.currency.price.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "BTCUSD",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_crypto_price_historical(params, obb):
+ """Test chart crypto price historical."""
+ result = obb.crypto.price.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "NDX",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_index_price_historical(params, obb):
+ """Test chart index price historical."""
+ result = obb.index.price.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "QQQ",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_historical(params, obb):
+ """Test chart etf historical."""
+ result = obb.etf.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "index": "date",
+ "length": "60",
+ "scalar": "90.0",
+ "drift": "2",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_adx(params, obb):
+ """Test chart ta adx."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.adx(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "index": "date",
+ "length": "30",
+ "scalar": "110",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_aroon(params, obb):
+ """Test chart ta aroon."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.aroon(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "",
+ "length": "60",
+ "offset": "10",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_ema(params, obb):
+ """Test chart ta ema."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.ema(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "2",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_hma(params, obb):
+ """Test chart ta hma."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.hma(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "fast": "10",
+ "slow": "30",
+ "signal": "10",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_macd(params, obb):
+ """Test chart ta macd."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.macd(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "16",
+ "scalar": "90.0",
+ "drift": "2",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_rsi(params, obb):
+ """Test chart ta rsi."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.rsi(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "2",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_sma(params, obb):
+ """Test chart ta sma."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.sma(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "60",
+ "offset": "10",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_wma(params, obb):
+ """Test chart ta wma."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.wma(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "target": "high",
+ "index": "date",
+ "length": "55",
+ "offset": "5",
+ "chart": "True",
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_zlma(params, obb):
+ """Test chart ta zlma."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.zlma(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "model": "yang_zhang",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_cones(params, obb):
+ """Test chart ta cones."""
+ params = {p: v for p, v in params.items() if v}
+
+ params["data"] = get_equity_data()
+
+ result = obb.technical.cones(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "DGS10",
+ "transform": "pc1",
+ "chart": True,
+ "provider": "fred",
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_economy_fred_series(params, obb):
+ """Test chart economy fred series."""
+ result = obb.economy.fred_series(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "data": "",
+ "study": "price",
+ "benchmark": "SPY",
+ "long_period": 252,
+ "short_period": 21,
+ "window": 21,
+ "trading_periods": 252,
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_technical_relative_rotation(params, obb):
+ params["data"] = obb.equity.price.historical(
+ "AAPL,MSFT,GOOGL,AMZN,SPY",
+ provider="yfinance",
+ start_date="2022-01-01",
+ end_date="2024-01-01",
+ ).results
+ result = obb.technical.relative_rotation(
+ data=params["data"],
+ benchmark=params["benchmark"],
+ study=params["study"],
+ long_period=params["long_period"],
+ short_period=params["short_period"],
+ window=params["window"],
+ trading_periods=params["trading_periods"],
+ chart=params["chart"],
+ )
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results.rs_ratios) > 0 # type: ignore
+ assert result.chart.content # type: ignore
+ assert isinstance(result.chart.fig, OpenBBFigure) # type: ignore
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK",
+ "chart": True,
+ "provider": "finviz",
+ "chart_params": {"limit": 4, "orientation": "h"},
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_price_performance(params, obb):
+ """Test chart equity price performance."""
+ result = obb.equity.price.performance(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK",
+ "chart": True,
+ "provider": "fmp",
+ "chart_params": {"orientation": "v"},
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_price_performance(params, obb):
+ """Test chart etf price performance."""
+ result = obb.etf.price_performance(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": None,
+ "symbol": "XRT",
+ "chart": True,
+ "provider": "fmp",
+ "chart_params": {"orientation": "v", "limit": 10},
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_etf_holdings(params, obb):
+ """Test chart etf holdings."""
+ result = obb.etf.holdings(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "econdb",
+ "country": "united_kingdom",
+ "date": None,
+ "chart": True,
+ }
+ ),
+ (
+ {
+ "provider": "fred",
+ "date": "2023-05-10,2024-05-10",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_fixedincome_government_yield_curve(params, obb):
+ """Test chart fixedincome government yield curve."""
+ result = obb.fixedincome.government.yield_curve(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "provider": "yfinance",
+ "symbol": "ES",
+ "start_date": "2022-01-01",
+ "end_date": "2022-02-01",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_derivatives_futures_historical(params, obb):
+ """Test chart derivatives futures historical."""
+ result = obb.derivatives.futures.historical(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "yfinance",
+ "symbol": "ES",
+ "date": None,
+ "chart": True,
+ }
+ ),
+ (
+ {
+ "provider": "cboe",
+ "symbol": "VX",
+ "date": "2024-06-25",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_derivatives_futures_curve(params, obb):
+ """Test chart derivatives futures curve."""
+ result = obb.derivatives.futures.curve(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "fmp",
+ "symbol": "AAPL",
+ "start_date": "2024-01-01",
+ "end_date": "2024-06-30",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_equity_historical_market_cap(params, obb):
+ """Test chart equity historical market cap."""
+ result = obb.equity.historical_market_cap(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ (
+ {
+ "provider": "bls",
+ "symbol": "APUS49D74714,APUS49D74715,APUS49D74716",
+ "start_date": "2014-01-01",
+ "end_date": "2024-07-01",
+ "chart": True,
+ }
+ ),
+ ],
+)
+@pytest.mark.integration
+def test_charting_economy_survey_bls_series(params, obb):
+ """Test chart economy survey bls series."""
+ result = obb.economy.survey.bls_series(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
+
+
+@parametrize(
+ "params",
+ [
+ {
+ "data": "",
+ "method": "pearson",
+ "chart": True,
+ }
+ ],
+)
+@pytest.mark.integration
+def test_charting_econometrics_correlation_matrix(params, obb):
+ """Test chart econometrics correlation matrix."""
+
+ symbols = "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK".split(",")
+ params["data"] = (
+ obb.equity.price.historical(symbol=symbols, provider="yfinance")
+ .to_df()
+ .pivot(columns="symbol", values="close")
+ .filter(items=symbols, axis=1)
+ )
+ result = obb.econometrics.correlation_matrix(**params)
+ assert result
+ assert isinstance(result, OBBject)
+ assert len(result.results) > 0
+ assert result.chart.content
+ assert isinstance(result.chart.fig, OpenBBFigure)
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f3e8cab7d8797476827b0390f860d02c2130e307
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py
@@ -0,0 +1,25 @@
+"""OpenBB OBBject extension for charting."""
+
+import warnings
+
+from openbb_core.app.model.extension import Extension
+
+warnings.filterwarnings(
+ "ignore",
+ category=UserWarning,
+ module="openbb_core.app.model.extension",
+)
+
+
+def get_charting_module():
+ """Get the Charting module."""
+ # pylint: disable=import-outside-toplevel
+ import importlib
+
+ _Charting = importlib.import_module("openbb_charting.charting").Charting
+ return _Charting
+
+
+ext = Extension(name="charting", description="Create custom charts from OBBject data.")
+
+Charting = ext.obbject_accessor(get_charting_module())
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charting.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charting.py
new file mode 100644
index 0000000000000000000000000000000000000000..119a2b9337d37fa4678dac82bbb8451e3fcfe777
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charting.py
@@ -0,0 +1,681 @@
+"""Charting Class implementation."""
+
+# pylint: disable=too-many-arguments,unused-argument,too-many-positional-arguments
+
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Callable,
+ ClassVar,
+ Dict,
+ List,
+ Literal,
+ Optional,
+ Tuple,
+ Type,
+ Union,
+)
+from warnings import warn
+
+from importlib_metadata import entry_points
+from openbb_core.app.model.charts.chart import Chart
+from openbb_core.app.model.obbject import OBBject
+from openbb_core.provider.abstract.data import Data
+
+from openbb_charting.charts.helpers import (
+ get_charting_functions,
+ get_charting_functions_list,
+)
+
+if TYPE_CHECKING:
+ from numpy import ndarray # noqa
+ from pandas import DataFrame, Series # noqa
+ from plotly.graph_objs import Figure # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+ from openbb_charting.query_params import ChartParams # noqa
+ from openbb_charting.core.backend import Backend # noqa
+
+
+class Charting:
+ """Charting extension.
+
+ Methods
+ -------
+ show
+ Display chart and save it to the OBBject.
+ to_chart
+ Redraw the chart and save it to the OBBject, with an optional entry point for Data.
+ functions
+ Return a list of Platform commands with charting functions.
+ get_params
+ Return the charting parameters for the function the OBBject was created from.
+ indicators
+ Return the list of the available technical indicators to use with the `to_chart` method and OHLC+V data.
+ table
+ Display an interactive table.
+ create_line_chart
+ Create a line chart from external data.
+ create_bar_chart
+ Create a bar chart, on a single x-axis with one or more values for the y-axis, from external data.
+ create_correlation_matrix
+ Create a correlation matrix from external data.
+ toggle_chart_style
+ Toggle the chart style, of an existing chart, between light and dark mode.
+ """
+
+ _extension_views: ClassVar[List[Type]] = [
+ entry_point.load()
+ for entry_point in entry_points(group="openbb_charting_extension")
+ ]
+ _format = "plotly" # the charts computed by this extension will be in plotly format
+
+ def __init__(self, obbject):
+ """Initialize Charting extension."""
+ # pylint: disable=import-outside-toplevel
+ import importlib # noqa
+
+ charting_settings_module = importlib.import_module(
+ "openbb_core.app.model.charts.charting_settings", "ChartingSettings"
+ )
+ ChartingSettings = charting_settings_module.ChartingSettings
+
+ self._obbject: OBBject = obbject
+ self._charting_settings = ChartingSettings(
+ user_settings=self._obbject._user_settings, # type: ignore
+ system_settings=self._obbject._system_settings, # type: ignore
+ )
+ self._backend = self._handle_backend()
+ self._functions: Dict[str, Callable] = self._get_functions()
+
+ @classmethod
+ def indicators(cls):
+ """Return an instance of the IndicatorsParams class, containing all available indicators and their parameters.
+
+ Without assigning to a variable, it will print the the information to the console.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.query_params import IndicatorsParams
+
+ return IndicatorsParams()
+
+ @classmethod
+ def functions(cls) -> List[str]:
+ """Return a list of the available functions."""
+ functions: List[str] = []
+ for view in cls._extension_views:
+ functions.extend(get_charting_functions_list(view))
+
+ return functions
+
+ def _get_functions(self) -> Dict[str, Callable]:
+ """Return a dict with the available functions."""
+ functions: Dict[str, Callable] = {}
+ for view in self._extension_views:
+ functions.update(get_charting_functions(view))
+
+ return functions
+
+ def _handle_backend(self) -> "Backend":
+ """Create and start the backend."""
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.core.backend import create_backend, get_backend
+
+ create_backend(self._charting_settings)
+ backend = get_backend()
+ backend.start(debug=self._charting_settings.debug_mode)
+ return backend
+
+ def _get_chart_function(self, route: str) -> Callable:
+ """Given a route, it returns the chart function. The module must contain the given route."""
+ if route is None:
+ raise ValueError("OBBject was initialized with no function route.")
+ adjusted_route = route.replace("/", "_")[1:]
+ if adjusted_route not in self._functions:
+ raise ValueError(
+ f"Could not find the route `{adjusted_route}` in the charting functions."
+ )
+ return self._functions[adjusted_route]
+
+ def get_params(self) -> Union["ChartParams", None]:
+ """Return the ChartQueryParams class for the function the OBBject was created from.
+
+ Without assigning to a variable, it will print the docstring to the console.
+ If the class is not defined, the help for the function will be returned.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.query_params import ChartParams
+
+ if self._obbject._route is None: # pylint: disable=protected-access
+ raise ValueError("OBBject was initialized with no function route.")
+ charting_function = (
+ self._obbject._route # pylint: disable=protected-access
+ ).replace("/", "_")[1:]
+ if hasattr(ChartParams, charting_function):
+ return getattr(ChartParams, charting_function)()
+
+ return help( # type: ignore
+ self._get_chart_function( # pylint: disable=protected-access
+ self._obbject.extra[ # pylint: disable=protected-access
+ "metadata"
+ ].route
+ )
+ )
+
+ def _prepare_data_as_df(
+ self, data: Optional[Union["DataFrame", "Series"]]
+ ) -> Tuple["DataFrame", bool]:
+ """Convert supplied data to a DataFrame."""
+ # pylint: disable=import-outside-toplevel
+ from openbb_core.app.utils import basemodel_to_df, convert_to_basemodel
+ from pandas import DataFrame, Series
+
+ has_data = (
+ isinstance(data, (Data, DataFrame, Series)) and not data.empty # type: ignore
+ ) or (bool(data))
+ index = (
+ data.index.name
+ if has_data and isinstance(data, (DataFrame, Series))
+ else None
+ )
+ data_as_df: DataFrame = (
+ basemodel_to_df(convert_to_basemodel(data), index=index)
+ if has_data
+ else self._obbject.to_dataframe(index=index)
+ )
+ if "date" in data_as_df.columns:
+ data_as_df = data_as_df.set_index("date")
+ if "provider" in data_as_df.columns:
+ data_as_df.drop(columns="provider", inplace=True)
+ return data_as_df, has_data
+
+ # pylint: disable=too-many-locals
+ def create_line_chart(
+ self,
+ data: Union[
+ list,
+ dict,
+ "DataFrame",
+ List["DataFrame"],
+ "Series",
+ List["Series"],
+ "ndarray",
+ Data,
+ ],
+ index: Optional[str] = None,
+ target: Optional[str] = None,
+ title: Optional[str] = None,
+ x: Optional[str] = None,
+ xtitle: Optional[str] = None,
+ y: Optional[Union[str, List[str]]] = None,
+ ytitle: Optional[str] = None,
+ y2: Optional[Union[str, List[str]]] = None,
+ y2title: Optional[str] = None,
+ layout_kwargs: Optional[dict] = None,
+ scatter_kwargs: Optional[dict] = None,
+ normalize: bool = False,
+ returns: bool = False,
+ same_axis: bool = False,
+ render: bool = True,
+ **kwargs,
+ ) -> Union["OpenBBFigure", "Figure", None]:
+ """Create a line chart from external data and render a chart or return the OpenBBFigure.
+
+ Parameters
+ ----------
+ data : Union[Data, DataFrame, Series]
+ Data to be plotted (OHLCV data).
+ index : Optional[str], optional
+ Index column, by default None
+ target : Optional[str], optional
+ Target column to be plotted, by default None
+ title : Optional[str], optional
+ Chart title, by default None
+ x : Optional[str], optional
+ X-axis column, by default None
+ xtitle : Optional[str], optional
+ X-axis title, by default None
+ y : Optional[Union[str, List[str]]], optional
+ Y-axis column(s), by default None
+ If None are supplied, the layout is optimized for the contents of data.
+ Where many units/scales are present,
+ it will attempt to divide based on the range of values.
+ ytitle : Optional[str], optional
+ Y-axis title, by default None
+ y2 : Optional[Union[str, List[str]]], optional
+ Y2-axis column(s), by default None
+ y2title : Optional[str], optional
+ Y2-axis title, by default None
+ layout_kwargs : Optional[dict], optional
+ Additional Plotly Layout parameters for `fig.update_layout`, by default None
+ scatter_kwargs : Optional[dict], optional
+ Additional Plotly parameters applied on creation of each scatter plot, by default None
+ normalize : bool, optional
+ Normalize the data with Z-Score Standardization, by default False
+ returns : bool, optional
+ Convert the data to cumulative returns, by default False
+ same_axis: bool, optional
+ If True, forces all data onto the same Y-axis, by default False
+ render: bool, optional
+ If True, the chart will be rendered, by default True
+ **kwargs: Dict[str, Any]
+ Extra parameters to be passed to `figure.show()`
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.charts.generic_charts import line_chart
+
+ fig = line_chart(
+ data=data,
+ index=index,
+ target=target,
+ title=title,
+ x=x,
+ xtitle=xtitle,
+ y=y,
+ ytitle=ytitle,
+ y2=y2,
+ y2title=y2title,
+ layout_kwargs=layout_kwargs,
+ scatter_kwargs=scatter_kwargs,
+ normalize=normalize,
+ returns=returns,
+ same_axis=same_axis,
+ **kwargs,
+ )
+ fig = self._set_chart_style(fig)
+ if render:
+ return fig.show(**kwargs)
+
+ return fig
+
+ def create_bar_chart(
+ self,
+ data: Union[
+ list,
+ dict,
+ "DataFrame",
+ List["DataFrame"],
+ "Series",
+ List["Series"],
+ "ndarray",
+ Data,
+ ],
+ x: str,
+ y: Union[str, List[str]],
+ barmode: Literal["group", "stack", "relative", "overlay"] = "group",
+ xtype: Literal[
+ "category", "multicategory", "date", "log", "linear"
+ ] = "category",
+ title: Optional[str] = None,
+ xtitle: Optional[str] = None,
+ ytitle: Optional[str] = None,
+ orientation: Literal["h", "v"] = "v",
+ colors: Optional[List[str]] = None,
+ layout_kwargs: Optional[Dict[str, Any]] = None,
+ bar_kwargs: Optional[Dict[str, Any]] = None,
+ render: bool = True,
+ **kwargs,
+ ) -> Union["OpenBBFigure", "Figure", None]:
+ """Create a bar chart on a single x-axis with one or more values for the y-axis.
+
+ Parameters
+ ----------
+ data : Union[list, dict, DataFrame, List[DataFrame], Series, List[Series], ndarray, Data]
+ Data to plot.
+ x : str
+ The x-axis column name.
+ y : Union[str, List[str]]
+ The y-axis column name(s).
+ barmode : Literal["group", "stack", "relative", "overlay"], optional
+ The bar mode, by default "group".
+ xtype : Literal["category", "multicategory", "date", "log", "linear"], optional
+ The x-axis type, by default "category".
+ title : str, optional
+ The title of the chart, by default None.
+ xtitle : str, optional
+ The x-axis title, by default None.
+ ytitle : str, optional
+ The y-axis title, by default None.
+ colors: List[str], optional
+ Manually set the colors to cycle through for each column in 'y', by default None.
+ bar_kwargs : Dict[str, Any], optional
+ Additional keyword arguments to apply with figure.add_bar(), by default None.
+ layout_kwargs : Dict[str, Any], optional
+ Additional keyword arguments to apply with figure.update_layout(), by default None.
+ Returns
+ -------
+ OpenBBFigure
+ The OpenBBFigure object.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.charts.generic_charts import bar_chart
+
+ fig = bar_chart(
+ data=data,
+ x=x,
+ y=y,
+ barmode=barmode,
+ xtype=xtype,
+ title=title,
+ xtitle=xtitle,
+ ytitle=ytitle,
+ orientation=orientation,
+ colors=colors,
+ bar_kwargs=bar_kwargs,
+ layout_kwargs=layout_kwargs,
+ )
+ fig = self._set_chart_style(fig)
+ if render:
+ return fig.show(**kwargs)
+
+ return fig
+
+ def create_correlation_matrix(
+ self,
+ data: Union[
+ list[Data],
+ "DataFrame",
+ ],
+ method: Literal["pearson", "kendall", "spearman"] = "pearson",
+ colorscale: str = "RdBu",
+ title: str = "Asset Correlation Matrix",
+ layout_kwargs: Optional[Dict[str, Any]] = None,
+ ):
+ """Create a correlation matrix from external data.
+
+ Parameters
+ ----------
+ data : Union[list[Data], DataFrame]
+ Input dataset.
+ method : Literal["pearson", "kendall", "spearman"]
+ Method to use for correlation calculation. Default is "pearson".
+ pearson : standard correlation coefficient
+ kendall : Kendall Tau correlation coefficient
+ spearman : Spearman rank correlation
+ colorscale : str
+ Plotly colorscale to use for the heatmap. Default is "RdBu".
+ title : str
+ Title of the chart. Default is "Asset Correlation Matrix".
+ layout_kwargs : Dict[str, Any]
+ Additional keyword arguments to apply with figure.update_layout(), by default None.
+
+ Returns
+ -------
+ OpenBBFigure
+ The OpenBBFigure object.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.charts.correlation_matrix import correlation_matrix
+
+ kwargs = {
+ "data": data,
+ "method": method,
+ "colorscale": colorscale,
+ "title": title,
+ "layout_kwargs": layout_kwargs,
+ }
+ fig, _ = correlation_matrix(**kwargs)
+ fig = self._set_chart_style(fig)
+ return fig
+
+ # pylint: disable=inconsistent-return-statements
+ def show(self, render: bool = True, **kwargs):
+ """Display chart and save it to the OBBject."""
+ try:
+ charting_function = self._get_chart_function(
+ self._obbject._route # pylint: disable=protected-access
+ )
+ kwargs["obbject_item"] = self._obbject.results
+ kwargs["charting_settings"] = self._charting_settings
+ kwargs["standard_params"] = (
+ self._obbject._standard_params # pylint: disable=protected-access
+ )
+ kwargs["extra_params"] = (
+ self._obbject._extra_params # pylint: disable=protected-access
+ )
+ kwargs["provider"] = self._obbject.provider
+ kwargs["extra"] = self._obbject.extra
+ fig, content = charting_function(**kwargs)
+ fig = self._set_chart_style(fig)
+ content = fig.show(external=True, **kwargs).to_plotly_json()
+ self._obbject.chart = Chart(fig=fig, content=content, format=self._format)
+ if render:
+ fig.show(**kwargs)
+ except Exception: # pylint: disable=W0718
+ try:
+ fig = self.create_line_chart(data=self._obbject.results, render=False, **kwargs) # type: ignore
+ fig = self._set_chart_style(fig)
+ content = fig.show(external=True, **kwargs).to_plotly_json() # type: ignore
+ self._obbject.chart = Chart(
+ fig=fig, content=content, format=self._format
+ )
+ if render:
+ return fig.show(**kwargs) # type: ignore
+ except Exception as e:
+ raise RuntimeError(
+ "Failed to automatically create a generic chart with the data provided."
+ ) from e
+
+ # pylint: disable=too-many-locals,inconsistent-return-statements
+ def to_chart(
+ self,
+ data: Optional[
+ Union[
+ list,
+ dict,
+ "DataFrame",
+ List["DataFrame"],
+ "Series",
+ List["Series"],
+ "ndarray",
+ Data,
+ ]
+ ] = None,
+ target: Optional[str] = None,
+ index: Optional[str] = None,
+ indicators: Optional[Dict[str, Dict[str, Any]]] = None,
+ symbol: str = "",
+ candles: bool = True,
+ volume: bool = True,
+ volume_ticks_x: int = 7,
+ render: bool = True,
+ **kwargs,
+ ):
+ """Create an OpenBBFigure with user customizations (if any) and save it to the OBBject.
+
+ This function is used to populate, or re-populate, the OBBject with a chart using the data within
+ the OBBject or external data supplied via the `data` parameter.
+ This function modifies the original OBBject by overwriting the existing chart.
+
+ Parameters
+ ----------
+ data : Union[Data, DataFrame, Series]
+ Data to be plotted.
+ indicators : Dict[str, Dict[str, Any]], optional
+ Indicators to be plotted, by default None
+ symbol : str, optional
+ Symbol to be plotted. This is used for labels and titles, by default ""
+ candles : bool, optional
+ If True, candles will be plotted, by default True
+ volume : bool, optional
+ If True, volume will be plotted, by default True
+ volume_ticks_x : int, optional
+ Volume ticks, by default 7
+ render : bool, optional
+ If True, the chart will be rendered, by default True
+ kwargs: Dict[str, Any]
+ Extra parameters to be passed to the chart constructor.
+
+ Examples
+ --------
+ Plotting a time series with TA indicators
+
+ >>> from openbb import obb
+ >>> res = obb.equity.price.historical("AAPL")
+ >>> indicators = dict(
+ >>> sma=dict(length=[20,30,50]),
+ >>> adx=dict(length=14),
+ >>> rsi=dict(length=14),
+ >>> macd=dict(fast=12, slow=26, signal=9),
+ >>> bbands=dict(length=20, std=2),
+ >>> stoch=dict(length=14),
+ >>> ema=dict(length=[20,30,50]),
+ >>> )
+ >>> res.charting.to_chart(**{"indicators": indicators})
+
+ Get all the available indicators
+
+ >>> res = obb.equity.price.historical("AAPL")
+ >>> indicators = res.charting.indicators()
+ >>> indicators?
+ """
+ data_as_df, has_data = self._prepare_data_as_df(data) # type: ignore
+ if target is not None:
+ data_as_df = data_as_df[[target]]
+ kwargs["candles"] = candles
+ kwargs["volume"] = volume
+ kwargs["volume_ticks_x"] = volume_ticks_x
+ kwargs["indicators"] = indicators if indicators else {}
+ kwargs["symbol"] = symbol
+ kwargs["target"] = target
+ kwargs["index"] = index
+ kwargs["obbject_item"] = self._obbject.results
+ kwargs["charting_settings"] = self._charting_settings
+ kwargs["standard_params"] = (
+ self._obbject._standard_params # pylint: disable=protected-access
+ )
+ kwargs["extra_params"] = (
+ self._obbject._extra_params # pylint: disable=protected-access
+ )
+ kwargs["provider"] = self._obbject.provider # pylint: disable=protected-access
+ kwargs["extra"] = self._obbject.extra # pylint: disable=protected-access
+ try:
+ if has_data:
+ self.show(data=data_as_df, render=render, **kwargs)
+ else:
+ self.show(**kwargs, render=render)
+ except Exception: # pylint: disable=W0718
+ try:
+ fig = self.create_line_chart(data=data_as_df, render=False, **kwargs)
+ fig = self._set_chart_style(fig)
+ content = fig.show(external=True, **kwargs).to_plotly_json() # type: ignore
+ self._obbject.chart = Chart(
+ fig=fig, content=content, format=self._format
+ )
+ if render:
+ return fig.show(**kwargs) # type: ignore
+ except Exception as e: # pylint: disable=W0718
+ raise RuntimeError(
+ "Failed to automatically create a generic chart with the data provided."
+ ) from e
+
+ def _set_chart_style(self, figure: "Figure"):
+ """Set the user preference for light or dark mode."""
+ style = self._charting_settings.chart_style
+ font_color = "black" if style == "light" else "white"
+ paper_bgcolor = "white" if style == "light" else "black"
+ figure = figure.update_layout(
+ dict( # pylint: disable=R1735
+ font_color=font_color, paper_bgcolor=paper_bgcolor
+ )
+ )
+ return figure
+
+ def toggle_chart_style(self):
+ """Toggle the chart style between light and dark mode."""
+ if not hasattr(self._obbject.chart, "fig"):
+ raise ValueError(
+ "Error: No chart has been created. Please create a chart first."
+ )
+ current = self._charting_settings.chart_style
+ new = "light" if current == "dark" else "dark"
+ self._charting_settings.chart_style = new
+ figure = self._obbject.chart.fig # type: ignore[union-attr]
+ updated_figure = self._set_chart_style(figure)
+ self._obbject.chart.fig = updated_figure # type: ignore[union-attr]
+ self._obbject.chart.content = updated_figure.show( # type: ignore[union-attr]
+ external=True
+ ).to_plotly_json()
+
+ @staticmethod
+ def _convert_to_string(x):
+ """Sanitize the data for the table."""
+ # pylint: disable=import-outside-toplevel
+ from numpy import isnan
+
+ if isinstance(x, (float, int)) and not isnan(x):
+ return x
+ if isinstance(x, dict):
+ return ", ".join([str(v) for v in x.values()])
+ if isinstance(x, list):
+ if all(isinstance(i, dict) for i in x):
+ return ", ".join(
+ str(", ".join([str(v) for v in i.values()])) for i in x
+ )
+ return ", ".join([str(i) for i in x])
+
+ return (
+ str(x)
+ .replace("[", "")
+ .replace("]", "")
+ .replace("'{", "")
+ .replace("}'", "")
+ .replace("nan", "")
+ )
+
+ def table(
+ self,
+ data: Optional[Union["DataFrame", "Series"]] = None,
+ title: str = "",
+ ):
+ """Display an interactive table.
+
+ Parameters
+ ----------
+ data : Optional[Union[DataFrame, Series]], optional
+ Data to be plotted, by default None.
+ If no data is provided the OBBject results will be used.
+ title : str, optional
+ Title of the table, by default "".
+ """
+ # pylint: disable=import-outside-toplevel
+ from pandas import RangeIndex
+
+ data_as_df, _ = self._prepare_data_as_df(data)
+ if isinstance(data_as_df.index, RangeIndex):
+ data_as_df.reset_index(inplace=True, drop=True)
+ else:
+ data_as_df.reset_index(inplace=True)
+ for col in data_as_df.columns:
+ data_as_df[col] = data_as_df[col].apply(self._convert_to_string)
+ if self._backend.isatty:
+ try:
+ self._backend.send_table(
+ df_table=data_as_df,
+ title=title
+ or self._obbject._route, # pylint: disable=protected-access
+ theme=self._charting_settings.table_style,
+ )
+ except Exception as e: # pylint: disable=W0718
+ warn(f"Failed to show figure with backend. {e}")
+
+ else:
+ from plotly import optional_imports
+
+ ipython_display = optional_imports.get_module("IPython.display")
+ if ipython_display:
+ ipython_display.display(ipython_display.HTML(data_as_df.to_html()))
+ else:
+ warn("IPython.display is not available.")
+
+ def url(
+ self,
+ url: str,
+ title: str = "",
+ width: Optional[int] = None,
+ height: Optional[int] = None,
+ ):
+ """Return the URL of the chart."""
+ try:
+ self._backend.send_url(url=url, title=title, width=width, height=height)
+ except Exception as e: # pylint: disable=W0718
+ warn(f"Failed to show figure with backend. {e}")
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..cdba7aca0feaa5f29fb351f97298121cafe8ffb6
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/__init__.py
@@ -0,0 +1 @@
+"""OpenBB Charting utils."""
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/correlation_matrix.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/correlation_matrix.py
new file mode 100644
index 0000000000000000000000000000000000000000..6321f263e04cd98c92349787e1c1ab97fc7c2ddf
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/correlation_matrix.py
@@ -0,0 +1,119 @@
+"""Correlation Matrix Chart."""
+
+from typing import TYPE_CHECKING, Any, Union
+
+if TYPE_CHECKING:
+ from plotly.graph_objs import Figure # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+
+
+def correlation_matrix( # noqa: PLR0912
+ **kwargs,
+) -> tuple[Union["OpenBBFigure", "Figure"], dict[str, Any]]:
+ """Correlation Matrix Chart."""
+ # pylint: disable=import-outside-toplevel
+ from numpy import ones_like, triu # noqa
+ from openbb_core.app.utils import basemodel_to_df # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure
+ from openbb_charting.core.chart_style import ChartStyle
+ from plotly.graph_objs import Figure, Heatmap, Layout
+ from pandas import DataFrame
+
+ if "data" in kwargs and isinstance(kwargs["data"], DataFrame):
+ corr = kwargs["data"]
+ elif "data" in kwargs and isinstance(kwargs["data"], list):
+ corr = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "date")) # type: ignore
+ else:
+ corr = basemodel_to_df(
+ kwargs["obbject_item"], index=kwargs.get("index", "date") # type: ignore
+ )
+ if (
+ "symbol" in corr.columns
+ and len(corr.symbol.unique()) > 1
+ and "close" in corr.columns
+ ):
+ corr = corr.pivot(
+ columns="symbol",
+ values="close",
+ )
+
+ method = kwargs.get("method") or "pearson"
+ corr = corr.corr(method=method, numeric_only=True)
+
+ X = corr.columns.to_list()
+ x_replace = X[-1]
+ Y = X.copy()
+ y_replace = Y[0]
+ X = [x if x != x_replace else "" for x in X]
+ Y = [y if y != y_replace else "" for y in Y]
+ mask = triu(ones_like(corr, dtype=bool))
+ df = corr.mask(mask)
+ title = kwargs.get("title") or "Asset Correlation Matrix"
+ text_color = "white" if ChartStyle().plt_style == "dark" else "black"
+ colorscale = kwargs.get("colorscale") or "RdBu"
+
+ heatmap = Heatmap(
+ z=df,
+ x=X,
+ y=Y,
+ xgap=1,
+ ygap=1,
+ colorscale=colorscale,
+ colorbar=dict(
+ orientation="v",
+ x=0.8,
+ y=0.5,
+ xanchor="left",
+ yanchor="middle",
+ xref="container",
+ yref="paper",
+ len=0.66,
+ bgcolor="rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)",
+ ),
+ text=df.fillna(""),
+ texttemplate="%{text:.4f}",
+ hoverongaps=False,
+ hovertemplate="%{x} - %{y} : %{z:.4f}",
+ )
+ layout = Layout(
+ title=title,
+ title_x=0.5,
+ xaxis=dict(
+ showgrid=False,
+ showline=False,
+ ticklen=0,
+ domain=[0.03, 1],
+ tickangle=90,
+ automargin=False,
+ ),
+ yaxis=dict(
+ showgrid=False,
+ side="left",
+ autorange="reversed",
+ showline=False,
+ ticklen=0,
+ automargin="height+width+left",
+ tickmode="auto",
+ ),
+ margin=dict(l=10, r=0, t=0, b=10),
+ dragmode="pan",
+ )
+ fig = Figure(data=[heatmap], layout=layout)
+ figure = OpenBBFigure(fig=fig)
+ figure.update_layout(
+ font=dict(color=text_color),
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ )
+ layout_kwargs = kwargs.get("layout_kwargs", {})
+
+ if layout_kwargs:
+ figure.update_layout(**layout_kwargs)
+
+ content = figure.show(external=True).to_plotly_json() # type: ignore
+
+ return figure, content
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/generic_charts.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/generic_charts.py
new file mode 100644
index 0000000000000000000000000000000000000000..003a557f33102318ad39499db04589274872d3c0
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/generic_charts.py
@@ -0,0 +1,654 @@
+"""Generic Charts Module."""
+
+# pylint: disable=too-many-arguments,unused-argument,too-many-locals, too-many-branches, too-many-lines, too-many-statements, use-dict-literal, broad-exception-caught, too-many-nested-blocks, too-many-positional-arguments
+
+from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union
+
+from openbb_core.app.utils import basemodel_to_df, convert_to_basemodel
+from openbb_core.provider.abstract.data import Data
+
+from openbb_charting.charts.helpers import (
+ calculate_returns,
+ should_share_axis,
+ z_score_standardization,
+)
+from openbb_charting.core.chart_style import ChartStyle
+from openbb_charting.styles.colors import LARGE_CYCLER
+
+if TYPE_CHECKING:
+ from numpy import ndarray # noqa
+ from pandas import DataFrame, Series # noqa
+ from plotly.graph_objs import Figure # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+
+
+def line_chart( # noqa: PLR0912
+ data: Union[
+ list,
+ dict,
+ "DataFrame",
+ List["DataFrame"],
+ "Series",
+ List["Series"],
+ "ndarray",
+ Data,
+ ],
+ index: Optional[str] = None,
+ target: Optional[str] = None,
+ title: Optional[str] = None,
+ x: Optional[str] = None,
+ xtitle: Optional[str] = None,
+ y: Optional[Union[str, List[str]]] = None,
+ ytitle: Optional[str] = None,
+ y2: Optional[Union[str, List[str]]] = None,
+ y2title: Optional[str] = None,
+ layout_kwargs: Optional[dict] = None,
+ scatter_kwargs: Optional[dict] = None,
+ normalize: bool = False,
+ returns: bool = False,
+ same_axis: bool = False,
+ **kwargs,
+) -> Union["OpenBBFigure", "Figure"]:
+ """Create a line chart."""
+ # pylint: disable=import-outside-toplevel
+ from pandas import DataFrame, Series, to_datetime # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure
+
+ if data is None:
+ raise ValueError("Error: Data is a required field.")
+
+ auto_layout = False
+ index = (
+ data.index.name
+ if isinstance(data, (DataFrame, Series))
+ else index if index is not None else x if x is not None else "date"
+ )
+ df: DataFrame = (basemodel_to_df(convert_to_basemodel(data), index=index)).dropna(
+ how="all", axis=1
+ )
+
+ if df.index.name is None:
+ if "date" in df.columns:
+ df.date = df.date.apply(to_datetime)
+ df.set_index("date", inplace=True)
+ else:
+ found_index = False
+ for col in df.columns:
+ if df[col].dtype == "object":
+ try:
+ df[col] = df[col].apply(to_datetime)
+ index = df[col].name # type: ignore
+ df.set_index(col, inplace=True)
+ df.index.name = "date"
+ found_index = True
+ except Exception as _: # noqa: S112
+ continue
+ if found_index is True:
+ break
+ if found_index is False:
+ df.set_index(df.iloc[:, 0], inplace=True)
+
+ if "symbol" in df.columns and len(df.symbol.unique()) > 1:
+ df = df.pivot(columns="symbol", values=target if target else "close")
+
+ if "symbol" not in df.columns and target in df.columns:
+ df = df[[target]]
+
+ y = y.split(",") if isinstance(y, str) else y
+
+ if y is None or same_axis is True:
+ y = df.columns.to_list()
+ auto_layout = True
+
+ if same_axis is True:
+ auto_layout = False
+
+ if returns is True:
+ df = df.apply(calculate_returns)
+ auto_layout = False
+
+ if normalize is True:
+ df = df.apply(z_score_standardization)
+ auto_layout = False
+
+ if layout_kwargs is None:
+ layout_kwargs = {}
+
+ if scatter_kwargs is None:
+ scatter_kwargs = {}
+
+ try:
+ fig = OpenBBFigure()
+ except Exception as _:
+ fig = OpenBBFigure(create_backend=True)
+
+ fig.update_layout(ChartStyle().plotly_template.get("layout", {}))
+ text_color = "white" if ChartStyle().plt_style == "dark" else "black"
+ title = f"{title}" if title else ""
+ xtitle = xtitle if xtitle else ""
+ y1title = ytitle if ytitle else ""
+ y2title = y2title if y2title else ""
+ y2 = y2 if y2 else []
+ yaxis_num = 1
+ yaxis = f"y{yaxis_num}"
+ first_y = y[0] # type: ignore[index]
+ second_y = None
+ third_y = None
+ add_scatter = False
+
+ # Attempt to layout the chart automatically with multiple y-axis.
+ mode = scatter_kwargs.pop("mode", "lines")
+ hovertemplate = scatter_kwargs.pop("hovertemplate", None)
+
+ if auto_layout is True:
+ # Sort columns by the difference between the max and min values.
+ # This is to help determine which columns should share the same y-axis.
+ diff = df.max(numeric_only=True) - df.min(numeric_only=True)
+ sorted_columns = diff.sort_values(ascending=False).index
+ if sorted_columns is None or len(sorted_columns) == 0:
+ raise ValueError("Error: expected data with numeric values.")
+ df = df[sorted_columns]
+
+ for i, col in enumerate(df.columns):
+
+ if col in y: # type: ignore[operator]
+ hovertemplate = (
+ hovertemplate
+ if hovertemplate
+ else f"{df[col].name}: %{{y}}"
+ )
+ share_yaxis = should_share_axis(df, first_y, col, threshold=2.5)
+ if share_yaxis is True:
+ add_scatter = True
+ if share_yaxis is False:
+ yaxis_num = 2
+ yaxis = f"y{yaxis_num}"
+ if second_y is None:
+ second_y = col
+ add_scatter = True
+ if second_y is not None:
+ add_scatter = False
+ share_yaxis = should_share_axis(df, col, second_y, threshold=3)
+ if share_yaxis is True:
+ add_scatter = True
+ if share_yaxis is False:
+ yaxis_num = 3
+ yaxis = f"y{yaxis_num}"
+ third_y = col
+ add_scatter = True
+
+ if add_scatter is True:
+ fig = fig.add_scatter(
+ x=df.index,
+ y=df[col],
+ name=col,
+ mode=mode,
+ line=dict(width=1, color=LARGE_CYCLER[i % len(LARGE_CYCLER)]),
+ hovertemplate=hovertemplate,
+ hoverlabel=dict(font_size=10),
+ yaxis=yaxis,
+ **scatter_kwargs,
+ )
+
+ if auto_layout is False:
+ color = 0
+ for i, col in enumerate(y): # type: ignore[arg-type]
+ hovertemplate = (
+ hovertemplate
+ if hovertemplate
+ else f"{df[col].name}: %{{y}}"
+ )
+ fig = fig.add_scatter(
+ x=df.index,
+ y=df[col],
+ name=col,
+ mode=mode,
+ line=dict(width=1, color=LARGE_CYCLER[color]),
+ hovertemplate=hovertemplate,
+ hoverlabel=dict(font_size=10),
+ yaxis="y1",
+ **scatter_kwargs,
+ )
+ color += 1
+ if y2:
+ second_y = y2[0]
+ for i, col in enumerate(y2):
+ hovertemplate = (
+ hovertemplate
+ if hovertemplate
+ else f"{df[col].name}: %{{y}}"
+ )
+ fig = fig.add_scatter(
+ x=df.index,
+ y=df[col],
+ name=col,
+ mode=mode,
+ line=dict(width=1, color=LARGE_CYCLER[color]),
+ hovertemplate=hovertemplate,
+ hoverlabel=dict(font_size=10),
+ yaxis="y2",
+ **scatter_kwargs,
+ )
+ color += 1
+
+ if returns is True:
+ y1title = "Percent"
+ title = f"{title} - Cumulative Returns" if title else "Cumulative Returns"
+
+ if normalize is True:
+ y1title = "Z-Score"
+ title = f"{title} - Z-Score" if title else "Z-Score"
+
+ if not title and target is not None:
+ title = f"{target.replace('_', ' ').title()}"
+
+ fig.update_layout(
+ title=dict(text=title if title else None, x=0.5, font=dict(size=16)),
+ font=dict(color=text_color),
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ legend=dict(
+ orientation="v",
+ yanchor="top",
+ xanchor="right",
+ y=0.95,
+ x=-0.01,
+ xref="paper",
+ font=dict(size=12),
+ bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ ),
+ yaxis=(
+ dict(
+ ticklen=0,
+ side="right",
+ title=dict(
+ text=y1title if ytitle else None, standoff=30, font=dict(size=16)
+ ),
+ tickfont=dict(size=14),
+ anchor="x",
+ showgrid=True,
+ mirror=True,
+ showline=True,
+ zeroline=False,
+ gridcolor="rgba(128,128,128,0.25)",
+ )
+ ),
+ yaxis2=(
+ dict(
+ overlaying="y",
+ side="left",
+ ticklen=0,
+ showgrid=False,
+ showline=True,
+ zeroline=False,
+ mirror=True,
+ title=dict(
+ text=y2title if y2title else None, standoff=10, font=dict(size=16)
+ ),
+ tickfont=dict(size=14),
+ anchor="x",
+ )
+ ),
+ yaxis3=(
+ dict(
+ overlaying="y",
+ side="left",
+ ticklen=0,
+ position=0,
+ showgrid=False,
+ showline=False,
+ zeroline=False,
+ showticklabels=True,
+ mirror=False,
+ tickfont=dict(size=12, color="rgba(128,128,128,0.75)"),
+ anchor="free",
+ )
+ ),
+ xaxis=dict(
+ ticklen=0,
+ showgrid=True,
+ title=(
+ dict(text=xtitle, standoff=30, font=dict(size=16)) if xtitle else None
+ ),
+ zeroline=False,
+ showline=True,
+ mirror=True,
+ gridcolor="rgba(128,128,128,0.25)",
+ domain=[0.095, 0.95] if third_y else None,
+ ),
+ margin=dict(r=25, l=25) if normalize is False else None,
+ autosize=True,
+ dragmode="pan",
+ hovermode="x",
+ )
+
+ if df.index.name not in ("date", "timestamp"):
+ fig.update_xaxes(type="category")
+
+ if layout_kwargs:
+ fig.update_layout(
+ **layout_kwargs,
+ )
+
+ return fig
+
+
+def bar_chart( # noqa: PLR0912
+ data: Union[
+ list,
+ dict,
+ "DataFrame",
+ List["DataFrame"],
+ "Series",
+ List["Series"],
+ "ndarray",
+ Data,
+ ],
+ x: str,
+ y: Union[str, List[str]],
+ barmode: Literal["group", "stack", "relative", "overlay"] = "group",
+ xtype: Literal["category", "multicategory", "date", "log", "linear"] = "category",
+ title: Optional[str] = None,
+ xtitle: Optional[str] = None,
+ ytitle: Optional[str] = None,
+ orientation: Literal["h", "v"] = "v",
+ colors: Optional[List[str]] = None,
+ bar_kwargs: Optional[Dict[str, Any]] = None,
+ layout_kwargs: Optional[Dict[str, Any]] = None,
+ **kwargs,
+) -> Union["OpenBBFigure", "Figure"]:
+ """Create a vertical bar chart on a single x-axis with one or more values for the y-axis.
+
+ Parameters
+ ----------
+ data : Union[
+ list, dict, "DataFrame", List["DataFrame"], "Series", List["Series"], "ndarray", Data
+ ]
+ Data to plot.
+ x : str
+ The x-axis column name.
+ y : Union[str, List[str]]
+ The y-axis column name(s).
+ barmode : Literal["group", "stack", "relative", "overlay"], optional
+ The bar mode, by default "group".
+ xtype : Literal["category", "multicategory", "date", "log", "linear"], optional
+ The x-axis type, by default "category".
+ title : str, optional
+ The title of the chart, by default None.
+ xtitle : str, optional
+ The x-axis title, by default None.
+ ytitle : str, optional
+ The y-axis title, by default None.
+ colors: List[str], optional
+ Manually set the colors to cycle through for each column in 'y', by default None.
+ bar_kwargs : Dict[str, Any], optional
+ Additional keyword arguments to apply with figure.add_bar(), by default None.
+ layout_kwargs : Dict[str, Any], optional
+ Additional keyword arguments to apply with figure.update_layout(), by default None.
+
+ Returns
+ -------
+ OpenBBFigure
+ The OpenBBFigure object.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.core.openbb_figure import OpenBBFigure
+
+ try:
+ figure = OpenBBFigure()
+ except Exception as _:
+ figure = OpenBBFigure(create_backend=True)
+
+ figure = figure.create_subplots(
+ 1,
+ 1,
+ shared_xaxes=True,
+ vertical_spacing=0.06,
+ horizontal_spacing=0.01,
+ row_width=[1],
+ specs=[[{"secondary_y": True}]],
+ )
+
+ figure.update_layout(ChartStyle().plotly_template.get("layout", {}))
+ text_color = "white" if ChartStyle().plt_style == "dark" else "black"
+ if colors is not None:
+ figure.update_layout(colorway=colors)
+ if bar_kwargs is None:
+ bar_kwargs = {}
+ if isinstance(data, (Data, list, dict)):
+ data = basemodel_to_df(convert_to_basemodel(data), index=None)
+
+ bar_df = data.copy().set_index(x) # type: ignore
+ y = y.split(",") if isinstance(y, str) else y
+ hovertemplate = bar_kwargs.pop("hovertemplate", None)
+ width = bar_kwargs.pop("width", None)
+ for item in y:
+ figure.add_bar(
+ x=bar_df.index if orientation == "v" else bar_df[item],
+ y=bar_df[item] if orientation == "v" else bar_df.index,
+ name=bar_df[item].name,
+ showlegend=len(y) > 1,
+ legendgroup=bar_df[item].name,
+ orientation=orientation,
+ hovertemplate=(
+ hovertemplate
+ if hovertemplate
+ else (
+ "%{fullData.name}:%{y}"
+ if orientation == "v"
+ else "%{fullData.name}:%{x}"
+ )
+ ),
+ width=(
+ width
+ if width
+ else 0.95 / len(y) * 0.75 if barmode == "group" and len(y) > 1 else 0.95
+ ),
+ **bar_kwargs,
+ )
+
+ figure.update_layout(
+ title=dict(text=title if title else None, x=0.5, font=dict(size=16)),
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rbga(255,255,255,0)"
+ ),
+ legend=dict(
+ orientation="v",
+ yanchor="top",
+ xanchor="right",
+ y=0.95,
+ x=-0.01 if orientation == "v" else 1.01,
+ xref="paper",
+ font=dict(size=12),
+ bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ ),
+ xaxis=dict(
+ type=xtype,
+ title=dict(
+ text=xtitle if xtitle else None, standoff=30, font=dict(size=16)
+ ),
+ ticklen=0,
+ showgrid=orientation == "h",
+ tickfont=dict(size=12, family="sans-serif"),
+ categoryorder="array" if orientation == "v" else None,
+ categoryarray=bar_df.index if orientation == "v" else None,
+ ),
+ yaxis=dict(
+ title=dict(
+ text=ytitle if ytitle else None, standoff=30, font=dict(size=16)
+ ),
+ ticklen=0,
+ showgrid=orientation == "v",
+ tickfont=dict(size=12),
+ side="left" if orientation == "h" else "right",
+ categoryorder="array" if orientation == "h" else None,
+ categoryarray=bar_df.index if orientation == "h" else None,
+ ),
+ margin=dict(pad=5),
+ barmode=barmode,
+ font=dict(color=text_color),
+ )
+ if orientation == "h":
+ figure.update_layout(
+ xaxis=dict(
+ type="linear",
+ showspikes=False,
+ ),
+ yaxis=dict(
+ type="category",
+ showspikes=False,
+ ),
+ hoverlabel=dict(
+ font=dict(size=12),
+ ),
+ hovermode="y unified",
+ )
+ if layout_kwargs:
+ figure.update_layout(
+ **layout_kwargs,
+ )
+ return figure
+
+
+def bar_increasing_decreasing( # pylint: disable=W0102
+ keys: List[str],
+ values: List[Union[int, float]],
+ title: Optional[str] = None,
+ xtitle: Optional[str] = None,
+ ytitle: Optional[str] = None,
+ colors: List[str] = ["blue", "red"],
+ orientation: Literal["h", "v"] = "h",
+ barmode: Literal["group", "stack", "relative", "overlay"] = "relative",
+ layout_kwargs: Optional[Dict[str, Any]] = None,
+) -> Union["OpenBBFigure", "Figure"]:
+ """Create a bar chart with increasing and decreasing values represented by two colors.
+
+ Parameters
+ ----------
+ keys : List[str]
+ The x-axis keys.
+ values : List[Any]
+ The y-axis values.
+ title : Optional[str], optional
+ The title of the chart, by default None.
+ xtitle : Optional[str], optional
+ The x-axis title, by default None.
+ ytitle : Optional[str], optional
+ The y-axis title, by default None.
+ colors : List[str], optional
+ The colors to use for increasing and decreasing values, by default ["blue", "red"].
+ orientation : Literal["h", "v"], optional
+ The orientation of the bars, by default "h".
+ barmode : Literal["group", "stack", "relative", "overlay"], optional
+ The bar mode, by default "relative".
+ layout_kwargs : Optional[Dict[str, Any]], optional
+ Additional keyword arguments to apply with figure.update_layout(), by default None.
+
+ Returns
+ -------
+ OpenBBFigure
+ The OpenBBFigure object.
+ """
+ # pylint: disable=import-outside-toplevel
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+ from pandas import Series
+
+ try:
+ figure = OpenBBFigure()
+ except Exception as _:
+ figure = OpenBBFigure(create_backend=True)
+
+ figure = figure.create_subplots(
+ 1,
+ 1,
+ shared_xaxes=False,
+ vertical_spacing=0.06,
+ horizontal_spacing=0.01,
+ row_width=[1],
+ specs=[[{"secondary_y": True}]],
+ )
+ figure.update_layout(ChartStyle().plotly_template.get("layout", {}))
+ text_color = "white" if ChartStyle().plt_style == "dark" else "black"
+
+ try:
+ data = Series(data=values, index=keys)
+ increasing_data = data[data > 0] # type: ignore
+ decreasing_data = data[data < 0] # type: ignore
+ except Exception as e:
+ raise ValueError(f"Error: {e}") from e
+
+ if not increasing_data.empty:
+ figure.add_bar(
+ x=increasing_data.index if orientation == "v" else increasing_data,
+ y=increasing_data if orientation == "v" else increasing_data.index,
+ marker=dict(color=colors[0]),
+ orientation=orientation,
+ showlegend=False,
+ width=0.95 / len(keys) * 0.75 if barmode == "group" else 0.95,
+ hoverinfo="y" if orientation == "v" else "x",
+ )
+ if not decreasing_data.empty:
+ figure.add_bar(
+ x=decreasing_data.index if orientation == "v" else decreasing_data,
+ y=decreasing_data if orientation == "v" else decreasing_data.index,
+ marker=dict(color=colors[1]),
+ orientation=orientation,
+ showlegend=False,
+ width=0.95 / len(keys) * 0.75 if barmode == "group" else 0.95,
+ hoverinfo="y" if orientation == "v" else "x",
+ )
+
+ figure.update_layout(
+ title=dict(text=title if title else None, x=0.5, font=dict(size=20)),
+ hovermode="x" if orientation == "v" else "y",
+ hoverlabel=dict(align="left" if orientation == "h" else "auto"),
+ yaxis=dict(
+ title=dict(
+ text=ytitle if ytitle else None, standoff=30, font=dict(size=16)
+ ),
+ side="left" if orientation == "h" else "right",
+ showgrid=orientation == "v",
+ gridcolor="rgba(128,128,128,0.25)",
+ tickfont=dict(size=12),
+ ticklen=0,
+ categoryorder="array" if orientation == "h" else None,
+ categoryarray=keys if orientation == "h" else None,
+ ),
+ xaxis=dict(
+ title=dict(
+ text=xtitle if xtitle else None, standoff=30, font=dict(size=16)
+ ),
+ showgrid=orientation == "h",
+ gridcolor="rgba(128,128,128,0.25)",
+ tickfont=dict(size=12),
+ ticklen=0,
+ categoryorder="array" if orientation == "v" else None,
+ categoryarray=keys if orientation == "v" else None,
+ ),
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ font=dict(color="white" if text_color == "white" else "black"),
+ margin=dict(pad=5),
+ )
+
+ if layout_kwargs:
+ figure.update_layout(
+ **layout_kwargs,
+ )
+
+ return figure
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/helpers.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/helpers.py
new file mode 100644
index 0000000000000000000000000000000000000000..ff2737e9cf30ba21c6999625bd22d5619a20829c
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/helpers.py
@@ -0,0 +1,123 @@
+"""Helper functions for charting."""
+
+# pylint: disable=R0917
+
+from typing import TYPE_CHECKING, Callable, Dict, List, Type
+
+if TYPE_CHECKING:
+ from pandas import DataFrame, Series
+
+
+def get_charting_functions(view: Type) -> Dict[str, Callable]:
+ """Discover charting functions."""
+ # pylint: disable=import-outside-toplevel
+ from inspect import getmembers, getsource, isfunction
+
+ implemented_functions: Dict[str, Callable] = {}
+
+ for name, obj in getmembers(view, isfunction):
+ if (
+ obj.__module__ == view.__module__
+ and not name.startswith("_")
+ and "NotImplementedError" not in getsource(obj)
+ ):
+ implemented_functions[name] = obj
+
+ return implemented_functions
+
+
+def get_charting_functions_list(view: Type) -> List[str]:
+ """Get a list of all the charting functions."""
+ return list(get_charting_functions(view).keys())
+
+
+def z_score_standardization(data: "Series") -> "Series":
+ """Z-Score Standardization Method."""
+ return (data - data.mean()) / data.std()
+
+
+def calculate_returns(data: "Series") -> "Series":
+ """Calculate the returns of a column."""
+ return ((1 + data.pct_change(fill_method=None).fillna(0)).cumprod() - 1) * 100
+
+
+def should_share_axis(
+ df: "DataFrame", col1: str, col2: str, threshold: float = 0.15
+) -> bool:
+ """Determine whether two columns should share an axis."""
+ # pylint: disable=import-outside-toplevel
+ from pandas import Series
+
+ try:
+ if isinstance(df, Series):
+ df = df.to_frame()
+ range1 = df[col1].max() - df[col1].min()
+ range2 = df[col2].max() - df[col2].min()
+ # Calculate the ratio of the two ranges
+ ratio = max(range1, range2) / min(range1, range2)
+ # If the ratio is less than the threshold, the two columns can share an axis
+ if ratio == 1:
+ return True
+ return ratio < threshold
+ except Exception:
+ return False
+
+
+def heikin_ashi(data: "DataFrame") -> "DataFrame":
+ """Return OHLC data as Heikin Ashi Candles.
+
+ Parameters
+ ----------
+ data: DataFrame
+ DataFrame containing OHLC data.
+
+ Returns
+ -------
+ DataFrame
+ DataFrame copy with Heikin Ashi candle calculations.
+ """
+ # pylint: disable=import-outside-toplevel
+ from pandas_ta import candles
+
+ df = data.copy()
+
+ check_columns = ["open", "high", "low", "close"]
+
+ for item in check_columns:
+ if item not in df.columns:
+ raise ValueError(
+ "The expected column labels, "
+ f"{check_columns}"
+ ", were not found in DataFrame."
+ )
+
+ ha = candles.ha(
+ df["open"],
+ df["high"],
+ df["low"],
+ df["close"],
+ )
+
+ for item in check_columns:
+ df[item] = ha[f"HA_{item}"]
+
+ return df
+
+
+def duration_sorter(durations: list) -> list:
+ """Sort durations labeled as month_5, year_5, etc."""
+
+ def duration_to_months(duration):
+ """Convert duration to months."""
+ if duration == "long_term":
+ return 360
+ parts = duration.split("_")
+ months = 0
+ for i in range(0, len(parts), 2):
+ number = int(parts[i + 1])
+ if parts[i] == "year":
+ number *= 12 # Convert years to months
+ months += number
+ return months
+
+ return sorted(durations, key=duration_to_months)
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_historical.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_historical.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7151845bab504b5297c6f8fc2dd3911a82b4ef9
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_historical.py
@@ -0,0 +1,335 @@
+"""Price historical charting utility."""
+
+# pylint: disable=too-many-branches, too-many-locals, unused-argument
+
+
+from typing import TYPE_CHECKING, Any, Dict, Tuple
+
+from openbb_charting.styles.colors import LARGE_CYCLER
+
+if TYPE_CHECKING:
+ from openbb_charting.core.openbb_figure import OpenBBFigure
+
+
+def price_historical( # noqa: PLR0912
+ **kwargs,
+) -> Tuple["OpenBBFigure", Dict[str, Any]]:
+ """Equity Price Historical Chart."""
+ # pylint: disable=import-outside-toplevel
+ from pandas import DataFrame # noqa
+ from openbb_core.app.utils import basemodel_to_df # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+ from openbb_charting.core.plotly_ta.ta_class import PlotlyTA # noqa
+ from openbb_charting.core.chart_style import ChartStyle # noqa
+ from openbb_charting.charts.helpers import ( # noqa
+ calculate_returns,
+ heikin_ashi,
+ should_share_axis,
+ z_score_standardization,
+ )
+
+ if "data" in kwargs and isinstance(kwargs["data"], DataFrame):
+ data = kwargs["data"]
+ elif "data" in kwargs and isinstance(kwargs["data"], list):
+ data = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "date")) # type: ignore
+ else:
+ data = basemodel_to_df(
+ kwargs["obbject_item"], index=kwargs.get("index", "date") # type: ignore
+ )
+
+ if "date" in data.columns:
+ data = data.set_index("date")
+
+ target = str(kwargs.get("target"))
+ normalize = kwargs.get("normalize") is True
+ returns = kwargs.get("returns") is True
+ same_axis = kwargs.get("same_axis") is True
+ text_color = "black" if ChartStyle().plt_style == "light" else "white"
+ title = f"{kwargs.get('title')}" if "title" in kwargs else "Historical Prices"
+ y1title = ""
+ y2title = ""
+ candles = True
+ multi_symbol = (
+ bool(kwargs.get("multi_symbol") is True)
+ or (
+ "symbol" in data.columns
+ and target in data.columns
+ and len(data.symbol.unique()) > 1
+ )
+ or ("target" in kwargs and kwargs.get("target") is not None)
+ or "symbol" in data.columns
+ or (
+ "symbol" not in data.columns
+ and bool(data.columns.isin(["open", "high", "low", "close"]).all())
+ )
+ )
+ target = "close" if target is None or target == "None" or target == "" else target
+
+ if multi_symbol is True:
+ if "symbol" not in data.columns and target in data.columns:
+ data = data[[target]]
+ y1title = target.title()
+ if "symbol" in data.columns and target in data.columns:
+ data = data.pivot(columns="symbol", values=target)
+ y1title = target
+ title = f"Historical {target.title()}"
+
+ indicators = kwargs.get("indicators", {})
+ candles = bool(~data.columns.isin(["open", "high", "low", "close"]).all())
+ candles = candles if kwargs.get("candles", True) else False
+ volume = kwargs.get("volume", True) if "volume" in data.columns else False
+
+ if normalize is True:
+ if "symbol" not in data.columns and target in data.columns:
+ data = data[[target]]
+ multi_symbol = True
+ candles = False
+ volume = False
+
+ if returns is True:
+ if "symbol" not in data.columns and target in data.columns:
+ data = data[[target]]
+ multi_symbol = True
+ candles = False
+ volume = False
+ if ( # pylint: disable = R0916
+ multi_symbol is False
+ and normalize is False
+ and returns is False
+ and candles is True
+ ) or (indicators and multi_symbol is False):
+ if (
+ "heikin_ashi" in kwargs
+ and kwargs["heikin_ashi"] is True
+ and candles is True
+ ):
+ data = heikin_ashi(data)
+ title = f"{title} - Heikin Ashi"
+ _volume = False
+ if "atr" in indicators: # type: ignore
+ _volume = volume
+ volume = False
+ ta = PlotlyTA()
+ fig = ta.plot( # type: ignore
+ data,
+ indicators=indicators if indicators else {}, # type: ignore
+ symbol=target if candles is False else "",
+ candles=candles,
+ volume=volume, # type: ignore
+ )
+ if _volume is True and "atr" in indicators: # type: ignore
+ fig.add_inchart_volume(data)
+ fig.update_layout(
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ font=dict(color=text_color),
+ showlegend=True,
+ legend=dict(
+ orientation="v",
+ yanchor="top",
+ xanchor="right",
+ y=0.95,
+ x=-0.01,
+ xref="paper",
+ font=dict(size=12),
+ bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ ),
+ xaxis=dict(
+ ticklen=0,
+ showgrid=True,
+ gridcolor="rgba(128,128,128,0.3)",
+ zeroline=True,
+ mirror=True,
+ showline=True,
+ ),
+ xaxis2=dict(
+ ticklen=0,
+ showgrid=True,
+ gridcolor="rgba(128,128,128,0.3)",
+ zeroline=True,
+ mirror=True,
+ showline=True,
+ ),
+ yaxis=dict(
+ ticklen=0,
+ showgrid=True,
+ gridcolor="rgba(128,128,128,0.3)",
+ zeroline=True,
+ mirror=True,
+ showline=True,
+ tickfont=dict(size=14),
+ ),
+ yaxis2=dict(
+ ticklen=0,
+ gridcolor="rgba(128,128,128,0.3)",
+ ),
+ yaxis3=dict(
+ ticklen=0,
+ gridcolor="rgba(128,128,128,0.3)",
+ ),
+ dragmode="pan",
+ hovermode="x",
+ )
+
+ if kwargs.get("title"):
+ title = kwargs["title"]
+ fig.update_layout(title=dict(text=title, x=0.5))
+
+ content = fig.to_plotly_json()
+
+ return fig, content
+
+ if multi_symbol is True or candles is False:
+
+ if "symbol" not in data.columns and target in data.columns:
+ data = data[[target]]
+
+ if "symbol" in data.columns:
+ data = data.pivot(columns="symbol", values=target)
+
+ title: str = kwargs.get("title", "Historical Prices") # type: ignore
+
+ y1title = data.iloc[:, 0].name
+ y2title = ""
+
+ if len(data.columns) > 2 or normalize is True or returns is True:
+ if returns is True or (len(data.columns) > 2 and normalize is False):
+ data = data.apply(calculate_returns)
+ title = f"{title} - Cumulative Returns"
+ y1title = "Percent"
+ if normalize is True:
+ if returns is True:
+ title = f"{title.replace(' - Cumulative Returns', '')} - Normalized Cumulative Returns"
+ else:
+ title = title + " - Normalized"
+ data = data.apply(z_score_standardization)
+ y1title = None # type: ignore
+ y2title = None # type: ignore
+
+ fig = OpenBBFigure()
+ fig.update_layout(ChartStyle().plotly_template.get("layout", {}))
+ text_color = "white" if ChartStyle().plt_style == "dark" else "black"
+
+ for i, col in enumerate(data.columns):
+
+ hovertemplate = f"{data[col].name}: %{{y}}"
+ yaxis = "y1"
+ if y1title and y1title != "Percent":
+ yaxis = (
+ (
+ "y1"
+ if should_share_axis(data, col, y1title) # type: ignore
+ or col == y1title
+ or normalize is True
+ or returns is True
+ else "y2"
+ )
+ if same_axis is False
+ else "y1"
+ )
+
+ if yaxis == "y2":
+ y2title = data[col].name
+
+ fig.add_scatter(
+ x=data.index,
+ y=data[col],
+ name=data[col].name,
+ mode="lines",
+ hovertemplate=hovertemplate,
+ line=dict(width=2, color=LARGE_CYCLER[i % len(LARGE_CYCLER)]),
+ yaxis=yaxis,
+ )
+
+ if normalize is True or returns is True:
+ y1title = "Percent" if returns is True else None # type: ignore
+ y2title = None # type: ignore
+
+ if same_axis is True:
+ y1title = None # type: ignore
+ y2title = None # type: ignore
+
+ fig.update_layout(
+ paper_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ plot_bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ legend=(
+ dict(
+ orientation="v",
+ yanchor="top",
+ xanchor="right",
+ y=0.95,
+ x=-0.01,
+ bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ )
+ if len(data.columns) > 2
+ else dict(
+ orientation="h",
+ yanchor="bottom",
+ xanchor="right",
+ y=1.02,
+ x=0.98,
+ bgcolor=(
+ "rgba(0,0,0,0)" if text_color == "white" else "rgba(255,255,255,0)"
+ ),
+ )
+ ),
+ yaxis1=(
+ dict(
+ side="right",
+ ticklen=0,
+ showgrid=True,
+ showline=True,
+ mirror=True,
+ gridcolor="rgba(128,128,128,0.3)",
+ title=dict(
+ text=y1title if y1title else None, standoff=20, font=dict(size=20)
+ ),
+ tickfont=dict(size=14),
+ anchor="x",
+ )
+ ),
+ yaxis2=(
+ dict(
+ overlaying="y",
+ side="left",
+ ticklen=0,
+ showgrid=False,
+ title=dict(
+ text=y2title if y2title else None, standoff=10, font=dict(size=20)
+ ),
+ tickfont=dict(size=14),
+ anchor="x",
+ )
+ if y2title
+ else None
+ ),
+ xaxis=dict(
+ ticklen=0,
+ showgrid=True,
+ gridcolor="rgba(128,128,128,0.3)",
+ showline=True,
+ mirror=True,
+ ),
+ margin=dict(l=20, r=20, b=20, t=20),
+ dragmode="pan",
+ hovermode="x",
+ )
+ if kwargs.get("title"):
+ title = kwargs["title"]
+ fig.update_layout(title=dict(text=title, x=0.5))
+
+ content = fig.show(external=True).to_plotly_json()
+
+ return fig, content
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_performance.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_performance.py
new file mode 100644
index 0000000000000000000000000000000000000000..50b53136254066535d9049c4b3965645c63686d1
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/price_performance.py
@@ -0,0 +1,108 @@
+"""Price performance charting implementation."""
+
+from typing import TYPE_CHECKING, Any, Dict, Tuple, Union
+
+if TYPE_CHECKING:
+ from plotly.graph_objs import Figure # noqa
+ from openbb_charting.core.openbb_figure import OpenBBFigure # noqa
+
+
+def price_performance(
+ **kwargs,
+) -> Tuple[Union["OpenBBFigure", "Figure"], Dict[str, Any]]: # noqa: PLR0912
+ """Equity Price Performance Chart."""
+ # pylint: disable=import-outside-toplevel
+ from pandas import DataFrame # noqa
+ from openbb_core.app.utils import basemodel_to_df # noqa
+ from openbb_charting.charts.generic_charts import bar_chart # noqa
+
+ if "data" in kwargs and isinstance(kwargs["data"], DataFrame):
+ data = kwargs["data"]
+ elif "data" in kwargs and isinstance(kwargs["data"], list):
+ data = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "symbol")) # type: ignore
+ else:
+ data = basemodel_to_df(
+ kwargs["obbject_item"], index=kwargs.get("index", "symbol") # type: ignore
+ )
+
+ cols = [
+ "one_day",
+ "one_week",
+ "one_month",
+ "three_month",
+ "six_month",
+ "ytd",
+ "one_year",
+ "two_year",
+ "three_year",
+ "four_year",
+ "five_year",
+ ]
+
+ df = DataFrame()
+ chart_df = DataFrame()
+
+ if "symbol" in data.columns:
+ data = data.set_index("symbol")
+ chart_cols = []
+
+ if len(data) == 0:
+ raise ValueError("No data was found in the DataFrame.")
+
+ data = data.drop_duplicates(keep="first")
+
+ for col in cols:
+ if col in data.columns and data[col].notnull().any():
+ df[col.replace("_", " ").title() if col != "ytd" else col.upper()] = data[
+ col
+ ].apply(lambda x: round(x * 100, 4) if x is not None else None)
+
+ if df.empty:
+ raise ValueError(f"No columns matching, {cols}, were found in the data.")
+
+ chart_df = df.T
+ chart_cols = chart_df.columns.to_list()
+
+ if "limit" in kwargs and isinstance(kwargs.get("limit"), int):
+ limit = kwargs.pop("limit", 10)
+ chart_df = chart_df.head(limit) # type: ignore
+
+ layout_kwargs: Dict[str, Any] = kwargs.get("layout_kwargs", {})
+
+ title = (
+ f"{kwargs.pop('title')}" if "title" in kwargs else "Equity Price Performance"
+ )
+ orientation = (
+ kwargs.pop("orientation")
+ if "orientation" in kwargs and kwargs.get("orientation") is not None
+ else "v"
+ )
+
+ ytitle = "Performance (%)"
+ xtitle = None
+
+ if orientation == "h":
+ xtitle = ytitle # type: ignore
+ ytitle = None # type: ignore
+
+ fig = bar_chart(
+ chart_df.reset_index(),
+ x="index",
+ y=chart_cols,
+ title=title,
+ xtitle=xtitle,
+ ytitle=ytitle,
+ orientation=orientation, # type: ignore
+ )
+ fig.update_traces(
+ hovertemplate=(
+ "%{fullData.name}:%{y:.2f}%"
+ if orientation == "v"
+ else "%{fullData.name}:%{x:.2f}%"
+ )
+ )
+
+ fig.update_layout(**layout_kwargs)
+ content = fig.show(external=True).to_plotly_json() # type: ignore
+
+ return fig, content
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charts/relative_rotation.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/relative_rotation.py
new file mode 100644
index 0000000000000000000000000000000000000000..26df948957164bf56d74062315f82043b9faf004
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charts/relative_rotation.py
@@ -0,0 +1,674 @@
+"""Relative Rotation Chart Helpers."""
+
+# pylint: disable=R0917
+
+from datetime import date as dateType
+from typing import TYPE_CHECKING, Literal, Optional
+from warnings import warn
+
+if TYPE_CHECKING:
+ from pandas import DataFrame
+ from plotly.graph_objects import Figure
+
+color_sequence = [
+ "burlywood",
+ "orange",
+ "grey",
+ "magenta",
+ "cyan",
+ "yellowgreen",
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#ffbb78",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5",
+ "#8c564b",
+ "#c49c94",
+ "#e377c2",
+ "#f7b6d2",
+ "#7f7f7f",
+ "#c7c7c7",
+ "#bcbd22",
+ "#dbdb8d",
+ "#17becf",
+ "#9edae5",
+ "#7e7e7e",
+ "#1b9e77",
+ "#d95f02",
+ "#7570b3",
+ "#e7298a",
+ "#66a61e",
+ "#e6ab02",
+ "#a6761d",
+ "#666666",
+ "#f0027f",
+ "#bf5b17",
+ "#d9f202",
+ "#8dd3c7",
+ "#ffffb3",
+ "#bebada",
+ "#fb8072",
+ "#80b1d3",
+ "#fdb462",
+ "#b3de69",
+ "#fccde5",
+ "#d9d9d9",
+ "#bc80bd",
+ "#ccebc5",
+ "#ffed6f",
+ "#6a3d9a",
+ "#b15928",
+ "#b2df8a",
+ "#33a02c",
+ "#fb9a99",
+ "#e31a1c",
+ "#fdbf6f",
+ "#ff7f00",
+ "#cab2d6",
+ "#6a3d9a",
+ "#ffff99",
+ "#b15928",
+]
+
+
+def create_rrg_with_tails(
+ ratios_data: "DataFrame",
+ momentum_data: "DataFrame",
+ study: str,
+ benchmark_symbol: str,
+ tail_periods: int,
+ tail_interval: Literal["day", "week", "month"],
+) -> "Figure":
+ """Create The Relative Rotation Graph With Tails.
+
+ Parameters
+ ----------
+ ratios_data : DataFrame
+ The DataFrame containing the RS-Ratio values.
+ momentum_data : DataFrame
+ The DataFrame containing the RS-Momentum values.
+ study : str
+ The study that was selected when loading the raw data.
+ If custom data is supplied, this will override the study for the chart titles.
+ benchmark_symbol : str
+ The symbol of the benchmark.
+ tail_periods : int
+ The number of periods to display in the tails.
+ tail_interval : Literal["day", "week", "month"]
+
+ Returns
+ -------
+ Figure
+ Plotly GraphObjects Figure.
+ """
+ # pylint: disable=import-outside-toplevel
+ from pandas import to_datetime
+ from plotly import graph_objects as go
+
+ symbols = ratios_data.columns.to_list()
+
+ tail_dict = {"week": "W", "month": "ME"}
+ ratios_data.index = to_datetime(ratios_data.index)
+ momentum_data.index = to_datetime(momentum_data.index)
+
+ if tail_interval != "day":
+ ratios_data = ratios_data.resample(tail_dict[tail_interval]).last()
+ momentum_data = momentum_data.resample(tail_dict[tail_interval]).last()
+ ratios_data = ratios_data.iloc[-tail_periods:]
+ momentum_data = momentum_data.iloc[-tail_periods:]
+ _tail_periods = len(ratios_data)
+ tail_title = (
+ f"The Previous {_tail_periods} {tail_interval.capitalize()}s "
+ f"Ending {ratios_data.index[-1].strftime('%Y-%m-%d')}"
+ )
+ x_min = ratios_data.min().min()
+ x_max = ratios_data.max().max()
+ y_min = momentum_data.min().min()
+ y_max = momentum_data.max().max()
+ # Create an empty list to store the scatter traces
+ frames: list = []
+ x_data = ratios_data
+ y_data = momentum_data
+ for i, date in enumerate(ratios_data.index): # pylint: disable=unused-variable
+
+ frame_data: list = []
+
+ for j, symbol in enumerate(symbols):
+ x_frame_data = x_data[symbol].iloc[: i + 1]
+ y_frame_data = y_data[symbol].iloc[: i + 1]
+ name = symbol.upper().replace("^", "").replace(":US", "")
+ special_name = "-" in name or len(name) > 7
+ marker_size = 34 if special_name else 30
+ line_frame_trace = go.Scatter(
+ x=x_frame_data,
+ y=y_frame_data,
+ mode="markers+lines",
+ line=dict(color=color_sequence[j], width=2, dash="dash"),
+ marker=dict(
+ size=5, color=color_sequence[j], line=dict(color="black", width=1)
+ ),
+ showlegend=False,
+ opacity=0.3,
+ name=name,
+ text=name,
+ hovertemplate="%{fullData.name}: "
+ + "RS-Ratio: %{x:.4f}, "
+ + "RS-Momentum: %{y:.4f}"
+ + "",
+ hoverlabel=dict(font_size=10),
+ )
+
+ marker_frame_trace = go.Scatter(
+ x=[x_frame_data.iloc[-1]],
+ y=[y_frame_data.iloc[-1]],
+ mode="markers+text",
+ name=name,
+ text=name,
+ textposition="middle center",
+ textfont=(
+ dict(size=10, color="black")
+ if len(symbol) < 4
+ else dict(size=7, color="black")
+ ),
+ line=dict(color=color_sequence[j], width=2, dash="dash"),
+ marker=dict(
+ size=marker_size,
+ color=color_sequence[j],
+ line=dict(color="black", width=1),
+ ),
+ opacity=0.9,
+ showlegend=False,
+ hovertemplate="%{fullData.name}: RS-Ratio: %{x:.4f}, RS-Momentum: %{y:.4f}",
+ )
+
+ frame_data.extend([line_frame_trace, marker_frame_trace])
+
+ frames.append(go.Frame(data=frame_data, name=f"Frame {i}"))
+
+ # Define the initial trace for the figure
+ initial_trace = frames[0]["data"]
+
+ padding = 0.1
+ y_range = [y_min - padding * abs(y_min) - 0.3, y_max + padding * abs(y_max) + 0.3]
+ x_range = [x_min - padding * abs(x_min) - 0.3, x_max + padding * abs(x_max) + 0.3]
+
+ # Create the layout for the figure
+ layout = go.Layout(
+ title={
+ "text": (
+ f"Relative Rotation Against {benchmark_symbol.replace('^', '')} {study.capitalize()} For {tail_title}"
+ ),
+ "x": 0.5,
+ "xanchor": "center",
+ "font": dict(size=18),
+ },
+ xaxis=dict(
+ title=dict(text="RS-Ratio", font=dict(size=16)),
+ showgrid=True,
+ zeroline=True,
+ showline=True,
+ mirror=True,
+ ticklen=0,
+ zerolinecolor="black",
+ range=x_range,
+ gridcolor="lightgrey",
+ showspikes=False,
+ ),
+ yaxis=dict(
+ title=dict(text="RS-Momentum", font=dict(size=16)),
+ showgrid=True,
+ zeroline=True,
+ showline=True,
+ mirror=True,
+ ticklen=0,
+ zerolinecolor="black",
+ range=y_range,
+ gridcolor="lightgrey",
+ side="left",
+ title_standoff=5,
+ ),
+ plot_bgcolor="rgba(255,255,255,1)",
+ shapes=[
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=0,
+ y0=0,
+ x1=x_range[1],
+ y1=y_range[1],
+ fillcolor="lightgreen",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=0,
+ x1=0,
+ y1=y_range[1],
+ fillcolor="lightblue",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=y_range[0],
+ x1=0,
+ y1=0,
+ fillcolor="lightpink",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=0,
+ y0=y_range[0],
+ x1=x_range[1],
+ y1=0,
+ fillcolor="lightyellow",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=y_range[0],
+ x1=x_range[1],
+ y1=y_range[1],
+ line=dict(
+ color="Black",
+ width=1,
+ ),
+ fillcolor="rgba(0,0,0,0)",
+ layer="above",
+ ),
+ ],
+ annotations=[
+ go.layout.Annotation(
+ x=1,
+ xref="paper",
+ y=1,
+ yref="paper",
+ text="Leading",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="darkgreen",
+ ),
+ ),
+ go.layout.Annotation(
+ x=1,
+ xref="paper",
+ y=0,
+ yref="paper",
+ text="Weakening",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="goldenrod",
+ ),
+ ),
+ go.layout.Annotation(
+ x=0,
+ xref="paper",
+ y=0,
+ yref="paper",
+ text="Lagging",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="red",
+ ),
+ ),
+ go.layout.Annotation(
+ x=0,
+ xref="paper",
+ yref="paper",
+ y=1,
+ text="Improving",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="blue",
+ ),
+ ),
+ ],
+ autosize=True,
+ margin=dict(
+ l=30,
+ r=50,
+ b=50,
+ t=50,
+ pad=0,
+ ),
+ dragmode="pan",
+ hovermode="closest",
+ updatemenus=[
+ {
+ "buttons": [
+ {
+ "args": [
+ None,
+ {
+ "frame": {"duration": 500, "redraw": False},
+ "fromcurrent": True,
+ "transition": {"duration": 500, "easing": "linear"},
+ },
+ ],
+ "label": "Play",
+ "method": "animate",
+ }
+ ],
+ "direction": "left",
+ "pad": {"r": 0, "t": 75},
+ "showactive": False,
+ "type": "buttons",
+ "x": -0.025,
+ "xanchor": "left",
+ "y": 0,
+ "yanchor": "top",
+ "bgcolor": "rgba(150, 150, 150, 0.8)",
+ "bordercolor": "rgba(100, 100, 100, 0.5)",
+ "borderwidth": 1,
+ "font": {"color": "black"},
+ }
+ ],
+ sliders=[
+ {
+ "active": 0,
+ "yanchor": "top",
+ "xanchor": "center",
+ "currentvalue": {
+ "font": {"size": 16},
+ "prefix": "Date: ",
+ "visible": True,
+ "xanchor": "right",
+ },
+ "transition": {"duration": 300, "easing": "cubic-in-out"},
+ "pad": {"b": 10, "t": 50},
+ "len": 0.9,
+ "x": 0.5,
+ "y": 0,
+ "steps": [
+ {
+ "label": f"{x_data.index[i].strftime('%Y-%m-%d')}",
+ "method": "animate",
+ "args": [
+ [f"Frame {i}"],
+ {
+ "mode": "immediate",
+ "transition": {"duration": 300},
+ "frame": {"duration": 300, "redraw": False},
+ },
+ ],
+ }
+ for i in range(len(x_data.index))
+ ],
+ }
+ ],
+ )
+
+ # Create the figure and add the initial trace
+ fig = go.Figure(data=initial_trace, layout=layout, frames=frames)
+
+ return fig
+
+
+def create_rrg_without_tails(
+ ratios_data: "DataFrame",
+ momentum_data: "DataFrame",
+ benchmark_symbol: str,
+ study: str,
+ date: Optional[dateType] = None,
+) -> "Figure":
+ """Create the Plotly Figure Object without Tails.
+
+ Parameters
+ ----------
+ ratios_data : DataFrame
+ The DataFrame containing the RS-Ratio values.
+ momentum_data : DataFrame
+ The DataFrame containing the RS-Momentum values.
+ benchmark_symbol : str
+ The symbol of the benchmark.
+ study: str
+ The study that was selected when loading the raw data.
+ If custom data is supplied, this will override the study for the chart titles.
+ date : Optional[dateType], optional
+ A specific date within the data to target for display, by default None.
+
+ Returns
+ -------
+ Figure
+ Plotly GraphObjects Figure.
+ """
+ # pylint: disable=import-outside-toplevel
+ from plotly import graph_objects as go # noqa
+ from pandas import to_datetime # noqa
+
+ if date is not None and date not in ratios_data.index.astype(str):
+ warn(f"Date {str(date)} not found in data, using the last available date.")
+ date = ratios_data.index[-1]
+ if date is None:
+ date = ratios_data.index[-1]
+
+ # Select a single row from each dataframe
+ row_x = ratios_data.loc[to_datetime(date).date()] # type: ignore
+ row_y = momentum_data.loc[to_datetime(date).date()] # type: ignore
+
+ x_max = row_x.max() + 0.5
+ x_min = row_x.min() - 0.5
+ y_max = row_y.max() + 0.5
+ y_min = row_y.min() - 0.5
+
+ # Create an empty list to store the scatter traces
+ traces = []
+
+ # Loop through each column in the row_x dataframe
+ for i, (column_name, value_x) in enumerate(row_x.items()):
+ # Retrieve the corresponding value from the row_y dataframe
+ value_y = row_y[column_name] # type: ignore
+ marker_name = column_name.upper().replace("^", "").replace(":US", "") # type: ignore
+ special_name = "-" in marker_name or len(marker_name) > 5
+ marker_size = 38 if special_name else 30
+ # Create a scatter trace for each column
+ trace = go.Scatter(
+ x=[value_x],
+ y=[value_y],
+ mode="markers+text",
+ text=[marker_name],
+ textposition="middle center",
+ textfont=dict(size=10 if len(marker_name) < 4 else 8, color="black"),
+ marker=dict(
+ size=marker_size,
+ color=color_sequence[i % len(color_sequence)],
+ line=dict(color="black", width=1),
+ ),
+ name=column_name,
+ showlegend=False,
+ hovertemplate="%{fullData.name}"
+ + "
RS-Ratio: %{x:.4f}"
+ + "RS-Momentum: %{y:.4f}"
+ + "",
+ )
+ # Add the trace to the list
+ traces.append(trace)
+
+ padding = 0.1
+ y_range = [y_min - padding * abs(y_min) - 0.3, y_max + padding * abs(y_max)]
+ x_range = [x_min - padding * abs(x_min), x_max + padding * abs(x_max)]
+
+ layout = go.Layout(
+ title={
+ "text": (
+ f"RS-Ratio vs RS-Momentum of {study.capitalize()} "
+ f"Against {benchmark_symbol.replace('^', '')} - {to_datetime(row_x.name).strftime('%Y-%m-%d')}" # type: ignore
+ ),
+ "x": 0.5,
+ "xanchor": "center",
+ "font": dict(size=20),
+ },
+ xaxis=dict(
+ title="RS-Ratio",
+ zerolinecolor="black",
+ range=x_range,
+ showspikes=False,
+ ),
+ yaxis=dict(
+ title="
RS-Momentum",
+ zerolinecolor="black",
+ range=y_range,
+ side="left",
+ title_standoff=5,
+ showspikes=False,
+ ),
+ shapes=[
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=0,
+ y0=0,
+ x1=x_range[1],
+ y1=y_range[1],
+ fillcolor="lightgreen",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=0,
+ x1=0,
+ y1=y_range[1],
+ fillcolor="lightblue",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=y_range[0],
+ x1=0,
+ y1=0,
+ fillcolor="lightpink",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=0,
+ y0=y_range[0],
+ x1=x_range[1],
+ y1=0,
+ fillcolor="lightyellow",
+ opacity=0.3,
+ layer="below",
+ line_width=0,
+ ),
+ go.layout.Shape(
+ type="rect",
+ xref="x",
+ yref="y",
+ x0=x_range[0],
+ y0=y_range[0],
+ x1=x_range[1],
+ y1=y_range[1],
+ line=dict(
+ color="Black",
+ width=1,
+ ),
+ fillcolor="rgba(0,0,0,0)",
+ layer="above",
+ ),
+ ],
+ annotations=[
+ go.layout.Annotation(
+ x=1,
+ xref="paper",
+ y=1,
+ yref="paper",
+ text="Leading",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="darkgreen",
+ ),
+ ),
+ go.layout.Annotation(
+ x=1,
+ xref="paper",
+ y=0,
+ yref="paper",
+ text="Weakening",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="goldenrod",
+ ),
+ ),
+ go.layout.Annotation(
+ x=0,
+ xref="paper",
+ y=0,
+ yref="paper",
+ text="Lagging",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="red",
+ ),
+ ),
+ go.layout.Annotation(
+ x=0,
+ xref="paper",
+ yref="paper",
+ y=1,
+ text="Improving",
+ showarrow=False,
+ font=dict(
+ size=18,
+ color="blue",
+ ),
+ ),
+ ],
+ autosize=True,
+ margin=dict(
+ l=30,
+ r=50,
+ b=50,
+ t=50,
+ pad=0,
+ ),
+ dragmode="pan",
+ )
+
+ fig = go.Figure(data=traces, layout=layout)
+
+ return fig
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..91c890e79c2e7c1c9a033636efda98eaa925b3f7
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py
@@ -0,0 +1 @@
+"""OpenBB Charting core."""
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/Terminal_icon.png b/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/Terminal_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e984431867f3194d41292dc118162b68b691d77
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/Terminal_icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c35949a0354ad27527099161f9cb97503d6bfdc42769e31eca5e589062bddae3
+size 418780
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/plotly-3.0.0.min.js b/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/plotly-3.0.0.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc83321e9427572056ad55cedeb85619f8d76e94
--- /dev/null
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/assets/plotly-3.0.0.min.js
@@ -0,0 +1,3879 @@
+/**
+* plotly.js v3.0.0
+* Copyright 2012-2025, Plotly, Inc.
+* All rights reserved.
+* Licensed under the MIT license
+*/
+(
+ function(root, factory) {
+ if (typeof module === "object" && module.exports) {
+ module.exports = factory();
+ } else {
+ root.moduleName = factory();
+ }
+} (typeof self !== "undefined" ? self : this, () => {
+"use strict";var Plotly=(()=>{var $C=Object.defineProperty,DQe=Object.defineProperties,zQe=Object.getOwnPropertyDescriptor,FQe=Object.getOwnPropertyDescriptors,qQe=Object.getOwnPropertyNames,WQ=Object.getOwnPropertySymbols;var XQ=Object.prototype.hasOwnProperty,OQe=Object.prototype.propertyIsEnumerable;var ZQ=(e,t,r)=>t in e?$C(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,YQ=(e,t)=>{for(var r in t||(t={}))XQ.call(t,r)&&ZQ(e,r,t[r]);if(WQ)for(var r of WQ(t))OQe.call(t,r)&&ZQ(e,r,t[r]);return e},KQ=(e,t)=>DQe(e,FQe(t));var su=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),BQe=(e,t)=>{for(var r in t)$C(e,r,{get:t[r],enumerable:!0})},NQe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qQe(t))!XQ.call(e,i)&&i!==r&&$C(e,i,{get:()=>t[i],enumerable:!(n=zQe(t,i))||n.enumerable});return e};var ab=e=>NQe($C({},"__esModule",{value:!0}),e);var QC=ye(JQ=>{"use strict";JQ.version="3.0.0"});var QQ=ye(($Q,e6)=>{(function(t,r,n){r[t]=r[t]||n(),typeof e6!="undefined"&&e6.exports?e6.exports=r[t]:typeof define=="function"&&define.amd&&define(function(){return r[t]})})("Promise",typeof window!="undefined"?window:$Q,function(){"use strict";var t,r,n,i=Object.prototype.toString,a=typeof setImmediate!="undefined"?function(E){return setImmediate(E)}:setTimeout;try{Object.defineProperty({},"x",{}),t=function(E,k,A,L){return Object.defineProperty(E,k,{value:A,writable:!0,configurable:L!==!1})}}catch(g){t=function(k,A,L){return k[A]=L,k}}n=function(){var E,k,A;function L(_,C){this.fn=_,this.self=C,this.next=void 0}return{add:function(C,M){A=new L(C,M),k?k.next=A:E=A,k=A,A=void 0},drain:function(){var C=E;for(E=k=r=void 0;C;)C.fn.call(C.self),C=C.next}}}();function o(g,E){n.add(g,E),r||(r=a(n.drain))}function s(g){var E,k=typeof g;return g!=null&&(k=="object"||k=="function")&&(E=g.then),typeof E=="function"?E:!1}function l(){for(var g=0;g0&&o(l,k))}catch(A){f.call(new d(k),A)}}}function f(g){var E=this;E.triggered||(E.triggered=!0,E.def&&(E=E.def),E.msg=g,E.state=2,E.chain.length>0&&o(l,E))}function h(g,E,k,A){for(var L=0;L{(function(){var e={version:"3.8.2"},t=[].slice,r=function(Z){return t.call(Z)},n=self.document;function i(Z){return Z&&(Z.ownerDocument||Z.document||Z).documentElement}function a(Z){return Z&&(Z.ownerDocument&&Z.ownerDocument.defaultView||Z.document&&Z||Z.defaultView)}if(n)try{r(n.documentElement.childNodes)[0].nodeType}catch(Z){r=function(oe){for(var we=oe.length,Be=new Array(we);we--;)Be[we]=oe[we];return Be}}if(Date.now||(Date.now=function(){return+new Date}),n)try{n.createElement("DIV").style.setProperty("opacity",0,"")}catch(Z){var o=this.Element.prototype,s=o.setAttribute,l=o.setAttributeNS,u=this.CSSStyleDeclaration.prototype,c=u.setProperty;o.setAttribute=function(oe,we){s.call(this,oe,we+"")},o.setAttributeNS=function(oe,we,Be){l.call(this,oe,we,Be+"")},u.setProperty=function(oe,we,Be){c.call(this,oe,we+"",Be)}}e.ascending=f;function f(Z,oe){return Zoe?1:Z>=oe?0:NaN}e.descending=function(Z,oe){return oeZ?1:oe>=Z?0:NaN},e.min=function(Z,oe){var we=-1,Be=Z.length,Ue,We;if(arguments.length===1){for(;++we=We){Ue=We;break}for(;++weWe&&(Ue=We)}else{for(;++we=We){Ue=We;break}for(;++weWe&&(Ue=We)}return Ue},e.max=function(Z,oe){var we=-1,Be=Z.length,Ue,We;if(arguments.length===1){for(;++we=We){Ue=We;break}for(;++weUe&&(Ue=We)}else{for(;++we=We){Ue=We;break}for(;++weUe&&(Ue=We)}return Ue},e.extent=function(Z,oe){var we=-1,Be=Z.length,Ue,We,wt;if(arguments.length===1){for(;++we=We){Ue=wt=We;break}for(;++weWe&&(Ue=We),wt=We){Ue=wt=We;break}for(;++weWe&&(Ue=We),wt1)return wt/(zt-1)},e.deviation=function(){var Z=e.variance.apply(this,arguments);return Z&&Math.sqrt(Z)};function v(Z){return{left:function(oe,we,Be,Ue){for(arguments.length<3&&(Be=0),arguments.length<4&&(Ue=oe.length);Be>>1;Z(oe[We],we)<0?Be=We+1:Ue=We}return Be},right:function(oe,we,Be,Ue){for(arguments.length<3&&(Be=0),arguments.length<4&&(Ue=oe.length);Be>>1;Z(oe[We],we)>0?Ue=We:Be=We+1}return Be}}}var x=v(f);e.bisectLeft=x.left,e.bisect=e.bisectRight=x.right,e.bisector=function(Z){return v(Z.length===1?function(oe,we){return f(Z(oe),we)}:Z)},e.shuffle=function(Z,oe,we){(Be=arguments.length)<3&&(we=Z.length,Be<2&&(oe=0));for(var Be=we-oe,Ue,We;Be;)We=Math.random()*Be--|0,Ue=Z[Be+oe],Z[Be+oe]=Z[We+oe],Z[We+oe]=Ue;return Z},e.permute=function(Z,oe){for(var we=oe.length,Be=new Array(we);we--;)Be[we]=Z[oe[we]];return Be},e.pairs=function(Z){for(var oe=0,we=Z.length-1,Be,Ue=Z[0],We=new Array(we<0?0:we);oe=0;)for(wt=Z[oe],we=wt.length;--we>=0;)We[--Ue]=wt[we];return We};var g=Math.abs;e.range=function(Z,oe,we){if(arguments.length<3&&(we=1,arguments.length<2&&(oe=Z,Z=0)),(oe-Z)/we===1/0)throw new Error("infinite range");var Be=[],Ue=E(g(we)),We=-1,wt;if(Z*=Ue,oe*=Ue,we*=Ue,we<0)for(;(wt=Z+we*++We)>oe;)Be.push(wt/Ue);else for(;(wt=Z+we*++We)=oe.length)return Ue?Ue.call(Z,zt):Be?zt.sort(Be):zt;for(var lr=-1,Dr=zt.length,Ir=oe[or++],oi,ui,qr,Kr=new A,ii;++lr=oe.length)return tt;var or=[],lr=we[zt++];return tt.forEach(function(Dr,Ir){or.push({key:Dr,values:wt(Ir,zt)})}),lr?or.sort(function(Dr,Ir){return lr(Dr.key,Ir.key)}):or}return Z.map=function(tt,zt){return We(zt,tt,0)},Z.entries=function(tt){return wt(We(e.map,tt,0),0)},Z.key=function(tt){return oe.push(tt),Z},Z.sortKeys=function(tt){return we[oe.length-1]=tt,Z},Z.sortValues=function(tt){return Be=tt,Z},Z.rollup=function(tt){return Ue=tt,Z},Z},e.set=function(Z){var oe=new V;if(Z)for(var we=0,Be=Z.length;we=0&&(Be=Z.slice(we+1),Z=Z.slice(0,we)),Z)return arguments.length<2?this[Z].on(Be):this[Z].on(Be,oe);if(arguments.length===2){if(oe==null)for(Z in this)this.hasOwnProperty(Z)&&this[Z].on(Be,null);return this}};function ae(Z){var oe=[],we=new A;function Be(){for(var Ue=oe,We=-1,wt=Ue.length,tt;++We=0&&(we=Z.slice(0,oe))!=="xmlns"&&(Z=Z.slice(oe+1)),Ge.hasOwnProperty(we)?{space:Ge[we],local:Z}:Z}},Ce.attr=function(Z,oe){if(arguments.length<2){if(typeof Z=="string"){var we=this.node();return Z=e.ns.qualify(Z),Z.local?we.getAttributeNS(Z.space,Z.local):we.getAttribute(Z)}for(oe in Z)this.each(nt(oe,Z[oe]));return this}return this.each(nt(Z,oe))};function nt(Z,oe){Z=e.ns.qualify(Z);function we(){this.removeAttribute(Z)}function Be(){this.removeAttributeNS(Z.space,Z.local)}function Ue(){this.setAttribute(Z,oe)}function We(){this.setAttributeNS(Z.space,Z.local,oe)}function wt(){var zt=oe.apply(this,arguments);zt==null?this.removeAttribute(Z):this.setAttribute(Z,zt)}function tt(){var zt=oe.apply(this,arguments);zt==null?this.removeAttributeNS(Z.space,Z.local):this.setAttributeNS(Z.space,Z.local,zt)}return oe==null?Z.local?Be:we:typeof oe=="function"?Z.local?tt:wt:Z.local?We:Ue}function ct(Z){return Z.trim().replace(/\s+/g," ")}Ce.classed=function(Z,oe){if(arguments.length<2){if(typeof Z=="string"){var we=this.node(),Be=(Z=rt(Z)).length,Ue=-1;if(oe=we.classList){for(;++Ue=0;)(We=we[Be])&&(Ue&&Ue!==We.nextSibling&&Ue.parentNode.insertBefore(We,Ue),Ue=We);return this},Ce.sort=function(Z){Z=xt.apply(this,arguments);for(var oe=-1,we=this.length;++oe=oe&&(oe=Ue+1);!(zt=wt[oe])&&++oe0&&(Z=Z.slice(0,Ue));var wt=Ht.get(Z);wt&&(Z=wt,We=fr);function tt(){var lr=this[Be];lr&&(this.removeEventListener(Z,lr,lr.$),delete this[Be])}function zt(){var lr=We(oe,r(arguments));tt.call(this),this.addEventListener(Z,this[Be]=lr,lr.$=we),lr._=oe}function or(){var lr=new RegExp("^__on([^.]+)"+e.requote(Z)+"$"),Dr;for(var Ir in this)if(Dr=Ir.match(lr)){var oi=this[Ir];this.removeEventListener(Dr[1],oi,oi.$),delete this[Ir]}}return Ue?oe?zt:tt:oe?W:or}var Ht=e.map({mouseenter:"mouseover",mouseleave:"mouseout"});n&&Ht.forEach(function(Z){"on"+Z in n&&Ht.remove(Z)});function $t(Z,oe){return function(we){var Be=e.event;e.event=we,oe[0]=this.__data__;try{Z.apply(this,oe)}finally{e.event=Be}}}function fr(Z,oe){var we=$t(Z,oe);return function(Be){var Ue=this,We=Be.relatedTarget;(!We||We!==Ue&&!(We.compareDocumentPosition(Ue)&8))&&we.call(Ue,Be)}}var _r,Br=0;function Or(Z){var oe=".dragsuppress-"+ ++Br,we="click"+oe,Be=e.select(a(Z)).on("touchmove"+oe,_e).on("dragstart"+oe,_e).on("selectstart"+oe,_e);if(_r==null&&(_r="onselectstart"in Z?!1:G(Z.style,"userSelect")),_r){var Ue=i(Z).style,We=Ue[_r];Ue[_r]="none"}return function(wt){if(Be.on(oe,null),_r&&(Ue[_r]=We),wt){var tt=function(){Be.on(we,null)};Be.on(we,function(){_e(),tt()},!0),setTimeout(tt,0)}}}e.mouse=function(Z){return ut(Z,Me())};var Nr=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;function ut(Z,oe){oe.changedTouches&&(oe=oe.changedTouches[0]);var we=Z.ownerSVGElement||Z;if(we.createSVGPoint){var Be=we.createSVGPoint();if(Nr<0){var Ue=a(Z);if(Ue.scrollX||Ue.scrollY){we=e.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var We=we[0][0].getScreenCTM();Nr=!(We.f||We.e),we.remove()}}return Nr?(Be.x=oe.pageX,Be.y=oe.pageY):(Be.x=oe.clientX,Be.y=oe.clientY),Be=Be.matrixTransform(Z.getScreenCTM().inverse()),[Be.x,Be.y]}var wt=Z.getBoundingClientRect();return[oe.clientX-wt.left-Z.clientLeft,oe.clientY-wt.top-Z.clientTop]}e.touch=function(Z,oe,we){if(arguments.length<3&&(we=oe,oe=Me().changedTouches),oe){for(var Be=0,Ue=oe.length,We;Be0?1:Z<0?-1:0}function Vt(Z,oe,we){return(oe[0]-Z[0])*(we[1]-Z[1])-(oe[1]-Z[1])*(we[0]-Z[0])}function ar(Z){return Z>1?0:Z<-1?Xe:Math.acos(Z)}function Qr(Z){return Z>1?xe:Z<-1?-xe:Math.asin(Z)}function ai(Z){return((Z=Math.exp(Z))-1/Z)/2}function jr(Z){return((Z=Math.exp(Z))+1/Z)/2}function ri(Z){return((Z=Math.exp(2*Z))-1)/(Z+1)}function bi(Z){return(Z=Math.sin(Z/2))*Z}var nn=Math.SQRT2,Wi=2,Ni=4;e.interpolateZoom=function(Z,oe){var we=Z[0],Be=Z[1],Ue=Z[2],We=oe[0],wt=oe[1],tt=oe[2],zt=We-we,or=wt-Be,lr=zt*zt+or*or,Dr,Ir;if(lr0&&(pn=pn.transition().duration(wt)),pn.call(ci.event)}function ga(){Kr&&Kr.domain(qr.range().map(function(pn){return(pn-Z.x)/Z.k}).map(qr.invert)),vi&&vi.domain(ii.range().map(function(pn){return(pn-Z.y)/Z.k}).map(ii.invert))}function ya(pn){tt++||pn({type:"zoomstart"})}function so(pn){ga(),pn({type:"zoom",scale:Z.k,translate:[Z.x,Z.y]})}function wa(pn){--tt||(pn({type:"zoomend"}),we=null)}function io(){var pn=this,za=ui.of(pn,arguments),Lo=0,Fo=e.select(a(pn)).on(or,fu).on(lr,dl),js=Jr(e.mouse(pn)),xl=Or(pn);ea.call(pn),ya(za);function fu(){Lo=1,En(e.mouse(pn),js),so(za)}function dl(){Fo.on(or,null).on(lr,null),xl(Lo),wa(za)}}function Ss(){var pn=this,za=ui.of(pn,arguments),Lo={},Fo=0,js,xl=".zoom-"+e.event.changedTouches[0].identifier,fu="touchmove"+xl,dl="touchend"+xl,xc=[],At=e.select(pn),Er=Or(pn);wi(),ya(za),At.on(zt,null).on(Ir,wi);function Wr(){var Bi=e.touches(pn);return js=Z.k,Bi.forEach(function(cn){cn.identifier in Lo&&(Lo[cn.identifier]=Jr(cn))}),Bi}function wi(){var Bi=e.event.target;e.select(Bi).on(fu,Ui).on(dl,Oi),xc.push(Bi);for(var cn=e.event.changedTouches,On=0,Bn=cn.length;On1){var Rn=yn[0],Dn=yn[1],fn=Rn[0]-Dn[0],Ai=Rn[1]-Dn[1];Fo=fn*fn+Ai*Ai}}function Ui(){var Bi=e.touches(pn),cn,On,Bn,yn;ea.call(pn);for(var to=0,Rn=Bi.length;to1?1:oe,we=we<0?0:we>1?1:we,Ue=we<=.5?we*(1+oe):we+oe-we*oe,Be=2*we-Ue;function We(tt){return tt>360?tt-=360:tt<0&&(tt+=360),tt<60?Be+(Ue-Be)*tt/60:tt<180?Ue:tt<240?Be+(Ue-Be)*(240-tt)/60:Be}function wt(tt){return Math.round(We(tt)*255)}return new Fa(wt(Z+120),wt(Z),wt(Z-120))}e.hcl=Zt;function Zt(Z,oe,we){return this instanceof Zt?(this.h=+Z,this.c=+oe,void(this.l=+we)):arguments.length<2?Z instanceof Zt?new Zt(Z.h,Z.c,Z.l):Z instanceof Zr?Ki(Z.l,Z.a,Z.b):Ki((Z=xn((Z=e.rgb(Z)).r,Z.g,Z.b)).l,Z.a,Z.b):new Zt(Z,oe,we)}var yr=Zt.prototype=new Wn;yr.brighter=function(Z){return new Zt(this.h,this.c,Math.min(100,this.l+Vr*(arguments.length?Z:1)))},yr.darker=function(Z){return new Zt(this.h,this.c,Math.max(0,this.l-Vr*(arguments.length?Z:1)))},yr.rgb=function(){return Fr(this.h,this.c,this.l).rgb()};function Fr(Z,oe,we){return isNaN(Z)&&(Z=0),isNaN(oe)&&(oe=0),new Zr(we,Math.cos(Z*=Se)*oe,Math.sin(Z)*oe)}e.lab=Zr;function Zr(Z,oe,we){return this instanceof Zr?(this.l=+Z,this.a=+oe,void(this.b=+we)):arguments.length<2?Z instanceof Zr?new Zr(Z.l,Z.a,Z.b):Z instanceof Zt?Fr(Z.h,Z.c,Z.l):xn((Z=Fa(Z)).r,Z.g,Z.b):new Zr(Z,oe,we)}var Vr=18,gi=.95047,Si=1,Mi=1.08883,Pi=Zr.prototype=new Wn;Pi.brighter=function(Z){return new Zr(Math.min(100,this.l+Vr*(arguments.length?Z:1)),this.a,this.b)},Pi.darker=function(Z){return new Zr(Math.max(0,this.l-Vr*(arguments.length?Z:1)),this.a,this.b)},Pi.rgb=function(){return Gi(this.l,this.a,this.b)};function Gi(Z,oe,we){var Be=(Z+16)/116,Ue=Be+oe/500,We=Be-we/200;return Ue=ka(Ue)*gi,Be=ka(Be)*Si,We=ka(We)*Mi,new Fa(la(3.2404542*Ue-1.5371385*Be-.4985314*We),la(-.969266*Ue+1.8760108*Be+.041556*We),la(.0556434*Ue-.2040259*Be+1.0572252*We))}function Ki(Z,oe,we){return Z>0?new Zt(Math.atan2(we,oe)*lt,Math.sqrt(oe*oe+we*we),Z):new Zt(NaN,NaN,Z)}function ka(Z){return Z>.206893034?Z*Z*Z:(Z-4/29)/7.787037}function jn(Z){return Z>.008856?Math.pow(Z,1/3):7.787037*Z+4/29}function la(Z){return Math.round(255*(Z<=.00304?12.92*Z:1.055*Math.pow(Z,1/2.4)-.055))}e.rgb=Fa;function Fa(Z,oe,we){return this instanceof Fa?(this.r=~~Z,this.g=~~oe,void(this.b=~~we)):arguments.length<2?Z instanceof Fa?new Fa(Z.r,Z.g,Z.b):Ha(""+Z,Fa,jt):new Fa(Z,oe,we)}function Ra(Z){return new Fa(Z>>16,Z>>8&255,Z&255)}function jo(Z){return Ra(Z)+""}var oa=Fa.prototype=new Wn;oa.brighter=function(Z){Z=Math.pow(.7,arguments.length?Z:1);var oe=this.r,we=this.g,Be=this.b,Ue=30;return!oe&&!we&&!Be?new Fa(Ue,Ue,Ue):(oe&&oe>4,Be=Be>>4|Be,Ue=zt&240,Ue=Ue>>4|Ue,We=zt&15,We=We<<4|We):Z.length===7&&(Be=(zt&16711680)>>16,Ue=(zt&65280)>>8,We=zt&255)),oe(Be,Ue,We))}function oo(Z,oe,we){var Be=Math.min(Z/=255,oe/=255,we/=255),Ue=Math.max(Z,oe,we),We=Ue-Be,wt,tt,zt=(Ue+Be)/2;return We?(tt=zt<.5?We/(Ue+Be):We/(2-Ue-Be),Z==Ue?wt=(oe-we)/We+(oe0&&zt<1?0:wt),new It(wt,tt,zt)}function xn(Z,oe,we){Z=_t(Z),oe=_t(oe),we=_t(we);var Be=jn((.4124564*Z+.3575761*oe+.1804375*we)/gi),Ue=jn((.2126729*Z+.7151522*oe+.072175*we)/Si),We=jn((.0193339*Z+.119192*oe+.9503041*we)/Mi);return Zr(116*Ue-16,500*(Be-Ue),200*(Ue-We))}function _t(Z){return(Z/=255)<=.04045?Z/12.92:Math.pow((Z+.055)/1.055,2.4)}function br(Z){var oe=parseFloat(Z);return Z.charAt(Z.length-1)==="%"?Math.round(oe*2.55):oe}var Hr=e.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Hr.forEach(function(Z,oe){Hr.set(Z,Ra(oe))});function ti(Z){return typeof Z=="function"?Z:function(){return Z}}e.functor=ti,e.xhr=zi(H);function zi(Z){return function(oe,we,Be){return arguments.length===2&&typeof we=="function"&&(Be=we,we=null),Yi(oe,we,Z,Be)}}function Yi(Z,oe,we,Be){var Ue={},We=e.dispatch("beforesend","progress","load","error"),wt={},tt=new XMLHttpRequest,zt=null;self.XDomainRequest&&!("withCredentials"in tt)&&/^(http(s)?:)?\/\//.test(Z)&&(tt=new XDomainRequest),"onload"in tt?tt.onload=tt.onerror=or:tt.onreadystatechange=function(){tt.readyState>3&&or()};function or(){var lr=tt.status,Dr;if(!lr&&hi(tt)||lr>=200&&lr<300||lr===304){try{Dr=we.call(Ue,tt)}catch(Ir){We.error.call(Ue,Ir);return}We.load.call(Ue,Dr)}else We.error.call(Ue,tt)}return tt.onprogress=function(lr){var Dr=e.event;e.event=lr;try{We.progress.call(Ue,tt)}finally{e.event=Dr}},Ue.header=function(lr,Dr){return lr=(lr+"").toLowerCase(),arguments.length<2?wt[lr]:(Dr==null?delete wt[lr]:wt[lr]=Dr+"",Ue)},Ue.mimeType=function(lr){return arguments.length?(oe=lr==null?null:lr+"",Ue):oe},Ue.responseType=function(lr){return arguments.length?(zt=lr,Ue):zt},Ue.response=function(lr){return we=lr,Ue},["get","post"].forEach(function(lr){Ue[lr]=function(){return Ue.send.apply(Ue,[lr].concat(r(arguments)))}}),Ue.send=function(lr,Dr,Ir){if(arguments.length===2&&typeof Dr=="function"&&(Ir=Dr,Dr=null),tt.open(lr,Z,!0),oe!=null&&!("accept"in wt)&&(wt.accept=oe+",*/*"),tt.setRequestHeader)for(var oi in wt)tt.setRequestHeader(oi,wt[oi]);return oe!=null&&tt.overrideMimeType&&tt.overrideMimeType(oe),zt!=null&&(tt.responseType=zt),Ir!=null&&Ue.on("error",Ir).on("load",function(ui){Ir(null,ui)}),We.beforesend.call(Ue,tt),tt.send(Dr==null?null:Dr),Ue},Ue.abort=function(){return tt.abort(),Ue},e.rebind(Ue,We,"on"),Be==null?Ue:Ue.get(an(Be))}function an(Z){return Z.length===1?function(oe,we){Z(oe==null?we:null)}:Z}function hi(Z){var oe=Z.responseType;return oe&&oe!=="text"?Z.response:Z.responseText}e.dsv=function(Z,oe){var we=new RegExp('["'+Z+`
+]`),Be=Z.charCodeAt(0);function Ue(or,lr,Dr){arguments.length<3&&(Dr=lr,lr=null);var Ir=Yi(or,oe,lr==null?We:wt(lr),Dr);return Ir.row=function(oi){return arguments.length?Ir.response((lr=oi)==null?We:wt(oi)):lr},Ir}function We(or){return Ue.parse(or.responseText)}function wt(or){return function(lr){return Ue.parse(lr.responseText,or)}}Ue.parse=function(or,lr){var Dr;return Ue.parseRows(or,function(Ir,oi){if(Dr)return Dr(Ir,oi-1);var ui=function(qr){for(var Kr={},ii=Ir.length,vi=0;vi=ui)return Ir;if(vi)return vi=!1,Dr;var un=qr;if(or.charCodeAt(un)===34){for(var dn=un;dn++24?(isFinite(oe)&&(clearTimeout(Sa),Sa=setTimeout(ho,oe)),Fn=0):(Fn=1,go(ho))}e.timer.flush=function(){Mo(),xo()};function Mo(){for(var Z=Date.now(),oe=Ji;oe;)Z>=oe.t&&oe.c(Z-oe.t)&&(oe.c=null),oe=oe.n;return Z}function xo(){for(var Z,oe=Ji,we=1/0;oe;)oe.c?(oe.t=0;--tt)qr.push(Ue[or[Dr[tt]][2]]);for(tt=+oi;tt1&&Vt(Z[we[Be-2]],Z[we[Be-1]],Z[Ue])<=0;)--Be;we[Be++]=Ue}return we.slice(0,Be)}function Xs(Z,oe){return Z[0]-oe[0]||Z[1]-oe[1]}e.geom.polygon=function(Z){return ie(Z,wl),Z};var wl=e.geom.polygon.prototype=[];wl.area=function(){for(var Z=-1,oe=this.length,we,Be=this[oe-1],Ue=0;++ZYe)tt=tt.L;else if(wt=oe-vo(tt,we),wt>Ye){if(!tt.R){Be=tt;break}tt=tt.R}else{We>-Ye?(Be=tt.P,Ue=tt):wt>-Ye?(Be=tt,Ue=tt.N):Be=Ue=tt;break}var zt=ms(Z);if(Hs.insert(Be,zt),!(!Be&&!Ue)){if(Be===Ue){ko(Be),Ue=ms(Be.site),Hs.insert(zt,Ue),zt.edge=Ue.edge=cf(Be.site,zt.site),Zn(Be),Zn(Ue);return}if(!Ue){zt.edge=cf(Be.site,zt.site);return}ko(Be),ko(Ue);var or=Be.site,lr=or.x,Dr=or.y,Ir=Z.x-lr,oi=Z.y-Dr,ui=Ue.site,qr=ui.x-lr,Kr=ui.y-Dr,ii=2*(Ir*Kr-oi*qr),vi=Ir*Ir+oi*oi,ci=qr*qr+Kr*Kr,Jr={x:(Kr*vi-oi*ci)/ii+lr,y:(Ir*ci-qr*vi)/ii+Dr};Al(Ue.edge,or,ui,Jr),zt.edge=cf(or,Z,null,Jr),Ue.edge=cf(Z,ui,null,Jr),Zn(Be),Zn(Ue)}}function Il(Z,oe){var we=Z.site,Be=we.x,Ue=we.y,We=Ue-oe;if(!We)return Be;var wt=Z.P;if(!wt)return-1/0;we=wt.site;var tt=we.x,zt=we.y,or=zt-oe;if(!or)return tt;var lr=tt-Be,Dr=1/We-1/or,Ir=lr/or;return Dr?(-Ir+Math.sqrt(Ir*Ir-2*Dr*(lr*lr/(-2*or)-zt+or/2+Ue-We/2)))/Dr+Be:(Be+tt)/2}function vo(Z,oe){var we=Z.N;if(we)return Il(we,oe);var Be=Z.site;return Be.y===oe?Be.x:1/0}function Wl(Z){this.site=Z,this.edges=[]}Wl.prototype.prepare=function(){for(var Z=this.edges,oe=Z.length,we;oe--;)we=Z[oe].edge,(!we.b||!we.a)&&Z.splice(oe,1);return Z.sort(Zl),Z.length};function Ks(Z){for(var oe=Z[0][0],we=Z[1][0],Be=Z[0][1],Ue=Z[1][1],We,wt,tt,zt,or=Ys,lr=or.length,Dr,Ir,oi,ui,qr,Kr;lr--;)if(Dr=or[lr],!(!Dr||!Dr.prepare()))for(oi=Dr.edges,ui=oi.length,Ir=0;IrYe||g(zt-wt)>Ye)&&(oi.splice(Ir,0,new Hc(rh(Dr.site,Kr,g(tt-oe)Ye?{x:oe,y:g(We-oe)Ye?{x:g(wt-Ue)Ye?{x:we,y:g(We-we)Ye?{x:g(wt-Be)=-Ve)){var Ir=zt*zt+or*or,oi=lr*lr+Kr*Kr,ui=(Kr*Ir-or*oi)/Dr,qr=(zt*oi-lr*Ir)/Dr,Kr=qr+tt,ii=Hu.pop()||new Ec;ii.arc=Z,ii.site=Ue,ii.x=ui+wt,ii.y=Kr+Math.sqrt(ui*ui+qr*qr),ii.cy=Kr,Z.circle=ii;for(var vi=null,ci=$l._;ci;)if(ii.y0)){if(qr/=oi,oi<0){if(qr0){if(qr>Ir)return;qr>Dr&&(Dr=qr)}if(qr=we-tt,!(!oi&&qr<0)){if(qr/=oi,oi<0){if(qr>Ir)return;qr>Dr&&(Dr=qr)}else if(oi>0){if(qr0)){if(qr/=ui,ui<0){if(qr0){if(qr>Ir)return;qr>Dr&&(Dr=qr)}if(qr=Be-zt,!(!ui&&qr<0)){if(qr/=ui,ui<0){if(qr>Ir)return;qr>Dr&&(Dr=qr)}else if(ui>0){if(qr0&&(Ue.a={x:tt+Dr*oi,y:zt+Dr*ui}),Ir<1&&(Ue.b={x:tt+Ir*oi,y:zt+Ir*ui}),Ue}}}}}}function Tl(Z){for(var oe=ml,we=Co(Z[0][0],Z[0][1],Z[1][0],Z[1][1]),Be=oe.length,Ue;Be--;)Ue=oe[Be],(!uf(Ue,Z)||!we(Ue)||g(Ue.a.x-Ue.b.x)=We)return;if(lr>Ir){if(!Be)Be={x:ui,y:wt};else if(Be.y>=tt)return;we={x:ui,y:tt}}else{if(!Be)Be={x:ui,y:tt};else if(Be.y1)if(lr>Ir){if(!Be)Be={x:(wt-ii)/Kr,y:wt};else if(Be.y>=tt)return;we={x:(tt-ii)/Kr,y:tt}}else{if(!Be)Be={x:(tt-ii)/Kr,y:tt};else if(Be.y=We)return;we={x:We,y:Kr*We+ii}}else{if(!Be)Be={x:We,y:Kr*We+ii};else if(Be.x=lr&&ii.x<=Ir&&ii.y>=Dr&&ii.y<=oi?[[lr,oi],[Ir,oi],[Ir,Dr],[lr,Dr]]:[];vi.point=zt[qr]}),or}function tt(zt){return zt.map(function(or,lr){return{x:Math.round(Be(or,lr)/Ye)*Ye,y:Math.round(Ue(or,lr)/Ye)*Ye,i:lr}})}return wt.links=function(zt){return Gc(tt(zt)).edges.filter(function(or){return or.l&&or.r}).map(function(or){return{source:zt[or.l.i],target:zt[or.r.i]}})},wt.triangles=function(zt){var or=[];return Gc(tt(zt)).cells.forEach(function(lr,Dr){for(var Ir=lr.site,oi=lr.edges.sort(Zl),ui=-1,qr=oi.length,Kr,ii,vi=oi[qr-1].edge,ci=vi.l===Ir?vi.r:vi.l;++uici&&(ci=lr.x),lr.y>Jr&&(Jr=lr.y),oi.push(lr.x),ui.push(lr.y);else for(qr=0;qrci&&(ci=un),dn>Jr&&(Jr=dn),oi.push(un),ui.push(dn)}var En=ci-ii,Nn=Jr-vi;En>Nn?Jr=vi+En:ci=ii+Nn;function ga(wa,io,Ss,_s,Ns,pn,za,Lo){if(!(isNaN(Ss)||isNaN(_s)))if(wa.leaf){var Fo=wa.x,js=wa.y;if(Fo!=null)if(g(Fo-Ss)+g(js-_s)<.01)ya(wa,io,Ss,_s,Ns,pn,za,Lo);else{var xl=wa.point;wa.x=wa.y=wa.point=null,ya(wa,xl,Fo,js,Ns,pn,za,Lo),ya(wa,io,Ss,_s,Ns,pn,za,Lo)}else wa.x=Ss,wa.y=_s,wa.point=io}else ya(wa,io,Ss,_s,Ns,pn,za,Lo)}function ya(wa,io,Ss,_s,Ns,pn,za,Lo){var Fo=(Ns+za)*.5,js=(pn+Lo)*.5,xl=Ss>=Fo,fu=_s>=js,dl=fu<<1|xl;wa.leaf=!1,wa=wa.nodes[dl]||(wa.nodes[dl]=Ul()),xl?Ns=Fo:za=Fo,fu?pn=js:Lo=js,ga(wa,io,Ss,_s,Ns,pn,za,Lo)}var so=Ul();if(so.add=function(wa){ga(so,wa,+Dr(wa,++qr),+Ir(wa,qr),ii,vi,ci,Jr)},so.visit=function(wa){Js(wa,so,ii,vi,ci,Jr)},so.find=function(wa){return hc(so,wa[0],wa[1],ii,vi,ci,Jr)},qr=-1,oe==null){for(;++qrWe||Ir>wt||oi=un,Nn=we>=dn,ga=Nn<<1|En,ya=ga+4;gawe&&(We=oe.slice(we,We),tt[wt]?tt[wt]+=We:tt[++wt]=We),(Be=Be[0])===(Ue=Ue[0])?tt[wt]?tt[wt]+=Ue:tt[++wt]=Ue:(tt[++wt]=null,zt.push({i:wt,x:$s(Be,Ue)})),we=dc.lastIndex;return we=0&&!(Be=e.interpolators[we](Z,oe)););return Be}e.interpolators=[function(Z,oe){var we=typeof oe;return(we==="string"?Hr.has(oe.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(oe)?Cc:hs:oe instanceof Wn?Cc:Array.isArray(oe)?ec:we==="object"&&isNaN(oe)?ws:$s)(Z,oe)}],e.interpolateArray=ec;function ec(Z,oe){var we=[],Be=[],Ue=Z.length,We=oe.length,wt=Math.min(Z.length,oe.length),tt;for(tt=0;tt=0?Z.slice(0,oe):Z,Be=oe>=0?Z.slice(oe+1):"in";return we=ov.get(we)||Ps,Be=wo.get(Be)||H,Od(Be(we.apply(null,t.call(arguments,1))))};function Od(Z){return function(oe){return oe<=0?0:oe>=1?1:Z(oe)}}function $o(Z){return function(oe){return 1-Z(1-oe)}}function Ja(Z){return function(oe){return .5*(oe<.5?Z(2*oe):2-Z(2-2*oe))}}function Ef(Z){return Z*Z}function tc(Z){return Z*Z*Z}function uu(Z){if(Z<=0)return 0;if(Z>=1)return 1;var oe=Z*Z,we=oe*Z;return 4*(Z<.5?we:3*(Z-oe)+we-.75)}function Mh(Z){return function(oe){return Math.pow(oe,Z)}}function jc(Z){return 1-Math.cos(Z*xe)}function kf(Z){return Math.pow(2,10*(Z-1))}function Ml(Z){return 1-Math.sqrt(1-Z*Z)}function Yh(Z,oe){var we;return arguments.length<2&&(oe=.45),arguments.length?we=oe/ht*Math.asin(1/Z):(Z=1,we=oe/4),function(Be){return 1+Z*Math.pow(2,-10*Be)*Math.sin((Be-we)*ht/oe)}}function Eh(Z){return Z||(Z=1.70158),function(oe){return oe*oe*((Z+1)*oe-Z)}}function nh(Z){return Z<1/2.75?7.5625*Z*Z:Z<2/2.75?7.5625*(Z-=1.5/2.75)*Z+.75:Z<2.5/2.75?7.5625*(Z-=2.25/2.75)*Z+.9375:7.5625*(Z-=2.625/2.75)*Z+.984375}e.interpolateHcl=hf;function hf(Z,oe){Z=e.hcl(Z),oe=e.hcl(oe);var we=Z.h,Be=Z.c,Ue=Z.l,We=oe.h-we,wt=oe.c-Be,tt=oe.l-Ue;return isNaN(wt)&&(wt=0,Be=isNaN(Be)?oe.c:Be),isNaN(We)?(We=0,we=isNaN(we)?oe.h:we):We>180?We-=360:We<-180&&(We+=360),function(zt){return Fr(we+We*zt,Be+wt*zt,Ue+tt*zt)+""}}e.interpolateHsl=kh;function kh(Z,oe){Z=e.hsl(Z),oe=e.hsl(oe);var we=Z.h,Be=Z.s,Ue=Z.l,We=oe.h-we,wt=oe.s-Be,tt=oe.l-Ue;return isNaN(wt)&&(wt=0,Be=isNaN(Be)?oe.s:Be),isNaN(We)?(We=0,we=isNaN(we)?oe.h:we):We>180?We-=360:We<-180&&(We+=360),function(zt){return jt(we+We*zt,Be+wt*zt,Ue+tt*zt)+""}}e.interpolateLab=Kh;function Kh(Z,oe){Z=e.lab(Z),oe=e.lab(oe);var we=Z.l,Be=Z.a,Ue=Z.b,We=oe.l-we,wt=oe.a-Be,tt=oe.b-Ue;return function(zt){return Gi(we+We*zt,Be+wt*zt,Ue+tt*zt)+""}}e.interpolateRound=rc;function rc(Z,oe){return oe-=Z,function(we){return Math.round(Z+oe*we)}}e.transform=function(Z){var oe=n.createElementNS(e.ns.prefix.svg,"g");return(e.transform=function(we){if(we!=null){oe.setAttribute("transform",we);var Be=oe.transform.baseVal.consolidate()}return new ah(Be?Be.matrix:Nf)})(Z)};function ah(Z){var oe=[Z.a,Z.b],we=[Z.c,Z.d],Be=df(oe),Ue=Wc(oe,we),We=df(Cu(we,oe,-Ue))||0;oe[0]*we[1]180?oe+=360:oe-Z>180&&(Z+=360),Be.push({i:we.push(Zc(we)+"rotate(",null,")")-2,x:$s(Z,oe)})):oe&&we.push(Zc(we)+"rotate("+oe+")")}function Bd(Z,oe,we,Be){Z!==oe?Be.push({i:we.push(Zc(we)+"skewX(",null,")")-2,x:$s(Z,oe)}):oe&&we.push(Zc(we)+"skewX("+oe+")")}function Jh(Z,oe,we,Be){if(Z[0]!==oe[0]||Z[1]!==oe[1]){var Ue=we.push(Zc(we)+"scale(",null,",",null,")");Be.push({i:Ue-4,x:$s(Z[0],oe[0])},{i:Ue-2,x:$s(Z[1],oe[1])})}else(oe[0]!==1||oe[1]!==1)&&we.push(Zc(we)+"scale("+oe+")")}function Cf(Z,oe){var we=[],Be=[];return Z=e.transform(Z),oe=e.transform(oe),ds(Z.translate,oe.translate,we,Be),Ch(Z.rotate,oe.rotate,we,Be),Bd(Z.skew,oe.skew,we,Be),Jh(Z.scale,oe.scale,we,Be),Z=oe=null,function(Ue){for(var We=-1,wt=Be.length,tt;++We0?We=Jr:(we.c=null,we.t=NaN,we=null,oe.end({type:"end",alpha:We=0})):Jr>0&&(oe.start({type:"start",alpha:We=Jr}),we=Oo(Z.tick)),Z):We},Z.start=function(){var Jr,un=oi.length,dn=ui.length,En=Be[0],Nn=Be[1],ga,ya;for(Jr=0;Jr=0;)We.push(lr=or[zt]),lr.parent=tt,lr.depth=tt.depth+1;we&&(tt.value=0),tt.children=or}else we&&(tt.value=+we.call(Be,tt,tt.depth)||0),delete tt.children;return vc(Ue,function(Dr){var Ir,oi;Z&&(Ir=Dr.children)&&Ir.sort(Z),we&&(oi=Dr.parent)&&(oi.value+=Dr.value)}),wt}return Be.sort=function(Ue){return arguments.length?(Z=Ue,Be):Z},Be.children=function(Ue){return arguments.length?(oe=Ue,Be):oe},Be.value=function(Ue){return arguments.length?(we=Ue,Be):we},Be.revalue=function(Ue){return we&&(Pc(Ue,function(We){We.children&&(We.value=0)}),vc(Ue,function(We){var wt;We.children||(We.value=+we.call(Be,We,We.depth)||0),(wt=We.parent)&&(wt.value+=We.value)})),Ue},Be};function Gu(Z,oe){return e.rebind(Z,oe,"sort","children","value"),Z.nodes=Z,Z.links=Iu,Z}function Pc(Z,oe){for(var we=[Z];(Z=we.pop())!=null;)if(oe(Z),(Ue=Z.children)&&(Be=Ue.length))for(var Be,Ue;--Be>=0;)we.push(Ue[Be])}function vc(Z,oe){for(var we=[Z],Be=[];(Z=we.pop())!=null;)if(Be.push(Z),(wt=Z.children)&&(We=wt.length))for(var Ue=-1,We,wt;++UeUe&&(Ue=tt),Be.push(tt)}for(wt=0;wtBe&&(we=oe,Be=Ue);return we}function Is(Z){return Z.reduce(Pf,0)}function Pf(Z,oe){return Z+oe[1]}e.layout.histogram=function(){var Z=!0,oe=Number,we=Vf,Be=Ic;function Ue(We,Ir){for(var tt=[],zt=We.map(oe,this),or=we.call(this,zt,Ir),lr=Be.call(this,or,zt,Ir),Dr,Ir=-1,oi=zt.length,ui=lr.length-1,qr=Z?1:1/oi,Kr;++Ir0)for(Ir=-1;++Ir=or[0]&&Kr<=or[1]&&(Dr=tt[e.bisect(lr,Kr,1,ui)-1],Dr.y+=qr,Dr.push(We[Ir]));return tt}return Ue.value=function(We){return arguments.length?(oe=We,Ue):oe},Ue.range=function(We){return arguments.length?(we=ti(We),Ue):we},Ue.bins=function(We){return arguments.length?(Be=typeof We=="number"?function(wt){return ju(wt,We)}:ti(We),Ue):Be},Ue.frequency=function(We){return arguments.length?(Z=!!We,Ue):Z},Ue};function Ic(Z,oe){return ju(Z,Math.ceil(Math.log(oe.length)/Math.LN2+1))}function ju(Z,oe){for(var we=-1,Be=+Z[0],Ue=(Z[1]-Be)/oe,We=[];++we<=oe;)We[we]=Ue*we+Be;return We}function Vf(Z){return[e.min(Z),e.max(Z)]}e.layout.pack=function(){var Z=e.layout.hierarchy().sort(pc),oe=0,we=[1,1],Be;function Ue(We,wt){var tt=Z.call(this,We,wt),zt=tt[0],or=we[0],lr=we[1],Dr=Be==null?Math.sqrt:typeof Be=="function"?Be:function(){return Be};if(zt.x=zt.y=0,vc(zt,function(oi){oi.r=+Dr(oi.value)}),vc(zt,Ih),oe){var Ir=oe*(Be?1:Math.max(2*zt.r/or,2*zt.r/lr))/2;vc(zt,function(oi){oi.r+=Ir}),vc(zt,Ih),vc(zt,function(oi){oi.r-=Ir})}return gc(zt,or/2,lr/2,Be?1:1/Math.max(2*zt.r/or,2*zt.r/lr)),tt}return Ue.size=function(We){return arguments.length?(we=We,Ue):we},Ue.radius=function(We){return arguments.length?(Be=We==null||typeof We=="function"?We:+We,Ue):Be},Ue.padding=function(We){return arguments.length?(oe=+We,Ue):oe},Gu(Ue,Z)};function pc(Z,oe){return Z.value-oe.value}function pf(Z,oe){var we=Z._pack_next;Z._pack_next=oe,oe._pack_prev=Z,oe._pack_next=we,we._pack_prev=oe}function Ph(Z,oe){Z._pack_next=oe,oe._pack_prev=Z}function Rl(Z,oe){var we=oe.x-Z.x,Be=oe.y-Z.y,Ue=Z.r+oe.r;return .999*Ue*Ue>we*we+Be*Be}function Ih(Z){if(!(oe=Z.children)||!(Ir=oe.length))return;var oe,we=1/0,Be=-1/0,Ue=1/0,We=-1/0,wt,tt,zt,or,lr,Dr,Ir;function oi(Jr){we=Math.min(Jr.x-Jr.r,we),Be=Math.max(Jr.x+Jr.r,Be),Ue=Math.min(Jr.y-Jr.r,Ue),We=Math.max(Jr.y+Jr.r,We)}if(oe.forEach(Wu),wt=oe[0],wt.x=-wt.r,wt.y=0,oi(wt),Ir>1&&(tt=oe[1],tt.x=tt.r,tt.y=0,oi(tt),Ir>2))for(zt=oe[2],hl(wt,tt,zt),oi(zt),pf(wt,zt),wt._pack_prev=zt,pf(zt,tt),tt=wt._pack_next,or=3;orKr.x&&(Kr=un),un.depth>ii.depth&&(ii=un)});var vi=oe(qr,Kr)/2-qr.x,ci=we[0]/(Kr.x+oe(Kr,qr)/2+vi),Jr=we[1]/(ii.depth||1);Pc(oi,function(un){un.x=(un.x+vi)*ci,un.y=un.depth*Jr})}return Ir}function We(lr){for(var Dr={A:null,children:[lr]},Ir=[Dr],oi;(oi=Ir.pop())!=null;)for(var ui=oi.children,qr,Kr=0,ii=ui.length;Kr0&&(nc(gt(qr,lr,Ir),lr,un),ii+=un,vi+=un),ci+=qr.m,ii+=oi.m,Jr+=Kr.m,vi+=ui.m;qr&&!Yc(ui)&&(ui.t=qr,ui.m+=ci-vi),oi&&!mc(Kr)&&(Kr.t=oi,Kr.m+=ii-Jr,Ir=lr)}return Ir}function or(lr){lr.x*=we[0],lr.y=lr.depth*we[1]}return Ue.separation=function(lr){return arguments.length?(oe=lr,Ue):oe},Ue.size=function(lr){return arguments.length?(Be=(we=lr)==null?or:null,Ue):Be?null:we},Ue.nodeSize=function(lr){return arguments.length?(Be=(we=lr)==null?null:or,Ue):Be?we:null},Gu(Ue,Z)};function ru(Z,oe){return Z.parent==oe.parent?1:2}function mc(Z){var oe=Z.children;return oe.length?oe[0]:Z.t}function Yc(Z){var oe=Z.children,we;return(we=oe.length)?oe[we-1]:Z.t}function nc(Z,oe,we){var Be=we/(oe.i-Z.i);oe.c-=Be,oe.s+=we,Z.c+=Be,oe.z+=we,oe.m+=we}function gf(Z){for(var oe=0,we=0,Be=Z.children,Ue=Be.length,We;--Ue>=0;)We=Be[Ue],We.z+=oe,We.m+=oe,oe+=We.s+(we+=We.c)}function gt(Z,oe,we){return Z.a.parent===oe.parent?Z.a:we}e.layout.cluster=function(){var Z=e.layout.hierarchy().sort(null).value(null),oe=ru,we=[1,1],Be=!1;function Ue(We,wt){var tt=Z.call(this,We,wt),zt=tt[0],or,lr=0;vc(zt,function(qr){var Kr=qr.children;Kr&&Kr.length?(qr.x=wr(Kr),qr.y=Bt(Kr)):(qr.x=or?lr+=oe(qr,or):0,qr.y=0,or=qr)});var Dr=vr(zt),Ir=Ur(zt),oi=Dr.x-oe(Dr,Ir)/2,ui=Ir.x+oe(Ir,Dr)/2;return vc(zt,Be?function(qr){qr.x=(qr.x-zt.x)*we[0],qr.y=(zt.y-qr.y)*we[1]}:function(qr){qr.x=(qr.x-oi)/(ui-oi)*we[0],qr.y=(1-(zt.y?qr.y/zt.y:1))*we[1]}),tt}return Ue.separation=function(We){return arguments.length?(oe=We,Ue):oe},Ue.size=function(We){return arguments.length?(Be=(we=We)==null,Ue):Be?null:we},Ue.nodeSize=function(We){return arguments.length?(Be=(we=We)!=null,Ue):Be?we:null},Gu(Ue,Z)};function Bt(Z){return 1+e.max(Z,function(oe){return oe.y})}function wr(Z){return Z.reduce(function(oe,we){return oe+we.x},0)/Z.length}function vr(Z){var oe=Z.children;return oe&&oe.length?vr(oe[0]):Z}function Ur(Z){var oe=Z.children,we;return oe&&(we=oe.length)?Ur(oe[we-1]):Z}e.layout.treemap=function(){var Z=e.layout.hierarchy(),oe=Math.round,we=[1,1],Be=null,Ue=fi,We=!1,wt,tt="squarify",zt=.5*(1+Math.sqrt(5));function or(qr,Kr){for(var ii=-1,vi=qr.length,ci,Jr;++ii0;)vi.push(Jr=ci[Nn-1]),vi.area+=Jr.area,tt!=="squarify"||(dn=Ir(vi,En))<=un?(ci.pop(),un=dn):(vi.area-=vi.pop().area,oi(vi,En,ii,!1),En=Math.min(ii.dx,ii.dy),vi.length=vi.area=0,un=1/0);vi.length&&(oi(vi,En,ii,!0),vi.length=vi.area=0),Kr.forEach(lr)}}function Dr(qr){var Kr=qr.children;if(Kr&&Kr.length){var ii=Ue(qr),vi=Kr.slice(),ci,Jr=[];for(or(vi,ii.dx*ii.dy/qr.value),Jr.area=0;ci=vi.pop();)Jr.push(ci),Jr.area+=ci.area,ci.z!=null&&(oi(Jr,ci.z?ii.dx:ii.dy,ii,!vi.length),Jr.length=Jr.area=0);Kr.forEach(Dr)}}function Ir(qr,Kr){for(var ii=qr.area,vi,ci=0,Jr=1/0,un=-1,dn=qr.length;++unci&&(ci=vi));return ii*=ii,Kr*=Kr,ii?Math.max(Kr*ci*zt/ii,ii/(Kr*Jr*zt)):1/0}function oi(qr,Kr,ii,vi){var ci=-1,Jr=qr.length,un=ii.x,dn=ii.y,En=Kr?oe(qr.area/Kr):0,Nn;if(Kr==ii.dx){for((vi||En>ii.dy)&&(En=ii.dy);++ciii.dx)&&(En=ii.dx);++ci1);return Z+oe*Be*Math.sqrt(-2*Math.log(We)/We)}},logNormal:function(){var Z=e.random.normal.apply(e,arguments);return function(){return Math.exp(Z())}},bates:function(Z){var oe=e.random.irwinHall(Z);return function(){return oe()/Z}},irwinHall:function(Z){return function(){for(var oe=0,we=0;we2?mi:hn,or=Be?Lu:pd;return Ue=zt(Z,oe,or,we),We=zt(oe,Z,or,Sl),tt}function tt(zt){return Ue(zt)}return tt.invert=function(zt){return We(zt)},tt.domain=function(zt){return arguments.length?(Z=zt.map(Number),wt()):Z},tt.range=function(zt){return arguments.length?(oe=zt,wt()):oe},tt.rangeRound=function(zt){return tt.range(zt).interpolate(rc)},tt.clamp=function(zt){return arguments.length?(Be=zt,wt()):Be},tt.interpolate=function(zt){return arguments.length?(we=zt,wt()):we},tt.ticks=function(zt){return qa(Z,zt)},tt.tickFormat=function(zt,or){return d3_scale_linearTickFormat(Z,zt,or)},tt.nice=function(zt){return Ta(Z,zt),wt()},tt.copy=function(){return Pn(Z,oe,we,Be)},wt()}function Ma(Z,oe){return e.rebind(Z,oe,"range","rangeRound","interpolate","clamp")}function Ta(Z,oe){return Ti(Z,qi(Ea(Z,oe)[2])),Ti(Z,qi(Ea(Z,oe)[2])),Z}function Ea(Z,oe){oe==null&&(oe=10);var we=Fi(Z),Be=we[1]-we[0],Ue=Math.pow(10,Math.floor(Math.log(Be/oe)/Math.LN10)),We=oe/Be*Ue;return We<=.15?Ue*=10:We<=.35?Ue*=5:We<=.75&&(Ue*=2),we[0]=Math.ceil(we[0]/Ue)*Ue,we[1]=Math.floor(we[1]/Ue)*Ue+Ue*.5,we[2]=Ue,we}function qa(Z,oe){return e.range.apply(e,Ea(Z,oe))}var Cn={s:1,g:1,p:1,r:1,e:1};function sn(Z){return-Math.floor(Math.log(Z)/Math.LN10+.01)}function Ua(Z,oe){var we=sn(oe[2]);return Z in Cn?Math.abs(we-sn(Math.max(g(oe[0]),g(oe[1]))))+ +(Z!=="e"):we-(Z==="%")*2}e.scale.log=function(){return mo(e.scale.linear().domain([0,1]),10,!0,[1,10])};function mo(Z,oe,we,Be){function Ue(tt){return(we?Math.log(tt<0?0:tt):-Math.log(tt>0?0:-tt))/Math.log(oe)}function We(tt){return we?Math.pow(oe,tt):-Math.pow(oe,-tt)}function wt(tt){return Z(Ue(tt))}return wt.invert=function(tt){return We(Z.invert(tt))},wt.domain=function(tt){return arguments.length?(we=tt[0]>=0,Z.domain((Be=tt.map(Number)).map(Ue)),wt):Be},wt.base=function(tt){return arguments.length?(oe=+tt,Z.domain(Be.map(Ue)),wt):oe},wt.nice=function(){var tt=Ti(Be.map(Ue),we?Math:Xo);return Z.domain(tt),Be=tt.map(We),wt},wt.ticks=function(){var tt=Fi(Be),zt=[],or=tt[0],lr=tt[1],Dr=Math.floor(Ue(or)),Ir=Math.ceil(Ue(lr)),oi=oe%1?2:oe;if(isFinite(Ir-Dr)){if(we){for(;Dr0;ui--)zt.push(We(Dr)*ui);for(Dr=0;zt[Dr]lr;Ir--);zt=zt.slice(Dr,Ir)}return zt},wt.copy=function(){return mo(Z.copy(),oe,we,Be)},Ma(wt,Z)}var Xo={floor:function(Z){return-Math.ceil(-Z)},ceil:function(Z){return-Math.floor(-Z)}};e.scale.pow=function(){return Ts(e.scale.linear(),1,[0,1])};function Ts(Z,oe,we){var Be=Qo(oe),Ue=Qo(1/oe);function We(wt){return Z(Be(wt))}return We.invert=function(wt){return Ue(Z.invert(wt))},We.domain=function(wt){return arguments.length?(Z.domain((we=wt.map(Number)).map(Be)),We):we},We.ticks=function(wt){return qa(we,wt)},We.tickFormat=function(wt,tt){return d3_scale_linearTickFormat(we,wt,tt)},We.nice=function(wt){return We.domain(Ta(we,wt))},We.exponent=function(wt){return arguments.length?(Be=Qo(oe=wt),Ue=Qo(1/oe),Z.domain(we.map(Be)),We):oe},We.copy=function(){return Ts(Z.copy(),oe,we)},Ma(We,Z)}function Qo(Z){return function(oe){return oe<0?-Math.pow(-oe,Z):Math.pow(oe,Z)}}e.scale.sqrt=function(){return e.scale.pow().exponent(.5)},e.scale.ordinal=function(){return ys([],{t:"range",a:[[]]})};function ys(Z,oe){var we,Be,Ue;function We(tt){return Be[((we.get(tt)||(oe.t==="range"?we.set(tt,Z.push(tt)):NaN))-1)%Be.length]}function wt(tt,zt){return e.range(Z.length).map(function(or){return tt+zt*or})}return We.domain=function(tt){if(!arguments.length)return Z;Z=[],we=new A;for(var zt=-1,or=tt.length,lr;++zt0?we[We-1]:Z[0],WeIr?0:1;if(lr=Le)return zt(lr,ui)+(or?zt(or,1-ui):"")+"Z";var qr,Kr,ii,vi,ci=0,Jr=0,un,dn,En,Nn,ga,ya,so,wa,io=[];if((vi=(+wt.apply(this,arguments)||0)/2)&&(ii=Be===Ru?Math.sqrt(or*or+lr*lr):+Be.apply(this,arguments),ui||(Jr*=-1),lr&&(Jr=Qr(ii/lr*Math.sin(vi))),or&&(ci=Qr(ii/or*Math.sin(vi)))),lr){un=lr*Math.cos(Dr+Jr),dn=lr*Math.sin(Dr+Jr),En=lr*Math.cos(Ir-Jr),Nn=lr*Math.sin(Ir-Jr);var Ss=Math.abs(Ir-Dr-2*Jr)<=Xe?0:1;if(Jr&&Dc(un,dn,En,Nn)===ui^Ss){var _s=(Dr+Ir)/2;un=lr*Math.cos(_s),dn=lr*Math.sin(_s),En=Nn=null}}else un=dn=0;if(or){ga=or*Math.cos(Ir-ci),ya=or*Math.sin(Ir-ci),so=or*Math.cos(Dr+ci),wa=or*Math.sin(Dr+ci);var Ns=Math.abs(Dr-Ir+2*ci)<=Xe?0:1;if(ci&&Dc(ga,ya,so,wa)===1-ui^Ns){var pn=(Dr+Ir)/2;ga=or*Math.cos(pn),ya=or*Math.sin(pn),so=wa=null}}else ga=ya=0;if(oi>Ye&&(qr=Math.min(Math.abs(lr-or)/2,+we.apply(this,arguments)))>.001){Kr=or0?0:1}function Da(Z,oe,we,Be,Ue){var We=Z[0]-oe[0],wt=Z[1]-oe[1],tt=(Ue?Be:-Be)/Math.sqrt(We*We+wt*wt),zt=tt*wt,or=-tt*We,lr=Z[0]+zt,Dr=Z[1]+or,Ir=oe[0]+zt,oi=oe[1]+or,ui=(lr+Ir)/2,qr=(Dr+oi)/2,Kr=Ir-lr,ii=oi-Dr,vi=Kr*Kr+ii*ii,ci=we-Be,Jr=lr*oi-Ir*Dr,un=(ii<0?-1:1)*Math.sqrt(Math.max(0,ci*ci*vi-Jr*Jr)),dn=(Jr*ii-Kr*un)/vi,En=(-Jr*Kr-ii*un)/vi,Nn=(Jr*ii+Kr*un)/vi,ga=(-Jr*Kr+ii*un)/vi,ya=dn-ui,so=En-qr,wa=Nn-ui,io=ga-qr;return ya*ya+so*so>wa*wa+io*io&&(dn=Nn,En=ga),[[dn-zt,En-or],[dn*we/ci,En*we/ci]]}function eo(){return!0}function Jc(Z){var oe=zs,we=ks,Be=eo,Ue=_c,We=Ue.key,wt=.7;function tt(zt){var or=[],lr=[],Dr=-1,Ir=zt.length,oi,ui=ti(oe),qr=ti(we);function Kr(){or.push("M",Ue(Z(lr),wt))}for(;++Dr1?Z.join("L"):Z+"Z"}function le(Z){return Z.join("L")+"Z"}function w(Z){for(var oe=0,we=Z.length,Be=Z[0],Ue=[Be[0],",",Be[1]];++oe1&&Ue.push("H",Be[0]),Ue.join("")}function B(Z){for(var oe=0,we=Z.length,Be=Z[0],Ue=[Be[0],",",Be[1]];++oe1){tt=oe[1],We=Z[zt],zt++,Be+="C"+(Ue[0]+wt[0])+","+(Ue[1]+wt[1])+","+(We[0]-tt[0])+","+(We[1]-tt[1])+","+We[0]+","+We[1];for(var or=2;or9&&(We=we*3/Math.sqrt(We),wt[tt]=We*Be,wt[tt+1]=We*Ue));for(tt=-1;++tt<=zt;)We=(Z[Math.min(zt,tt+1)][0]-Z[Math.max(0,tt-1)][0])/(6*(1+wt[tt]*wt[tt])),oe.push([We||0,wt[tt]*We||0]);return oe}function Mt(Z){return Z.length<3?_c(Z):Z[0]+je(Z,et(Z))}e.svg.line.radial=function(){var Z=Jc(Dt);return Z.radius=Z.x,delete Z.x,Z.angle=Z.y,delete Z.y,Z};function Dt(Z){for(var oe,we=-1,Be=Z.length,Ue,We;++weXe)+",1 "+Dr}function or(lr,Dr,Ir,oi){return"Q 0,0 "+oi}return We.radius=function(lr){return arguments.length?(we=ti(lr),We):we},We.source=function(lr){return arguments.length?(Z=ti(lr),We):Z},We.target=function(lr){return arguments.length?(oe=ti(lr),We):oe},We.startAngle=function(lr){return arguments.length?(Be=ti(lr),We):Be},We.endAngle=function(lr){return arguments.length?(Ue=ti(lr),We):Ue},We};function Rr(Z){return Z.radius}e.svg.diagonal=function(){var Z=tr,oe=mr,we=zr;function Be(Ue,We){var wt=Z.call(this,Ue,We),tt=oe.call(this,Ue,We),zt=(wt.y+tt.y)/2,or=[wt,{x:wt.x,y:zt},{x:tt.x,y:zt},tt];return or=or.map(we),"M"+or[0]+"C"+or[1]+" "+or[2]+" "+or[3]}return Be.source=function(Ue){return arguments.length?(Z=ti(Ue),Be):Z},Be.target=function(Ue){return arguments.length?(oe=ti(Ue),Be):oe},Be.projection=function(Ue){return arguments.length?(we=Ue,Be):we},Be};function zr(Z){return[Z.x,Z.y]}e.svg.diagonal.radial=function(){var Z=e.svg.diagonal(),oe=zr,we=Z.projection;return Z.projection=function(Be){return arguments.length?we(Xr(oe=Be)):oe},Z};function Xr(Z){return function(){var oe=Z.apply(this,arguments),we=oe[0],Be=oe[1]-xe;return[we*Math.cos(Be),we*Math.sin(Be)]}}e.svg.symbol=function(){var Z=Li,oe=di;function we(Be,Ue){return(Qi.get(Z.call(this,Be,Ue))||Ci)(oe.call(this,Be,Ue))}return we.type=function(Be){return arguments.length?(Z=ti(Be),we):Z},we.size=function(Be){return arguments.length?(oe=ti(Be),we):oe},we};function di(){return 64}function Li(){return"circle"}function Ci(Z){var oe=Math.sqrt(Z/Xe);return"M0,"+oe+"A"+oe+","+oe+" 0 1,1 0,"+-oe+"A"+oe+","+oe+" 0 1,1 0,"+oe+"Z"}var Qi=e.map({circle:Ci,cross:function(Z){var oe=Math.sqrt(Z/5)/2;return"M"+-3*oe+","+-oe+"H"+-oe+"V"+-3*oe+"H"+oe+"V"+-oe+"H"+3*oe+"V"+oe+"H"+oe+"V"+3*oe+"H"+-oe+"V"+oe+"H"+-3*oe+"Z"},diamond:function(Z){var oe=Math.sqrt(Z/(2*pa)),we=oe*pa;return"M0,"+-oe+"L"+we+",0 0,"+oe+" "+-we+",0Z"},square:function(Z){var oe=Math.sqrt(Z)/2;return"M"+-oe+","+-oe+"L"+oe+","+-oe+" "+oe+","+oe+" "+-oe+","+oe+"Z"},"triangle-down":function(Z){var oe=Math.sqrt(Z/Mn),we=oe*Mn/2;return"M0,"+we+"L"+oe+","+-we+" "+-oe+","+-we+"Z"},"triangle-up":function(Z){var oe=Math.sqrt(Z/Mn),we=oe*Mn/2;return"M0,"+-we+"L"+oe+","+we+" "+-oe+","+we+"Z"}});e.svg.symbolTypes=Qi.keys();var Mn=Math.sqrt(3),pa=Math.tan(30*Se);Ce.transition=function(Z){for(var oe=Ro||++co,we=po(Z),Be=[],Ue,We,wt=Ds||{time:Date.now(),ease:uu,delay:0,duration:250},tt=-1,zt=this.length;++tt0;)Dr[--vi].call(Z,ii);if(Kr>=1)return wt.event&&wt.event.end.call(Z,Z.__data__,oe),--We.count?delete We[Be]:delete Z[we],1}wt||(tt=Ue.time,zt=Oo(Ir,0,tt),wt=We[Be]={tween:new A,time:tt,timer:zt,delay:Ue.delay,duration:Ue.duration,ease:Ue.ease,index:oe},Ue=null,++We.count)}e.svg.axis=function(){var Z=e.scale.linear(),oe=Vl,we=6,Be=6,Ue=3,We=[10],wt=null,tt;function zt(or){or.each(function(){var lr=e.select(this),Dr=this.__chart__||Z,Ir=this.__chart__=Z.copy(),oi=wt==null?Ir.ticks?Ir.ticks.apply(Ir,We):Ir.domain():wt,ui=tt==null?Ir.tickFormat?Ir.tickFormat.apply(Ir,We):H:tt,qr=lr.selectAll(".tick").data(oi,Ir),Kr=qr.enter().insert("g",".domain").attr("class","tick").style("opacity",Ye),ii=e.transition(qr.exit()).style("opacity",Ye).remove(),vi=e.transition(qr.order()).style("opacity",1),ci=Math.max(we,0)+Ue,Jr,un=Xi(Ir),dn=lr.selectAll(".domain").data([0]),En=(dn.enter().append("path").attr("class","domain"),e.transition(dn));Kr.append("line"),Kr.append("text");var Nn=Kr.select("line"),ga=vi.select("line"),ya=qr.select("text").text(ui),so=Kr.select("text"),wa=vi.select("text"),io=oe==="top"||oe==="left"?-1:1,Ss,_s,Ns,pn;if(oe==="bottom"||oe==="top"?(Jr=cu,Ss="x",Ns="y",_s="x2",pn="y2",ya.attr("dy",io<0?"0em":".71em").style("text-anchor","middle"),En.attr("d","M"+un[0]+","+io*Be+"V0H"+un[1]+"V"+io*Be)):(Jr=el,Ss="y",Ns="x",_s="y2",pn="x2",ya.attr("dy",".32em").style("text-anchor",io<0?"end":"start"),En.attr("d","M"+io*Be+","+un[0]+"H0V"+un[1]+"H"+io*Be)),Nn.attr(pn,io*we),so.attr(Ns,io*ci),ga.attr(_s,0).attr(pn,io*we),wa.attr(Ss,0).attr(Ns,io*ci),Ir.rangeBand){var za=Ir,Lo=za.rangeBand()/2;Dr=Ir=function(Fo){return za(Fo)+Lo}}else Dr.rangeBand?Dr=Ir:ii.call(Jr,Ir,Dr);Kr.call(Jr,Dr,Ir),vi.call(Jr,Ir,Ir)})}return zt.scale=function(or){return arguments.length?(Z=or,zt):Z},zt.orient=function(or){return arguments.length?(oe=or in Zu?or+"":Vl,zt):oe},zt.ticks=function(){return arguments.length?(We=r(arguments),zt):We},zt.tickValues=function(or){return arguments.length?(wt=or,zt):wt},zt.tickFormat=function(or){return arguments.length?(tt=or,zt):tt},zt.tickSize=function(or){var lr=arguments.length;return lr?(we=+or,Be=+arguments[lr-1],zt):we},zt.innerTickSize=function(or){return arguments.length?(we=+or,zt):we},zt.outerTickSize=function(or){return arguments.length?(Be=+or,zt):Be},zt.tickPadding=function(or){return arguments.length?(Ue=+or,zt):Ue},zt.tickSubdivide=function(){return arguments.length&&zt},zt};var Vl="bottom",Zu={top:1,right:1,bottom:1,left:1};function cu(Z,oe,we){Z.attr("transform",function(Be){var Ue=oe(Be);return"translate("+(isFinite(Ue)?Ue:we(Be))+",0)"})}function el(Z,oe,we){Z.attr("transform",function(Be){var Ue=oe(Be);return"translate(0,"+(isFinite(Ue)?Ue:we(Be))+")"})}e.svg.brush=function(){var Z=ke(lr,"brushstart","brush","brushend"),oe=null,we=null,Be=[0,0],Ue=[0,0],We,wt,tt=!0,zt=!0,or=zc[0];function lr(qr){qr.each(function(){var Kr=e.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",ui).on("touchstart.brush",ui),ii=Kr.selectAll(".background").data([0]);ii.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),Kr.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var vi=Kr.selectAll(".resize").data(or,H);vi.exit().remove(),vi.enter().append("g").attr("class",function(dn){return"resize "+dn}).style("cursor",function(dn){return nu[dn]}).append("rect").attr("x",function(dn){return/[ew]$/.test(dn)?-3:null}).attr("y",function(dn){return/^[ns]/.test(dn)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),vi.style("display",lr.empty()?"none":null);var ci=e.transition(Kr),Jr=e.transition(ii),un;oe&&(un=Xi(oe),Jr.attr("x",un[0]).attr("width",un[1]-un[0]),Ir(ci)),we&&(un=Xi(we),Jr.attr("y",un[0]).attr("height",un[1]-un[0]),oi(ci)),Dr(ci)})}lr.event=function(qr){qr.each(function(){var Kr=Z.of(this,arguments),ii={x:Be,y:Ue,i:We,j:wt},vi=this.__chart__||ii;this.__chart__=ii,Ro?e.select(this).transition().each("start.brush",function(){We=vi.i,wt=vi.j,Be=vi.x,Ue=vi.y,Kr({type:"brushstart"})}).tween("brush:brush",function(){var ci=ec(Be,ii.x),Jr=ec(Ue,ii.y);return We=wt=null,function(un){Be=ii.x=ci(un),Ue=ii.y=Jr(un),Kr({type:"brush",mode:"resize"})}}).each("end.brush",function(){We=ii.i,wt=ii.j,Kr({type:"brush",mode:"resize"}),Kr({type:"brushend"})}):(Kr({type:"brushstart"}),Kr({type:"brush",mode:"resize"}),Kr({type:"brushend"}))})};function Dr(qr){qr.selectAll(".resize").attr("transform",function(Kr){return"translate("+Be[+/e$/.test(Kr)]+","+Ue[+/^s/.test(Kr)]+")"})}function Ir(qr){qr.select(".extent").attr("x",Be[0]),qr.selectAll(".extent,.n>rect,.s>rect").attr("width",Be[1]-Be[0])}function oi(qr){qr.select(".extent").attr("y",Ue[0]),qr.selectAll(".extent,.e>rect,.w>rect").attr("height",Ue[1]-Ue[0])}function ui(){var qr=this,Kr=e.select(e.event.target),ii=Z.of(qr,arguments),vi=e.select(qr),ci=Kr.datum(),Jr=!/^(n|s)$/.test(ci)&&oe,un=!/^(e|w)$/.test(ci)&&we,dn=Kr.classed("extent"),En=Or(qr),Nn,ga=e.mouse(qr),ya,so=e.select(a(qr)).on("keydown.brush",Ss).on("keyup.brush",_s);if(e.event.changedTouches?so.on("touchmove.brush",Ns).on("touchend.brush",za):so.on("mousemove.brush",Ns).on("mouseup.brush",za),vi.interrupt().selectAll("*").interrupt(),dn)ga[0]=Be[0]-ga[0],ga[1]=Ue[0]-ga[1];else if(ci){var wa=+/w$/.test(ci),io=+/^n/.test(ci);ya=[Be[1-wa]-ga[0],Ue[1-io]-ga[1]],ga[0]=Be[wa],ga[1]=Ue[io]}else e.event.altKey&&(Nn=ga.slice());vi.style("pointer-events","none").selectAll(".resize").style("display",null),e.select("body").style("cursor",Kr.style("cursor")),ii({type:"brushstart"}),Ns();function Ss(){e.event.keyCode==32&&(dn||(Nn=null,ga[0]-=Be[1],ga[1]-=Ue[1],dn=2),_e())}function _s(){e.event.keyCode==32&&dn==2&&(ga[0]+=Be[1],ga[1]+=Ue[1],dn=0,_e())}function Ns(){var Lo=e.mouse(qr),Fo=!1;ya&&(Lo[0]+=ya[0],Lo[1]+=ya[1]),dn||(e.event.altKey?(Nn||(Nn=[(Be[0]+Be[1])/2,(Ue[0]+Ue[1])/2]),ga[0]=Be[+(Lo[0]{(function(e,t){typeof r6=="object"&&typeof eee!="undefined"?t(r6):typeof define=="function"&&define.amd?define(["exports"],t):(e=e||self,t(e.d3=e.d3||{}))})(r6,function(e){"use strict";var t=new Date,r=new Date;function n(Ke,xt,bt,Lt){function St(Et){return Ke(Et=arguments.length===0?new Date:new Date(+Et)),Et}return St.floor=function(Et){return Ke(Et=new Date(+Et)),Et},St.ceil=function(Et){return Ke(Et=new Date(Et-1)),xt(Et,1),Ke(Et),Et},St.round=function(Et){var dt=St(Et),Ht=St.ceil(Et);return Et-dt0))return $t;do $t.push(fr=new Date(+Et)),xt(Et,Ht),Ke(Et);while(fr=dt)for(;Ke(dt),!Et(dt);)dt.setTime(dt-1)},function(dt,Ht){if(dt>=dt)if(Ht<0)for(;++Ht<=0;)for(;xt(dt,-1),!Et(dt););else for(;--Ht>=0;)for(;xt(dt,1),!Et(dt););})},bt&&(St.count=function(Et,dt){return t.setTime(+Et),r.setTime(+dt),Ke(t),Ke(r),Math.floor(bt(t,r))},St.every=function(Et){return Et=Math.floor(Et),!isFinite(Et)||!(Et>0)?null:Et>1?St.filter(Lt?function(dt){return Lt(dt)%Et===0}:function(dt){return St.count(0,dt)%Et===0}):St}),St}var i=n(function(){},function(Ke,xt){Ke.setTime(+Ke+xt)},function(Ke,xt){return xt-Ke});i.every=function(Ke){return Ke=Math.floor(Ke),!isFinite(Ke)||!(Ke>0)?null:Ke>1?n(function(xt){xt.setTime(Math.floor(xt/Ke)*Ke)},function(xt,bt){xt.setTime(+xt+bt*Ke)},function(xt,bt){return(bt-xt)/Ke}):i};var a=i.range,o=1e3,s=6e4,l=36e5,u=864e5,c=6048e5,f=n(function(Ke){Ke.setTime(Ke-Ke.getMilliseconds())},function(Ke,xt){Ke.setTime(+Ke+xt*o)},function(Ke,xt){return(xt-Ke)/o},function(Ke){return Ke.getUTCSeconds()}),h=f.range,d=n(function(Ke){Ke.setTime(Ke-Ke.getMilliseconds()-Ke.getSeconds()*o)},function(Ke,xt){Ke.setTime(+Ke+xt*s)},function(Ke,xt){return(xt-Ke)/s},function(Ke){return Ke.getMinutes()}),v=d.range,x=n(function(Ke){Ke.setTime(Ke-Ke.getMilliseconds()-Ke.getSeconds()*o-Ke.getMinutes()*s)},function(Ke,xt){Ke.setTime(+Ke+xt*l)},function(Ke,xt){return(xt-Ke)/l},function(Ke){return Ke.getHours()}),b=x.range,g=n(function(Ke){Ke.setHours(0,0,0,0)},function(Ke,xt){Ke.setDate(Ke.getDate()+xt)},function(Ke,xt){return(xt-Ke-(xt.getTimezoneOffset()-Ke.getTimezoneOffset())*s)/u},function(Ke){return Ke.getDate()-1}),E=g.range;function k(Ke){return n(function(xt){xt.setDate(xt.getDate()-(xt.getDay()+7-Ke)%7),xt.setHours(0,0,0,0)},function(xt,bt){xt.setDate(xt.getDate()+bt*7)},function(xt,bt){return(bt-xt-(bt.getTimezoneOffset()-xt.getTimezoneOffset())*s)/c})}var A=k(0),L=k(1),_=k(2),C=k(3),M=k(4),p=k(5),P=k(6),T=A.range,F=L.range,q=_.range,V=C.range,H=M.range,X=p.range,G=P.range,N=n(function(Ke){Ke.setDate(1),Ke.setHours(0,0,0,0)},function(Ke,xt){Ke.setMonth(Ke.getMonth()+xt)},function(Ke,xt){return xt.getMonth()-Ke.getMonth()+(xt.getFullYear()-Ke.getFullYear())*12},function(Ke){return Ke.getMonth()}),W=N.range,re=n(function(Ke){Ke.setMonth(0,1),Ke.setHours(0,0,0,0)},function(Ke,xt){Ke.setFullYear(Ke.getFullYear()+xt)},function(Ke,xt){return xt.getFullYear()-Ke.getFullYear()},function(Ke){return Ke.getFullYear()});re.every=function(Ke){return!isFinite(Ke=Math.floor(Ke))||!(Ke>0)?null:n(function(xt){xt.setFullYear(Math.floor(xt.getFullYear()/Ke)*Ke),xt.setMonth(0,1),xt.setHours(0,0,0,0)},function(xt,bt){xt.setFullYear(xt.getFullYear()+bt*Ke)})};var ae=re.range,_e=n(function(Ke){Ke.setUTCSeconds(0,0)},function(Ke,xt){Ke.setTime(+Ke+xt*s)},function(Ke,xt){return(xt-Ke)/s},function(Ke){return Ke.getUTCMinutes()}),Me=_e.range,ke=n(function(Ke){Ke.setUTCMinutes(0,0,0)},function(Ke,xt){Ke.setTime(+Ke+xt*l)},function(Ke,xt){return(xt-Ke)/l},function(Ke){return Ke.getUTCHours()}),ge=ke.range,ie=n(function(Ke){Ke.setUTCHours(0,0,0,0)},function(Ke,xt){Ke.setUTCDate(Ke.getUTCDate()+xt)},function(Ke,xt){return(xt-Ke)/u},function(Ke){return Ke.getUTCDate()-1}),Te=ie.range;function Ee(Ke){return n(function(xt){xt.setUTCDate(xt.getUTCDate()-(xt.getUTCDay()+7-Ke)%7),xt.setUTCHours(0,0,0,0)},function(xt,bt){xt.setUTCDate(xt.getUTCDate()+bt*7)},function(xt,bt){return(bt-xt)/c})}var Ae=Ee(0),ze=Ee(1),Ce=Ee(2),me=Ee(3),Re=Ee(4),ce=Ee(5),Ge=Ee(6),nt=Ae.range,ct=ze.range,qt=Ce.range,rt=me.range,ot=Re.range,Rt=ce.range,kt=Ge.range,Ct=n(function(Ke){Ke.setUTCDate(1),Ke.setUTCHours(0,0,0,0)},function(Ke,xt){Ke.setUTCMonth(Ke.getUTCMonth()+xt)},function(Ke,xt){return xt.getUTCMonth()-Ke.getUTCMonth()+(xt.getUTCFullYear()-Ke.getUTCFullYear())*12},function(Ke){return Ke.getUTCMonth()}),Yt=Ct.range,xr=n(function(Ke){Ke.setUTCMonth(0,1),Ke.setUTCHours(0,0,0,0)},function(Ke,xt){Ke.setUTCFullYear(Ke.getUTCFullYear()+xt)},function(Ke,xt){return xt.getUTCFullYear()-Ke.getUTCFullYear()},function(Ke){return Ke.getUTCFullYear()});xr.every=function(Ke){return!isFinite(Ke=Math.floor(Ke))||!(Ke>0)?null:n(function(xt){xt.setUTCFullYear(Math.floor(xt.getUTCFullYear()/Ke)*Ke),xt.setUTCMonth(0,1),xt.setUTCHours(0,0,0,0)},function(xt,bt){xt.setUTCFullYear(xt.getUTCFullYear()+bt*Ke)})};var er=xr.range;e.timeDay=g,e.timeDays=E,e.timeFriday=p,e.timeFridays=X,e.timeHour=x,e.timeHours=b,e.timeInterval=n,e.timeMillisecond=i,e.timeMilliseconds=a,e.timeMinute=d,e.timeMinutes=v,e.timeMonday=L,e.timeMondays=F,e.timeMonth=N,e.timeMonths=W,e.timeSaturday=P,e.timeSaturdays=G,e.timeSecond=f,e.timeSeconds=h,e.timeSunday=A,e.timeSundays=T,e.timeThursday=M,e.timeThursdays=H,e.timeTuesday=_,e.timeTuesdays=q,e.timeWednesday=C,e.timeWednesdays=V,e.timeWeek=A,e.timeWeeks=T,e.timeYear=re,e.timeYears=ae,e.utcDay=ie,e.utcDays=Te,e.utcFriday=ce,e.utcFridays=Rt,e.utcHour=ke,e.utcHours=ge,e.utcMillisecond=i,e.utcMilliseconds=a,e.utcMinute=_e,e.utcMinutes=Me,e.utcMonday=ze,e.utcMondays=ct,e.utcMonth=Ct,e.utcMonths=Yt,e.utcSaturday=Ge,e.utcSaturdays=kt,e.utcSecond=f,e.utcSeconds=h,e.utcSunday=Ae,e.utcSundays=nt,e.utcThursday=Re,e.utcThursdays=ot,e.utcTuesday=Ce,e.utcTuesdays=qt,e.utcWednesday=me,e.utcWednesdays=rt,e.utcWeek=Ae,e.utcWeeks=nt,e.utcYear=xr,e.utcYears=er,Object.defineProperty(e,"__esModule",{value:!0})})});var e3=ye((i6,tee)=>{(function(e,t){typeof i6=="object"&&typeof tee!="undefined"?t(i6,hq()):typeof define=="function"&&define.amd?define(["exports","d3-time"],t):(e=e||self,t(e.d3=e.d3||{},e.d3))})(i6,function(e,t){"use strict";function r(Ne){if(0<=Ne.y&&Ne.y<100){var Ye=new Date(-1,Ne.m,Ne.d,Ne.H,Ne.M,Ne.S,Ne.L);return Ye.setFullYear(Ne.y),Ye}return new Date(Ne.y,Ne.m,Ne.d,Ne.H,Ne.M,Ne.S,Ne.L)}function n(Ne){if(0<=Ne.y&&Ne.y<100){var Ye=new Date(Date.UTC(-1,Ne.m,Ne.d,Ne.H,Ne.M,Ne.S,Ne.L));return Ye.setUTCFullYear(Ne.y),Ye}return new Date(Date.UTC(Ne.y,Ne.m,Ne.d,Ne.H,Ne.M,Ne.S,Ne.L))}function i(Ne,Ye,Ve){return{y:Ne,m:Ye,d:Ve,H:0,M:0,S:0,L:0}}function a(Ne){var Ye=Ne.dateTime,Ve=Ne.date,Xe=Ne.time,ht=Ne.periods,Le=Ne.days,xe=Ne.shortDays,Se=Ne.months,lt=Ne.shortMonths,Gt=h(ht),Vt=d(ht),ar=h(Le),Qr=d(Le),ai=h(xe),jr=d(xe),ri=h(Se),bi=d(Se),nn=h(lt),Wi=d(lt),Ni={a:Si,A:Mi,b:Pi,B:Gi,c:null,d:N,e:N,f:Me,H:W,I:re,j:ae,L:_e,m:ke,M:ge,p:Ki,q:ka,Q:dt,s:Ht,S:ie,u:Te,U:Ee,V:Ae,w:ze,W:Ce,x:null,X:null,y:me,Y:Re,Z:ce,"%":Et},_n={a:jn,A:la,b:Fa,B:Ra,c:null,d:Ge,e:Ge,f:ot,H:nt,I:ct,j:qt,L:rt,m:Rt,M:kt,p:jo,q:oa,Q:dt,s:Ht,S:Ct,u:Yt,U:xr,V:er,w:Ke,W:xt,x:null,X:null,y:bt,Y:Lt,Z:St,"%":Et},$i={a:jt,A:Zt,b:yr,B:Fr,c:Zr,d:M,e:M,f:V,H:P,I:P,j:p,L:q,m:C,M:T,p:ft,q:_,Q:X,s:G,S:F,u:x,U:b,V:g,w:v,W:E,x:Vr,X:gi,y:A,Y:k,Z:L,"%":H};Ni.x=zn(Ve,Ni),Ni.X=zn(Xe,Ni),Ni.c=zn(Ye,Ni),_n.x=zn(Ve,_n),_n.X=zn(Xe,_n),_n.c=zn(Ye,_n);function zn(Sn,Ha){return function(oo){var xn=[],_t=-1,br=0,Hr=Sn.length,ti,zi,Yi;for(oo instanceof Date||(oo=new Date(+oo));++_t
53)return null;"w"in xn||(xn.w=1),"Z"in xn?(br=n(i(xn.y,0,1)),Hr=br.getUTCDay(),br=Hr>4||Hr===0?t.utcMonday.ceil(br):t.utcMonday(br),br=t.utcDay.offset(br,(xn.V-1)*7),xn.y=br.getUTCFullYear(),xn.m=br.getUTCMonth(),xn.d=br.getUTCDate()+(xn.w+6)%7):(br=r(i(xn.y,0,1)),Hr=br.getDay(),br=Hr>4||Hr===0?t.timeMonday.ceil(br):t.timeMonday(br),br=t.timeDay.offset(br,(xn.V-1)*7),xn.y=br.getFullYear(),xn.m=br.getMonth(),xn.d=br.getDate()+(xn.w+6)%7)}else("W"in xn||"U"in xn)&&("w"in xn||(xn.w="u"in xn?xn.u%7:"W"in xn?1:0),Hr="Z"in xn?n(i(xn.y,0,1)).getUTCDay():r(i(xn.y,0,1)).getDay(),xn.m=0,xn.d="W"in xn?(xn.w+6)%7+xn.W*7-(Hr+5)%7:xn.w+xn.U*7-(Hr+6)%7);return"Z"in xn?(xn.H+=xn.Z/100|0,xn.M+=xn.Z%100,n(xn)):r(xn)}}function It(Sn,Ha,oo,xn){for(var _t=0,br=Ha.length,Hr=oo.length,ti,zi;_t
=Hr)return-1;if(ti=Ha.charCodeAt(_t++),ti===37){if(ti=Ha.charAt(_t++),zi=$i[ti in o?Ha.charAt(_t++):ti],!zi||(xn=zi(Sn,oo,xn))<0)return-1}else if(ti!=oo.charCodeAt(xn++))return-1}return xn}function ft(Sn,Ha,oo){var xn=Gt.exec(Ha.slice(oo));return xn?(Sn.p=Vt[xn[0].toLowerCase()],oo+xn[0].length):-1}function jt(Sn,Ha,oo){var xn=ai.exec(Ha.slice(oo));return xn?(Sn.w=jr[xn[0].toLowerCase()],oo+xn[0].length):-1}function Zt(Sn,Ha,oo){var xn=ar.exec(Ha.slice(oo));return xn?(Sn.w=Qr[xn[0].toLowerCase()],oo+xn[0].length):-1}function yr(Sn,Ha,oo){var xn=nn.exec(Ha.slice(oo));return xn?(Sn.m=Wi[xn[0].toLowerCase()],oo+xn[0].length):-1}function Fr(Sn,Ha,oo){var xn=ri.exec(Ha.slice(oo));return xn?(Sn.m=bi[xn[0].toLowerCase()],oo+xn[0].length):-1}function Zr(Sn,Ha,oo){return It(Sn,Ye,Ha,oo)}function Vr(Sn,Ha,oo){return It(Sn,Ve,Ha,oo)}function gi(Sn,Ha,oo){return It(Sn,Xe,Ha,oo)}function Si(Sn){return xe[Sn.getDay()]}function Mi(Sn){return Le[Sn.getDay()]}function Pi(Sn){return lt[Sn.getMonth()]}function Gi(Sn){return Se[Sn.getMonth()]}function Ki(Sn){return ht[+(Sn.getHours()>=12)]}function ka(Sn){return 1+~~(Sn.getMonth()/3)}function jn(Sn){return xe[Sn.getUTCDay()]}function la(Sn){return Le[Sn.getUTCDay()]}function Fa(Sn){return lt[Sn.getUTCMonth()]}function Ra(Sn){return Se[Sn.getUTCMonth()]}function jo(Sn){return ht[+(Sn.getUTCHours()>=12)]}function oa(Sn){return 1+~~(Sn.getUTCMonth()/3)}return{format:function(Sn){var Ha=zn(Sn+="",Ni);return Ha.toString=function(){return Sn},Ha},parse:function(Sn){var Ha=Wn(Sn+="",!1);return Ha.toString=function(){return Sn},Ha},utcFormat:function(Sn){var Ha=zn(Sn+="",_n);return Ha.toString=function(){return Sn},Ha},utcParse:function(Sn){var Ha=Wn(Sn+="",!0);return Ha.toString=function(){return Sn},Ha}}}var o={"-":"",_:" ",0:"0"},s=/^\s*\d+/,l=/^%/,u=/[\\^$*+?|[\]().{}]/g;function c(Ne,Ye,Ve){var Xe=Ne<0?"-":"",ht=(Xe?-Ne:Ne)+"",Le=ht.length;return Xe+(Le68?1900:2e3),Ve+Xe[0].length):-1}function L(Ne,Ye,Ve){var Xe=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(Ye.slice(Ve,Ve+6));return Xe?(Ne.Z=Xe[1]?0:-(Xe[2]+(Xe[3]||"00")),Ve+Xe[0].length):-1}function _(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+1));return Xe?(Ne.q=Xe[0]*3-3,Ve+Xe[0].length):-1}function C(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+2));return Xe?(Ne.m=Xe[0]-1,Ve+Xe[0].length):-1}function M(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+2));return Xe?(Ne.d=+Xe[0],Ve+Xe[0].length):-1}function p(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+3));return Xe?(Ne.m=0,Ne.d=+Xe[0],Ve+Xe[0].length):-1}function P(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+2));return Xe?(Ne.H=+Xe[0],Ve+Xe[0].length):-1}function T(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+2));return Xe?(Ne.M=+Xe[0],Ve+Xe[0].length):-1}function F(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+2));return Xe?(Ne.S=+Xe[0],Ve+Xe[0].length):-1}function q(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+3));return Xe?(Ne.L=+Xe[0],Ve+Xe[0].length):-1}function V(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve,Ve+6));return Xe?(Ne.L=Math.floor(Xe[0]/1e3),Ve+Xe[0].length):-1}function H(Ne,Ye,Ve){var Xe=l.exec(Ye.slice(Ve,Ve+1));return Xe?Ve+Xe[0].length:-1}function X(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve));return Xe?(Ne.Q=+Xe[0],Ve+Xe[0].length):-1}function G(Ne,Ye,Ve){var Xe=s.exec(Ye.slice(Ve));return Xe?(Ne.s=+Xe[0],Ve+Xe[0].length):-1}function N(Ne,Ye){return c(Ne.getDate(),Ye,2)}function W(Ne,Ye){return c(Ne.getHours(),Ye,2)}function re(Ne,Ye){return c(Ne.getHours()%12||12,Ye,2)}function ae(Ne,Ye){return c(1+t.timeDay.count(t.timeYear(Ne),Ne),Ye,3)}function _e(Ne,Ye){return c(Ne.getMilliseconds(),Ye,3)}function Me(Ne,Ye){return _e(Ne,Ye)+"000"}function ke(Ne,Ye){return c(Ne.getMonth()+1,Ye,2)}function ge(Ne,Ye){return c(Ne.getMinutes(),Ye,2)}function ie(Ne,Ye){return c(Ne.getSeconds(),Ye,2)}function Te(Ne){var Ye=Ne.getDay();return Ye===0?7:Ye}function Ee(Ne,Ye){return c(t.timeSunday.count(t.timeYear(Ne)-1,Ne),Ye,2)}function Ae(Ne,Ye){var Ve=Ne.getDay();return Ne=Ve>=4||Ve===0?t.timeThursday(Ne):t.timeThursday.ceil(Ne),c(t.timeThursday.count(t.timeYear(Ne),Ne)+(t.timeYear(Ne).getDay()===4),Ye,2)}function ze(Ne){return Ne.getDay()}function Ce(Ne,Ye){return c(t.timeMonday.count(t.timeYear(Ne)-1,Ne),Ye,2)}function me(Ne,Ye){return c(Ne.getFullYear()%100,Ye,2)}function Re(Ne,Ye){return c(Ne.getFullYear()%1e4,Ye,4)}function ce(Ne){var Ye=Ne.getTimezoneOffset();return(Ye>0?"-":(Ye*=-1,"+"))+c(Ye/60|0,"0",2)+c(Ye%60,"0",2)}function Ge(Ne,Ye){return c(Ne.getUTCDate(),Ye,2)}function nt(Ne,Ye){return c(Ne.getUTCHours(),Ye,2)}function ct(Ne,Ye){return c(Ne.getUTCHours()%12||12,Ye,2)}function qt(Ne,Ye){return c(1+t.utcDay.count(t.utcYear(Ne),Ne),Ye,3)}function rt(Ne,Ye){return c(Ne.getUTCMilliseconds(),Ye,3)}function ot(Ne,Ye){return rt(Ne,Ye)+"000"}function Rt(Ne,Ye){return c(Ne.getUTCMonth()+1,Ye,2)}function kt(Ne,Ye){return c(Ne.getUTCMinutes(),Ye,2)}function Ct(Ne,Ye){return c(Ne.getUTCSeconds(),Ye,2)}function Yt(Ne){var Ye=Ne.getUTCDay();return Ye===0?7:Ye}function xr(Ne,Ye){return c(t.utcSunday.count(t.utcYear(Ne)-1,Ne),Ye,2)}function er(Ne,Ye){var Ve=Ne.getUTCDay();return Ne=Ve>=4||Ve===0?t.utcThursday(Ne):t.utcThursday.ceil(Ne),c(t.utcThursday.count(t.utcYear(Ne),Ne)+(t.utcYear(Ne).getUTCDay()===4),Ye,2)}function Ke(Ne){return Ne.getUTCDay()}function xt(Ne,Ye){return c(t.utcMonday.count(t.utcYear(Ne)-1,Ne),Ye,2)}function bt(Ne,Ye){return c(Ne.getUTCFullYear()%100,Ye,2)}function Lt(Ne,Ye){return c(Ne.getUTCFullYear()%1e4,Ye,4)}function St(){return"+0000"}function Et(){return"%"}function dt(Ne){return+Ne}function Ht(Ne){return Math.floor(+Ne/1e3)}var $t;fr({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function fr(Ne){return $t=a(Ne),e.timeFormat=$t.format,e.timeParse=$t.parse,e.utcFormat=$t.utcFormat,e.utcParse=$t.utcParse,$t}var _r="%Y-%m-%dT%H:%M:%S.%LZ";function Br(Ne){return Ne.toISOString()}var Or=Date.prototype.toISOString?Br:e.utcFormat(_r);function Nr(Ne){var Ye=new Date(Ne);return isNaN(Ye)?null:Ye}var ut=+new Date("2000-01-01T00:00:00.000Z")?Nr:e.utcParse(_r);e.isoFormat=Or,e.isoParse=ut,e.timeFormatDefaultLocale=fr,e.timeFormatLocale=a,Object.defineProperty(e,"__esModule",{value:!0})})});var dq=ye((n6,ree)=>{(function(e,t){typeof n6=="object"&&typeof ree!="undefined"?t(n6):typeof define=="function"&&define.amd?define(["exports"],t):(e=typeof globalThis!="undefined"?globalThis:e||self,t(e.d3=e.d3||{}))})(n6,function(e){"use strict";function t(C){return Math.abs(C=Math.round(C))>=1e21?C.toLocaleString("en").replace(/,/g,""):C.toString(10)}function r(C,M){if((p=(C=M?C.toExponential(M-1):C.toExponential()).indexOf("e"))<0)return null;var p,P=C.slice(0,p);return[P.length>1?P[0]+P.slice(2):P,+C.slice(p+1)]}function n(C){return C=r(Math.abs(C)),C?C[1]:NaN}function i(C,M){return function(p,P){for(var T=p.length,F=[],q=0,V=C[0],H=0;T>0&&V>0&&(H+V+1>P&&(V=Math.max(1,P-H)),F.push(p.substring(T-=V,T+V)),!((H+=V+1)>P));)V=C[q=(q+1)%C.length];return F.reverse().join(M)}}function a(C){return function(M){return M.replace(/[0-9]/g,function(p){return C[+p]})}}var o=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function s(C){if(!(M=o.exec(C)))throw new Error("invalid format: "+C);var M;return new l({fill:M[1],align:M[2],sign:M[3],symbol:M[4],zero:M[5],width:M[6],comma:M[7],precision:M[8]&&M[8].slice(1),trim:M[9],type:M[10]})}s.prototype=l.prototype;function l(C){this.fill=C.fill===void 0?" ":C.fill+"",this.align=C.align===void 0?">":C.align+"",this.sign=C.sign===void 0?"-":C.sign+"",this.symbol=C.symbol===void 0?"":C.symbol+"",this.zero=!!C.zero,this.width=C.width===void 0?void 0:+C.width,this.comma=!!C.comma,this.precision=C.precision===void 0?void 0:+C.precision,this.trim=!!C.trim,this.type=C.type===void 0?"":C.type+""}l.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function u(C){e:for(var M=C.length,p=1,P=-1,T;p0&&(P=0);break}return P>0?C.slice(0,P)+C.slice(T+1):C}var c;function f(C,M){var p=r(C,M);if(!p)return C+"";var P=p[0],T=p[1],F=T-(c=Math.max(-8,Math.min(8,Math.floor(T/3)))*3)+1,q=P.length;return F===q?P:F>q?P+new Array(F-q+1).join("0"):F>0?P.slice(0,F)+"."+P.slice(F):"0."+new Array(1-F).join("0")+r(C,Math.max(0,M+F-1))[0]}function h(C,M){var p=r(C,M);if(!p)return C+"";var P=p[0],T=p[1];return T<0?"0."+new Array(-T).join("0")+P:P.length>T+1?P.slice(0,T+1)+"."+P.slice(T+1):P+new Array(T-P.length+2).join("0")}var d={"%":function(C,M){return(C*100).toFixed(M)},b:function(C){return Math.round(C).toString(2)},c:function(C){return C+""},d:t,e:function(C,M){return C.toExponential(M)},f:function(C,M){return C.toFixed(M)},g:function(C,M){return C.toPrecision(M)},o:function(C){return Math.round(C).toString(8)},p:function(C,M){return h(C*100,M)},r:h,s:f,X:function(C){return Math.round(C).toString(16).toUpperCase()},x:function(C){return Math.round(C).toString(16)}};function v(C){return C}var x=Array.prototype.map,b=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function g(C){var M=C.grouping===void 0||C.thousands===void 0?v:i(x.call(C.grouping,Number),C.thousands+""),p=C.currency===void 0?"":C.currency[0]+"",P=C.currency===void 0?"":C.currency[1]+"",T=C.decimal===void 0?".":C.decimal+"",F=C.numerals===void 0?v:a(x.call(C.numerals,String)),q=C.percent===void 0?"%":C.percent+"",V=C.minus===void 0?"-":C.minus+"",H=C.nan===void 0?"NaN":C.nan+"";function X(N){N=s(N);var W=N.fill,re=N.align,ae=N.sign,_e=N.symbol,Me=N.zero,ke=N.width,ge=N.comma,ie=N.precision,Te=N.trim,Ee=N.type;Ee==="n"?(ge=!0,Ee="g"):d[Ee]||(ie===void 0&&(ie=12),Te=!0,Ee="g"),(Me||W==="0"&&re==="=")&&(Me=!0,W="0",re="=");var Ae=_e==="$"?p:_e==="#"&&/[boxX]/.test(Ee)?"0"+Ee.toLowerCase():"",ze=_e==="$"?P:/[%p]/.test(Ee)?q:"",Ce=d[Ee],me=/[defgprs%]/.test(Ee);ie=ie===void 0?6:/[gprs]/.test(Ee)?Math.max(1,Math.min(21,ie)):Math.max(0,Math.min(20,ie));function Re(ce){var Ge=Ae,nt=ze,ct,qt,rt;if(Ee==="c")nt=Ce(ce)+nt,ce="";else{ce=+ce;var ot=ce<0||1/ce<0;if(ce=isNaN(ce)?H:Ce(Math.abs(ce),ie),Te&&(ce=u(ce)),ot&&+ce==0&&ae!=="+"&&(ot=!1),Ge=(ot?ae==="("?ae:V:ae==="-"||ae==="("?"":ae)+Ge,nt=(Ee==="s"?b[8+c/3]:"")+nt+(ot&&ae==="("?")":""),me){for(ct=-1,qt=ce.length;++ctrt||rt>57){nt=(rt===46?T+ce.slice(ct+1):ce.slice(ct))+nt,ce=ce.slice(0,ct);break}}}ge&&!Me&&(ce=M(ce,1/0));var Rt=Ge.length+ce.length+nt.length,kt=Rt>1)+Ge+ce+nt+kt.slice(Rt);break;default:ce=kt+Ge+ce+nt;break}return F(ce)}return Re.toString=function(){return N+""},Re}function G(N,W){var re=X((N=s(N),N.type="f",N)),ae=Math.max(-8,Math.min(8,Math.floor(n(W)/3)))*3,_e=Math.pow(10,-ae),Me=b[8+ae/3];return function(ke){return re(_e*ke)+Me}}return{format:X,formatPrefix:G}}var E;k({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"});function k(C){return E=g(C),e.format=E.format,e.formatPrefix=E.formatPrefix,E}function A(C){return Math.max(0,-n(Math.abs(C)))}function L(C,M){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(n(M)/3)))*3-n(Math.abs(C)))}function _(C,M){return C=Math.abs(C),M=Math.abs(M)-C,Math.max(0,n(M)-n(C))+1}e.FormatSpecifier=l,e.formatDefaultLocale=k,e.formatLocale=g,e.formatSpecifier=s,e.precisionFixed=A,e.precisionPrefix=L,e.precisionRound=_,Object.defineProperty(e,"__esModule",{value:!0})})});var nee=ye((CQt,iee)=>{"use strict";iee.exports=function(e){for(var t=e.length,r,n=0;n13)&&r!==32&&r!==133&&r!==160&&r!==5760&&r!==6158&&(r<8192||r>8205)&&r!==8232&&r!==8233&&r!==8239&&r!==8287&&r!==8288&&r!==12288&&r!==65279)return!1;return!0}});var uo=ye((LQt,aee)=>{"use strict";var UQe=nee();aee.exports=function(e){var t=typeof e;if(t==="string"){var r=e;if(e=+e,e===0&&UQe(r))return!1}else if(t!=="number")return!1;return e-e<1}});var es=ye((PQt,oee)=>{"use strict";oee.exports={BADNUM:void 0,FP_SAFE:Number.MAX_VALUE*1e-4,ONEMAXYEAR:316224e5,ONEAVGYEAR:315576e5,ONEMINYEAR:31536e6,ONEMAXQUARTER:79488e5,ONEAVGQUARTER:78894e5,ONEMINQUARTER:76896e5,ONEMAXMONTH:26784e5,ONEAVGMONTH:26298e5,ONEMINMONTH:24192e5,ONEWEEK:6048e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,ONEMILLI:1,ONEMICROSEC:.001,EPOCHJD:24405875e-1,ALMOST_EQUAL:1-1e-6,LOG_CLIP:10,MINUS_SIGN:"\u2212"}});var vq=ye((a6,see)=>{(function(e,t){typeof a6=="object"&&typeof see!="undefined"?t(a6):typeof define=="function"&&define.amd?define(["exports"],t):(e=typeof globalThis!="undefined"?globalThis:e||self,t(e["base64-arraybuffer"]={}))})(a6,function(e){"use strict";for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=typeof Uint8Array=="undefined"?[]:new Uint8Array(256),n=0;n>2],c+=t[(s[l]&3)<<4|s[l+1]>>4],c+=t[(s[l+1]&15)<<2|s[l+2]>>6],c+=t[s[l+2]&63];return u%3===2?c=c.substring(0,c.length-1)+"=":u%3===1&&(c=c.substring(0,c.length-2)+"=="),c},a=function(o){var s=o.length*.75,l=o.length,u,c=0,f,h,d,v;o[o.length-1]==="="&&(s--,o[o.length-2]==="="&&s--);var x=new ArrayBuffer(s),b=new Uint8Array(x);for(u=0;u>4,b[c++]=(h&15)<<4|d>>2,b[c++]=(d&3)<<6|v&63;return x};e.decode=a,e.encode=i,Object.defineProperty(e,"__esModule",{value:!0})})});var gy=ye((IQt,lee)=>{"use strict";lee.exports=function(t){return window&&window.process&&window.process.versions?Object.prototype.toString.call(t)==="[object Object]":Object.prototype.toString.call(t)==="[object Object]"&&Object.getPrototypeOf(t).hasOwnProperty("hasOwnProperty")}});var vv=ye(mg=>{"use strict";var VQe=vq().decode,HQe=gy(),pq=Array.isArray,GQe=ArrayBuffer,jQe=DataView;function uee(e){return GQe.isView(e)&&!(e instanceof jQe)}mg.isTypedArray=uee;function o6(e){return pq(e)||uee(e)}mg.isArrayOrTypedArray=o6;function WQe(e){return!o6(e[0])}mg.isArray1D=WQe;mg.ensureArray=function(e,t){return pq(e)||(e=[]),e.length=t,e};var Md={u1c:typeof Uint8ClampedArray=="undefined"?void 0:Uint8ClampedArray,i1:typeof Int8Array=="undefined"?void 0:Int8Array,u1:typeof Uint8Array=="undefined"?void 0:Uint8Array,i2:typeof Int16Array=="undefined"?void 0:Int16Array,u2:typeof Uint16Array=="undefined"?void 0:Uint16Array,i4:typeof Int32Array=="undefined"?void 0:Int32Array,u4:typeof Uint32Array=="undefined"?void 0:Uint32Array,f4:typeof Float32Array=="undefined"?void 0:Float32Array,f8:typeof Float64Array=="undefined"?void 0:Float64Array};Md.uint8c=Md.u1c;Md.uint8=Md.u1;Md.int8=Md.i1;Md.uint16=Md.u2;Md.int16=Md.i2;Md.uint32=Md.u4;Md.int32=Md.i4;Md.float32=Md.f4;Md.float64=Md.f8;function gq(e){return e.constructor===ArrayBuffer}mg.isArrayBuffer=gq;mg.decodeTypedArraySpec=function(e){var t=[],r=ZQe(e),n=r.dtype,i=Md[n];if(!i)throw new Error('Error in dtype: "'+n+'"');var a=i.BYTES_PER_ELEMENT,o=r.bdata;gq(o)||(o=VQe(o));var s=r.shape===void 0?[o.byteLength/a]:(""+r.shape).split(",");s.reverse();var l=s.length,u,c,f=+s[0],h=a*f,d=0;if(l===1)t=new i(o);else if(l===2)for(u=+s[1],c=0;c{"use strict";var fee=uo(),yq=vv().isArrayOrTypedArray;pee.exports=function(t,r){if(fee(r))r=String(r);else if(typeof r!="string"||r.substr(r.length-4)==="[-1]")throw"bad property string";var n=r.split("."),i,a,o,s;for(s=0;s{"use strict";var t3=ES(),$Qe=/^\w*$/,QQe=0,gee=1,s6=2,mee=3,ob=4;yee.exports=function(t,r,n,i){n=n||"name",i=i||"value";var a,o,s,l={};r&&r.length?(s=t3(t,r),o=s.get()):o=t,r=r||"";var u={};if(o)for(a=0;a2)return l[d]=l[d]|s6,f.set(h,null);if(c){for(a=d;a{"use strict";var eet=/^(.*)(\.[^\.\[\]]+|\[\d\])$/,tet=/^[^\.\[\]]+$/;xee.exports=function(e,t){for(;t;){var r=e.match(eet);if(r)e=r[1];else if(e.match(tet))e="";else throw new Error("bad relativeAttr call:"+[e,t]);if(t.charAt(0)==="^")t=t.slice(1);else break}return e&&t.charAt(0)!=="["?e+"."+t:e+t}});var l6=ye((qQt,wee)=>{"use strict";var ret=uo();wee.exports=function(t,r){if(t>0)return Math.log(t)/Math.LN10;var n=Math.log(Math.min(r[0],r[1]))/Math.LN10;return ret(n)||(n=Math.log(Math.max(r[0],r[1]))/Math.LN10-6),n}});var See=ye((OQt,Aee)=>{"use strict";var Tee=vv().isArrayOrTypedArray,kS=gy();Aee.exports=function e(t,r){for(var n in r){var i=r[n],a=t[n];if(a!==i)if(n.charAt(0)==="_"||typeof i=="function"){if(n in t)continue;t[n]=i}else if(Tee(i)&&Tee(a)&&kS(i[0])){if(n==="customdata"||n==="ids")continue;for(var o=Math.min(i.length,a.length),s=0;s{"use strict";function iet(e,t){var r=e%t;return r<0?r+t:r}function net(e,t){return Math.abs(e)>t/2?e-Math.round(e/t)*t:e}Mee.exports={mod:iet,modHalf:net}});var id=ye((NQt,u6)=>{(function(e){var t=/^\s+/,r=/\s+$/,n=0,i=e.round,a=e.min,o=e.max,s=e.random;function l(me,Re){if(me=me||"",Re=Re||{},me instanceof l)return me;if(!(this instanceof l))return new l(me,Re);var ce=u(me);this._originalInput=me,this._r=ce.r,this._g=ce.g,this._b=ce.b,this._a=ce.a,this._roundA=i(100*this._a)/100,this._format=Re.format||ce.format,this._gradientType=Re.gradientType,this._r<1&&(this._r=i(this._r)),this._g<1&&(this._g=i(this._g)),this._b<1&&(this._b=i(this._b)),this._ok=ce.ok,this._tc_id=n++}l.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var me=this.toRgb();return(me.r*299+me.g*587+me.b*114)/1e3},getLuminance:function(){var me=this.toRgb(),Re,ce,Ge,nt,ct,qt;return Re=me.r/255,ce=me.g/255,Ge=me.b/255,Re<=.03928?nt=Re/12.92:nt=e.pow((Re+.055)/1.055,2.4),ce<=.03928?ct=ce/12.92:ct=e.pow((ce+.055)/1.055,2.4),Ge<=.03928?qt=Ge/12.92:qt=e.pow((Ge+.055)/1.055,2.4),.2126*nt+.7152*ct+.0722*qt},setAlpha:function(me){return this._a=N(me),this._roundA=i(100*this._a)/100,this},toHsv:function(){var me=d(this._r,this._g,this._b);return{h:me.h*360,s:me.s,v:me.v,a:this._a}},toHsvString:function(){var me=d(this._r,this._g,this._b),Re=i(me.h*360),ce=i(me.s*100),Ge=i(me.v*100);return this._a==1?"hsv("+Re+", "+ce+"%, "+Ge+"%)":"hsva("+Re+", "+ce+"%, "+Ge+"%, "+this._roundA+")"},toHsl:function(){var me=f(this._r,this._g,this._b);return{h:me.h*360,s:me.s,l:me.l,a:this._a}},toHslString:function(){var me=f(this._r,this._g,this._b),Re=i(me.h*360),ce=i(me.s*100),Ge=i(me.l*100);return this._a==1?"hsl("+Re+", "+ce+"%, "+Ge+"%)":"hsla("+Re+", "+ce+"%, "+Ge+"%, "+this._roundA+")"},toHex:function(me){return x(this._r,this._g,this._b,me)},toHexString:function(me){return"#"+this.toHex(me)},toHex8:function(me){return b(this._r,this._g,this._b,this._a,me)},toHex8String:function(me){return"#"+this.toHex8(me)},toRgb:function(){return{r:i(this._r),g:i(this._g),b:i(this._b),a:this._a}},toRgbString:function(){return this._a==1?"rgb("+i(this._r)+", "+i(this._g)+", "+i(this._b)+")":"rgba("+i(this._r)+", "+i(this._g)+", "+i(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:i(W(this._r,255)*100)+"%",g:i(W(this._g,255)*100)+"%",b:i(W(this._b,255)*100)+"%",a:this._a}},toPercentageRgbString:function(){return this._a==1?"rgb("+i(W(this._r,255)*100)+"%, "+i(W(this._g,255)*100)+"%, "+i(W(this._b,255)*100)+"%)":"rgba("+i(W(this._r,255)*100)+"%, "+i(W(this._g,255)*100)+"%, "+i(W(this._b,255)*100)+"%, "+this._roundA+")"},toName:function(){return this._a===0?"transparent":this._a<1?!1:X[x(this._r,this._g,this._b,!0)]||!1},toFilter:function(me){var Re="#"+g(this._r,this._g,this._b,this._a),ce=Re,Ge=this._gradientType?"GradientType = 1, ":"";if(me){var nt=l(me);ce="#"+g(nt._r,nt._g,nt._b,nt._a)}return"progid:DXImageTransform.Microsoft.gradient("+Ge+"startColorstr="+Re+",endColorstr="+ce+")"},toString:function(me){var Re=!!me;me=me||this._format;var ce=!1,Ge=this._a<1&&this._a>=0,nt=!Re&&Ge&&(me==="hex"||me==="hex6"||me==="hex3"||me==="hex4"||me==="hex8"||me==="name");return nt?me==="name"&&this._a===0?this.toName():this.toRgbString():(me==="rgb"&&(ce=this.toRgbString()),me==="prgb"&&(ce=this.toPercentageRgbString()),(me==="hex"||me==="hex6")&&(ce=this.toHexString()),me==="hex3"&&(ce=this.toHexString(!0)),me==="hex4"&&(ce=this.toHex8String(!0)),me==="hex8"&&(ce=this.toHex8String()),me==="name"&&(ce=this.toName()),me==="hsl"&&(ce=this.toHslString()),me==="hsv"&&(ce=this.toHsvString()),ce||this.toHexString())},clone:function(){return l(this.toString())},_applyModification:function(me,Re){var ce=me.apply(null,[this].concat([].slice.call(Re)));return this._r=ce._r,this._g=ce._g,this._b=ce._b,this.setAlpha(ce._a),this},lighten:function(){return this._applyModification(L,arguments)},brighten:function(){return this._applyModification(_,arguments)},darken:function(){return this._applyModification(C,arguments)},desaturate:function(){return this._applyModification(E,arguments)},saturate:function(){return this._applyModification(k,arguments)},greyscale:function(){return this._applyModification(A,arguments)},spin:function(){return this._applyModification(M,arguments)},_applyCombination:function(me,Re){return me.apply(null,[this].concat([].slice.call(Re)))},analogous:function(){return this._applyCombination(q,arguments)},complement:function(){return this._applyCombination(p,arguments)},monochromatic:function(){return this._applyCombination(V,arguments)},splitcomplement:function(){return this._applyCombination(F,arguments)},triad:function(){return this._applyCombination(P,arguments)},tetrad:function(){return this._applyCombination(T,arguments)}},l.fromRatio=function(me,Re){if(typeof me=="object"){var ce={};for(var Ge in me)me.hasOwnProperty(Ge)&&(Ge==="a"?ce[Ge]=me[Ge]:ce[Ge]=ge(me[Ge]));me=ce}return l(me,Re)};function u(me){var Re={r:0,g:0,b:0},ce=1,Ge=null,nt=null,ct=null,qt=!1,rt=!1;return typeof me=="string"&&(me=ze(me)),typeof me=="object"&&(Ae(me.r)&&Ae(me.g)&&Ae(me.b)?(Re=c(me.r,me.g,me.b),qt=!0,rt=String(me.r).substr(-1)==="%"?"prgb":"rgb"):Ae(me.h)&&Ae(me.s)&&Ae(me.v)?(Ge=ge(me.s),nt=ge(me.v),Re=v(me.h,Ge,nt),qt=!0,rt="hsv"):Ae(me.h)&&Ae(me.s)&&Ae(me.l)&&(Ge=ge(me.s),ct=ge(me.l),Re=h(me.h,Ge,ct),qt=!0,rt="hsl"),me.hasOwnProperty("a")&&(ce=me.a)),ce=N(ce),{ok:qt,format:me.format||rt,r:a(255,o(Re.r,0)),g:a(255,o(Re.g,0)),b:a(255,o(Re.b,0)),a:ce}}function c(me,Re,ce){return{r:W(me,255)*255,g:W(Re,255)*255,b:W(ce,255)*255}}function f(me,Re,ce){me=W(me,255),Re=W(Re,255),ce=W(ce,255);var Ge=o(me,Re,ce),nt=a(me,Re,ce),ct,qt,rt=(Ge+nt)/2;if(Ge==nt)ct=qt=0;else{var ot=Ge-nt;switch(qt=rt>.5?ot/(2-Ge-nt):ot/(Ge+nt),Ge){case me:ct=(Re-ce)/ot+(Re1&&(Ct-=1),Ct<1/6?Rt+(kt-Rt)*6*Ct:Ct<1/2?kt:Ct<2/3?Rt+(kt-Rt)*(2/3-Ct)*6:Rt}if(Re===0)Ge=nt=ct=ce;else{var rt=ce<.5?ce*(1+Re):ce+Re-ce*Re,ot=2*ce-rt;Ge=qt(ot,rt,me+1/3),nt=qt(ot,rt,me),ct=qt(ot,rt,me-1/3)}return{r:Ge*255,g:nt*255,b:ct*255}}function d(me,Re,ce){me=W(me,255),Re=W(Re,255),ce=W(ce,255);var Ge=o(me,Re,ce),nt=a(me,Re,ce),ct,qt,rt=Ge,ot=Ge-nt;if(qt=Ge===0?0:ot/Ge,Ge==nt)ct=0;else{switch(Ge){case me:ct=(Re-ce)/ot+(Re>1)+720)%360;--Re;)Ge.h=(Ge.h+nt)%360,ct.push(l(Ge));return ct}function V(me,Re){Re=Re||6;for(var ce=l(me).toHsv(),Ge=ce.h,nt=ce.s,ct=ce.v,qt=[],rt=1/Re;Re--;)qt.push(l({h:Ge,s:nt,v:ct})),ct=(ct+rt)%1;return qt}l.mix=function(me,Re,ce){ce=ce===0?0:ce||50;var Ge=l(me).toRgb(),nt=l(Re).toRgb(),ct=ce/100,qt={r:(nt.r-Ge.r)*ct+Ge.r,g:(nt.g-Ge.g)*ct+Ge.g,b:(nt.b-Ge.b)*ct+Ge.b,a:(nt.a-Ge.a)*ct+Ge.a};return l(qt)},l.readability=function(me,Re){var ce=l(me),Ge=l(Re);return(e.max(ce.getLuminance(),Ge.getLuminance())+.05)/(e.min(ce.getLuminance(),Ge.getLuminance())+.05)},l.isReadable=function(me,Re,ce){var Ge=l.readability(me,Re),nt,ct;switch(ct=!1,nt=Ce(ce),nt.level+nt.size){case"AAsmall":case"AAAlarge":ct=Ge>=4.5;break;case"AAlarge":ct=Ge>=3;break;case"AAAsmall":ct=Ge>=7;break}return ct},l.mostReadable=function(me,Re,ce){var Ge=null,nt=0,ct,qt,rt,ot;ce=ce||{},qt=ce.includeFallbackColors,rt=ce.level,ot=ce.size;for(var Rt=0;Rtnt&&(nt=ct,Ge=l(Re[Rt]));return l.isReadable(me,Ge,{level:rt,size:ot})||!qt?Ge:(ce.includeFallbackColors=!1,l.mostReadable(me,["#fff","#000"],ce))};var H=l.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},X=l.hexNames=G(H);function G(me){var Re={};for(var ce in me)me.hasOwnProperty(ce)&&(Re[me[ce]]=ce);return Re}function N(me){return me=parseFloat(me),(isNaN(me)||me<0||me>1)&&(me=1),me}function W(me,Re){_e(me)&&(me="100%");var ce=Me(me);return me=a(Re,o(0,parseFloat(me))),ce&&(me=parseInt(me*Re,10)/100),e.abs(me-Re)<1e-6?1:me%Re/parseFloat(Re)}function re(me){return a(1,o(0,me))}function ae(me){return parseInt(me,16)}function _e(me){return typeof me=="string"&&me.indexOf(".")!=-1&&parseFloat(me)===1}function Me(me){return typeof me=="string"&&me.indexOf("%")!=-1}function ke(me){return me.length==1?"0"+me:""+me}function ge(me){return me<=1&&(me=me*100+"%"),me}function ie(me){return e.round(parseFloat(me)*255).toString(16)}function Te(me){return ae(me)/255}var Ee=function(){var me="[-\\+]?\\d+%?",Re="[-\\+]?\\d*\\.\\d+%?",ce="(?:"+Re+")|(?:"+me+")",Ge="[\\s|\\(]+("+ce+")[,|\\s]+("+ce+")[,|\\s]+("+ce+")\\s*\\)?",nt="[\\s|\\(]+("+ce+")[,|\\s]+("+ce+")[,|\\s]+("+ce+")[,|\\s]+("+ce+")\\s*\\)?";return{CSS_UNIT:new RegExp(ce),rgb:new RegExp("rgb"+Ge),rgba:new RegExp("rgba"+nt),hsl:new RegExp("hsl"+Ge),hsla:new RegExp("hsla"+nt),hsv:new RegExp("hsv"+Ge),hsva:new RegExp("hsva"+nt),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();function Ae(me){return!!Ee.CSS_UNIT.exec(me)}function ze(me){me=me.replace(t,"").replace(r,"").toLowerCase();var Re=!1;if(H[me])me=H[me],Re=!0;else if(me=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var ce;return(ce=Ee.rgb.exec(me))?{r:ce[1],g:ce[2],b:ce[3]}:(ce=Ee.rgba.exec(me))?{r:ce[1],g:ce[2],b:ce[3],a:ce[4]}:(ce=Ee.hsl.exec(me))?{h:ce[1],s:ce[2],l:ce[3]}:(ce=Ee.hsla.exec(me))?{h:ce[1],s:ce[2],l:ce[3],a:ce[4]}:(ce=Ee.hsv.exec(me))?{h:ce[1],s:ce[2],v:ce[3]}:(ce=Ee.hsva.exec(me))?{h:ce[1],s:ce[2],v:ce[3],a:ce[4]}:(ce=Ee.hex8.exec(me))?{r:ae(ce[1]),g:ae(ce[2]),b:ae(ce[3]),a:Te(ce[4]),format:Re?"name":"hex8"}:(ce=Ee.hex6.exec(me))?{r:ae(ce[1]),g:ae(ce[2]),b:ae(ce[3]),format:Re?"name":"hex"}:(ce=Ee.hex4.exec(me))?{r:ae(ce[1]+""+ce[1]),g:ae(ce[2]+""+ce[2]),b:ae(ce[3]+""+ce[3]),a:Te(ce[4]+""+ce[4]),format:Re?"name":"hex8"}:(ce=Ee.hex3.exec(me))?{r:ae(ce[1]+""+ce[1]),g:ae(ce[2]+""+ce[2]),b:ae(ce[3]+""+ce[3]),format:Re?"name":"hex"}:!1}function Ce(me){var Re,ce;return me=me||{level:"AA",size:"small"},Re=(me.level||"AA").toUpperCase(),ce=(me.size||"small").toLowerCase(),Re!=="AA"&&Re!=="AAA"&&(Re="AA"),ce!=="small"&&ce!=="large"&&(ce="small"),{level:Re,size:ce}}typeof u6!="undefined"&&u6.exports?u6.exports=l:typeof define=="function"&&define.amd?define(function(){return l}):window.tinycolor=l})(Math)});var no=ye(PS=>{"use strict";var Eee=gy(),CS=Array.isArray;function aet(e,t){var r,n;for(r=0;r{"use strict";kee.exports=function(e){var t=e.variantValues,r=e.editType,n=e.colorEditType;n===void 0&&(n=r);var i={editType:r,valType:"integer",min:1,max:1e3,extras:["normal","bold"],dflt:"normal"};e.noNumericWeightValues&&(i.valType="enumerated",i.values=i.extras,i.extras=void 0,i.min=void 0,i.max=void 0);var a={family:{valType:"string",noBlank:!0,strict:!0,editType:r},size:{valType:"number",min:1,editType:r},color:{valType:"color",editType:n},weight:i,style:{editType:r,valType:"enumerated",values:["normal","italic"],dflt:"normal"},variant:e.noFontVariant?void 0:{editType:r,valType:"enumerated",values:t||["normal","small-caps","all-small-caps","all-petite-caps","petite-caps","unicase"],dflt:"normal"},textcase:e.noFontTextcase?void 0:{editType:r,valType:"enumerated",values:["normal","word caps","upper","lower"],dflt:"normal"},lineposition:e.noFontLineposition?void 0:{editType:r,valType:"flaglist",flags:["under","over","through"],extras:["none"],dflt:"none"},shadow:e.noFontShadow?void 0:{editType:r,valType:"string",dflt:e.autoShadowDflt?"auto":"none"},editType:r};return e.autoSize&&(a.size.dflt="auto"),e.autoColor&&(a.color.dflt="auto"),e.arrayOk&&(a.family.arrayOk=!0,a.weight.arrayOk=!0,a.style.arrayOk=!0,e.noFontVariant||(a.variant.arrayOk=!0),e.noFontTextcase||(a.textcase.arrayOk=!0),e.noFontLineposition||(a.lineposition.arrayOk=!0),e.noFontShadow||(a.shadow.arrayOk=!0),a.size.arrayOk=!0,a.color.arrayOk=!0),a}});var IS=ye((HQt,Cee)=>{"use strict";Cee.exports={YANGLE:60,HOVERARROWSIZE:6,HOVERTEXTPAD:3,HOVERFONTSIZE:13,HOVERFONT:"Arial, sans-serif",HOVERMINTIME:50,HOVERID:"-hover"}});var B1=ye((GQt,Iee)=>{"use strict";var Lee=IS(),Pee=Su(),_q=Pee({editType:"none"});_q.family.dflt=Lee.HOVERFONT;_q.size.dflt=Lee.HOVERFONTSIZE;Iee.exports={clickmode:{valType:"flaglist",flags:["event","select"],dflt:"event",editType:"plot",extras:["none"]},dragmode:{valType:"enumerated",values:["zoom","pan","select","lasso","drawclosedpath","drawopenpath","drawline","drawrect","drawcircle","orbit","turntable",!1],dflt:"zoom",editType:"modebar"},hovermode:{valType:"enumerated",values:["x","y","closest",!1,"x unified","y unified"],dflt:"closest",editType:"modebar"},hoversubplots:{valType:"enumerated",values:["single","overlaying","axis"],dflt:"overlaying",editType:"none"},hoverdistance:{valType:"integer",min:-1,dflt:20,editType:"none"},spikedistance:{valType:"integer",min:-1,dflt:-1,editType:"none"},hoverlabel:{bgcolor:{valType:"color",editType:"none"},bordercolor:{valType:"color",editType:"none"},font:_q,grouptitlefont:Pee({editType:"none"}),align:{valType:"enumerated",values:["left","right","auto"],dflt:"auto",editType:"none"},namelength:{valType:"integer",min:-1,dflt:15,editType:"none"},editType:"none"},selectdirection:{valType:"enumerated",values:["h","v","d","any"],dflt:"any",editType:"none"}}});var i3=ye((jQt,Ree)=>{"use strict";var oet=Su(),c6=B1().hoverlabel,f6=no().extendFlat;Ree.exports={hoverlabel:{bgcolor:f6({},c6.bgcolor,{arrayOk:!0}),bordercolor:f6({},c6.bordercolor,{arrayOk:!0}),font:oet({arrayOk:!0,editType:"none"}),align:f6({},c6.align,{arrayOk:!0}),namelength:f6({},c6.namelength,{arrayOk:!0}),editType:"none"}}});var vl=ye((WQt,Dee)=>{"use strict";var set=Su(),uet=i3();Dee.exports={type:{valType:"enumerated",values:[],dflt:"scatter",editType:"calc+clearAxisTypes",_noTemplating:!0},visible:{valType:"enumerated",values:[!0,!1,"legendonly"],dflt:!0,editType:"calc"},showlegend:{valType:"boolean",dflt:!0,editType:"style"},legend:{valType:"subplotid",dflt:"legend",editType:"style"},legendgroup:{valType:"string",dflt:"",editType:"style"},legendgrouptitle:{text:{valType:"string",dflt:"",editType:"style"},font:set({editType:"style"}),editType:"style"},legendrank:{valType:"number",dflt:1e3,editType:"style"},legendwidth:{valType:"number",min:0,editType:"style"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"style"},name:{valType:"string",editType:"style"},uid:{valType:"string",editType:"plot",anim:!0},ids:{valType:"data_array",editType:"calc",anim:!0},customdata:{valType:"data_array",editType:"calc"},meta:{valType:"any",arrayOk:!0,editType:"plot"},selectedpoints:{valType:"any",editType:"calc"},hoverinfo:{valType:"flaglist",flags:["x","y","z","text","name"],extras:["all","none","skip"],arrayOk:!0,dflt:"all",editType:"none"},hoverlabel:uet.hoverlabel,stream:{token:{valType:"string",noBlank:!0,strict:!0,editType:"calc"},maxpoints:{valType:"number",min:0,max:1e4,dflt:500,editType:"calc"},editType:"calc"},uirevision:{valType:"any",editType:"none"}}});var sb=ye((ZQt,qee)=>{"use strict";var cet=id(),h6={Greys:[[0,"rgb(0,0,0)"],[1,"rgb(255,255,255)"]],YlGnBu:[[0,"rgb(8,29,88)"],[.125,"rgb(37,52,148)"],[.25,"rgb(34,94,168)"],[.375,"rgb(29,145,192)"],[.5,"rgb(65,182,196)"],[.625,"rgb(127,205,187)"],[.75,"rgb(199,233,180)"],[.875,"rgb(237,248,217)"],[1,"rgb(255,255,217)"]],Greens:[[0,"rgb(0,68,27)"],[.125,"rgb(0,109,44)"],[.25,"rgb(35,139,69)"],[.375,"rgb(65,171,93)"],[.5,"rgb(116,196,118)"],[.625,"rgb(161,217,155)"],[.75,"rgb(199,233,192)"],[.875,"rgb(229,245,224)"],[1,"rgb(247,252,245)"]],YlOrRd:[[0,"rgb(128,0,38)"],[.125,"rgb(189,0,38)"],[.25,"rgb(227,26,28)"],[.375,"rgb(252,78,42)"],[.5,"rgb(253,141,60)"],[.625,"rgb(254,178,76)"],[.75,"rgb(254,217,118)"],[.875,"rgb(255,237,160)"],[1,"rgb(255,255,204)"]],Bluered:[[0,"rgb(0,0,255)"],[1,"rgb(255,0,0)"]],RdBu:[[0,"rgb(5,10,172)"],[.35,"rgb(106,137,247)"],[.5,"rgb(190,190,190)"],[.6,"rgb(220,170,132)"],[.7,"rgb(230,145,90)"],[1,"rgb(178,10,28)"]],Reds:[[0,"rgb(220,220,220)"],[.2,"rgb(245,195,157)"],[.4,"rgb(245,160,105)"],[1,"rgb(178,10,28)"]],Blues:[[0,"rgb(5,10,172)"],[.35,"rgb(40,60,190)"],[.5,"rgb(70,100,245)"],[.6,"rgb(90,120,245)"],[.7,"rgb(106,137,247)"],[1,"rgb(220,220,220)"]],Picnic:[[0,"rgb(0,0,255)"],[.1,"rgb(51,153,255)"],[.2,"rgb(102,204,255)"],[.3,"rgb(153,204,255)"],[.4,"rgb(204,204,255)"],[.5,"rgb(255,255,255)"],[.6,"rgb(255,204,255)"],[.7,"rgb(255,153,255)"],[.8,"rgb(255,102,204)"],[.9,"rgb(255,102,102)"],[1,"rgb(255,0,0)"]],Rainbow:[[0,"rgb(150,0,90)"],[.125,"rgb(0,0,200)"],[.25,"rgb(0,25,255)"],[.375,"rgb(0,152,255)"],[.5,"rgb(44,255,150)"],[.625,"rgb(151,255,0)"],[.75,"rgb(255,234,0)"],[.875,"rgb(255,111,0)"],[1,"rgb(255,0,0)"]],Portland:[[0,"rgb(12,51,131)"],[.25,"rgb(10,136,186)"],[.5,"rgb(242,211,56)"],[.75,"rgb(242,143,56)"],[1,"rgb(217,30,30)"]],Jet:[[0,"rgb(0,0,131)"],[.125,"rgb(0,60,170)"],[.375,"rgb(5,255,255)"],[.625,"rgb(255,255,0)"],[.875,"rgb(250,0,0)"],[1,"rgb(128,0,0)"]],Hot:[[0,"rgb(0,0,0)"],[.3,"rgb(230,0,0)"],[.6,"rgb(255,210,0)"],[1,"rgb(255,255,255)"]],Blackbody:[[0,"rgb(0,0,0)"],[.2,"rgb(230,0,0)"],[.4,"rgb(230,210,0)"],[.7,"rgb(255,255,255)"],[1,"rgb(160,200,255)"]],Earth:[[0,"rgb(0,0,130)"],[.1,"rgb(0,180,180)"],[.2,"rgb(40,210,40)"],[.4,"rgb(230,230,50)"],[.6,"rgb(120,70,20)"],[1,"rgb(255,255,255)"]],Electric:[[0,"rgb(0,0,0)"],[.15,"rgb(30,0,100)"],[.4,"rgb(120,0,100)"],[.6,"rgb(160,90,0)"],[.8,"rgb(230,200,0)"],[1,"rgb(255,250,220)"]],Viridis:[[0,"#440154"],[.06274509803921569,"#48186a"],[.12549019607843137,"#472d7b"],[.18823529411764706,"#424086"],[.25098039215686274,"#3b528b"],[.3137254901960784,"#33638d"],[.3764705882352941,"#2c728e"],[.4392156862745098,"#26828e"],[.5019607843137255,"#21918c"],[.5647058823529412,"#1fa088"],[.6274509803921569,"#28ae80"],[.6901960784313725,"#3fbc73"],[.7529411764705882,"#5ec962"],[.8156862745098039,"#84d44b"],[.8784313725490196,"#addc30"],[.9411764705882353,"#d8e219"],[1,"#fde725"]],Cividis:[[0,"rgb(0,32,76)"],[.058824,"rgb(0,42,102)"],[.117647,"rgb(0,52,110)"],[.176471,"rgb(39,63,108)"],[.235294,"rgb(60,74,107)"],[.294118,"rgb(76,85,107)"],[.352941,"rgb(91,95,109)"],[.411765,"rgb(104,106,112)"],[.470588,"rgb(117,117,117)"],[.529412,"rgb(131,129,120)"],[.588235,"rgb(146,140,120)"],[.647059,"rgb(161,152,118)"],[.705882,"rgb(176,165,114)"],[.764706,"rgb(192,177,109)"],[.823529,"rgb(209,191,102)"],[.882353,"rgb(225,204,92)"],[.941176,"rgb(243,219,79)"],[1,"rgb(255,233,69)"]]},zee=h6.RdBu;function fet(e,t){if(t||(t=zee),!e)return t;function r(){try{e=h6[e]||JSON.parse(e)}catch(n){e=t}}return typeof e=="string"&&(r(),typeof e=="string"&&r()),Fee(e)?e:t}function Fee(e){var t=0;if(!Array.isArray(e)||e.length<2||!e[0]||!e[e.length-1]||+e[0][0]!=0||+e[e.length-1][0]!=1)return!1;for(var r=0;r{"use strict";lb.defaults=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"];lb.defaultLine="#444";lb.lightLine="#eee";lb.background="#fff";lb.borderLine="#BEC8D9";lb.lightFraction=100*10/11});var va=ye((YQt,Oee)=>{"use strict";var xp=id(),det=uo(),vet=vv().isTypedArray,nd=Oee.exports={},d6=dh();nd.defaults=d6.defaults;var pet=nd.defaultLine=d6.defaultLine;nd.lightLine=d6.lightLine;var bq=nd.background=d6.background;nd.tinyRGB=function(e){var t=e.toRgb();return"rgb("+Math.round(t.r)+", "+Math.round(t.g)+", "+Math.round(t.b)+")"};nd.rgb=function(e){return nd.tinyRGB(xp(e))};nd.opacity=function(e){return e?xp(e).getAlpha():0};nd.addOpacity=function(e,t){var r=xp(e).toRgb();return"rgba("+Math.round(r.r)+", "+Math.round(r.g)+", "+Math.round(r.b)+", "+t+")"};nd.combine=function(e,t){var r=xp(e).toRgb();if(r.a===1)return xp(e).toRgbString();var n=xp(t||bq).toRgb(),i=n.a===1?n:{r:255*(1-n.a)+n.r*n.a,g:255*(1-n.a)+n.g*n.a,b:255*(1-n.a)+n.b*n.a},a={r:i.r*(1-r.a)+r.r*r.a,g:i.g*(1-r.a)+r.g*r.a,b:i.b*(1-r.a)+r.b*r.a};return xp(a).toRgbString()};nd.interpolate=function(e,t,r){var n=xp(e).toRgb(),i=xp(t).toRgb(),a={r:r*n.r+(1-r)*i.r,g:r*n.g+(1-r)*i.g,b:r*n.b+(1-r)*i.b};return xp(a).toRgbString()};nd.contrast=function(e,t,r){var n=xp(e);n.getAlpha()!==1&&(n=xp(nd.combine(e,bq)));var i=n.isDark()?t?n.lighten(t):bq:r?n.darken(r):pet;return i.toString()};nd.stroke=function(e,t){var r=xp(t);e.style({stroke:nd.tinyRGB(r),"stroke-opacity":r.getAlpha()})};nd.fill=function(e,t){var r=xp(t);e.style({fill:nd.tinyRGB(r),"fill-opacity":r.getAlpha()})};nd.clean=function(e){if(!(!e||typeof e!="object")){var t=Object.keys(e),r,n,i,a;for(r=0;r=0)))return e;if(a===3)n[a]>1&&(n[a]=1);else if(n[a]>=1)return e}var o=Math.round(n[0]*255)+", "+Math.round(n[1]*255)+", "+Math.round(n[2]*255);return i?"rgba("+o+", "+n[3]+")":"rgb("+o+")"}});var N1=ye((KQt,Bee)=>{"use strict";Bee.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DESELECTDIM:.2}});var n3=ye(Nee=>{"use strict";Nee.counter=function(e,t,r,n){var i=(t||"")+(r?"":"$"),a=n===!1?"":"^";return e==="xy"?new RegExp(a+"x([2-9]|[1-9][0-9]+)?y([2-9]|[1-9][0-9]+)?"+i):new RegExp(a+e+"([2-9]|[1-9][0-9]+)?"+i)}});var Gee=ye(bp=>{"use strict";var wq=uo(),Uee=id(),Vee=no().extendFlat,get=vl(),met=sb(),yet=va(),_et=N1().DESELECTDIM,a3=ES(),Hee=n3().counter,xet=r3().modHalf,dm=vv().isArrayOrTypedArray,U1=vv().isTypedArraySpec,V1=vv().decodeTypedArraySpec;bp.valObjectMeta={data_array:{coerceFunction:function(e,t,r){t.set(dm(e)?e:U1(e)?V1(e):r)}},enumerated:{coerceFunction:function(e,t,r,n){n.coerceNumber&&(e=+e),n.values.indexOf(e)===-1?t.set(r):t.set(e)},validateFunction:function(e,t){t.coerceNumber&&(e=+e);for(var r=t.values,n=0;nn.max?t.set(r):t.set(+e)}},integer:{coerceFunction:function(e,t,r,n){if((n.extras||[]).indexOf(e)!==-1){t.set(e);return}U1(e)&&(e=V1(e)),e%1||!wq(e)||n.min!==void 0&&en.max?t.set(r):t.set(+e)}},string:{coerceFunction:function(e,t,r,n){if(typeof e!="string"){var i=typeof e=="number";n.strict===!0||!i?t.set(r):t.set(String(e))}else n.noBlank&&!e?t.set(r):t.set(e)}},color:{coerceFunction:function(e,t,r){U1(e)&&(e=V1(e)),Uee(e).isValid()?t.set(e):t.set(r)}},colorlist:{coerceFunction:function(e,t,r){function n(i){return Uee(i).isValid()}!Array.isArray(e)||!e.length?t.set(r):e.every(n)?t.set(e):t.set(r)}},colorscale:{coerceFunction:function(e,t,r){t.set(met.get(e,r))}},angle:{coerceFunction:function(e,t,r){U1(e)&&(e=V1(e)),e==="auto"?t.set("auto"):wq(e)?t.set(xet(+e,360)):t.set(r)}},subplotid:{coerceFunction:function(e,t,r,n){var i=n.regex||Hee(r);if(typeof e=="string"&&i.test(e)){t.set(e);return}t.set(r)},validateFunction:function(e,t){var r=t.dflt;return e===r?!0:typeof e!="string"?!1:!!Hee(r).test(e)}},flaglist:{coerceFunction:function(e,t,r,n){if((n.extras||[]).indexOf(e)!==-1){t.set(e);return}if(typeof e!="string"){t.set(r);return}for(var i=e.split("+"),a=0;a{"use strict";var jee={staticPlot:{valType:"boolean",dflt:!1},typesetMath:{valType:"boolean",dflt:!0},plotlyServerURL:{valType:"string",dflt:""},editable:{valType:"boolean",dflt:!1},edits:{annotationPosition:{valType:"boolean",dflt:!1},annotationTail:{valType:"boolean",dflt:!1},annotationText:{valType:"boolean",dflt:!1},axisTitleText:{valType:"boolean",dflt:!1},colorbarPosition:{valType:"boolean",dflt:!1},colorbarTitleText:{valType:"boolean",dflt:!1},legendPosition:{valType:"boolean",dflt:!1},legendText:{valType:"boolean",dflt:!1},shapePosition:{valType:"boolean",dflt:!1},titleText:{valType:"boolean",dflt:!1}},editSelection:{valType:"boolean",dflt:!0},autosizable:{valType:"boolean",dflt:!1},responsive:{valType:"boolean",dflt:!1},fillFrame:{valType:"boolean",dflt:!1},frameMargins:{valType:"number",dflt:0,min:0,max:.5},scrollZoom:{valType:"flaglist",flags:["cartesian","gl3d","geo","mapbox","map"],extras:[!0,!1],dflt:"gl3d+geo+map"},doubleClick:{valType:"enumerated",values:[!1,"reset","autosize","reset+autosize"],dflt:"reset+autosize"},doubleClickDelay:{valType:"number",dflt:300,min:0},showAxisDragHandles:{valType:"boolean",dflt:!0},showAxisRangeEntryBoxes:{valType:"boolean",dflt:!0},showTips:{valType:"boolean",dflt:!0},showLink:{valType:"boolean",dflt:!1},linkText:{valType:"string",dflt:"Edit chart",noBlank:!0},sendData:{valType:"boolean",dflt:!0},showSources:{valType:"any",dflt:!1},displayModeBar:{valType:"enumerated",values:["hover",!0,!1],dflt:"hover"},showSendToCloud:{valType:"boolean",dflt:!1},showEditInChartStudio:{valType:"boolean",dflt:!1},modeBarButtonsToRemove:{valType:"any",dflt:[]},modeBarButtonsToAdd:{valType:"any",dflt:[]},modeBarButtons:{valType:"any",dflt:!1},toImageButtonOptions:{valType:"any",dflt:{}},displaylogo:{valType:"boolean",dflt:!0},watermark:{valType:"boolean",dflt:!1},plotGlPixelRatio:{valType:"number",dflt:2,min:1,max:4},setBackground:{valType:"any",dflt:"transparent"},topojsonURL:{valType:"string",noBlank:!0,dflt:"https://cdn.plot.ly/"},mapboxAccessToken:{valType:"string",dflt:null},logging:{valType:"integer",min:0,max:2,dflt:1},notifyOnLogging:{valType:"integer",min:0,max:2,dflt:0},queueLength:{valType:"integer",min:0,dflt:0},locale:{valType:"string",dflt:"en-US"},locales:{valType:"any",dflt:{}}},Wee={};function Zee(e,t){for(var r in e){var n=e[r];n.valType?t[r]=n.dflt:(t[r]||(t[r]={}),Zee(n,t[r]))}}Zee(jee,Wee);Xee.exports={configAttributes:jee,dfltConfig:Wee}});var Aq=ye((eer,Yee)=>{"use strict";var Tq=xa(),bet=uo(),RS=[];Yee.exports=function(e,t){if(RS.indexOf(e)!==-1)return;RS.push(e);var r=1e3;bet(t)?r=t:t==="long"&&(r=3e3);var n=Tq.select("body").selectAll(".plotly-notifier").data([0]);n.enter().append("div").classed("plotly-notifier",!0);var i=n.selectAll(".notifier-note").data(RS);function a(o){o.duration(700).style("opacity",0).each("end",function(s){var l=RS.indexOf(s);l!==-1&&RS.splice(l,1),Tq.select(this).remove()})}i.enter().append("div").classed("notifier-note",!0).style("opacity",0).each(function(o){var s=Tq.select(this);s.append("button").classed("notifier-close",!0).html("×").on("click",function(){s.transition().call(a)});for(var l=s.append("p"),u=o.split(/
/g),c=0;c{"use strict";var o3=ub().dfltConfig,Sq=Aq(),Mq=Kee.exports={};Mq.log=function(){var e;if(o3.logging>1){var t=["LOG:"];for(e=0;e1){var r=[];for(e=0;e"),"long")}};Mq.warn=function(){var e;if(o3.logging>0){var t=["WARN:"];for(e=0;e0){var r=[];for(e=0;e"),"stick")}};Mq.error=function(){var e;if(o3.logging>0){var t=["ERROR:"];for(e=0;e0){var r=[];for(e=0;e"),"stick")}}});var p6=ye((rer,Jee)=>{"use strict";Jee.exports=function(){}});var Eq=ye((ier,$ee)=>{"use strict";$ee.exports=function(t,r){if(r instanceof RegExp){for(var n=r.toString(),i=0;i{Qee.exports=wet;function wet(){var e=new Float32Array(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var rte=ye((aer,tte)=>{tte.exports=Tet;function Tet(e){var t=new Float32Array(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}});var nte=ye((oer,ite)=>{ite.exports=Aet;function Aet(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}});var kq=ye((ser,ate)=>{ate.exports=Met;function Met(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var ste=ye((ler,ote)=>{ote.exports=Eet;function Eet(e,t){if(e===t){var r=t[1],n=t[2],i=t[3],a=t[6],o=t[7],s=t[11];e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=r,e[6]=t[9],e[7]=t[13],e[8]=n,e[9]=a,e[11]=t[14],e[12]=i,e[13]=o,e[14]=s}else e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15];return e}});var ute=ye((uer,lte)=>{lte.exports=ket;function ket(e,t){var r=t[0],n=t[1],i=t[2],a=t[3],o=t[4],s=t[5],l=t[6],u=t[7],c=t[8],f=t[9],h=t[10],d=t[11],v=t[12],x=t[13],b=t[14],g=t[15],E=r*s-n*o,k=r*l-i*o,A=r*u-a*o,L=n*l-i*s,_=n*u-a*s,C=i*u-a*l,M=c*x-f*v,p=c*b-h*v,P=c*g-d*v,T=f*b-h*x,F=f*g-d*x,q=h*g-d*b,V=E*q-k*F+A*T+L*P-_*p+C*M;return V?(V=1/V,e[0]=(s*q-l*F+u*T)*V,e[1]=(i*F-n*q-a*T)*V,e[2]=(x*C-b*_+g*L)*V,e[3]=(h*_-f*C-d*L)*V,e[4]=(l*P-o*q-u*p)*V,e[5]=(r*q-i*P+a*p)*V,e[6]=(b*A-v*C-g*k)*V,e[7]=(c*C-h*A+d*k)*V,e[8]=(o*F-s*P+u*M)*V,e[9]=(n*P-r*F-a*M)*V,e[10]=(v*_-x*A+g*E)*V,e[11]=(f*A-c*_-d*E)*V,e[12]=(s*p-o*T-l*M)*V,e[13]=(r*T-n*p+i*M)*V,e[14]=(x*k-v*L-b*E)*V,e[15]=(c*L-f*k+h*E)*V,e):null}});var fte=ye((cer,cte)=>{cte.exports=Cet;function Cet(e,t){var r=t[0],n=t[1],i=t[2],a=t[3],o=t[4],s=t[5],l=t[6],u=t[7],c=t[8],f=t[9],h=t[10],d=t[11],v=t[12],x=t[13],b=t[14],g=t[15];return e[0]=s*(h*g-d*b)-f*(l*g-u*b)+x*(l*d-u*h),e[1]=-(n*(h*g-d*b)-f*(i*g-a*b)+x*(i*d-a*h)),e[2]=n*(l*g-u*b)-s*(i*g-a*b)+x*(i*u-a*l),e[3]=-(n*(l*d-u*h)-s*(i*d-a*h)+f*(i*u-a*l)),e[4]=-(o*(h*g-d*b)-c*(l*g-u*b)+v*(l*d-u*h)),e[5]=r*(h*g-d*b)-c*(i*g-a*b)+v*(i*d-a*h),e[6]=-(r*(l*g-u*b)-o*(i*g-a*b)+v*(i*u-a*l)),e[7]=r*(l*d-u*h)-o*(i*d-a*h)+c*(i*u-a*l),e[8]=o*(f*g-d*x)-c*(s*g-u*x)+v*(s*d-u*f),e[9]=-(r*(f*g-d*x)-c*(n*g-a*x)+v*(n*d-a*f)),e[10]=r*(s*g-u*x)-o*(n*g-a*x)+v*(n*u-a*s),e[11]=-(r*(s*d-u*f)-o*(n*d-a*f)+c*(n*u-a*s)),e[12]=-(o*(f*b-h*x)-c*(s*b-l*x)+v*(s*h-l*f)),e[13]=r*(f*b-h*x)-c*(n*b-i*x)+v*(n*h-i*f),e[14]=-(r*(s*b-l*x)-o*(n*b-i*x)+v*(n*l-i*s)),e[15]=r*(s*h-l*f)-o*(n*h-i*f)+c*(n*l-i*s),e}});var dte=ye((fer,hte)=>{hte.exports=Let;function Let(e){var t=e[0],r=e[1],n=e[2],i=e[3],a=e[4],o=e[5],s=e[6],l=e[7],u=e[8],c=e[9],f=e[10],h=e[11],d=e[12],v=e[13],x=e[14],b=e[15],g=t*o-r*a,E=t*s-n*a,k=t*l-i*a,A=r*s-n*o,L=r*l-i*o,_=n*l-i*s,C=u*v-c*d,M=u*x-f*d,p=u*b-h*d,P=c*x-f*v,T=c*b-h*v,F=f*b-h*x;return g*F-E*T+k*P+A*p-L*M+_*C}});var pte=ye((her,vte)=>{vte.exports=Pet;function Pet(e,t,r){var n=t[0],i=t[1],a=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],f=t[8],h=t[9],d=t[10],v=t[11],x=t[12],b=t[13],g=t[14],E=t[15],k=r[0],A=r[1],L=r[2],_=r[3];return e[0]=k*n+A*s+L*f+_*x,e[1]=k*i+A*l+L*h+_*b,e[2]=k*a+A*u+L*d+_*g,e[3]=k*o+A*c+L*v+_*E,k=r[4],A=r[5],L=r[6],_=r[7],e[4]=k*n+A*s+L*f+_*x,e[5]=k*i+A*l+L*h+_*b,e[6]=k*a+A*u+L*d+_*g,e[7]=k*o+A*c+L*v+_*E,k=r[8],A=r[9],L=r[10],_=r[11],e[8]=k*n+A*s+L*f+_*x,e[9]=k*i+A*l+L*h+_*b,e[10]=k*a+A*u+L*d+_*g,e[11]=k*o+A*c+L*v+_*E,k=r[12],A=r[13],L=r[14],_=r[15],e[12]=k*n+A*s+L*f+_*x,e[13]=k*i+A*l+L*h+_*b,e[14]=k*a+A*u+L*d+_*g,e[15]=k*o+A*c+L*v+_*E,e}});var mte=ye((der,gte)=>{gte.exports=Iet;function Iet(e,t,r){var n=r[0],i=r[1],a=r[2],o,s,l,u,c,f,h,d,v,x,b,g;return t===e?(e[12]=t[0]*n+t[4]*i+t[8]*a+t[12],e[13]=t[1]*n+t[5]*i+t[9]*a+t[13],e[14]=t[2]*n+t[6]*i+t[10]*a+t[14],e[15]=t[3]*n+t[7]*i+t[11]*a+t[15]):(o=t[0],s=t[1],l=t[2],u=t[3],c=t[4],f=t[5],h=t[6],d=t[7],v=t[8],x=t[9],b=t[10],g=t[11],e[0]=o,e[1]=s,e[2]=l,e[3]=u,e[4]=c,e[5]=f,e[6]=h,e[7]=d,e[8]=v,e[9]=x,e[10]=b,e[11]=g,e[12]=o*n+c*i+v*a+t[12],e[13]=s*n+f*i+x*a+t[13],e[14]=l*n+h*i+b*a+t[14],e[15]=u*n+d*i+g*a+t[15]),e}});var _te=ye((ver,yte)=>{yte.exports=Ret;function Ret(e,t,r){var n=r[0],i=r[1],a=r[2];return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e[3]=t[3]*n,e[4]=t[4]*i,e[5]=t[5]*i,e[6]=t[6]*i,e[7]=t[7]*i,e[8]=t[8]*a,e[9]=t[9]*a,e[10]=t[10]*a,e[11]=t[11]*a,e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}});var bte=ye((per,xte)=>{xte.exports=Det;function Det(e,t,r,n){var i=n[0],a=n[1],o=n[2],s=Math.sqrt(i*i+a*a+o*o),l,u,c,f,h,d,v,x,b,g,E,k,A,L,_,C,M,p,P,T,F,q,V,H;return Math.abs(s)<1e-6?null:(s=1/s,i*=s,a*=s,o*=s,l=Math.sin(r),u=Math.cos(r),c=1-u,f=t[0],h=t[1],d=t[2],v=t[3],x=t[4],b=t[5],g=t[6],E=t[7],k=t[8],A=t[9],L=t[10],_=t[11],C=i*i*c+u,M=a*i*c+o*l,p=o*i*c-a*l,P=i*a*c-o*l,T=a*a*c+u,F=o*a*c+i*l,q=i*o*c+a*l,V=a*o*c-i*l,H=o*o*c+u,e[0]=f*C+x*M+k*p,e[1]=h*C+b*M+A*p,e[2]=d*C+g*M+L*p,e[3]=v*C+E*M+_*p,e[4]=f*P+x*T+k*F,e[5]=h*P+b*T+A*F,e[6]=d*P+g*T+L*F,e[7]=v*P+E*T+_*F,e[8]=f*q+x*V+k*H,e[9]=h*q+b*V+A*H,e[10]=d*q+g*V+L*H,e[11]=v*q+E*V+_*H,t!==e&&(e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e)}});var Tte=ye((ger,wte)=>{wte.exports=zet;function zet(e,t,r){var n=Math.sin(r),i=Math.cos(r),a=t[4],o=t[5],s=t[6],l=t[7],u=t[8],c=t[9],f=t[10],h=t[11];return t!==e&&(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[4]=a*i+u*n,e[5]=o*i+c*n,e[6]=s*i+f*n,e[7]=l*i+h*n,e[8]=u*i-a*n,e[9]=c*i-o*n,e[10]=f*i-s*n,e[11]=h*i-l*n,e}});var Ste=ye((mer,Ate)=>{Ate.exports=Fet;function Fet(e,t,r){var n=Math.sin(r),i=Math.cos(r),a=t[0],o=t[1],s=t[2],l=t[3],u=t[8],c=t[9],f=t[10],h=t[11];return t!==e&&(e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=a*i-u*n,e[1]=o*i-c*n,e[2]=s*i-f*n,e[3]=l*i-h*n,e[8]=a*n+u*i,e[9]=o*n+c*i,e[10]=s*n+f*i,e[11]=l*n+h*i,e}});var Ete=ye((yer,Mte)=>{Mte.exports=qet;function qet(e,t,r){var n=Math.sin(r),i=Math.cos(r),a=t[0],o=t[1],s=t[2],l=t[3],u=t[4],c=t[5],f=t[6],h=t[7];return t!==e&&(e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=a*i+u*n,e[1]=o*i+c*n,e[2]=s*i+f*n,e[3]=l*i+h*n,e[4]=u*i-a*n,e[5]=c*i-o*n,e[6]=f*i-s*n,e[7]=h*i-l*n,e}});var Cte=ye((_er,kte)=>{kte.exports=Oet;function Oet(e,t,r){var n,i,a,o=r[0],s=r[1],l=r[2],u=Math.sqrt(o*o+s*s+l*l);return Math.abs(u)<1e-6?null:(u=1/u,o*=u,s*=u,l*=u,n=Math.sin(t),i=Math.cos(t),a=1-i,e[0]=o*o*a+i,e[1]=s*o*a+l*n,e[2]=l*o*a-s*n,e[3]=0,e[4]=o*s*a-l*n,e[5]=s*s*a+i,e[6]=l*s*a+o*n,e[7]=0,e[8]=o*l*a+s*n,e[9]=s*l*a-o*n,e[10]=l*l*a+i,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e)}});var Pte=ye((xer,Lte)=>{Lte.exports=Bet;function Bet(e,t,r){var n=t[0],i=t[1],a=t[2],o=t[3],s=n+n,l=i+i,u=a+a,c=n*s,f=n*l,h=n*u,d=i*l,v=i*u,x=a*u,b=o*s,g=o*l,E=o*u;return e[0]=1-(d+x),e[1]=f+E,e[2]=h-g,e[3]=0,e[4]=f-E,e[5]=1-(c+x),e[6]=v+b,e[7]=0,e[8]=h+g,e[9]=v-b,e[10]=1-(c+d),e[11]=0,e[12]=r[0],e[13]=r[1],e[14]=r[2],e[15]=1,e}});var Rte=ye((ber,Ite)=>{Ite.exports=Net;function Net(e,t){return e[0]=t[0],e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t[1],e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t[2],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var zte=ye((wer,Dte)=>{Dte.exports=Uet;function Uet(e,t){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e}});var qte=ye((Ter,Fte)=>{Fte.exports=Vet;function Vet(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=n,e[6]=r,e[7]=0,e[8]=0,e[9]=-r,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var Bte=ye((Aer,Ote)=>{Ote.exports=Het;function Het(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=n,e[1]=0,e[2]=-r,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=r,e[9]=0,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var Ute=ye((Ser,Nte)=>{Nte.exports=Get;function Get(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=n,e[1]=r,e[2]=0,e[3]=0,e[4]=-r,e[5]=n,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var Cq=ye((Mer,Vte)=>{Vte.exports=jet;function jet(e,t){var r=t[0],n=t[1],i=t[2],a=t[3],o=r+r,s=n+n,l=i+i,u=r*o,c=n*o,f=n*s,h=i*o,d=i*s,v=i*l,x=a*o,b=a*s,g=a*l;return e[0]=1-f-v,e[1]=c+g,e[2]=h-b,e[3]=0,e[4]=c-g,e[5]=1-u-v,e[6]=d+x,e[7]=0,e[8]=h+b,e[9]=d-x,e[10]=1-u-f,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}});var Gte=ye((Eer,Hte)=>{Hte.exports=Wet;function Wet(e,t,r,n,i,a,o){var s=1/(r-t),l=1/(i-n),u=1/(a-o);return e[0]=a*2*s,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=a*2*l,e[6]=0,e[7]=0,e[8]=(r+t)*s,e[9]=(i+n)*l,e[10]=(o+a)*u,e[11]=-1,e[12]=0,e[13]=0,e[14]=o*a*2*u,e[15]=0,e}});var Wte=ye((ker,jte)=>{jte.exports=Zet;function Zet(e,t,r,n,i){var a=1/Math.tan(t/2),o=1/(n-i);return e[0]=a/r,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=a,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=(i+n)*o,e[11]=-1,e[12]=0,e[13]=0,e[14]=2*i*n*o,e[15]=0,e}});var Xte=ye((Cer,Zte)=>{Zte.exports=Xet;function Xet(e,t,r,n){var i=Math.tan(t.upDegrees*Math.PI/180),a=Math.tan(t.downDegrees*Math.PI/180),o=Math.tan(t.leftDegrees*Math.PI/180),s=Math.tan(t.rightDegrees*Math.PI/180),l=2/(o+s),u=2/(i+a);return e[0]=l,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=u,e[6]=0,e[7]=0,e[8]=-((o-s)*l*.5),e[9]=(i-a)*u*.5,e[10]=n/(r-n),e[11]=-1,e[12]=0,e[13]=0,e[14]=n*r/(r-n),e[15]=0,e}});var Kte=ye((Ler,Yte)=>{Yte.exports=Yet;function Yet(e,t,r,n,i,a,o){var s=1/(t-r),l=1/(n-i),u=1/(a-o);return e[0]=-2*s,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=-2*l,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=2*u,e[11]=0,e[12]=(t+r)*s,e[13]=(i+n)*l,e[14]=(o+a)*u,e[15]=1,e}});var $te=ye((Per,Jte)=>{var Ket=kq();Jte.exports=Jet;function Jet(e,t,r,n){var i,a,o,s,l,u,c,f,h,d,v=t[0],x=t[1],b=t[2],g=n[0],E=n[1],k=n[2],A=r[0],L=r[1],_=r[2];return Math.abs(v-A)<1e-6&&Math.abs(x-L)<1e-6&&Math.abs(b-_)<1e-6?Ket(e):(c=v-A,f=x-L,h=b-_,d=1/Math.sqrt(c*c+f*f+h*h),c*=d,f*=d,h*=d,i=E*h-k*f,a=k*c-g*h,o=g*f-E*c,d=Math.sqrt(i*i+a*a+o*o),d?(d=1/d,i*=d,a*=d,o*=d):(i=0,a=0,o=0),s=f*o-h*a,l=h*i-c*o,u=c*a-f*i,d=Math.sqrt(s*s+l*l+u*u),d?(d=1/d,s*=d,l*=d,u*=d):(s=0,l=0,u=0),e[0]=i,e[1]=s,e[2]=c,e[3]=0,e[4]=a,e[5]=l,e[6]=f,e[7]=0,e[8]=o,e[9]=u,e[10]=h,e[11]=0,e[12]=-(i*v+a*x+o*b),e[13]=-(s*v+l*x+u*b),e[14]=-(c*v+f*x+h*b),e[15]=1,e)}});var ere=ye((Ier,Qte)=>{Qte.exports=$et;function $et(e){return"mat4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+", "+e[4]+", "+e[5]+", "+e[6]+", "+e[7]+", "+e[8]+", "+e[9]+", "+e[10]+", "+e[11]+", "+e[12]+", "+e[13]+", "+e[14]+", "+e[15]+")"}});var Lq=ye((Rer,tre)=>{tre.exports={create:ete(),clone:rte(),copy:nte(),identity:kq(),transpose:ste(),invert:ute(),adjoint:fte(),determinant:dte(),multiply:pte(),translate:mte(),scale:_te(),rotate:bte(),rotateX:Tte(),rotateY:Ste(),rotateZ:Ete(),fromRotation:Cte(),fromRotationTranslation:Pte(),fromScaling:Rte(),fromTranslation:zte(),fromXRotation:qte(),fromYRotation:Bte(),fromZRotation:Ute(),fromQuat:Cq(),frustum:Gte(),perspective:Wte(),perspectiveFromFieldOfView:Xte(),ortho:Kte(),lookAt:$te(),str:ere()}});var g6=ye(Xf=>{"use strict";var Qet=Lq();Xf.init2dArray=function(e,t){for(var r=new Array(e),n=0;n{"use strict";var ett=xa(),rre=H1(),ttt=g6(),rtt=Lq();function itt(e){var t;if(typeof e=="string"){if(t=document.getElementById(e),t===null)throw new Error("No DOM element with id '"+e+"' exists on the page.");return t}else if(e==null)throw new Error("DOM element provided is null or undefined");return e}function ntt(e){var t=ett.select(e);return t.node()instanceof HTMLElement&&t.size()&&t.classed("js-plotly-plot")}function ire(e){var t=e&&e.parentNode;t&&t.removeChild(e)}function att(e,t){nre("global",e,t)}function nre(e,t,r){var n="plotly.js-style-"+e,i=document.getElementById(n);if(!(i&&i.matches(".no-inline-styles"))){i||(i=document.createElement("style"),i.setAttribute("id",n),i.appendChild(document.createTextNode("")),document.head.appendChild(i));var a=i.sheet;a?a.insertRule?a.insertRule(t+"{"+r+"}",0):a.addRule?a.addRule(t,r,0):rre.warn("addStyleRule failed"):rre.warn("Cannot addRelatedStyleRule, probably due to strict CSP...")}}function ott(e){var t="plotly.js-style-"+e,r=document.getElementById(t);r&&ire(r)}function stt(e,t,r,n,i,a){var o=n.split(":"),s=i.split(":"),l="data-btn-style-event-added";a||(a=document),a.querySelectorAll(e).forEach(function(u){u.getAttribute(l)||(u.addEventListener("mouseenter",function(){var c=this.querySelector(r);c&&(c.style[o[0]]=o[1])}),u.addEventListener("mouseleave",function(){var c=this.querySelector(r);c&&(t&&this.matches(t)?c.style[o[0]]=o[1]:c.style[s[0]]=s[1])}),u.setAttribute(l,!0))})}function ltt(e){var t=ore(e),r=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];return t.forEach(function(n){var i=are(n);if(i){var a=ttt.convertCssMatrix(i);r=rtt.multiply(r,r,a)}}),r}function are(e){var t=window.getComputedStyle(e,null),r=t.getPropertyValue("-webkit-transform")||t.getPropertyValue("-moz-transform")||t.getPropertyValue("-ms-transform")||t.getPropertyValue("-o-transform")||t.getPropertyValue("transform");return r==="none"?null:r.replace("matrix","").replace("3d","").slice(1,-1).split(",").map(function(n){return+n})}function ore(e){for(var t=[];utt(e);)t.push(e),e=e.parentNode,typeof ShadowRoot=="function"&&e instanceof ShadowRoot&&(e=e.host);return t}function utt(e){return e&&(e instanceof Element||e instanceof HTMLElement)}function ctt(e,t){return e&&t&&e.top===t.top&&e.left===t.left&&e.right===t.right&&e.bottom===t.bottom}sre.exports={getGraphDiv:itt,isPlotDiv:ntt,removeElement:ire,addStyleRule:att,addRelatedStyleRule:nre,deleteRelatedStyleRule:ott,setStyleOnHover:stt,getFullTransformMatrix:ltt,getElementTransformMatrix:are,getElementAndAncestors:ore,equalDomRects:ctt}});var zS=ye((Fer,lre)=>{"use strict";lre.exports={mode:{valType:"enumerated",dflt:"afterall",values:["immediate","next","afterall"]},direction:{valType:"enumerated",values:["forward","reverse"],dflt:"forward"},fromcurrent:{valType:"boolean",dflt:!1},frame:{duration:{valType:"number",min:0,dflt:500},redraw:{valType:"boolean",dflt:!0}},transition:{duration:{valType:"number",min:0,dflt:500,editType:"none"},easing:{valType:"enumerated",dflt:"cubic-in-out",values:["linear","quad","cubic","sin","exp","circle","elastic","back","bounce","linear-in","quad-in","cubic-in","sin-in","exp-in","circle-in","elastic-in","back-in","bounce-in","linear-out","quad-out","cubic-out","sin-out","exp-out","circle-out","elastic-out","back-out","bounce-out","linear-in-out","quad-in-out","cubic-in-out","sin-in-out","exp-in-out","circle-in-out","elastic-in-out","back-in-out","bounce-in-out"],editType:"none"},ordering:{valType:"enumerated",values:["layout first","traces first"],dflt:"layout first",editType:"none"}}}});var Bu=ye((qer,pre)=>{"use strict";var cre=no().extendFlat,ftt=gy(),fre={valType:"flaglist",extras:["none"],flags:["calc","clearAxisTypes","plot","style","markerSize","colorbars"]},hre={valType:"flaglist",extras:["none"],flags:["calc","plot","legend","ticks","axrange","layoutstyle","modebar","camera","arraydraw","colorbars"]},htt=fre.flags.slice().concat(["fullReplot"]),dtt=hre.flags.slice().concat("layoutReplot");pre.exports={traces:fre,layout:hre,traceFlags:function(){return ure(htt)},layoutFlags:function(){return ure(dtt)},update:function(e,t){var r=t.editType;if(r&&r!=="none")for(var n=r.split("+"),i=0;i{"use strict";Pq.dash={valType:"string",values:["solid","dot","dash","longdash","dashdot","longdashdot"],dflt:"solid",editType:"style"};Pq.pattern={shape:{valType:"enumerated",values:["","/","\\","x","-","|","+","."],dflt:"",arrayOk:!0,editType:"style"},fillmode:{valType:"enumerated",values:["replace","overlay"],dflt:"replace",editType:"style"},bgcolor:{valType:"color",arrayOk:!0,editType:"style"},fgcolor:{valType:"color",arrayOk:!0,editType:"style"},fgopacity:{valType:"number",editType:"style",min:0,max:1},size:{valType:"number",min:0,dflt:8,arrayOk:!0,editType:"style"},solidity:{valType:"number",min:0,max:1,dflt:.3,arrayOk:!0,editType:"style"},editType:"style"}});var Iq=ye((Ber,gre)=>{"use strict";gre.exports={FORMAT_LINK:"https://github.com/d3/d3-format/tree/v1.4.5#d3-format",DATE_FORMAT_LINK:"https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format"}});var Wo=ye(m6=>{"use strict";var mre=Iq(),Ner=mre.FORMAT_LINK,Uer=mre.DATE_FORMAT_LINK;function Rq(e){var t=e.description?" "+e.description:"",r=e.keys||[];if(r.length>0){for(var n=[],i=0;i{"use strict";function G1(e,t){return t?t.d2l(e):e}function yre(e,t){return t?t.l2d(e):e}function vtt(e){return e.x0}function ptt(e){return e.x1}function gtt(e){return e.y0}function mtt(e){return e.y1}function _re(e){return e.x0shift||0}function xre(e){return e.x1shift||0}function bre(e){return e.y0shift||0}function wre(e){return e.y1shift||0}function y6(e,t){return G1(e.x1,t)+xre(e)-G1(e.x0,t)-_re(e)}function _6(e,t,r){return G1(e.y1,r)+wre(e)-G1(e.y0,r)-bre(e)}function ytt(e,t){return Math.abs(y6(e,t))}function _tt(e,t,r){return Math.abs(_6(e,t,r))}function xtt(e,t,r){return e.type!=="line"?void 0:Math.sqrt(Math.pow(y6(e,t),2)+Math.pow(_6(e,t,r),2))}function btt(e,t){return yre((G1(e.x1,t)+xre(e)+G1(e.x0,t)+_re(e))/2,t)}function wtt(e,t,r){return yre((G1(e.y1,r)+wre(e)+G1(e.y0,r)+bre(e))/2,r)}function Ttt(e,t,r){return e.type!=="line"?void 0:_6(e,t,r)/y6(e,t)}Tre.exports={x0:vtt,x1:ptt,y0:gtt,y1:mtt,slope:Ttt,dx:y6,dy:_6,width:ytt,height:_tt,length:xtt,xcenter:btt,ycenter:wtt}});var Mre=ye((Ger,Sre)=>{"use strict";var Att=Bu().overrideAll,cb=vl(),Are=Su(),Stt=Ed().dash,j1=no().extendFlat,Mtt=Wo().shapeTexttemplateAttrs,Ett=x6();Sre.exports=Att({newshape:{visible:j1({},cb.visible,{}),showlegend:{valType:"boolean",dflt:!1},legend:j1({},cb.legend,{}),legendgroup:j1({},cb.legendgroup,{}),legendgrouptitle:{text:j1({},cb.legendgrouptitle.text,{}),font:Are({})},legendrank:j1({},cb.legendrank,{}),legendwidth:j1({},cb.legendwidth,{}),line:{color:{valType:"color"},width:{valType:"number",min:0,dflt:4},dash:j1({},Stt,{dflt:"solid"})},fillcolor:{valType:"color",dflt:"rgba(0,0,0,0)"},fillrule:{valType:"enumerated",values:["evenodd","nonzero"],dflt:"evenodd"},opacity:{valType:"number",min:0,max:1,dflt:1},layer:{valType:"enumerated",values:["below","above","between"],dflt:"above"},drawdirection:{valType:"enumerated",values:["ortho","horizontal","vertical","diagonal"],dflt:"diagonal"},name:j1({},cb.name,{}),label:{text:{valType:"string",dflt:""},texttemplate:Mtt({newshape:!0},{keys:Object.keys(Ett)}),font:Are({}),textposition:{valType:"enumerated",values:["top left","top center","top right","middle left","middle center","middle right","bottom left","bottom center","bottom right","start","middle","end"]},textangle:{valType:"angle",dflt:"auto"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"auto"},yanchor:{valType:"enumerated",values:["top","middle","bottom"]},padding:{valType:"number",dflt:3,min:0}}},activeshape:{fillcolor:{valType:"color",dflt:"rgb(255,0,255)"},opacity:{valType:"number",min:0,max:1,dflt:.5}}},"none","from-root")});var kre=ye((jer,Ere)=>{"use strict";var ktt=Ed().dash,Ctt=no().extendFlat;Ere.exports={newselection:{mode:{valType:"enumerated",values:["immediate","gradual"],dflt:"immediate",editType:"none"},line:{color:{valType:"color",editType:"none"},width:{valType:"number",min:1,dflt:1,editType:"none"},dash:Ctt({},ktt,{dflt:"dot",editType:"none"}),editType:"none"},editType:"none"},activeselection:{fillcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"none"},opacity:{valType:"number",min:0,max:1,dflt:.5,editType:"none"},editType:"none"}}});var b6=ye((Wer,Cre)=>{"use strict";Cre.exports=function(e){var t=e.editType;return{t:{valType:"number",dflt:0,editType:t},r:{valType:"number",dflt:0,editType:t},b:{valType:"number",dflt:0,editType:t},l:{valType:"number",dflt:0,editType:t},editType:t}}});var s3=ye((Zer,Rre)=>{"use strict";var Dq=Su(),Ltt=zS(),w6=dh(),Lre=Mre(),Pre=kre(),Ptt=b6(),Ire=no().extendFlat,T6=Dq({editType:"calc"});T6.family.dflt='"Open Sans", verdana, arial, sans-serif';T6.size.dflt=12;T6.color.dflt=w6.defaultLine;Rre.exports={font:T6,title:{text:{valType:"string",editType:"layoutstyle"},font:Dq({editType:"layoutstyle"}),subtitle:{text:{valType:"string",editType:"layoutstyle"},font:Dq({editType:"layoutstyle"}),editType:"layoutstyle"},xref:{valType:"enumerated",dflt:"container",values:["container","paper"],editType:"layoutstyle"},yref:{valType:"enumerated",dflt:"container",values:["container","paper"],editType:"layoutstyle"},x:{valType:"number",min:0,max:1,dflt:.5,editType:"layoutstyle"},y:{valType:"number",min:0,max:1,dflt:"auto",editType:"layoutstyle"},xanchor:{valType:"enumerated",dflt:"auto",values:["auto","left","center","right"],editType:"layoutstyle"},yanchor:{valType:"enumerated",dflt:"auto",values:["auto","top","middle","bottom"],editType:"layoutstyle"},pad:Ire(Ptt({editType:"layoutstyle"}),{}),automargin:{valType:"boolean",dflt:!1,editType:"plot"},editType:"layoutstyle"},uniformtext:{mode:{valType:"enumerated",values:[!1,"hide","show"],dflt:!1,editType:"plot"},minsize:{valType:"number",min:0,dflt:0,editType:"plot"},editType:"plot"},autosize:{valType:"boolean",dflt:!1,editType:"none"},width:{valType:"number",min:10,dflt:700,editType:"plot"},height:{valType:"number",min:10,dflt:450,editType:"plot"},minreducedwidth:{valType:"number",min:2,dflt:64,editType:"plot"},minreducedheight:{valType:"number",min:2,dflt:64,editType:"plot"},margin:{l:{valType:"number",min:0,dflt:80,editType:"plot"},r:{valType:"number",min:0,dflt:80,editType:"plot"},t:{valType:"number",min:0,dflt:100,editType:"plot"},b:{valType:"number",min:0,dflt:80,editType:"plot"},pad:{valType:"number",min:0,dflt:0,editType:"plot"},autoexpand:{valType:"boolean",dflt:!0,editType:"plot"},editType:"plot"},computed:{valType:"any",editType:"none"},paper_bgcolor:{valType:"color",dflt:w6.background,editType:"plot"},plot_bgcolor:{valType:"color",dflt:w6.background,editType:"layoutstyle"},autotypenumbers:{valType:"enumerated",values:["convert types","strict"],dflt:"convert types",editType:"calc"},separators:{valType:"string",editType:"plot"},hidesources:{valType:"boolean",dflt:!1,editType:"plot"},showlegend:{valType:"boolean",editType:"legend"},colorway:{valType:"colorlist",dflt:w6.defaults,editType:"calc"},datarevision:{valType:"any",editType:"calc"},uirevision:{valType:"any",editType:"none"},editrevision:{valType:"any",editType:"none"},selectionrevision:{valType:"any",editType:"none"},template:{valType:"any",editType:"calc"},newshape:Lre.newshape,activeshape:Lre.activeshape,newselection:Pre.newselection,activeselection:Pre.activeselection,meta:{valType:"any",arrayOk:!0,editType:"plot"},transition:Ire({},Ltt.transition,{editType:"none"})}});var Dre=su(()=>{});var Itt={};var zre=su(()=>{Dre()});var ba=ye(qs=>{"use strict";var l3=H1(),Fre=p6(),qre=Eq(),Rtt=gy(),Dtt=DS().addStyleRule,Ore=no(),ztt=vl(),Ftt=s3(),qtt=Ore.extendFlat,zq=Ore.extendDeepAll;qs.modules={};qs.allCategories={};qs.allTypes=[];qs.subplotsRegistry={};qs.componentsRegistry={};qs.layoutArrayContainers=[];qs.layoutArrayRegexes=[];qs.traceLayoutAttributes={};qs.localeRegistry={};qs.apiMethodRegistry={};qs.collectableSubplotTypes=null;qs.register=function(t){if(qs.collectableSubplotTypes=null,t)t&&!Array.isArray(t)&&(t=[t]);else throw new Error("No argument passed to Plotly.register.");for(var r=0;r{"use strict";var Htt=e3().timeFormat,Yre=uo(),Fq=H1(),Z1=r3().mod,f3=es(),_0=f3.BADNUM,wp=f3.ONEDAY,FS=f3.ONEHOUR,W1=f3.ONEMIN,c3=f3.ONESEC,qS=f3.EPOCHJD,my=ba(),Hre=e3().utcFormat,Gtt=/^\s*(-?\d\d\d\d|\d\d)(-(\d?\d)(-(\d?\d)([ Tt]([01]?\d|2[0-3])(:([0-5]\d)(:([0-5]\d(\.\d+)?))?(Z|z|[+\-]\d\d(:?\d\d)?)?)?)?)?)?\s*$/m,jtt=/^\s*(-?\d\d\d\d|\d\d)(-(\d?\di?)(-(\d?\d)([ Tt]([01]?\d|2[0-3])(:([0-5]\d)(:([0-5]\d(\.\d+)?))?(Z|z|[+\-]\d\d(:?\d\d)?)?)?)?)?)?\s*$/m,Gre=new Date().getFullYear()-70;function yy(e){return e&&my.componentsRegistry.calendars&&typeof e=="string"&&e!=="gregorian"}Yf.dateTick0=function(e,t){var r=Wtt(e,!!t);if(t<2)return r;var n=Yf.dateTime2ms(r,e);return n+=wp*(t-1),Yf.ms2DateTime(n,0,e)};function Wtt(e,t){return yy(e)?t?my.getComponentMethod("calendars","CANONICAL_SUNDAY")[e]:my.getComponentMethod("calendars","CANONICAL_TICK")[e]:t?"2000-01-02":"2000-01-01"}Yf.dfltRange=function(e){return yy(e)?my.getComponentMethod("calendars","DFLTRANGE")[e]:["2000-01-01","2001-01-01"]};Yf.isJSDate=function(e){return typeof e=="object"&&e!==null&&typeof e.getTime=="function"};var S6,M6;Yf.dateTime2ms=function(e,t){if(Yf.isJSDate(e)){var r=e.getTimezoneOffset()*W1,n=(e.getUTCMinutes()-e.getMinutes())*W1+(e.getUTCSeconds()-e.getSeconds())*c3+(e.getUTCMilliseconds()-e.getMilliseconds());if(n){var i=3*W1;r=r-i/2+Z1(n-r+i/2,i)}return e=Number(e)-r,e>=S6&&e<=M6?e:_0}if(typeof e!="string"&&typeof e!="number")return _0;e=String(e);var a=yy(t),o=e.charAt(0);a&&(o==="G"||o==="g")&&(e=e.substr(1),t="");var s=a&&t.substr(0,7)==="chinese",l=e.match(s?jtt:Gtt);if(!l)return _0;var u=l[1],c=l[3]||"1",f=Number(l[5]||1),h=Number(l[7]||0),d=Number(l[9]||0),v=Number(l[11]||0);if(a){if(u.length===2)return _0;u=Number(u);var x;try{var b=my.getComponentMethod("calendars","getCal")(t);if(s){var g=c.charAt(c.length-1)==="i";c=parseInt(c,10),x=b.newDate(u,b.toMonthIndex(u,c,g),f)}else x=b.newDate(u,Number(c),f)}catch(k){return _0}return x?(x.toJD()-qS)*wp+h*FS+d*W1+v*c3:_0}u.length===2?u=(Number(u)+2e3-Gre)%100+Gre:u=Number(u),c-=1;var E=new Date(Date.UTC(2e3,c,f,h,d));return E.setUTCFullYear(u),E.getUTCMonth()!==c||E.getUTCDate()!==f?_0:E.getTime()+v*c3};S6=Yf.MIN_MS=Yf.dateTime2ms("-9999");M6=Yf.MAX_MS=Yf.dateTime2ms("9999-12-31 23:59:59.9999");Yf.isDateTime=function(e,t){return Yf.dateTime2ms(e,t)!==_0};function u3(e,t){return String(e+Math.pow(10,t)).substr(1)}var A6=90*wp,jre=3*FS,Wre=5*W1;Yf.ms2DateTime=function(e,t,r){if(typeof e!="number"||!(e>=S6&&e<=M6))return _0;t||(t=0);var n=Math.floor(Z1(e+.05,1)*10),i=Math.round(e-n/10),a,o,s,l,u,c;if(yy(r)){var f=Math.floor(i/wp)+qS,h=Math.floor(Z1(e,wp));try{a=my.getComponentMethod("calendars","getCal")(r).fromJD(f).formatDate("yyyy-mm-dd")}catch(d){a=Hre("G%Y-%m-%d")(new Date(i))}if(a.charAt(0)==="-")for(;a.length<11;)a="-0"+a.substr(1);else for(;a.length<10;)a="0"+a;o=t=S6+wp&&e<=M6-wp))return _0;var t=Math.floor(Z1(e+.05,1)*10),r=new Date(Math.round(e-t/10)),n=Htt("%Y-%m-%d")(r),i=r.getHours(),a=r.getMinutes(),o=r.getSeconds(),s=r.getUTCMilliseconds()*10+t;return Kre(n,i,a,o,s)};function Kre(e,t,r,n,i){if((t||r||n||i)&&(e+=" "+u3(t,2)+":"+u3(r,2),(n||i)&&(e+=":"+u3(n,2),i))){for(var a=4;i%10===0;)a-=1,i/=10;e+="."+u3(i,a)}return e}Yf.cleanDate=function(e,t,r){if(e===_0)return t;if(Yf.isJSDate(e)||typeof e=="number"&&isFinite(e)){if(yy(r))return Fq.error("JS Dates and milliseconds are incompatible with world calendars",e),t;if(e=Yf.ms2DateTimeLocal(+e),!e&&t!==void 0)return t}else if(!Yf.isDateTime(e,r))return Fq.error("unrecognized date",e),t;return e};var Ztt=/%\d?f/g,Xtt=/%h/g,Ytt={1:"1",2:"1",3:"2",4:"2"};function Zre(e,t,r,n){e=e.replace(Ztt,function(a){var o=Math.min(+a.charAt(1)||6,6),s=(t/1e3%1+2).toFixed(o).substr(2).replace(/0+$/,"")||"0";return s});var i=new Date(Math.floor(t+.05));if(e=e.replace(Xtt,function(){return Ytt[r("%q")(i)]}),yy(n))try{e=my.getComponentMethod("calendars","worldCalFmt")(e,t,n)}catch(a){return"Invalid"}return r(e)(i)}var Ktt=[59,59.9,59.99,59.999,59.9999];function Jtt(e,t){var r=Z1(e+.05,wp),n=u3(Math.floor(r/FS),2)+":"+u3(Z1(Math.floor(r/W1),60),2);if(t!=="M"){Yre(t)||(t=0);var i=Math.min(Z1(e/c3,60),Ktt[t]),a=(100+i).toFixed(t).substr(1);t>0&&(a=a.replace(/0+$/,"").replace(/[\.]$/,"")),n+=":"+a}return n}Yf.formatDate=function(e,t,r,n,i,a){if(i=yy(i)&&i,!t)if(r==="y")t=a.year;else if(r==="m")t=a.month;else if(r==="d")t=a.dayMonth+`
+`+a.year;else return Jtt(e,r)+`
+`+Zre(a.dayMonthYear,e,n,i);return Zre(t,e,n,i)};var Xre=3*wp;Yf.incrementMonth=function(e,t,r){r=yy(r)&&r;var n=Z1(e,wp);if(e=Math.round(e-n),r)try{var i=Math.round(e/wp)+qS,a=my.getComponentMethod("calendars","getCal")(r),o=a.fromJD(i);return t%12?a.add(o,t,"m"):a.add(o,t/12,"y"),(o.toJD()-qS)*wp+n}catch(l){Fq.error("invalid ms "+e+" in calendar "+r)}var s=new Date(e+Xre);return s.setUTCMonth(s.getUTCMonth()+t)+n-Xre};Yf.findExactDates=function(e,t){for(var r=0,n=0,i=0,a=0,o,s,l=yy(t)&&my.getComponentMethod("calendars","getCal")(t),u=0;u{"use strict";$re.exports=function(t){return t}});var E6=ye(_y=>{"use strict";var $tt=uo(),Qtt=H1(),ert=OS(),trt=es().BADNUM,qq=1e-9;_y.findBin=function(e,t,r){if($tt(t.start))return r?Math.ceil((e-t.start)/t.size-qq)-1:Math.floor((e-t.start)/t.size+qq);var n=0,i=t.length,a=0,o=i>1?(t[i-1]-t[0])/(i-1):1,s,l;for(o>=0?l=r?rrt:irt:l=r?art:nrt,e+=o*qq*(r?-1:1)*(o>=0?1:-1);n90&&Qtt.log("Long binary search..."),n-1};function rrt(e,t){return et}function art(e,t){return e>=t}_y.sorterAsc=function(e,t){return e-t};_y.sorterDes=function(e,t){return t-e};_y.distinctVals=function(e){var t=e.slice();t.sort(_y.sorterAsc);var r;for(r=t.length-1;r>-1&&t[r]===trt;r--);for(var n=t[r]-t[0]||1,i=n/(r||1)/1e4,a=[],o,s=0;s<=r;s++){var l=t[s],u=l-o;o===void 0?(a.push(l),o=l):u>i&&(n=Math.min(n,u),a.push(l),o=l)}return{vals:a,minDiff:n}};_y.roundUp=function(e,t,r){for(var n=0,i=t.length-1,a,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;n0&&(n=1),r&&n)return e.sort(t)}return n?e:e.reverse()};_y.findIndexOfMin=function(e,t){t=t||ert;for(var r=1/0,n,i=0;i{"use strict";Qre.exports=function(t){return Object.keys(t).sort()}});var eie=ye(Kf=>{"use strict";var BS=uo(),ort=vv().isArrayOrTypedArray;Kf.aggNums=function(e,t,r,n){var i,a;if((!n||n>r.length)&&(n=r.length),BS(t)||(t=!1),ort(r[0])){for(a=new Array(n),i=0;ie.length-1)return e[e.length-1];var r=t%1;return r*e[Math.ceil(t)]+(1-r)*e[Math.floor(t)]}});var aie=ye((itr,nie)=>{"use strict";var tie=r3(),Oq=tie.mod,srt=tie.modHalf,NS=Math.PI,Y1=2*NS;function lrt(e){return e/180*NS}function urt(e){return e/NS*180}function Bq(e){return Math.abs(e[1]-e[0])>Y1-1e-14}function rie(e,t){return srt(t-e,Y1)}function crt(e,t){return Math.abs(rie(e,t))}function iie(e,t){if(Bq(t))return!0;var r,n;t[0]n&&(n+=Y1);var i=Oq(e,Y1),a=i+Y1;return i>=r&&i<=n||a>=r&&a<=n}function frt(e,t,r,n){if(!iie(t,n))return!1;var i,a;return r[0]=i&&e<=a}function Nq(e,t,r,n,i,a,o){i=i||0,a=a||0;var s=Bq([r,n]),l,u,c,f,h;s?(l=0,u=NS,c=Y1):r{"use strict";fb.isLeftAnchor=function(t){return t.xanchor==="left"||t.xanchor==="auto"&&t.x<=1/3};fb.isCenterAnchor=function(t){return t.xanchor==="center"||t.xanchor==="auto"&&t.x>1/3&&t.x<2/3};fb.isRightAnchor=function(t){return t.xanchor==="right"||t.xanchor==="auto"&&t.x>=2/3};fb.isTopAnchor=function(t){return t.yanchor==="top"||t.yanchor==="auto"&&t.y>=2/3};fb.isMiddleAnchor=function(t){return t.yanchor==="middle"||t.yanchor==="auto"&&t.y>1/3&&t.y<2/3};fb.isBottomAnchor=function(t){return t.yanchor==="bottom"||t.yanchor==="auto"&&t.y<=1/3}});var uie=ye(hb=>{"use strict";var Uq=r3().mod;hb.segmentsIntersect=lie;function lie(e,t,r,n,i,a,o,s){var l=r-e,u=i-e,c=o-i,f=n-t,h=a-t,d=s-a,v=l*d-c*f;if(v===0)return null;var x=(u*d-c*h)/v,b=(u*f-l*h)/v;return b<0||b>1||x<0||x>1?null:{x:e+l*x,y:t+f*x}}hb.segmentDistance=function(t,r,n,i,a,o,s,l){if(lie(t,r,n,i,a,o,s,l))return 0;var u=n-t,c=i-r,f=s-a,h=l-o,d=u*u+c*c,v=f*f+h*h,x=Math.min(k6(u,c,d,a-t,o-r),k6(u,c,d,s-t,l-r),k6(f,h,v,t-a,r-o),k6(f,h,v,n-a,i-o));return Math.sqrt(x)};function k6(e,t,r,n,i){var a=n*e+i*t;if(a<0)return n*n+i*i;if(a>r){var o=n-e,s=i-t;return o*o+s*s}else{var l=n*t-i*e;return l*l/r}}var C6,Vq,sie;hb.getTextLocation=function(t,r,n,i){if((t!==Vq||i!==sie)&&(C6={},Vq=t,sie=i),C6[n])return C6[n];var a=t.getPointAtLength(Uq(n-i/2,r)),o=t.getPointAtLength(Uq(n+i/2,r)),s=Math.atan((o.y-a.y)/(o.x-a.x)),l=t.getPointAtLength(Uq(n,r)),u=(l.x*4+a.x+o.x)/6,c=(l.y*4+a.y+o.y)/6,f={x:u,y:c,theta:s};return C6[n]=f,f};hb.clearLocationCache=function(){Vq=null};hb.getVisibleSegment=function(t,r,n){var i=r.left,a=r.right,o=r.top,s=r.bottom,l=0,u=t.getTotalLength(),c=u,f,h;function d(x){var b=t.getPointAtLength(x);x===0?f=b:x===u&&(h=b);var g=b.xa?b.x-a:0,E=b.ys?b.y-s:0;return Math.sqrt(g*g+E*E)}for(var v=d(l);v;){if(l+=v+n,l>c)return;v=d(l)}for(v=d(c);v;){if(c-=v+n,l>c)return;v=d(c)}return{min:l,max:c,len:c-l,total:u,isClosed:l===0&&c===u&&Math.abs(f.x-h.x)<.1&&Math.abs(f.y-h.y)<.1}};hb.findPointOnPath=function(t,r,n,i){i=i||{};for(var a=i.pathLength||t.getTotalLength(),o=i.tolerance||.001,s=i.iterationLimit||30,l=t.getPointAtLength(0)[n]>t.getPointAtLength(a)[n]?-1:1,u=0,c=0,f=a,h,d,v;u0?f=h:c=h,u++}return d}});var L6=ye(US=>{"use strict";var xy={};US.throttle=function(t,r,n){var i=xy[t],a=Date.now();if(!i){for(var o in xy)xy[o].tsi.ts+r){s();return}i.timer=setTimeout(function(){s(),i.timer=null},r)};US.done=function(e){var t=xy[e];return!t||!t.timer?Promise.resolve():new Promise(function(r){var n=t.onDone;t.onDone=function(){n&&n(),r(),t.onDone=null}})};US.clear=function(e){if(e)cie(xy[e]),delete xy[e];else for(var t in xy)US.clear(t)};function cie(e){e&&e.timer!==null&&(clearTimeout(e.timer),e.timer=null)}});var hie=ye((str,fie)=>{"use strict";fie.exports=function(t){t._responsiveChartHandler&&(window.removeEventListener("resize",t._responsiveChartHandler),delete t._responsiveChartHandler)}});var die=ye((ltr,P6)=>{"use strict";P6.exports=Hq;P6.exports.isMobile=Hq;P6.exports.default=Hq;var prt=/(android|bb\d+|meego).+mobile|armv7l|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,grt=/CrOS/,mrt=/android|ipad|playbook|silk/i;function Hq(e){e||(e={});let t=e.ua;if(!t&&typeof navigator!="undefined"&&(t=navigator.userAgent),t&&t.headers&&typeof t.headers["user-agent"]=="string"&&(t=t.headers["user-agent"]),typeof t!="string")return!1;let r=prt.test(t)&&!grt.test(t)||!!e.tablet&&mrt.test(t);return!r&&e.tablet&&e.featureDetect&&navigator&&navigator.maxTouchPoints>1&&t.indexOf("Macintosh")!==-1&&t.indexOf("Safari")!==-1&&(r=!0),r}});var pie=ye((utr,vie)=>{"use strict";var yrt=uo(),_rt=die();vie.exports=function(t){var r;if(t&&t.hasOwnProperty("userAgent")?r=t.userAgent:r=xrt(),typeof r!="string")return!0;var n=_rt({ua:{headers:{"user-agent":r}},tablet:!0,featureDetect:!1});if(!n)for(var i=r.split(" "),a=1;a-1;s--){var l=i[s];if(l.substr(0,8)==="Version/"){var u=l.substr(8).split(".")[0];if(yrt(u)&&(u=+u),u>=13)return!0}}}return n};function xrt(){var e;return typeof navigator!="undefined"&&(e=navigator.userAgent),e&&e.headers&&typeof e.headers["user-agent"]=="string"&&(e=e.headers["user-agent"]),e}});var mie=ye((ctr,gie)=>{"use strict";var brt=xa();gie.exports=function(t,r,n){var i=t.selectAll("g."+n.replace(/\s/g,".")).data(r,function(o){return o[0].trace.uid});i.exit().remove(),i.enter().append("g").attr("class",n),i.order();var a=t.classed("rangeplot")?"nodeRangePlot3":"node3";return i.each(function(o){o[0][a]=brt.select(this)}),i}});var _ie=ye((ftr,yie)=>{"use strict";var wrt=ba();yie.exports=function(t,r){for(var n=t._context.locale,i=0;i<2;i++){for(var a=t._context.locales,o=0;o<2;o++){var s=(a[n]||{}).dictionary;if(s){var l=s[r];if(l)return l}a=wrt.localeRegistry}var u=n.split("-")[0];if(u===n)break;n=u}return r}});var Gq=ye((htr,xie)=>{"use strict";xie.exports=function(t){for(var r={},n=[],i=0,a=0;a{"use strict";bie.exports=function(t){for(var r=Srt(t)?Art:Trt,n=[],i=0;i{"use strict";Tie.exports=function(t,r){if(!r)return t;var n=1/Math.abs(r),i=n>1?(n*t+n*r)/n:t+r,a=String(i).length;if(a>16){var o=String(r).length,s=String(t).length;if(a>=s+o){var l=parseFloat(i).toPrecision(12);l.indexOf("e+")===-1&&(i=+l)}}return i}});var Mie=ye((ptr,Sie)=>{"use strict";var Mrt=uo(),Ert=es().BADNUM,krt=/^['"%,$#\s']+|[, ]|['"%,$#\s']+$/g;Sie.exports=function(t){return typeof t=="string"&&(t=t.replace(krt,"")),Mrt(t)?Number(t):Ert}});var Mr=ye((gtr,Bie)=>{"use strict";var VS=xa(),Crt=e3().utcFormat,Lrt=dq().format,Iie=uo(),Rie=es(),Die=Rie.FP_SAFE,Prt=-Die,Eie=Rie.BADNUM,li=Bie.exports={};li.adjustFormat=function(t){return!t||/^\d[.]\df/.test(t)||/[.]\d%/.test(t)?t:t==="0.f"?"~f":/^\d%/.test(t)?"~%":/^\ds/.test(t)?"~s":!/^[~,.0$]/.test(t)&&/[&fps]/.test(t)?"~"+t:t};var kie={};li.warnBadFormat=function(e){var t=String(e);kie[t]||(kie[t]=1,li.warn('encountered bad format: "'+t+'"'))};li.noFormat=function(e){return String(e)};li.numberFormat=function(e){var t;try{t=Lrt(li.adjustFormat(e))}catch(r){return li.warnBadFormat(e),li.noFormat}return t};li.nestedProperty=ES();li.keyedContainer=_ee();li.relativeAttr=bee();li.isPlainObject=gy();li.toLogRange=l6();li.relinkPrivateKeys=See();var K1=vv();li.isArrayBuffer=K1.isArrayBuffer;li.isTypedArray=K1.isTypedArray;li.isArrayOrTypedArray=K1.isArrayOrTypedArray;li.isArray1D=K1.isArray1D;li.ensureArray=K1.ensureArray;li.concat=K1.concat;li.maxRowLength=K1.maxRowLength;li.minRowLength=K1.minRowLength;var zie=r3();li.mod=zie.mod;li.modHalf=zie.modHalf;var J1=Gee();li.valObjectMeta=J1.valObjectMeta;li.coerce=J1.coerce;li.coerce2=J1.coerce2;li.coerceFont=J1.coerceFont;li.coercePattern=J1.coercePattern;li.coerceHoverinfo=J1.coerceHoverinfo;li.coerceSelectionMarkerOpacity=J1.coerceSelectionMarkerOpacity;li.validate=J1.validate;var Wp=Jre();li.dateTime2ms=Wp.dateTime2ms;li.isDateTime=Wp.isDateTime;li.ms2DateTime=Wp.ms2DateTime;li.ms2DateTimeLocal=Wp.ms2DateTimeLocal;li.cleanDate=Wp.cleanDate;li.isJSDate=Wp.isJSDate;li.formatDate=Wp.formatDate;li.incrementMonth=Wp.incrementMonth;li.dateTick0=Wp.dateTick0;li.dfltRange=Wp.dfltRange;li.findExactDates=Wp.findExactDates;li.MIN_MS=Wp.MIN_MS;li.MAX_MS=Wp.MAX_MS;var db=E6();li.findBin=db.findBin;li.sorterAsc=db.sorterAsc;li.sorterDes=db.sorterDes;li.distinctVals=db.distinctVals;li.roundUp=db.roundUp;li.sort=db.sort;li.findIndexOfMin=db.findIndexOfMin;li.sortObjectKeys=X1();var by=eie();li.aggNums=by.aggNums;li.len=by.len;li.mean=by.mean;li.geometricMean=by.geometricMean;li.median=by.median;li.midRange=by.midRange;li.variance=by.variance;li.stdev=by.stdev;li.interp=by.interp;var yg=g6();li.init2dArray=yg.init2dArray;li.transposeRagged=yg.transposeRagged;li.dot=yg.dot;li.translationMatrix=yg.translationMatrix;li.rotationMatrix=yg.rotationMatrix;li.rotationXYMatrix=yg.rotationXYMatrix;li.apply3DTransform=yg.apply3DTransform;li.apply2DTransform=yg.apply2DTransform;li.apply2DTransform2=yg.apply2DTransform2;li.convertCssMatrix=yg.convertCssMatrix;li.inverseTransformMatrix=yg.inverseTransformMatrix;var vm=aie();li.deg2rad=vm.deg2rad;li.rad2deg=vm.rad2deg;li.angleDelta=vm.angleDelta;li.angleDist=vm.angleDist;li.isFullCircle=vm.isFullCircle;li.isAngleInsideSector=vm.isAngleInsideSector;li.isPtInsideSector=vm.isPtInsideSector;li.pathArc=vm.pathArc;li.pathSector=vm.pathSector;li.pathAnnulus=vm.pathAnnulus;var d3=oie();li.isLeftAnchor=d3.isLeftAnchor;li.isCenterAnchor=d3.isCenterAnchor;li.isRightAnchor=d3.isRightAnchor;li.isTopAnchor=d3.isTopAnchor;li.isMiddleAnchor=d3.isMiddleAnchor;li.isBottomAnchor=d3.isBottomAnchor;var v3=uie();li.segmentsIntersect=v3.segmentsIntersect;li.segmentDistance=v3.segmentDistance;li.getTextLocation=v3.getTextLocation;li.clearLocationCache=v3.clearLocationCache;li.getVisibleSegment=v3.getVisibleSegment;li.findPointOnPath=v3.findPointOnPath;var D6=no();li.extendFlat=D6.extendFlat;li.extendDeep=D6.extendDeep;li.extendDeepAll=D6.extendDeepAll;li.extendDeepNoArrays=D6.extendDeepNoArrays;var jq=H1();li.log=jq.log;li.warn=jq.warn;li.error=jq.error;var Irt=n3();li.counterRegex=Irt.counter;var Wq=L6();li.throttle=Wq.throttle;li.throttleDone=Wq.done;li.clearThrottle=Wq.clear;var _g=DS();li.getGraphDiv=_g.getGraphDiv;li.isPlotDiv=_g.isPlotDiv;li.removeElement=_g.removeElement;li.addStyleRule=_g.addStyleRule;li.addRelatedStyleRule=_g.addRelatedStyleRule;li.deleteRelatedStyleRule=_g.deleteRelatedStyleRule;li.setStyleOnHover=_g.setStyleOnHover;li.getFullTransformMatrix=_g.getFullTransformMatrix;li.getElementTransformMatrix=_g.getElementTransformMatrix;li.getElementAndAncestors=_g.getElementAndAncestors;li.equalDomRects=_g.equalDomRects;li.clearResponsive=hie();li.preserveDrawingBuffer=pie();li.makeTraceGroups=mie();li._=_ie();li.notifier=Aq();li.filterUnique=Gq();li.filterVisible=wie();li.pushUnique=Eq();li.increment=Aie();li.cleanNumber=Mie();li.ensureNumber=function(t){return Iie(t)?(t=Number(t),t>Die||t=t?!1:Iie(e)&&e>=0&&e%1===0};li.noop=p6();li.identity=OS();li.repeat=function(e,t){for(var r=new Array(t),n=0;nr?Math.max(r,Math.min(t,e)):Math.max(t,Math.min(r,e))};li.bBoxIntersect=function(e,t,r){return r=r||0,e.left<=t.right+r&&t.left<=e.right+r&&e.top<=t.bottom+r&&t.top<=e.bottom+r};li.simpleMap=function(e,t,r,n,i){for(var a=e.length,o=new Array(a),s=0;s=Math.pow(2,r)?i>10?(li.warn("randstr failed uniqueness"),o):e(t,r,n,(i||0)+1):o};li.OptionControl=function(e,t){e||(e={}),t||(t="opt");var r={};return r.optionList=[],r._newoption=function(n){n[t]=e,r[n.name]=n,r.optionList.push(n)},r["_"+t]=e,r};li.smooth=function(e,t){if(t=Math.round(t)||0,t<2)return e;var r=e.length,n=2*r,i=2*t-1,a=new Array(i),o=new Array(r),s,l,u,c;for(s=0;s=n&&(u-=n*Math.floor(u/n)),u<0?u=-1-u:u>=r&&(u=n-1-u),c+=e[u]*a[l];o[s]=c}return o};li.syncOrAsync=function(e,t,r){var n,i;function a(){return li.syncOrAsync(e,t,r)}for(;e.length;)if(i=e.splice(0,1)[0],n=i(t),n&&n.then)return n.then(a);return r&&r(t)};li.stripTrailingSlash=function(e){return e.substr(-1)==="/"?e.substr(0,e.length-1):e};li.noneOrAll=function(e,t,r){if(e){var n=!1,i=!0,a,o;for(a=0;a0?i:0})};li.fillArray=function(e,t,r,n){if(n=n||li.identity,li.isArrayOrTypedArray(e))for(var i=0;i1?i+o[1]:"";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,"$1"+a+"$2");return s+l};li.TEMPLATE_STRING_REGEX=/%{([^\s%{}:]*)([:|\|][^}]*)?}/g;var Oie=/^\w*$/;li.templateString=function(e,t){var r={};return e.replace(li.TEMPLATE_STRING_REGEX,function(n,i){var a;return Oie.test(i)?a=t[i]:(r[i]=r[i]||li.nestedProperty(t,i).get,a=r[i]()),li.isValidTextValue(a)?a:""})};var Ort={max:10,count:0,name:"hovertemplate"};li.hovertemplateString=function(){return Zq.apply(Ort,arguments)};var Brt={max:10,count:0,name:"texttemplate"};li.texttemplateString=function(){return Zq.apply(Brt,arguments)};var Nrt=/^(\S+)([\*\/])(-?\d+(\.\d+)?)$/;function Urt(e){var t=e.match(Nrt);return t?{key:t[1],op:t[2],number:Number(t[3])}:{key:e,op:null,number:null}}var Vrt={max:10,count:0,name:"texttemplate",parseMultDiv:!0};li.texttemplateStringForShapes=function(){return Zq.apply(Vrt,arguments)};var Cie=/^[:|\|]/;function Zq(e,t,r){var n=this,i=arguments;t||(t={});var a={};return e.replace(li.TEMPLATE_STRING_REGEX,function(o,s,l){var u=s==="xother"||s==="yother",c=s==="_xother"||s==="_yother",f=s==="_xother_"||s==="_yother_",h=s==="xother_"||s==="yother_",d=u||c||h||f,v=s;(c||f)&&(v=v.substring(1)),(h||f)&&(v=v.substring(0,v.length-1));var x=null,b=null;if(n.parseMultDiv){var g=Urt(v);v=g.key,x=g.op,b=g.number}var E;if(d){if(E=t[v],E===void 0)return""}else{var k,A;for(A=3;A=R6&&o<=Lie,u=s>=R6&&s<=Lie;if(l&&(n=10*n+o-R6),u&&(i=10*i+s-R6),!l||!u){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var h3=2e9;li.seedPseudoRandom=function(){h3=2e9};li.pseudoRandom=function(){var e=h3;return h3=(69069*h3+1)%4294967296,Math.abs(h3-e)<429496729?li.pseudoRandom():h3/4294967296};li.fillText=function(e,t,r){var n=Array.isArray(r)?function(o){r.push(o)}:function(o){r.text=o},i=li.extractOption(e,t,"htx","hovertext");if(li.isValidTextValue(i))return n(i);var a=li.extractOption(e,t,"tx","text");if(li.isValidTextValue(a))return n(a)};li.isValidTextValue=function(e){return e||e===0};li.formatPercent=function(e,t){t=t||0;for(var r=(Math.round(100*e*Math.pow(10,t))*Math.pow(.1,t)).toFixed(t)+"%",n=0;n1&&(u=1):u=0,li.strTranslate(i-u*(r+o),a-u*(n+s))+li.strScale(u)+(l?"rotate("+l+(t?"":" "+r+" "+n)+")":"")};li.setTransormAndDisplay=function(e,t){e.attr("transform",li.getTextTransform(t)),e.style("display",t.scale?null:"none")};li.ensureUniformFontSize=function(e,t){var r=li.extendFlat({},t);return r.size=Math.max(t.size,e._fullLayout.uniformtext.minsize||0),r};li.join2=function(e,t,r){var n=e.length;return n>1?e.slice(0,-1).join(t)+r+e[n-1]:e.join(t)};li.bigFont=function(e){return Math.round(1.2*e)};var Pie=li.getFirefoxVersion(),Hrt=Pie!==null&&Pie<86;li.getPositionFromD3Event=function(){return Hrt?[VS.event.layerX,VS.event.layerY]:[VS.event.offsetX,VS.event.offsetY]}});var Vie=ye(()=>{"use strict";var Grt=Mr(),Nie={"X,X div":'direction:ltr;font-family:"Open Sans",verdana,arial,sans-serif;margin:0;padding:0;',"X input,X button":'font-family:"Open Sans",verdana,arial,sans-serif;',"X input:focus,X button:focus":"outline:none;","X a":"text-decoration:none;","X a:hover":"text-decoration:none;","X .crisp":"shape-rendering:crispEdges;","X .user-select-none":"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;","X svg a":"fill:#447adb;","X svg a:hover":"fill:#3c6dc5;","X .main-svg":"position:absolute;top:0;left:0;pointer-events:none;","X .main-svg .draglayer":"pointer-events:all;","X .cursor-default":"cursor:default;","X .cursor-pointer":"cursor:pointer;","X .cursor-crosshair":"cursor:crosshair;","X .cursor-move":"cursor:move;","X .cursor-col-resize":"cursor:col-resize;","X .cursor-row-resize":"cursor:row-resize;","X .cursor-ns-resize":"cursor:ns-resize;","X .cursor-ew-resize":"cursor:ew-resize;","X .cursor-sw-resize":"cursor:sw-resize;","X .cursor-s-resize":"cursor:s-resize;","X .cursor-se-resize":"cursor:se-resize;","X .cursor-w-resize":"cursor:w-resize;","X .cursor-e-resize":"cursor:e-resize;","X .cursor-nw-resize":"cursor:nw-resize;","X .cursor-n-resize":"cursor:n-resize;","X .cursor-ne-resize":"cursor:ne-resize;","X .cursor-grab":"cursor:-webkit-grab;cursor:grab;","X .modebar":"position:absolute;top:2px;right:2px;","X .ease-bg":"-webkit-transition:background-color .3s ease 0s;-moz-transition:background-color .3s ease 0s;-ms-transition:background-color .3s ease 0s;-o-transition:background-color .3s ease 0s;transition:background-color .3s ease 0s;","X .modebar--hover>:not(.watermark)":"opacity:0;-webkit-transition:opacity .3s ease 0s;-moz-transition:opacity .3s ease 0s;-ms-transition:opacity .3s ease 0s;-o-transition:opacity .3s ease 0s;transition:opacity .3s ease 0s;","X:hover .modebar--hover .modebar-group":"opacity:1;","X .modebar-group":"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;","X .modebar-btn":"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;","X .modebar-btn svg":"position:relative;top:2px;","X .modebar.vertical":"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;","X .modebar.vertical svg":"top:-1px;","X .modebar.vertical .modebar-group":"display:block;float:none;padding-left:0px;padding-bottom:8px;","X .modebar.vertical .modebar-group .modebar-btn":"display:block;text-align:center;","X [data-title]:before,X [data-title]:after":"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;","X [data-title]:hover:before,X [data-title]:hover:after":"display:block;opacity:1;","X [data-title]:before":'content:"";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;',"X [data-title]:after":"content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;","X .vertical [data-title]:before,X .vertical [data-title]:after":"top:0%;right:200%;","X .vertical [data-title]:before":"border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;",Y:'font-family:"Open Sans",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;',"Y p":"margin:0;","Y .notifier-note":"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;","Y .notifier-close":"color:#fff;opacity:.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;","Y .notifier-close:hover":"color:#444;text-decoration:none;cursor:pointer;"};for(Xq in Nie)Uie=Xq.replace(/^,/," ,").replace(/X/g,".js-plotly-plot .plotly").replace(/Y/g,".plotly-notifier"),Grt.addStyleRule(Uie,Nie[Xq]);var Uie,Xq});var Yq=ye((_tr,Hie)=>{Hie.exports=!0});var Jq=ye((xtr,Gie)=>{"use strict";var jrt=Yq(),Kq;typeof window.matchMedia=="function"?Kq=!window.matchMedia("(hover: none)").matches:Kq=jrt;Gie.exports=Kq});var vb=ye((btr,$q)=>{"use strict";var p3=typeof Reflect=="object"?Reflect:null,jie=p3&&typeof p3.apply=="function"?p3.apply:function(t,r,n){return Function.prototype.apply.call(t,r,n)},z6;p3&&typeof p3.ownKeys=="function"?z6=p3.ownKeys:Object.getOwnPropertySymbols?z6=function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:z6=function(t){return Object.getOwnPropertyNames(t)};function Wrt(e){console&&console.warn&&console.warn(e)}var Zie=Number.isNaN||function(t){return t!==t};function Tc(){Tc.init.call(this)}$q.exports=Tc;$q.exports.once=Krt;Tc.EventEmitter=Tc;Tc.prototype._events=void 0;Tc.prototype._eventsCount=0;Tc.prototype._maxListeners=void 0;var Wie=10;function F6(e){if(typeof e!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}Object.defineProperty(Tc,"defaultMaxListeners",{enumerable:!0,get:function(){return Wie},set:function(e){if(typeof e!="number"||e<0||Zie(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");Wie=e}});Tc.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};Tc.prototype.setMaxListeners=function(t){if(typeof t!="number"||t<0||Zie(t))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+t+".");return this._maxListeners=t,this};function Xie(e){return e._maxListeners===void 0?Tc.defaultMaxListeners:e._maxListeners}Tc.prototype.getMaxListeners=function(){return Xie(this)};Tc.prototype.emit=function(t){for(var r=[],n=1;n0&&(o=r[0]),o instanceof Error)throw o;var s=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw s.context=o,s}var l=a[t];if(l===void 0)return!1;if(typeof l=="function")jie(l,this,r);else for(var u=l.length,c=Qie(l,u),n=0;n0&&o.length>i&&!o.warned){o.warned=!0;var s=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");s.name="MaxListenersExceededWarning",s.emitter=e,s.type=t,s.count=o.length,Wrt(s)}return e}Tc.prototype.addListener=function(t,r){return Yie(this,t,r,!1)};Tc.prototype.on=Tc.prototype.addListener;Tc.prototype.prependListener=function(t,r){return Yie(this,t,r,!0)};function Zrt(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Kie(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},i=Zrt.bind(n);return i.listener=r,n.wrapFn=i,i}Tc.prototype.once=function(t,r){return F6(r),this.on(t,Kie(this,t,r)),this};Tc.prototype.prependOnceListener=function(t,r){return F6(r),this.prependListener(t,Kie(this,t,r)),this};Tc.prototype.removeListener=function(t,r){var n,i,a,o,s;if(F6(r),i=this._events,i===void 0)return this;if(n=i[t],n===void 0)return this;if(n===r||n.listener===r)--this._eventsCount===0?this._events=Object.create(null):(delete i[t],i.removeListener&&this.emit("removeListener",t,n.listener||r));else if(typeof n!="function"){for(a=-1,o=n.length-1;o>=0;o--)if(n[o]===r||n[o].listener===r){s=n[o].listener,a=o;break}if(a<0)return this;a===0?n.shift():Xrt(n,a),n.length===1&&(i[t]=n[0]),i.removeListener!==void 0&&this.emit("removeListener",t,s||r)}return this};Tc.prototype.off=Tc.prototype.removeListener;Tc.prototype.removeAllListeners=function(t){var r,n,i;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[t]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[t]),this;if(arguments.length===0){var a=Object.keys(n),o;for(i=0;i=0;i--)this.removeListener(t,r[i]);return this};function Jie(e,t,r){var n=e._events;if(n===void 0)return[];var i=n[t];return i===void 0?[]:typeof i=="function"?r?[i.listener||i]:[i]:r?Yrt(i):Qie(i,i.length)}Tc.prototype.listeners=function(t){return Jie(this,t,!0)};Tc.prototype.rawListeners=function(t){return Jie(this,t,!1)};Tc.listenerCount=function(e,t){return typeof e.listenerCount=="function"?e.listenerCount(t):$ie.call(e,t)};Tc.prototype.listenerCount=$ie;function $ie(e){var t=this._events;if(t!==void 0){var r=t[e];if(typeof r=="function")return 1;if(r!==void 0)return r.length}return 0}Tc.prototype.eventNames=function(){return this._eventsCount>0?z6(this._events):[]};function Qie(e,t){for(var r=new Array(t),n=0;n{"use strict";var Qq=vb().EventEmitter,$rt={init:function(e){if(e._ev instanceof Qq)return e;var t=new Qq,r=new Qq;return e._ev=t,e._internalEv=r,e.on=t.on.bind(t),e.once=t.once.bind(t),e.removeListener=t.removeListener.bind(t),e.removeAllListeners=t.removeAllListeners.bind(t),e._internalOn=r.on.bind(r),e._internalOnce=r.once.bind(r),e._removeInternalListener=r.removeListener.bind(r),e._removeAllInternalListeners=r.removeAllListeners.bind(r),e.emit=function(n,i){t.emit(n,i),r.emit(n,i)},e},triggerHandler:function(e,t,r){var n,i=e._ev;if(!i)return;var a=i._events[t];if(!a)return;function o(l){if(l.listener){if(i.removeListener(t,l.listener),!l.fired)return l.fired=!0,l.listener.apply(i,[r])}else return l.apply(i,[r])}a=Array.isArray(a)?a:[a];var s;for(s=0;s{"use strict";var rne=Mr(),Qrt=ub().dfltConfig;function eit(e,t){for(var r=[],n,i=0;iQrt.queueLength&&(e.undoQueue.queue.shift(),e.undoQueue.index--)};wy.startSequence=function(e){e.undoQueue=e.undoQueue||{index:0,queue:[],sequence:!1},e.undoQueue.sequence=!0,e.undoQueue.beginSequence=!0};wy.stopSequence=function(e){e.undoQueue=e.undoQueue||{index:0,queue:[],sequence:!1},e.undoQueue.sequence=!1,e.undoQueue.beginSequence=!1};wy.undo=function(t){var r,n;if(!(t.undoQueue===void 0||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,r=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,n=0;n=t.undoQueue.queue.length)){for(r=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,n=0;n{"use strict";ane.exports={_isLinkedToArray:"frames_entry",group:{valType:"string"},name:{valType:"string"},traces:{valType:"any"},baseframe:{valType:"string"},data:{valType:"any"},layout:{valType:"any"}}});var _3=ye(Bh=>{"use strict";var x0=ba(),HS=Mr(),O6=vl(),tO=s3(),tit=eO(),rit=zS(),iit=ub().configAttributes,one=Bu(),xg=HS.extendDeepAll,m3=HS.isPlainObject,nit=HS.isArrayOrTypedArray,B6=HS.nestedProperty,ait=HS.valObjectMeta,rO="_isSubplotObj",N6="_isLinkedToArray",oit="_arrayAttrRegexps",lne="_deprecated",iO=[rO,N6,oit,lne];Bh.IS_SUBPLOT_OBJ=rO;Bh.IS_LINKED_TO_ARRAY=N6;Bh.DEPRECATED=lne;Bh.UNDERSCORE_ATTRS=iO;Bh.get=function(){var e={};return x0.allTypes.forEach(function(t){e[t]=lit(t)}),{defs:{valObjects:ait,metaKeys:iO.concat(["description","role","editType","impliedEdits"]),editType:{traces:one.traces,layout:one.layout},impliedEdits:{}},traces:e,layout:uit(),frames:cit(),animation:y3(rit),config:y3(iit)}};Bh.crawl=function(e,t,r,n){var i=r||0;n=n||"",Object.keys(e).forEach(function(a){var o=e[a];if(iO.indexOf(a)===-1){var s=(n?n+".":"")+a;t(o,a,e,i,s),!Bh.isValObject(o)&&m3(o)&&a!=="impliedEdits"&&Bh.crawl(o,t,i+1,s)}})};Bh.isValObject=function(e){return e&&e.valType!==void 0};Bh.findArrayAttributes=function(e){var t=[],r=[],n=[],i,a;function o(l,u,c,f){r=r.slice(0,f).concat([u]),n=n.slice(0,f).concat([l&&l._isLinkedToArray]);var h=l&&(l.valType==="data_array"||l.arrayOk===!0)&&!(r[f-1]==="colorbar"&&(u==="ticktext"||u==="tickvals"));h&&s(i,0,"")}function s(l,u,c){var f=l[r[u]],h=c+r[u];if(u===r.length-1)nit(f)&&t.push(a+h);else if(n[u]){if(Array.isArray(f))for(var d=0;d=a.length)return!1;if(e.dimensions===2){if(r++,t.length===r)return e;var o=t[r];if(!q6(o))return!1;e=a[i][o]}else e=a[i]}else e=a}}return e}function q6(e){return e===Math.round(e)&&e>=0}function lit(e){var t,r;t=x0.modules[e]._module,r=t.basePlotModule;var n={};n.type=null;var i=xg({},O6),a=xg({},t.attributes);Bh.crawl(a,function(l,u,c,f,h){B6(i,h).set(void 0),l===void 0&&B6(a,h).set(void 0)}),xg(n,i),x0.traceIs(e,"noOpacity")&&delete n.opacity,x0.traceIs(e,"showLegend")||(delete n.showlegend,delete n.legendgroup),x0.traceIs(e,"noHover")&&(delete n.hoverinfo,delete n.hoverlabel),t.selectPoints||delete n.selectedpoints,xg(n,a),r.attributes&&xg(n,r.attributes),n.type=e;var o={meta:t.meta||{},categories:t.categories||{},animatable:!!t.animatable,type:e,attributes:y3(n)};if(t.layoutAttributes){var s={};xg(s,t.layoutAttributes),o.layoutAttributes=y3(s)}return t.animatable||Bh.crawl(o,function(l){Bh.isValObject(l)&&"anim"in l&&delete l.anim}),o}function uit(){var e={},t,r;xg(e,tO);for(t in x0.subplotsRegistry)if(r=x0.subplotsRegistry[t],!!r.layoutAttributes)if(Array.isArray(r.attr))for(var n=0;n{"use strict";var x3=Mr(),pit=vl(),$1="templateitemname",nO={name:{valType:"string",editType:"none"}};nO[$1]={valType:"string",editType:"calc"};pb.templatedArray=function(e,t){return t._isLinkedToArray=e,t.name=nO.name,t[$1]=nO[$1],t};pb.traceTemplater=function(e){var t={},r,n;for(r in e)n=e[r],Array.isArray(n)&&n.length&&(t[r]=0);function i(a){r=x3.coerce(a,{},pit,"type");var o={type:r,_template:null};if(r in t){n=e[r];var s=t[r]%n.length;t[r]++,o._template=n[s]}return o}return{newTrace:i}};pb.newContainer=function(e,t,r){var n=e._template,i=n&&(n[t]||r&&n[r]);x3.isPlainObject(i)||(i=null);var a=e[t]={_template:i};return a};pb.arrayTemplater=function(e,t,r){var n=e._template,i=n&&n[fne(t)],a=n&&n[t];(!Array.isArray(a)||!a.length)&&(a=[]);var o={};function s(u){var c={name:u.name,_input:u},f=c[$1]=u[$1];if(!cne(f))return c._template=i,c;for(var h=0;h=n&&(r._input||{})._templateitemname;a&&(i=n);var o=t+"["+i+"]",s;function l(){s={},a&&(s[o]={},s[o][$1]=a)}l();function u(d,v){s[d]=v}function c(d,v){a?x3.nestedProperty(s[o],d).set(v):s[o+"."+d]=v}function f(){var d=s;return l(),d}function h(d,v){d&&c(d,v);var x=f();for(var b in x)x3.nestedProperty(e,b).set(x[b])}return{modifyBase:u,modifyItem:c,getUpdateObj:f,applyUpdate:h}}});var ad=ye((Etr,hne)=>{"use strict";var GS=n3().counter;hne.exports={idRegex:{x:GS("x","( domain)?"),y:GS("y","( domain)?")},attrRegex:GS("[xy]axis"),xAxisMatch:GS("xaxis"),yAxisMatch:GS("yaxis"),AX_ID_PATTERN:/^[xyz][0-9]*( domain)?$/,AX_NAME_PATTERN:/^[xyz]axis[0-9]*$/,SUBPLOT_PATTERN:/^x([0-9]*)y([0-9]*)$/,HOUR_PATTERN:"hour",WEEKDAY_PATTERN:"day of week",MINDRAG:8,MINZOOM:20,DRAGGERSIZE:20,REDRAWDELAY:50,DFLTRANGEX:[-1,6],DFLTRANGEY:[-1,4],traceLayerClasses:["imagelayer","heatmaplayer","contourcarpetlayer","contourlayer","funnellayer","waterfalllayer","barlayer","carpetlayer","violinlayer","boxlayer","ohlclayer","scattercarpetlayer","scatterlayer"],clipOnAxisFalseQuery:[".scatterlayer",".barlayer",".funnellayer",".waterfalllayer"],layerValue2layerClass:{"above traces":"above","below traces":"below"},zindexSeparator:"z"}});var af=ye(Tp=>{"use strict";var git=ba(),aO=ad();Tp.id2name=function(t){if(!(typeof t!="string"||!t.match(aO.AX_ID_PATTERN))){var r=t.split(" ")[0].substr(1);return r==="1"&&(r=""),t.charAt(0)+"axis"+r}};Tp.name2id=function(t){if(t.match(aO.AX_NAME_PATTERN)){var r=t.substr(5);return r==="1"&&(r=""),t.charAt(0)+r}};Tp.cleanId=function(t,r,n){var i=/( domain)$/.test(t);if(!(typeof t!="string"||!t.match(aO.AX_ID_PATTERN))&&!(r&&t.charAt(0)!==r)&&!(i&&!n)){var a=t.split(" ")[0].substr(1).replace(/^0+/,"");return a==="1"&&(a=""),t.charAt(0)+a+(i&&n?" domain":"")}};Tp.list=function(e,t,r){var n=e._fullLayout;if(!n)return[];var i=Tp.listIds(e,t),a=new Array(i.length),o;for(o=0;on?1:-1:+(e.substr(1)||1)-+(t.substr(1)||1)};Tp.ref2id=function(e){return/^[xyz]/.test(e)?e.split(" ")[0]:!1};function dne(e,t){if(t&&t.length){for(var r=0;r{"use strict";function mit(e){var t=e._fullLayout._zoomlayer;t&&t.selectAll(".outline-controllers").remove()}function yit(e){var t=e._fullLayout._zoomlayer;t&&t.selectAll(".select-outline").remove(),e._fullLayout._outlining=!1}vne.exports={clearOutlineControllers:mit,clearOutline:yit}});var U6=ye((Ltr,pne)=>{"use strict";pne.exports={scattermode:{valType:"enumerated",values:["group","overlay"],dflt:"overlay",editType:"calc"},scattergap:{valType:"number",min:0,max:1,editType:"calc"}}});var kd=ye(H6=>{"use strict";var V6=ba(),Ptr=ad().SUBPLOT_PATTERN;H6.getSubplotCalcData=function(e,t,r){var n=V6.subplotsRegistry[t];if(!n)return[];for(var i=n.attr,a=[],o=0;o{"use strict";var _it=ba(),b3=Mr();gb.manageCommandObserver=function(e,t,r,n){var i={},a=!0;t&&t._commandObserver&&(i=t._commandObserver),i.cache||(i.cache={}),i.lookupTable={};var o=gb.hasSimpleAPICommandBindings(e,r,i.lookupTable);if(t&&t._commandObserver){if(o)return i;if(t._commandObserver.remove)return t._commandObserver.remove(),t._commandObserver=null,i}if(o){gne(e,o,i.cache),i.check=function(){if(a){var c=gne(e,o,i.cache);return c.changed&&n&&i.lookupTable[c.value]!==void 0&&(i.disable(),Promise.resolve(n({value:c.value,type:o.type,prop:o.prop,traces:o.traces,index:i.lookupTable[c.value]})).then(i.enable,i.enable)),c.changed}};for(var s=["plotly_relayout","plotly_redraw","plotly_restyle","plotly_update","plotly_animatingframe","plotly_afterplot"],l=0;l0?".":"")+i;b3.isPlainObject(a)?oO(a,t,o,n+1):t(o,i,a)}})}});var Xu=ye((Dtr,Rne)=>{"use strict";var Mne=xa(),bit=e3().timeFormatLocale,wit=dq().formatLocale,jS=uo(),Tit=vq(),bl=ba(),Ene=_3(),Ait=Vs(),Ca=Mr(),kne=va(),xne=es().BADNUM,Ap=af(),Sit=Q1().clearOutline,Mit=U6(),sO=zS(),Eit=eO(),kit=kd().getModuleCalcData,bne=Ca.relinkPrivateKeys,mb=Ca._,ha=Rne.exports={};Ca.extendFlat(ha,bl);ha.attributes=vl();ha.attributes.type.values=ha.allTypes;ha.fontAttrs=Su();ha.layoutAttributes=s3();var j6=_ne();ha.executeAPICommand=j6.executeAPICommand;ha.computeAPICommandBindings=j6.computeAPICommandBindings;ha.manageCommandObserver=j6.manageCommandObserver;ha.hasSimpleAPICommandBindings=j6.hasSimpleAPICommandBindings;ha.redrawText=function(e){return e=Ca.getGraphDiv(e),new Promise(function(t){setTimeout(function(){e._fullLayout&&(bl.getComponentMethod("annotations","draw")(e),bl.getComponentMethod("legend","draw")(e),bl.getComponentMethod("colorbar","draw")(e),t(ha.previousPromises(e)))},300)})};ha.resize=function(e){e=Ca.getGraphDiv(e);var t,r=new Promise(function(n,i){(!e||Ca.isHidden(e))&&i(new Error("Resize must be passed a displayed plot div element.")),e._redrawTimer&&clearTimeout(e._redrawTimer),e._resolveResize&&(t=e._resolveResize),e._resolveResize=n,e._redrawTimer=setTimeout(function(){if(!e.layout||e.layout.width&&e.layout.height||Ca.isHidden(e)){n(e);return}delete e.layout.width,delete e.layout.height;var a=e.changed;e.autoplay=!0,bl.call("relayout",e,{autosize:!0}).then(function(){e.changed=a,e._resolveResize===n&&(delete e._resolveResize,n(e))})},100)});return t&&t(r),r};ha.previousPromises=function(e){if((e._promises||[]).length)return Promise.all(e._promises).then(function(){e._promises=[]})};ha.addLinks=function(e){if(!(!e._context.showLink&&!e._context.showSources)){var t=e._fullLayout,r=Ca.ensureSingle(t._paper,"text","js-plot-link-container",function(l){l.style({"font-family":'"Open Sans", Arial, sans-serif',"font-size":"12px",fill:kne.defaultLine,"pointer-events":"all"}).each(function(){var u=Mne.select(this);u.append("tspan").classed("js-link-to-tool",!0),u.append("tspan").classed("js-link-spacer",!0),u.append("tspan").classed("js-sourcelinks",!0)})}),n=r.node(),i={y:t._paper.attr("height")-9};document.body.contains(n)&&n.getComputedTextLength()>=t.width-20?(i["text-anchor"]="start",i.x=5):(i["text-anchor"]="end",i.x=t._paper.attr("width")-7),r.attr(i);var a=r.select(".js-link-to-tool"),o=r.select(".js-link-spacer"),s=r.select(".js-sourcelinks");e._context.showSources&&e._context.showSources(e),e._context.showLink&&Cit(e,a),o.text(a.text()&&s.text()?" - ":"")}};function Cit(e,t){t.text("");var r=t.append("a").attr({"xlink:xlink:href":"#",class:"link--impt link--embedview","font-weight":"bold"}).text(e._context.linkText+" \xBB");if(e._context.sendData)r.on("click",function(){ha.sendDataToCloud(e)});else{var n=window.location.pathname.split("/"),i=window.location.search;r.attr({"xlink:xlink:show":"new","xlink:xlink:href":"/"+n[2].split(".")[0]+"/"+n[1]+i})}}ha.sendDataToCloud=function(e){var t=(window.PLOTLYENV||{}).BASE_URL||e._context.plotlyServerURL;if(t){e.emit("plotly_beforeexport");var r=Mne.select(e).append("div").attr("id","hiddenform").style("display","none"),n=r.append("form").attr({action:t+"/external",method:"post",target:"_blank"}),i=n.append("input").attr({type:"text",name:"data"});return i.node().value=ha.graphJson(e,!1,"keepdata"),n.node().submit(),r.remove(),e.emit("plotly_afterexport"),!1}};var Lit=["days","shortDays","months","shortMonths","periods","dateTime","date","time","decimal","thousands","grouping","currency"],Pit=["year","month","dayMonth","dayMonthYear"];ha.supplyDefaults=function(e,t){var r=t&&t.skipUpdateCalc,n=e._fullLayout||{};if(n._skipDefaults){delete n._skipDefaults;return}var i=e._fullLayout={},a=e.layout||{},o=e._fullData||[],s=e._fullData=[],l=e.data||[],u=e.calcdata||[],c=e._context||{},f;e._transitionData||ha.createTransitionData(e),i._dfltTitle={plot:mb(e,"Click to enter Plot title"),subtitle:mb(e,"Click to enter Plot subtitle"),x:mb(e,"Click to enter X axis title"),y:mb(e,"Click to enter Y axis title"),colorbar:mb(e,"Click to enter Colorscale title"),annotation:mb(e,"new text")},i._traceWord=mb(e,"trace");var h=wne(e,Lit);if(i._mapboxAccessToken=c.mapboxAccessToken,n._initialAutoSizeIsDone){var d=n.width,v=n.height;ha.supplyLayoutGlobalDefaults(a,i,h),a.width||(i.width=d),a.height||(i.height=v),ha.sanitizeMargins(i)}else{ha.supplyLayoutGlobalDefaults(a,i,h);var x=!a.width||!a.height,b=i.autosize,g=c.autosizable,E=x&&(b||g);E?ha.plotAutoSize(e,a,i):x&&ha.sanitizeMargins(i),!b&&x&&(a.width=i.width,a.height=i.height)}i._d3locale=Dit(h,i.separators),i._extraFormat=wne(e,Pit),i._initialAutoSizeIsDone=!0,i._dataLength=l.length,i._modules=[],i._visibleModules=[],i._basePlotModules=[];var k=i._subplots=Rit(),A=i._splomAxes={x:{},y:{}},L=i._splomSubplots={};i._splomGridDflt={},i._scatterStackOpts={},i._firstScatter={},i._alignmentOpts={},i._colorAxes={},i._requestRangeslider={},i._traceUids=Iit(o,l),ha.supplyDataDefaults(l,s,a,i);var _=Object.keys(A.x),C=Object.keys(A.y);if(_.length>1&&C.length>1){for(bl.getComponentMethod("grid","sizeDefaults")(a,i),f=0;f<_.length;f++)Ca.pushUnique(k.xaxis,_[f]);for(f=0;f15&&C.length>15&&i.shapes.length===0&&i.images.length===0,ha.linkSubplots(s,i,o,n),ha.cleanPlot(s,i,o,n);var F=!!(n._has&&n._has("cartesian")),q=!!(i._has&&i._has("cartesian")),V=F,H=q;V&&!H?n._bgLayer.remove():H&&!V&&(i._shouldCreateBgLayer=!0),n._zoomlayer&&!e._dragging&&Sit({_fullLayout:n}),zit(s,i),bne(i,n),bl.getComponentMethod("colorscale","crossTraceDefaults")(s,i),i._preGUI||(i._preGUI={}),i._tracePreGUI||(i._tracePreGUI={});var X=i._tracePreGUI,G={},N;for(N in X)G[N]="old";for(f=0;f0){var c=1-2*a;o=Math.round(c*o),s=Math.round(c*s)}}var f=ha.layoutAttributes.width.min,h=ha.layoutAttributes.height.min;o1,v=!r.height&&Math.abs(n.height-s)>1;(v||d)&&(d&&(n.width=o),v&&(n.height=s)),t._initialAutoSize||(t._initialAutoSize={width:o,height:s}),ha.sanitizeMargins(n)};ha.supplyLayoutModuleDefaults=function(e,t,r,n){var i=bl.componentsRegistry,a=t._basePlotModules,o,s,l,u=bl.subplotsRegistry.cartesian;for(o in i)l=i[o],l.includeBasePlot&&l.includeBasePlot(e,t);a.length||a.push(u),t._has("cartesian")&&(bl.getComponentMethod("grid","contentDefaults")(e,t),u.finalizeSubplots(e,t));for(var c in t._subplots)t._subplots[c].sort(Ca.subplotSort);for(s=0;s1&&(r.l/=b,r.r/=b)}if(h){var g=(r.t+r.b)/h;g>1&&(r.t/=g,r.b/=g)}var E=r.xl!==void 0?r.xl:r.x,k=r.xr!==void 0?r.xr:r.x,A=r.yt!==void 0?r.yt:r.y,L=r.yb!==void 0?r.yb:r.y;d[t]={l:{val:E,size:r.l+x},r:{val:k,size:r.r+x},b:{val:L,size:r.b+x},t:{val:A,size:r.t+x}},v[t]=1}if(!n._replotting)return ha.doAutoMargin(e)}};function qit(e){if("_redrawFromAutoMarginCount"in e._fullLayout)return!1;var t=Ap.list(e,"",!0);for(var r in t)if(t[r].autoshift||t[r].shift)return!0;return!1}ha.doAutoMargin=function(e){var t=e._fullLayout,r=t.width,n=t.height;t._size||(t._size={}),Cne(t);var i=t._size,a=t.margin,o={t:0,b:0,l:0,r:0},s=Ca.extendFlat({},i),l=a.l,u=a.r,c=a.t,f=a.b,h=t._pushmargin,d=t._pushmarginIds,v=t.minreducedwidth,x=t.minreducedheight;if(a.autoexpand!==!1){for(var b in h)d[b]||delete h[b];var g=e._fullLayout._reservedMargin;for(var E in g)for(var k in g[E]){var A=g[E][k];o[k]=Math.max(o[k],A)}h.base={l:{val:0,size:l},r:{val:1,size:u},t:{val:1,size:c},b:{val:0,size:f}};for(var L in o){var _=0;for(var C in h)C!=="base"&&jS(h[C][L].size)&&(_=h[C][L].size>_?h[C][L].size:_);var M=Math.max(0,a[L]-_);o[L]=Math.max(0,o[L]-M)}for(var p in h){var P=h[p].l||{},T=h[p].b||{},F=P.val,q=P.size,V=T.val,H=T.size,X=r-o.r-o.l,G=n-o.t-o.b;for(var N in h){if(jS(q)&&h[N].r){var W=h[N].r.val,re=h[N].r.size;if(W>F){var ae=(q*W+(re-X)*F)/(W-F),_e=(re*(1-F)+(q-X)*(1-W))/(W-F);ae+_e>l+u&&(l=ae,u=_e)}}if(jS(H)&&h[N].t){var Me=h[N].t.val,ke=h[N].t.size;if(Me>V){var ge=(H*Me+(ke-G)*V)/(Me-V),ie=(ke*(1-V)+(H-G)*(1-Me))/(Me-V);ge+ie>f+c&&(f=ge,c=ie)}}}}}var Te=Ca.constrain(r-a.l-a.r,Lne,v),Ee=Ca.constrain(n-a.t-a.b,Pne,x),Ae=Math.max(0,r-Te),ze=Math.max(0,n-Ee);if(Ae){var Ce=(l+u)/Ae;Ce>1&&(l/=Ce,u/=Ce)}if(ze){var me=(f+c)/ze;me>1&&(f/=me,c/=me)}if(i.l=Math.round(l)+o.l,i.r=Math.round(u)+o.r,i.t=Math.round(c)+o.t,i.b=Math.round(f)+o.b,i.p=Math.round(a.pad),i.w=Math.round(r)-i.l-i.r,i.h=Math.round(n)-i.t-i.b,!t._replotting&&(ha.didMarginChange(s,i)||qit(e))){"_redrawFromAutoMarginCount"in t?t._redrawFromAutoMarginCount++:t._redrawFromAutoMarginCount=1;var Re=3*(1+Object.keys(d).length);if(t._redrawFromAutoMarginCount1)return!0}return!1};ha.graphJson=function(e,t,r,n,i,a){(i&&t&&!e._fullData||i&&!t&&!e._fullLayout)&&ha.supplyDefaults(e);var o=i?e._fullData:e.data,s=i?e._fullLayout:e.layout,l=(e._transitionData||{})._frames;function u(h,d){if(typeof h=="function")return d?"_function_":null;if(Ca.isPlainObject(h)){var v={},x;return Object.keys(h).sort().forEach(function(k){if(["_","["].indexOf(k.charAt(0))===-1){if(typeof h[k]=="function"){d&&(v[k]="_function");return}if(r==="keepdata"){if(k.substr(k.length-3)==="src")return}else if(r==="keepstream"){if(x=h[k+"src"],typeof x=="string"&&x.indexOf(":")>0&&!Ca.isPlainObject(h.stream))return}else if(r!=="keepall"&&(x=h[k+"src"],typeof x=="string"&&x.indexOf(":")>0))return;v[k]=u(h[k],d)}}),v}var b=Array.isArray(h),g=Ca.isTypedArray(h);if((b||g)&&h.dtype&&h.shape){var E=h.bdata;return u({dtype:h.dtype,shape:h.shape,bdata:Ca.isArrayBuffer(E)?Tit.encode(E):E},d)}return b?h.map(function(k){return u(k,d)}):g?Ca.simpleMap(h,Ca.identity):Ca.isJSDate(h)?Ca.ms2DateTimeLocal(+h):h}var c={data:(o||[]).map(function(h){var d=u(h);return t&&delete d.fit,d})};if(!t&&(c.layout=u(s),i)){var f=s._size;c.layout.computed={margin:{b:f.b,l:f.l,r:f.r,t:f.t}}}return l&&(c.frames=u(l)),a&&(c.config=u(e._context,!0)),n==="object"?c:JSON.stringify(c)};ha.modifyFrames=function(e,t){var r,n,i,a=e._transitionData._frames,o=e._transitionData._frameHash;for(r=0;r0&&(e._transitioningWithDuration=!0),e._transitionData._interruptCallbacks.push(function(){n=!0}),r.redraw&&e._transitionData._interruptCallbacks.push(function(){return bl.call("redraw",e)}),e._transitionData._interruptCallbacks.push(function(){e.emit("plotly_transitioninterrupted",[])});var h=0,d=0;function v(){return h++,function(){d++,!n&&d===h&&s(f)}}r.runFn(v),setTimeout(v())})}function s(f){if(e._transitionData)return a(e._transitionData._interruptCallbacks),Promise.resolve().then(function(){if(r.redraw)return bl.call("redraw",e)}).then(function(){e._transitioning=!1,e._transitioningWithDuration=!1,e.emit("plotly_transitioned",[])}).then(f)}function l(){if(e._transitionData)return e._transitioning=!1,i(e._transitionData._interruptCallbacks)}var u=[ha.previousPromises,l,r.prepareFn,ha.rehover,ha.reselect,o],c=Ca.syncOrAsync(u,e);return(!c||!c.then)&&(c=Promise.resolve()),c.then(function(){return e})}ha.doCalcdata=function(e,t){var r=Ap.list(e),n=e._fullData,i=e._fullLayout,a,o,s,l,u=new Array(n.length),c=(e.calcdata||[]).slice();for(e.calcdata=u,i._numBoxes=0,i._numViolins=0,i._violinScaleGroupStats={},e._hmpixcount=0,e._hmlumcount=0,i._piecolormap={},i._sunburstcolormap={},i._treemapcolormap={},i._iciclecolormap={},i._funnelareacolormap={},s=0;s=0;l--)if(L[l].enabled){a._indexToPoints=L[l]._indexToPoints;break}o&&o.calc&&(A=o.calc(e,a))}(!Array.isArray(A)||!A[0])&&(A=[{x:xne,y:xne}]),A[0].t||(A[0].t={}),A[0].trace=a,u[E]=A}}for(Ane(r,n,i),s=0;s{"use strict";yb.xmlns="http://www.w3.org/2000/xmlns/";yb.svg="http://www.w3.org/2000/svg";yb.xlink="http://www.w3.org/1999/xlink";yb.svgAttrs={xmlns:yb.svg,"xmlns:xlink":yb.xlink}});var Nh=ye((Ftr,Dne)=>{"use strict";Dne.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,CAP_SHIFT:.7,MID_SHIFT:.35,OPPOSITE_SIDE:{left:"right",right:"left",top:"bottom",bottom:"top"}}});var Ll=ye(b0=>{"use strict";var vh=xa(),Ty=Mr(),Uit=Ty.strTranslate,lO=Zp(),Vit=Nh().LINE_SPACING,Hit=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;b0.convertToTspans=function(e,t,r){var n=e.text(),i=!e.attr("data-notex")&&t&&t._context.typesetMath&&typeof MathJax!="undefined"&&n.match(Hit),a=vh.select(e.node().parentNode);if(a.empty())return;var o=e.attr("class")?e.attr("class").split(" ")[0]:"text";o+="-math",a.selectAll("svg."+o).remove(),a.selectAll("g."+o+"-group").remove(),e.style("display",null).attr({"data-unformatted":n,"data-math":"N"});function s(){a.empty()||(o=e.attr("class")+"-math",a.select("svg."+o).remove()),e.text("").style("white-space","pre");var l=rnt(e.node(),n);l&&e.style("pointer-events","all"),b0.positionText(e),r&&r.call(e)}return i?(t&&t._promises||[]).push(new Promise(function(l){e.style("display","none");var u=parseInt(e.node().style.fontSize,10),c={fontSize:u};Zit(i[2],c,function(f,h,d){a.selectAll("svg."+o).remove(),a.selectAll("g."+o+"-group").remove();var v=f&&f.select("svg");if(!v||!v.node()){s(),l();return}var x=a.append("g").classed(o+"-group",!0).attr({"pointer-events":"none","data-unformatted":n,"data-math":"Y"});x.node().appendChild(v.node()),h&&h.node()&&v.node().insertBefore(h.node().cloneNode(!0),v.node().firstChild);var b=d.width,g=d.height;v.attr({class:o,height:g,preserveAspectRatio:"xMinYMin meet"}).style({overflow:"visible","pointer-events":"none"});var E=e.node().style.fill||"black",k=v.select("g");k.attr({fill:E,stroke:E});var A=k.node().getBoundingClientRect(),L=A.width,_=A.height;(L>b||_>g)&&(v.style("overflow","hidden"),A=v.node().getBoundingClientRect(),L=A.width,_=A.height);var C=+e.attr("x"),M=+e.attr("y"),p=u||e.node().getBoundingClientRect().height,P=-p/4;if(o[0]==="y")x.attr({transform:"rotate("+[-90,C,M]+")"+Uit(-L/2,P-_/2)});else if(o[0]==="l")M=P-_/2;else if(o[0]==="a"&&o.indexOf("atitle")!==0)C=0,M=P;else{var T=e.attr("text-anchor");C=C-L*(T==="middle"?.5:T==="end"?1:0),M=M+P-_/2}v.attr({x:C,y:M}),r&&r.call(e,x),l(x)})})):s(),e};var Git=/(<|<|<)/g,jit=/(>|>|>)/g;function Wit(e){return e.replace(Git,"\\lt ").replace(jit,"\\gt ")}var zne=[["$","$"],["\\(","\\)"]];function Zit(e,t,r){var n=parseInt((MathJax.version||"").split(".")[0]);if(n!==2&&n!==3){Ty.warn("No MathJax version:",MathJax.version);return}var i,a,o,s,l=function(){return a=Ty.extendDeepAll({},MathJax.Hub.config),o=MathJax.Hub.processSectionDelay,MathJax.Hub.processSectionDelay!==void 0&&(MathJax.Hub.processSectionDelay=0),MathJax.Hub.Config({messageStyle:"none",tex2jax:{inlineMath:zne},displayAlign:"left"})},u=function(){a=Ty.extendDeepAll({},MathJax.config),MathJax.config.tex||(MathJax.config.tex={}),MathJax.config.tex.inlineMath=zne},c=function(){if(i=MathJax.Hub.config.menuSettings.renderer,i!=="SVG")return MathJax.Hub.setRenderer("SVG")},f=function(){i=MathJax.config.startup.output,i!=="svg"&&(MathJax.config.startup.output="svg")},h=function(){var E="math-output-"+Ty.randstr({},64);s=vh.select("body").append("div").attr({id:E}).style({visibility:"hidden",position:"absolute","font-size":t.fontSize+"px"}).text(Wit(e));var k=s.node();return n===2?MathJax.Hub.Typeset(k):MathJax.typeset([k])},d=function(){var E=s.select(n===2?".MathJax_SVG":".MathJax"),k=!E.empty()&&s.select("svg").node();if(!k)Ty.log("There was an error in the tex syntax.",e),r();else{var A=k.getBoundingClientRect(),L;n===2?L=vh.select("body").select("#MathJax_SVG_glyphs"):L=E.select("defs"),r(E,L,A)}s.remove()},v=function(){if(i!=="SVG")return MathJax.Hub.setRenderer(i)},x=function(){i!=="svg"&&(MathJax.config.startup.output=i)},b=function(){return o!==void 0&&(MathJax.Hub.processSectionDelay=o),MathJax.Hub.Config(a)},g=function(){MathJax.config=a};n===2?MathJax.Hub.Queue(l,c,h,d,v,b):n===3&&(u(),f(),MathJax.startup.defaultReady(),MathJax.startup.promise.then(function(){h(),d(),x(),g()}))}var Bne={sup:"font-size:70%",sub:"font-size:70%",s:"text-decoration:line-through",u:"text-decoration:underline",b:"font-weight:bold",i:"font-style:italic",a:"cursor:pointer",span:"",em:"font-style:italic;font-weight:bold"},Xit={sub:"0.3em",sup:"-0.6em"},Yit={sub:"-0.21em",sup:"0.42em"},Fne="\u200B",qne=["http:","https:","mailto:","",void 0,":"],Nne=b0.NEWLINES=/(\r\n?|\n)/g,cO=/(<[^<>]*>)/,fO=/<(\/?)([^ >]*)(\s+(.*))?>/i,Kit=/
/i;b0.BR_TAG_ALL=/
/gi;var Une=/(^|[\s"'])style\s*=\s*("([^"]*);?"|'([^']*);?')/i,Vne=/(^|[\s"'])href\s*=\s*("([^"]*)"|'([^']*)')/i,Hne=/(^|[\s"'])target\s*=\s*("([^"\s]*)"|'([^'\s]*)')/i,Jit=/(^|[\s"'])popup\s*=\s*("([\w=,]*)"|'([\w=,]*)')/i;function _b(e,t){if(!e)return null;var r=e.match(t),n=r&&(r[3]||r[4]);return n&&W6(n)}var $it=/(^|;)\s*color:/;b0.plainText=function(e,t){t=t||{};for(var r=t.len!==void 0&&t.len!==-1?t.len:1/0,n=t.allowedTags!==void 0?t.allowedTags:["br"],i="...",a=i.length,o=e.split(cO),s=[],l="",u=0,c=0;ca?s.push(f.substr(0,x-a)+i):s.push(f.substr(0,x));break}l=""}}return s.join("")};var Qit={mu:"\u03BC",amp:"&",lt:"<",gt:">",nbsp:"\xA0",times:"\xD7",plusmn:"\xB1",deg:"\xB0"},ent=/&(#\d+|#x[\da-fA-F]+|[a-z]+);/g;function W6(e){return e.replace(ent,function(t,r){var n;return r.charAt(0)==="#"?n=tnt(r.charAt(1)==="x"?parseInt(r.substr(2),16):parseInt(r.substr(1),10)):n=Qit[r],n||t})}b0.convertEntities=W6;function tnt(e){if(!(e>1114111)){var t=String.fromCodePoint;if(t)return t(e);var r=String.fromCharCode;return e<=65535?r(e):r((e>>10)+55232,e%1024+56320)}}function rnt(e,t){t=t.replace(Nne," ");var r=!1,n=[],i,a=-1;function o(){a++;var _=document.createElementNS(lO.svg,"tspan");vh.select(_).attr({class:"line",dy:a*Vit+"em"}),e.appendChild(_),i=_;var C=n;if(n=[{node:_}],C.length>1)for(var M=1;M.",t);return}var C=n.pop();_!==C.type&&Ty.log("Start tag <"+C.type+"> doesnt match end tag <"+_+">. Pretending it did match.",t),i=n[n.length-1].node}var c=Kit.test(t);c?o():(i=e,n=[{node:e}]);for(var f=t.split(cO),h=0;h{"use strict";var int=xa(),X6=id(),ZS=uo(),Z6=Mr(),jne=va(),nnt=sb().isValid;function ant(e,t,r){var n=t?Z6.nestedProperty(e,t).get()||{}:e,i=n[r||"color"];i&&i._inputArray&&(i=i._inputArray);var a=!1;if(Z6.isArrayOrTypedArray(i)){for(var o=0;o=0;n--,i++){var a=e[n];r[i]=[1-a[0],a[1]]}return r}function Jne(e,t){t=t||{};for(var r=e.domain,n=e.range,i=n.length,a=new Array(i),o=0;o{"use strict";var Qne=Iq(),snt=Qne.FORMAT_LINK,lnt=Qne.DATE_FORMAT_LINK;function unt(e,t){return{valType:"string",dflt:"",editType:"none",description:(t?hO:eae)("hover text",e)+["By default the values are formatted using "+(t?"generic number format":"`"+e+"axis.hoverformat`")+"."].join(" ")}}function hO(e,t){return["Sets the "+e+" formatting rule"+(t?"for `"+t+"` ":""),"using d3 formatting mini-languages","which are very similar to those in Python. For numbers, see: "+snt+"."].join(" ")}function eae(e,t){return hO(e,t)+[" And for dates see: "+lnt+".","We add two items to d3's date formatter:","*%h* for half of the year as a decimal number as well as","*%{n}f* for fractional seconds","with n digits. For example, *2016-10-13 09:15:23.456* with tickformat","*%H~%M~%S.%2f* would display *09~15~23.46*"].join(" ")}tae.exports={axisHoverFormat:unt,descriptionOnlyNumbers:hO,descriptionWithDates:eae}});var Cd=ye((Ntr,yae)=>{"use strict";var rae=Su(),w3=dh(),mae=Ed().dash,vO=no().extendFlat,iae=Vs().templatedArray,nae=Oc().descriptionWithDates,cnt=es().ONEDAY,pm=ad(),fnt=pm.HOUR_PATTERN,hnt=pm.WEEKDAY_PATTERN,dO={valType:"enumerated",values:["auto","linear","array"],editType:"ticks",impliedEdits:{tick0:void 0,dtick:void 0}},dnt=vO({},dO,{values:dO.values.slice().concat(["sync"])});function aae(e){return{valType:"integer",min:0,dflt:e?5:0,editType:"ticks"}}var oae={valType:"any",editType:"ticks",impliedEdits:{tickmode:"linear"}},sae={valType:"any",editType:"ticks",impliedEdits:{tickmode:"linear"}},lae={valType:"data_array",editType:"ticks"},uae={valType:"enumerated",values:["outside","inside",""],editType:"ticks"};function cae(e){var t={valType:"number",min:0,editType:"ticks"};return e||(t.dflt=5),t}function fae(e){var t={valType:"number",min:0,editType:"ticks"};return e||(t.dflt=1),t}var hae={valType:"color",dflt:w3.defaultLine,editType:"ticks"},dae={valType:"color",dflt:w3.lightLine,editType:"ticks"};function vae(e){var t={valType:"number",min:0,editType:"ticks"};return e||(t.dflt=1),t}var pae=vO({},mae,{editType:"ticks"}),gae={valType:"boolean",editType:"ticks"};yae.exports={visible:{valType:"boolean",editType:"plot"},color:{valType:"color",dflt:w3.defaultLine,editType:"ticks"},title:{text:{valType:"string",editType:"ticks"},font:rae({editType:"ticks"}),standoff:{valType:"number",min:0,editType:"ticks"},editType:"ticks"},type:{valType:"enumerated",values:["-","linear","log","date","category","multicategory"],dflt:"-",editType:"calc",_noTemplating:!0},autotypenumbers:{valType:"enumerated",values:["convert types","strict"],dflt:"convert types",editType:"calc"},autorange:{valType:"enumerated",values:[!0,!1,"reversed","min reversed","max reversed","min","max"],dflt:!0,editType:"axrange",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},autorangeoptions:{minallowed:{valType:"any",editType:"plot",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},maxallowed:{valType:"any",editType:"plot",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},clipmin:{valType:"any",editType:"plot",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},clipmax:{valType:"any",editType:"plot",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},include:{valType:"any",arrayOk:!0,editType:"plot",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},editType:"plot"},rangemode:{valType:"enumerated",values:["normal","tozero","nonnegative"],dflt:"normal",editType:"plot"},range:{valType:"info_array",items:[{valType:"any",editType:"axrange",impliedEdits:{"^autorange":!1},anim:!0},{valType:"any",editType:"axrange",impliedEdits:{"^autorange":!1},anim:!0}],editType:"axrange",impliedEdits:{autorange:!1},anim:!0},minallowed:{valType:"any",editType:"plot",impliedEdits:{"^autorange":!1}},maxallowed:{valType:"any",editType:"plot",impliedEdits:{"^autorange":!1}},fixedrange:{valType:"boolean",dflt:!1,editType:"calc"},insiderange:{valType:"info_array",items:[{valType:"any",editType:"plot"},{valType:"any",editType:"plot"}],editType:"plot"},scaleanchor:{valType:"enumerated",values:[pm.idRegex.x.toString(),pm.idRegex.y.toString(),!1],editType:"plot"},scaleratio:{valType:"number",min:0,dflt:1,editType:"plot"},constrain:{valType:"enumerated",values:["range","domain"],editType:"plot"},constraintoward:{valType:"enumerated",values:["left","center","right","top","middle","bottom"],editType:"plot"},matches:{valType:"enumerated",values:[pm.idRegex.x.toString(),pm.idRegex.y.toString()],editType:"calc"},rangebreaks:iae("rangebreak",{enabled:{valType:"boolean",dflt:!0,editType:"calc"},bounds:{valType:"info_array",items:[{valType:"any",editType:"calc"},{valType:"any",editType:"calc"}],editType:"calc"},pattern:{valType:"enumerated",values:[hnt,fnt,""],editType:"calc"},values:{valType:"info_array",freeLength:!0,editType:"calc",items:{valType:"any",editType:"calc"}},dvalue:{valType:"number",editType:"calc",min:0,dflt:cnt},editType:"calc"}),tickmode:dnt,nticks:aae(),tick0:oae,dtick:sae,ticklabelstep:{valType:"integer",min:1,dflt:1,editType:"ticks"},tickvals:lae,ticktext:{valType:"data_array",editType:"ticks"},ticks:uae,tickson:{valType:"enumerated",values:["labels","boundaries"],dflt:"labels",editType:"ticks"},ticklabelmode:{valType:"enumerated",values:["instant","period"],dflt:"instant",editType:"ticks"},ticklabelposition:{valType:"enumerated",values:["outside","inside","outside top","inside top","outside left","inside left","outside right","inside right","outside bottom","inside bottom"],dflt:"outside",editType:"calc"},ticklabeloverflow:{valType:"enumerated",values:["allow","hide past div","hide past domain"],editType:"calc"},ticklabelshift:{valType:"integer",dflt:0,editType:"ticks"},ticklabelstandoff:{valType:"integer",dflt:0,editType:"ticks"},ticklabelindex:{valType:"integer",arrayOk:!0,editType:"calc"},mirror:{valType:"enumerated",values:[!0,"ticks",!1,"all","allticks"],dflt:!1,editType:"ticks+layoutstyle"},ticklen:cae(),tickwidth:fae(),tickcolor:hae,showticklabels:{valType:"boolean",dflt:!0,editType:"ticks"},labelalias:{valType:"any",dflt:!1,editType:"ticks"},automargin:{valType:"flaglist",flags:["height","width","left","right","top","bottom"],extras:[!0,!1],dflt:!1,editType:"ticks"},showspikes:{valType:"boolean",dflt:!1,editType:"modebar"},spikecolor:{valType:"color",dflt:null,editType:"none"},spikethickness:{valType:"number",dflt:3,editType:"none"},spikedash:vO({},mae,{dflt:"dash",editType:"none"}),spikemode:{valType:"flaglist",flags:["toaxis","across","marker"],dflt:"toaxis",editType:"none"},spikesnap:{valType:"enumerated",values:["data","cursor","hovered data"],dflt:"hovered data",editType:"none"},tickfont:rae({editType:"ticks"}),tickangle:{valType:"angle",dflt:"auto",editType:"ticks"},autotickangles:{valType:"info_array",freeLength:!0,items:{valType:"angle"},dflt:[0,30,90],editType:"ticks"},tickprefix:{valType:"string",dflt:"",editType:"ticks"},showtickprefix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},ticksuffix:{valType:"string",dflt:"",editType:"ticks"},showticksuffix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},showexponent:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},exponentformat:{valType:"enumerated",values:["none","e","E","power","SI","B"],dflt:"B",editType:"ticks"},minexponent:{valType:"number",dflt:3,min:0,editType:"ticks"},separatethousands:{valType:"boolean",dflt:!1,editType:"ticks"},tickformat:{valType:"string",dflt:"",editType:"ticks",description:nae("tick label")},tickformatstops:iae("tickformatstop",{enabled:{valType:"boolean",dflt:!0,editType:"ticks"},dtickrange:{valType:"info_array",items:[{valType:"any",editType:"ticks"},{valType:"any",editType:"ticks"}],editType:"ticks"},value:{valType:"string",dflt:"",editType:"ticks"},editType:"ticks"}),hoverformat:{valType:"string",dflt:"",editType:"none",description:nae("hover text")},showline:{valType:"boolean",dflt:!1,editType:"ticks+layoutstyle"},linecolor:{valType:"color",dflt:w3.defaultLine,editType:"layoutstyle"},linewidth:{valType:"number",min:0,dflt:1,editType:"ticks+layoutstyle"},showgrid:gae,gridcolor:dae,gridwidth:vae(),griddash:pae,zeroline:{valType:"boolean",editType:"ticks"},zerolinecolor:{valType:"color",dflt:w3.defaultLine,editType:"ticks"},zerolinewidth:{valType:"number",dflt:1,editType:"ticks"},showdividers:{valType:"boolean",dflt:!0,editType:"ticks"},dividercolor:{valType:"color",dflt:w3.defaultLine,editType:"ticks"},dividerwidth:{valType:"number",dflt:1,editType:"ticks"},anchor:{valType:"enumerated",values:["free",pm.idRegex.x.toString(),pm.idRegex.y.toString()],editType:"plot"},side:{valType:"enumerated",values:["top","bottom","left","right"],editType:"plot"},overlaying:{valType:"enumerated",values:["free",pm.idRegex.x.toString(),pm.idRegex.y.toString()],editType:"plot"},minor:{tickmode:dO,nticks:aae("minor"),tick0:oae,dtick:sae,tickvals:lae,ticks:uae,ticklen:cae("minor"),tickwidth:fae("minor"),tickcolor:hae,gridcolor:dae,gridwidth:vae("minor"),griddash:pae,showgrid:gae,editType:"ticks"},layer:{valType:"enumerated",values:["above traces","below traces"],dflt:"above traces",editType:"plot"},domain:{valType:"info_array",items:[{valType:"number",min:0,max:1,editType:"plot"},{valType:"number",min:0,max:1,editType:"plot"}],dflt:[0,1],editType:"plot"},position:{valType:"number",min:0,max:1,dflt:0,editType:"plot"},autoshift:{valType:"boolean",dflt:!1,editType:"plot"},shift:{valType:"number",editType:"plot"},categoryorder:{valType:"enumerated",values:["trace","category ascending","category descending","array","total ascending","total descending","min ascending","min descending","max ascending","max descending","sum ascending","sum descending","mean ascending","mean descending","geometric mean ascending","geometric mean descending","median ascending","median descending"],dflt:"trace",editType:"calc"},categoryarray:{valType:"data_array",editType:"calc"},uirevision:{valType:"any",editType:"none"},editType:"calc"}});var Y6=ye((Utr,bae)=>{"use strict";var Ac=Cd(),_ae=Su(),xae=no().extendFlat,vnt=Bu().overrideAll;bae.exports=vnt({orientation:{valType:"enumerated",values:["h","v"],dflt:"v"},thicknessmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"pixels"},thickness:{valType:"number",min:0,dflt:30},lenmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"fraction"},len:{valType:"number",min:0,dflt:1},x:{valType:"number"},xref:{valType:"enumerated",dflt:"paper",values:["container","paper"],editType:"layoutstyle"},xanchor:{valType:"enumerated",values:["left","center","right"]},xpad:{valType:"number",min:0,dflt:10},y:{valType:"number"},yref:{valType:"enumerated",dflt:"paper",values:["container","paper"],editType:"layoutstyle"},yanchor:{valType:"enumerated",values:["top","middle","bottom"]},ypad:{valType:"number",min:0,dflt:10},outlinecolor:Ac.linecolor,outlinewidth:Ac.linewidth,bordercolor:Ac.linecolor,borderwidth:{valType:"number",min:0,dflt:0},bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)"},tickmode:Ac.minor.tickmode,nticks:Ac.nticks,tick0:Ac.tick0,dtick:Ac.dtick,tickvals:Ac.tickvals,ticktext:Ac.ticktext,ticks:xae({},Ac.ticks,{dflt:""}),ticklabeloverflow:xae({},Ac.ticklabeloverflow,{}),ticklabelposition:{valType:"enumerated",values:["outside","inside","outside top","inside top","outside left","inside left","outside right","inside right","outside bottom","inside bottom"],dflt:"outside"},ticklen:Ac.ticklen,tickwidth:Ac.tickwidth,tickcolor:Ac.tickcolor,ticklabelstep:Ac.ticklabelstep,showticklabels:Ac.showticklabels,labelalias:Ac.labelalias,tickfont:_ae({}),tickangle:Ac.tickangle,tickformat:Ac.tickformat,tickformatstops:Ac.tickformatstops,tickprefix:Ac.tickprefix,showtickprefix:Ac.showtickprefix,ticksuffix:Ac.ticksuffix,showticksuffix:Ac.showticksuffix,separatethousands:Ac.separatethousands,exponentformat:Ac.exponentformat,minexponent:Ac.minexponent,showexponent:Ac.showexponent,title:{text:{valType:"string"},font:_ae({}),side:{valType:"enumerated",values:["right","top","bottom"]}}},"colorbars","from-root")});var Kl=ye((Htr,Tae)=>{"use strict";var pnt=Y6(),gnt=n3().counter,mnt=X1(),wae=sb().scales,Vtr=mnt(wae);function K6(e){return"`"+e+"`"}Tae.exports=function(t,r){t=t||"",r=r||{};var n=r.cLetter||"c",i="onlyIfNumerical"in r?r.onlyIfNumerical:!!t,a="noScale"in r?r.noScale:t==="marker.line",o="showScaleDflt"in r?r.showScaleDflt:n==="z",s=typeof r.colorscaleDflt=="string"?wae[r.colorscaleDflt]:null,l=r.editTypeOverride||"",u=t?t+".":"",c,f;"colorAttr"in r?(c=r.colorAttr,f=r.colorAttr):(c={z:"z",c:"color"}[n],f="in "+K6(u+c));var h=i?" Has an effect only if "+f+" is set to a numerical array.":"",d=n+"auto",v=n+"min",x=n+"max",b=n+"mid",g=K6(u+d),E=K6(u+v),k=K6(u+x),A=E+" and "+k,L={};L[v]=L[x]=void 0;var _={};_[d]=!1;var C={};return c==="color"&&(C.color={valType:"color",arrayOk:!0,editType:l||"style"},r.anim&&(C.color.anim=!0)),C[d]={valType:"boolean",dflt:!0,editType:"calc",impliedEdits:L},C[v]={valType:"number",dflt:null,editType:l||"plot",impliedEdits:_},C[x]={valType:"number",dflt:null,editType:l||"plot",impliedEdits:_},C[b]={valType:"number",dflt:null,editType:"calc",impliedEdits:L},C.colorscale={valType:"colorscale",editType:"calc",dflt:s,impliedEdits:{autocolorscale:!1}},C.autocolorscale={valType:"boolean",dflt:r.autoColorDflt!==!1,editType:"calc",impliedEdits:{colorscale:void 0}},C.reversescale={valType:"boolean",dflt:!1,editType:"plot"},a||(C.showscale={valType:"boolean",dflt:o,editType:"calc"},C.colorbar=pnt),r.noColorAxis||(C.coloraxis={valType:"subplotid",regex:gnt("coloraxis"),dflt:null,editType:"calc"}),C}});var gO=ye((Gtr,Aae)=>{"use strict";var ynt=no().extendFlat,_nt=Kl(),pO=sb().scales;Aae.exports={editType:"calc",colorscale:{editType:"calc",sequential:{valType:"colorscale",dflt:pO.Reds,editType:"calc"},sequentialminus:{valType:"colorscale",dflt:pO.Blues,editType:"calc"},diverging:{valType:"colorscale",dflt:pO.RdBu,editType:"calc"}},coloraxis:ynt({_isSubplotObj:!0,editType:"calc"},_nt("",{colorAttr:"corresponding trace color array(s)",noColorAxis:!0,showScaleDflt:!0}))}});var mO=ye((jtr,Sae)=>{"use strict";var xnt=Mr();Sae.exports=function(t){return xnt.isPlainObject(t.colorbar)}});var xO=ye(_O=>{"use strict";var yO=uo(),Mae=Mr(),Eae=es(),bnt=Eae.ONEDAY,wnt=Eae.ONEWEEK;_O.dtick=function(e,t){var r=t==="log",n=t==="date",i=t==="category",a=n?bnt:1;if(!e)return a;if(yO(e))return e=Number(e),e<=0?a:i?Math.max(1,Math.round(e)):n?Math.max(.1,e):e;if(typeof e!="string"||!(n||r))return a;var o=e.charAt(0),s=e.substr(1);return s=yO(s)?Number(s):0,s<=0||!(n&&o==="M"&&s===Math.round(s)||r&&o==="L"||r&&o==="D"&&(s===1||s===2))?a:e};_O.tick0=function(e,t,r,n){if(t==="date")return Mae.cleanDate(e,Mae.dateTick0(r,n%wnt===0?1:0));if(!(n==="D1"||n==="D2"))return yO(e)?Number(e):0}});var xb=ye((Ztr,Cae)=>{"use strict";var kae=xO(),Tnt=Mr().isArrayOrTypedArray,Ant=vv().isTypedArraySpec,Snt=vv().decodeTypedArraySpec;Cae.exports=function(t,r,n,i,a){a||(a={});var o=a.isMinor,s=o?t.minor||{}:t,l=o?r.minor:r,u=o?"minor.":"";function c(E){var k=s[E];return Ant(k)&&(k=Snt(k)),k!==void 0?k:(l._template||{})[E]}var f=c("tick0"),h=c("dtick"),d=c("tickvals"),v=Tnt(d)?"array":h?"linear":"auto",x=n(u+"tickmode",v);if(x==="auto"||x==="sync")n(u+"nticks");else if(x==="linear"){var b=l.dtick=kae.dtick(h,i);l.tick0=kae.tick0(f,i,r.calendar,b)}else if(i!=="multicategory"){var g=n(u+"tickvals");g===void 0?l.tickmode="auto":o||n("ticktext")}}});var T3=ye((Xtr,Pae)=>{"use strict";var bO=Mr(),Lae=Cd();Pae.exports=function(t,r,n,i){var a=i.isMinor,o=a?t.minor||{}:t,s=a?r.minor:r,l=a?Lae.minor:Lae,u=a?"minor.":"",c=bO.coerce2(o,s,l,"ticklen",a?(r.ticklen||5)*.6:void 0),f=bO.coerce2(o,s,l,"tickwidth",a?r.tickwidth||1:void 0),h=bO.coerce2(o,s,l,"tickcolor",(a?r.tickcolor:void 0)||s.color),d=n(u+"ticks",!a&&i.outerTicks||c||f||h?"outside":"");d||(delete s.ticklen,delete s.tickwidth,delete s.tickcolor)}});var wO=ye((Ytr,Iae)=>{"use strict";Iae.exports=function(t){var r=["showexponent","showtickprefix","showticksuffix"],n=r.filter(function(a){return t[a]!==void 0}),i=function(a){return t[a]===t[n[0]]};if(n.every(i)||n.length===1)return t[n[0]]}});var Zd=ye((Ktr,Rae)=>{"use strict";var J6=Mr(),Mnt=Vs();Rae.exports=function(t,r,n){var i=n.name,a=n.inclusionAttr||"visible",o=r[i],s=J6.isArrayOrTypedArray(t[i])?t[i]:[],l=r[i]=[],u=Mnt.arrayTemplater(r,i,a),c,f;for(c=0;c{"use strict";var TO=Mr(),Ent=va().contrast,Dae=Cd(),knt=wO(),Cnt=Zd();zae.exports=function(t,r,n,i,a){a||(a={});var o=n("labelalias");TO.isPlainObject(o)||delete r.labelalias;var s=knt(t),l=n("showticklabels");if(l){a.noTicklabelshift||n("ticklabelshift"),a.noTicklabelstandoff||n("ticklabelstandoff");var u=a.font||{},c=r.color,f=r.ticklabelposition||"",h=f.indexOf("inside")!==-1?Ent(a.bgColor):c&&c!==Dae.color.dflt?c:u.color;if(TO.coerceFont(n,"tickfont",u,{overrideDflt:{color:h}}),!a.noTicklabelstep&&i!=="multicategory"&&i!=="log"&&n("ticklabelstep"),!a.noAng){var d=n("tickangle");!a.noAutotickangles&&d==="auto"&&n("autotickangles")}if(i!=="category"){var v=n("tickformat");Cnt(t,r,{name:"tickformatstops",inclusionAttr:"enabled",handleItemDefaults:Lnt}),r.tickformatstops.length||delete r.tickformatstops,!a.noExp&&!v&&i!=="date"&&(n("showexponent",s),n("exponentformat"),n("minexponent"),n("separatethousands"))}}};function Lnt(e,t){function r(i,a){return TO.coerce(e,t,Dae.tickformatstops,i,a)}var n=r("enabled");n&&(r("dtickrange"),r("value"))}});var t_=ye(($tr,Fae)=>{"use strict";var Pnt=wO();Fae.exports=function(t,r,n,i,a){a||(a={});var o=a.tickSuffixDflt,s=Pnt(t),l=n("tickprefix");l&&n("showtickprefix",s);var u=n("ticksuffix",o);u&&n("showticksuffix",s)}});var AO=ye((Qtr,qae)=>{"use strict";var r_=Mr(),Int=Vs(),Rnt=xb(),Dnt=T3(),znt=e_(),Fnt=t_(),qnt=Y6();qae.exports=function(t,r,n){var i=Int.newContainer(r,"colorbar"),a=t.colorbar||{};function o(T,F){return r_.coerce(a,i,qnt,T,F)}var s=n.margin||{t:0,b:0,l:0,r:0},l=n.width-s.l-s.r,u=n.height-s.t-s.b,c=o("orientation"),f=c==="v",h=o("thicknessmode");o("thickness",h==="fraction"?30/(f?l:u):30);var d=o("lenmode");o("len",d==="fraction"?1:f?u:l);var v=o("yref"),x=o("xref"),b=v==="paper",g=x==="paper",E,k,A,L="left";f?(A="middle",L=g?"left":"right",E=g?1.02:1,k=.5):(A=b?"bottom":"top",L="center",E=.5,k=b?1.02:1),r_.coerce(a,i,{x:{valType:"number",min:g?-2:0,max:g?3:1,dflt:E}},"x"),r_.coerce(a,i,{y:{valType:"number",min:b?-2:0,max:b?3:1,dflt:k}},"y"),o("xanchor",L),o("xpad"),o("yanchor",A),o("ypad"),r_.noneOrAll(a,i,["x","y"]),o("outlinecolor"),o("outlinewidth"),o("bordercolor"),o("borderwidth"),o("bgcolor");var _=r_.coerce(a,i,{ticklabelposition:{valType:"enumerated",dflt:"outside",values:f?["outside","inside","outside top","inside top","outside bottom","inside bottom"]:["outside","inside","outside left","inside left","outside right","inside right"]}},"ticklabelposition");o("ticklabeloverflow",_.indexOf("inside")!==-1?"hide past domain":"hide past div"),Rnt(a,i,o,"linear");var C=n.font,M={noAutotickangles:!0,noTicklabelshift:!0,noTicklabelstandoff:!0,outerTicks:!1,font:C};_.indexOf("inside")!==-1&&(M.bgColor="black"),Fnt(a,i,o,"linear",M),znt(a,i,o,"linear",M),Dnt(a,i,o,"linear",M),o("title.text",n._dfltTitle.colorbar);var p=i.showticklabels?i.tickfont:C,P=r_.extendFlat({},C,{family:p.family,size:r_.bigFont(p.size)});r_.coerceFont(o,"title.font",P),o("title.side",f?"top":"right")}});var Uh=ye((err,Nae)=>{"use strict";var Oae=uo(),MO=Mr(),Ont=mO(),Bnt=AO(),Bae=sb().isValid,Nnt=ba().traceIs;function SO(e,t){var r=t.slice(0,t.length-1);return t?MO.nestedProperty(e,r).get()||{}:e}Nae.exports=function e(t,r,n,i,a){var o=a.prefix,s=a.cLetter,l="_module"in r,u=SO(t,o),c=SO(r,o),f=SO(r._template||{},o)||{},h=function(){return delete t.coloraxis,delete r.coloraxis,e(t,r,n,i,a)};if(l){var d=n._colorAxes||{},v=i(o+"coloraxis");if(v){var x=Nnt(r,"contour")&&MO.nestedProperty(r,"contours.coloring").get()||"heatmap",b=d[v];b?(b[2].push(h),b[0]!==x&&(b[0]=!1,MO.warn(["Ignoring coloraxis:",v,"setting","as it is linked to incompatible colorscales."].join(" ")))):d[v]=[x,r,[h]];return}}var g=u[s+"min"],E=u[s+"max"],k=Oae(g)&&Oae(E)&&g{"use strict";var Uae=Mr(),Unt=Vs(),Vae=gO(),Vnt=Uh();Hae.exports=function(t,r){function n(f,h){return Uae.coerce(t,r,Vae,f,h)}n("colorscale.sequential"),n("colorscale.sequentialminus"),n("colorscale.diverging");var i=r._colorAxes,a,o;function s(f,h){return Uae.coerce(a,o,Vae.coloraxis,f,h)}for(var l in i){var u=i[l];if(u[0])a=t[l]||{},o=Unt.newContainer(r,l,"coloraxis"),o._name=l,Vnt(a,o,r,s,{prefix:"",cLetter:"c"});else{for(var c=0;c{"use strict";var Hnt=Mr(),Gnt=Dv().hasColorscale,jnt=Dv().extractOpts;jae.exports=function(t,r){function n(c,f){var h=c["_"+f];h!==void 0&&(c[f]=h)}function i(c,f){var h=f.container?Hnt.nestedProperty(c,f.container).get():c;if(h)if(h.coloraxis)h._colorAx=r[h.coloraxis];else{var d=jnt(h),v=d.auto;(v||d.min===void 0)&&n(h,f.min),(v||d.max===void 0)&&n(h,f.max),d.autocolorscale&&n(h,"colorscale")}}for(var a=0;a{"use strict";var Zae=uo(),EO=Mr(),Wnt=Dv().extractOpts;Xae.exports=function(t,r,n){var i=t._fullLayout,a=n.vals,o=n.containerStr,s=o?EO.nestedProperty(r,o).get():r,l=Wnt(s),u=l.auto!==!1,c=l.min,f=l.max,h=l.mid,d=function(){return EO.aggNums(Math.min,null,a)},v=function(){return EO.aggNums(Math.max,null,a)};if(c===void 0?c=d():u&&(s._colorAx&&Zae(c)?c=Math.min(c,d()):c=d()),f===void 0?f=v():u&&(s._colorAx&&Zae(f)?f=Math.max(f,v()):f=v()),u&&h!==void 0&&(f-h>h-c?c=h-(f-h):f-h=0?x=i.colorscale.sequential:x=i.colorscale.sequentialminus,l._sync("colorscale",x)}}});var Mu=ye((nrr,Yae)=>{"use strict";var $6=sb(),A3=Dv();Yae.exports={moduleType:"component",name:"colorscale",attributes:Kl(),layoutAttributes:gO(),supplyLayoutDefaults:Gae(),handleDefaults:Uh(),crossTraceDefaults:Wae(),calc:zv(),scales:$6.scales,defaultScale:$6.defaultScale,getScale:$6.get,isValidScale:$6.isValid,hasColorscale:A3.hasColorscale,extractOpts:A3.extractOpts,extractScale:A3.extractScale,flipScale:A3.flipScale,makeColorScaleFunc:A3.makeColorScaleFunc,makeColorScaleFuncFromTrace:A3.makeColorScaleFuncFromTrace}});var lu=ye((arr,Jae)=>{"use strict";var Kae=Mr(),Znt=vv().isTypedArraySpec;Jae.exports={hasLines:function(e){return e.visible&&e.mode&&e.mode.indexOf("lines")!==-1},hasMarkers:function(e){return e.visible&&(e.mode&&e.mode.indexOf("markers")!==-1||e.type==="splom")},hasText:function(e){return e.visible&&e.mode&&e.mode.indexOf("text")!==-1},isBubble:function(e){var t=e.marker;return Kae.isPlainObject(t)&&(Kae.isArrayOrTypedArray(t.size)||Znt(t.size))}}});var S3=ye((orr,$ae)=>{"use strict";var Xnt=uo();$ae.exports=function(t,r){r||(r=2);var n=t.marker,i=n.sizeref||1,a=n.sizemin||0,o=n.sizemode==="area"?function(s){return Math.sqrt(s/i)}:function(s){return s/i};return function(s){var l=o(s/r);return Xnt(l)&&l>0?Math.max(l,a):0}}});var rp=ye(pv=>{"use strict";var Qae=Mr();pv.getSubplot=function(e){return e.subplot||e.xaxis+e.yaxis||e.geo};pv.isTraceInSubplots=function(e,t){if(e.type==="splom"){for(var r=e.xaxes||[],n=e.yaxes||[],i=0;i=0&&r.index{roe.exports=Qnt;var kO={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},$nt=/([astvzqmhlc])([^astvzqmhlc]*)/ig;function Qnt(e){var t=[];return e.replace($nt,function(r,n,i){var a=n.toLowerCase();for(i=tat(i),a=="m"&&i.length>2&&(t.push([n].concat(i.splice(0,2))),a="l",n=n=="m"?"l":"L");;){if(i.length==kO[a])return i.unshift(n),t.push(i);if(i.length{"use strict";var rat=XS(),Yn=function(e,t){return t?Math.round(e*(t=Math.pow(10,t)))/t:Math.round(e)},ts="M0,0Z",ioe=Math.sqrt(2),i_=Math.sqrt(3),CO=Math.PI,LO=Math.cos,PO=Math.sin;loe.exports={circle:{n:0,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i="M"+n+",0A"+n+","+n+" 0 1,1 0,-"+n+"A"+n+","+n+" 0 0,1 "+n+",0Z";return r?is(t,r,i):i}},square:{n:1,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"H-"+n+"V-"+n+"H"+n+"Z")}},diamond:{n:2,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.3,2);return is(t,r,"M"+n+",0L0,"+n+"L-"+n+",0L0,-"+n+"Z")}},cross:{n:3,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.4,2),i=Yn(e*1.2,2);return is(t,r,"M"+i+","+n+"H"+n+"V"+i+"H-"+n+"V"+n+"H-"+i+"V-"+n+"H-"+n+"V-"+i+"H"+n+"V-"+n+"H"+i+"Z")}},x:{n:4,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.8/ioe,2),i="l"+n+","+n,a="l"+n+",-"+n,o="l-"+n+",-"+n,s="l-"+n+","+n;return is(t,r,"M0,"+n+i+a+o+a+o+s+o+s+i+s+i+"Z")}},"triangle-up":{n:5,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2/i_,2),i=Yn(e/2,2),a=Yn(e,2);return is(t,r,"M-"+n+","+i+"H"+n+"L0,-"+a+"Z")}},"triangle-down":{n:6,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2/i_,2),i=Yn(e/2,2),a=Yn(e,2);return is(t,r,"M-"+n+",-"+i+"H"+n+"L0,"+a+"Z")}},"triangle-left":{n:7,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2/i_,2),i=Yn(e/2,2),a=Yn(e,2);return is(t,r,"M"+i+",-"+n+"V"+n+"L-"+a+",0Z")}},"triangle-right":{n:8,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2/i_,2),i=Yn(e/2,2),a=Yn(e,2);return is(t,r,"M-"+i+",-"+n+"V"+n+"L"+a+",0Z")}},"triangle-ne":{n:9,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.6,2),i=Yn(e*1.2,2);return is(t,r,"M-"+i+",-"+n+"H"+n+"V"+i+"Z")}},"triangle-se":{n:10,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.6,2),i=Yn(e*1.2,2);return is(t,r,"M"+n+",-"+i+"V"+n+"H-"+i+"Z")}},"triangle-sw":{n:11,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.6,2),i=Yn(e*1.2,2);return is(t,r,"M"+i+","+n+"H-"+n+"V-"+i+"Z")}},"triangle-nw":{n:12,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.6,2),i=Yn(e*1.2,2);return is(t,r,"M-"+n+","+i+"V-"+n+"H"+i+"Z")}},pentagon:{n:13,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.951,2),i=Yn(e*.588,2),a=Yn(-e,2),o=Yn(e*-.309,2),s=Yn(e*.809,2);return is(t,r,"M"+n+","+o+"L"+i+","+s+"H-"+i+"L-"+n+","+o+"L0,"+a+"Z")}},hexagon:{n:14,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e/2,2),a=Yn(e*i_/2,2);return is(t,r,"M"+a+",-"+i+"V"+i+"L0,"+n+"L-"+a+","+i+"V-"+i+"L0,-"+n+"Z")}},hexagon2:{n:15,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e/2,2),a=Yn(e*i_/2,2);return is(t,r,"M-"+i+","+a+"H"+i+"L"+n+",0L"+i+",-"+a+"H-"+i+"L-"+n+",0Z")}},octagon:{n:16,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.924,2),i=Yn(e*.383,2);return is(t,r,"M-"+i+",-"+n+"H"+i+"L"+n+",-"+i+"V"+i+"L"+i+","+n+"H-"+i+"L-"+n+","+i+"V-"+i+"Z")}},star:{n:17,f:function(e,t,r){if(rs(t))return ts;var n=e*1.4,i=Yn(n*.225,2),a=Yn(n*.951,2),o=Yn(n*.363,2),s=Yn(n*.588,2),l=Yn(-n,2),u=Yn(n*-.309,2),c=Yn(n*.118,2),f=Yn(n*.809,2),h=Yn(n*.382,2);return is(t,r,"M"+i+","+u+"H"+a+"L"+o+","+c+"L"+s+","+f+"L0,"+h+"L-"+s+","+f+"L-"+o+","+c+"L-"+a+","+u+"H-"+i+"L0,"+l+"Z")}},hexagram:{n:18,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.66,2),i=Yn(e*.38,2),a=Yn(e*.76,2);return is(t,r,"M-"+a+",0l-"+i+",-"+n+"h"+a+"l"+i+",-"+n+"l"+i+","+n+"h"+a+"l-"+i+","+n+"l"+i+","+n+"h-"+a+"l-"+i+","+n+"l-"+i+",-"+n+"h-"+a+"Z")}},"star-triangle-up":{n:19,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*i_*.8,2),i=Yn(e*.8,2),a=Yn(e*1.6,2),o=Yn(e*4,2),s="A "+o+","+o+" 0 0 1 ";return is(t,r,"M-"+n+","+i+s+n+","+i+s+"0,-"+a+s+"-"+n+","+i+"Z")}},"star-triangle-down":{n:20,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*i_*.8,2),i=Yn(e*.8,2),a=Yn(e*1.6,2),o=Yn(e*4,2),s="A "+o+","+o+" 0 0 1 ";return is(t,r,"M"+n+",-"+i+s+"-"+n+",-"+i+s+"0,"+a+s+n+",-"+i+"Z")}},"star-square":{n:21,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.1,2),i=Yn(e*2,2),a="A "+i+","+i+" 0 0 1 ";return is(t,r,"M-"+n+",-"+n+a+"-"+n+","+n+a+n+","+n+a+n+",-"+n+a+"-"+n+",-"+n+"Z")}},"star-diamond":{n:22,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.4,2),i=Yn(e*1.9,2),a="A "+i+","+i+" 0 0 1 ";return is(t,r,"M-"+n+",0"+a+"0,"+n+a+n+",0"+a+"0,-"+n+a+"-"+n+",0Z")}},"diamond-tall":{n:23,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*.7,2),i=Yn(e*1.4,2);return is(t,r,"M0,"+i+"L"+n+",0L0,-"+i+"L-"+n+",0Z")}},"diamond-wide":{n:24,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.4,2),i=Yn(e*.7,2);return is(t,r,"M0,"+i+"L"+n+",0L0,-"+i+"L-"+n+",0Z")}},hourglass:{n:25,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"H-"+n+"L"+n+",-"+n+"H-"+n+"Z")},noDot:!0},bowtie:{n:26,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"V-"+n+"L-"+n+","+n+"V-"+n+"Z")},noDot:!0},"circle-cross":{n:27,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M0,"+n+"V-"+n+"M"+n+",0H-"+n+"M"+n+",0A"+n+","+n+" 0 1,1 0,-"+n+"A"+n+","+n+" 0 0,1 "+n+",0Z")},needLine:!0,noDot:!0},"circle-x":{n:28,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e/ioe,2);return is(t,r,"M"+i+","+i+"L-"+i+",-"+i+"M"+i+",-"+i+"L-"+i+","+i+"M"+n+",0A"+n+","+n+" 0 1,1 0,-"+n+"A"+n+","+n+" 0 0,1 "+n+",0Z")},needLine:!0,noDot:!0},"square-cross":{n:29,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M0,"+n+"V-"+n+"M"+n+",0H-"+n+"M"+n+","+n+"H-"+n+"V-"+n+"H"+n+"Z")},needLine:!0,noDot:!0},"square-x":{n:30,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"L-"+n+",-"+n+"M"+n+",-"+n+"L-"+n+","+n+"M"+n+","+n+"H-"+n+"V-"+n+"H"+n+"Z")},needLine:!0,noDot:!0},"diamond-cross":{n:31,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.3,2);return is(t,r,"M"+n+",0L0,"+n+"L-"+n+",0L0,-"+n+"ZM0,-"+n+"V"+n+"M-"+n+",0H"+n)},needLine:!0,noDot:!0},"diamond-x":{n:32,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.3,2),i=Yn(e*.65,2);return is(t,r,"M"+n+",0L0,"+n+"L-"+n+",0L0,-"+n+"ZM-"+i+",-"+i+"L"+i+","+i+"M-"+i+","+i+"L"+i+",-"+i)},needLine:!0,noDot:!0},"cross-thin":{n:33,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.4,2);return is(t,r,"M0,"+n+"V-"+n+"M"+n+",0H-"+n)},needLine:!0,noDot:!0,noFill:!0},"x-thin":{n:34,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"L-"+n+",-"+n+"M"+n+",-"+n+"L-"+n+","+n)},needLine:!0,noDot:!0,noFill:!0},asterisk:{n:35,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.2,2),i=Yn(e*.85,2);return is(t,r,"M0,"+n+"V-"+n+"M"+n+",0H-"+n+"M"+i+","+i+"L-"+i+",-"+i+"M"+i+",-"+i+"L-"+i+","+i)},needLine:!0,noDot:!0,noFill:!0},hash:{n:36,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e/2,2),i=Yn(e,2);return is(t,r,"M"+n+","+i+"V-"+i+"M"+(n-i)+",-"+i+"V"+i+"M"+i+","+n+"H-"+i+"M-"+i+","+(n-i)+"H"+i)},needLine:!0,noFill:!0},"y-up":{n:37,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.2,2),i=Yn(e*1.6,2),a=Yn(e*.8,2);return is(t,r,"M-"+n+","+a+"L0,0M"+n+","+a+"L0,0M0,-"+i+"L0,0")},needLine:!0,noDot:!0,noFill:!0},"y-down":{n:38,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.2,2),i=Yn(e*1.6,2),a=Yn(e*.8,2);return is(t,r,"M-"+n+",-"+a+"L0,0M"+n+",-"+a+"L0,0M0,"+i+"L0,0")},needLine:!0,noDot:!0,noFill:!0},"y-left":{n:39,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.2,2),i=Yn(e*1.6,2),a=Yn(e*.8,2);return is(t,r,"M"+a+","+n+"L0,0M"+a+",-"+n+"L0,0M-"+i+",0L0,0")},needLine:!0,noDot:!0,noFill:!0},"y-right":{n:40,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.2,2),i=Yn(e*1.6,2),a=Yn(e*.8,2);return is(t,r,"M-"+a+","+n+"L0,0M-"+a+",-"+n+"L0,0M"+i+",0L0,0")},needLine:!0,noDot:!0,noFill:!0},"line-ew":{n:41,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.4,2);return is(t,r,"M"+n+",0H-"+n)},needLine:!0,noDot:!0,noFill:!0},"line-ns":{n:42,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*1.4,2);return is(t,r,"M0,"+n+"V-"+n)},needLine:!0,noDot:!0,noFill:!0},"line-ne":{n:43,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+",-"+n+"L-"+n+","+n)},needLine:!0,noDot:!0,noFill:!0},"line-nw":{n:44,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2);return is(t,r,"M"+n+","+n+"L-"+n+",-"+n)},needLine:!0,noDot:!0,noFill:!0},"arrow-up":{n:45,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e*2,2);return is(t,r,"M0,0L-"+n+","+i+"H"+n+"Z")},backoff:1,noDot:!0},"arrow-down":{n:46,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e*2,2);return is(t,r,"M0,0L-"+n+",-"+i+"H"+n+"Z")},noDot:!0},"arrow-left":{n:47,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2,2),i=Yn(e,2);return is(t,r,"M0,0L"+n+",-"+i+"V"+i+"Z")},noDot:!0},"arrow-right":{n:48,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2,2),i=Yn(e,2);return is(t,r,"M0,0L-"+n+",-"+i+"V"+i+"Z")},noDot:!0},"arrow-bar-up":{n:49,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e*2,2);return is(t,r,"M-"+n+",0H"+n+"M0,0L-"+n+","+i+"H"+n+"Z")},backoff:1,needLine:!0,noDot:!0},"arrow-bar-down":{n:50,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e,2),i=Yn(e*2,2);return is(t,r,"M-"+n+",0H"+n+"M0,0L-"+n+",-"+i+"H"+n+"Z")},needLine:!0,noDot:!0},"arrow-bar-left":{n:51,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2,2),i=Yn(e,2);return is(t,r,"M0,-"+i+"V"+i+"M0,0L"+n+",-"+i+"V"+i+"Z")},needLine:!0,noDot:!0},"arrow-bar-right":{n:52,f:function(e,t,r){if(rs(t))return ts;var n=Yn(e*2,2),i=Yn(e,2);return is(t,r,"M0,-"+i+"V"+i+"M0,0L-"+n+",-"+i+"V"+i+"Z")},needLine:!0,noDot:!0},arrow:{n:53,f:function(e,t,r){if(rs(t))return ts;var n=CO/2.5,i=2*e*LO(n),a=2*e*PO(n);return is(t,r,"M0,0L"+-i+","+a+"L"+i+","+a+"Z")},backoff:.9,noDot:!0},"arrow-wide":{n:54,f:function(e,t,r){if(rs(t))return ts;var n=CO/4,i=2*e*LO(n),a=2*e*PO(n);return is(t,r,"M0,0L"+-i+","+a+"A "+2*e+","+2*e+" 0 0 1 "+i+","+a+"Z")},backoff:.4,noDot:!0}};function rs(e){return e===null}var noe,aoe,ooe,soe;function is(e,t,r){if((!e||e%360===0)&&!t)return r;if(ooe===e&&soe===t&&noe===r)return aoe;ooe=e,soe=t,noe=r;function n(b,g){var E=LO(b),k=PO(b),A=g[0],L=g[1]+(t||0);return[A*E-L*k,A*k+L*E]}for(var i=e/180*CO,a=0,o=0,s=rat(r),l="",u=0;u{"use strict";var od=xa(),du=Mr(),iat=du.numberFormat,Ab=uo(),qO=id(),eL=ba(),Xd=va(),nat=Mu(),KS=du.strTranslate,tL=Ll(),aat=Zp(),oat=Nh(),sat=oat.LINE_SPACING,_oe=N1().DESELECTDIM,lat=lu(),uat=S3(),cat=rp().appendArrayPointValue,na=Coe.exports={};na.font=function(e,t){var r=t.variant,n=t.style,i=t.weight,a=t.color,o=t.size,s=t.family,l=t.shadow,u=t.lineposition,c=t.textcase;s&&e.style("font-family",s),o+1&&e.style("font-size",o+"px"),a&&e.call(Xd.fill,a),i&&e.style("font-weight",i),n&&e.style("font-style",n),r&&e.style("font-variant",r),c&&e.style("text-transform",IO(hat(c))),l&&e.style("text-shadow",l==="auto"?tL.makeTextShadow(Xd.contrast(a)):IO(l)),u&&e.style("text-decoration-line",IO(dat(u)))};function IO(e){return e==="none"?void 0:e}var fat={normal:"none",lower:"lowercase",upper:"uppercase","word caps":"capitalize"};function hat(e){return fat[e]}function dat(e){return e.replace("under","underline").replace("over","overline").replace("through","line-through").split("+").join(" ")}na.setPosition=function(e,t,r){e.attr("x",t).attr("y",r)};na.setSize=function(e,t,r){e.attr("width",t).attr("height",r)};na.setRect=function(e,t,r,n,i){e.call(na.setPosition,t,r).call(na.setSize,n,i)};na.translatePoint=function(e,t,r,n){var i=r.c2p(e.x),a=n.c2p(e.y);if(Ab(i)&&Ab(a)&&t.node())t.node().nodeName==="text"?t.attr("x",i).attr("y",a):t.attr("transform",KS(i,a));else return!1;return!0};na.translatePoints=function(e,t,r){e.each(function(n){var i=od.select(this);na.translatePoint(n,i,t,r)})};na.hideOutsideRangePoint=function(e,t,r,n,i,a){t.attr("display",r.isPtWithinRange(e,i)&&n.isPtWithinRange(e,a)?null:"none")};na.hideOutsideRangePoints=function(e,t){if(t._hasClipOnAxisFalse){var r=t.xaxis,n=t.yaxis;e.each(function(i){var a=i[0].trace,o=a.xcalendar,s=a.ycalendar,l=eL.traceIs(a,"bar-like")?".bartext":".point,.textpoint";e.selectAll(l).each(function(u){na.hideOutsideRangePoint(u,od.select(this),r,n,o,s)})})}};na.crispRound=function(e,t,r){return!t||!Ab(t)?r||0:e._context.staticPlot?t:t<1?1:Math.round(t)};na.singleLineStyle=function(e,t,r,n,i){t.style("fill","none");var a=(((e||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,s=i||a.dash||"";Xd.stroke(t,n||a.color),na.dashLine(t,s,o)};na.lineGroupStyle=function(e,t,r,n){e.style("fill","none").each(function(i){var a=(((i||[])[0]||{}).trace||{}).line||{},o=t||a.width||0,s=n||a.dash||"";od.select(this).call(Xd.stroke,r||a.color).call(na.dashLine,s,o)})};na.dashLine=function(e,t,r){r=+r||0,t=na.dashStyle(t,r),e.style({"stroke-dasharray":t,"stroke-width":r+"px"})};na.dashStyle=function(e,t){t=+t||1;var r=Math.max(t,3);return e==="solid"?e="":e==="dot"?e=r+"px,"+r+"px":e==="dash"?e=3*r+"px,"+3*r+"px":e==="longdash"?e=5*r+"px,"+5*r+"px":e==="dashdot"?e=3*r+"px,"+r+"px,"+r+"px,"+r+"px":e==="longdashdot"&&(e=5*r+"px,"+2*r+"px,"+r+"px,"+2*r+"px"),e};function xoe(e,t,r,n){var i=t.fillpattern,a=t.fillgradient,o=i&&na.getPatternAttr(i.shape,0,"");if(o){var s=na.getPatternAttr(i.bgcolor,0,null),l=na.getPatternAttr(i.fgcolor,0,null),u=i.fgopacity,c=na.getPatternAttr(i.size,0,8),f=na.getPatternAttr(i.solidity,0,.3),h=t.uid;na.pattern(e,"point",r,h,o,c,f,void 0,i.fillmode,s,l,u)}else if(a&&a.type!=="none"){var d=a.type,v="scatterfill-"+t.uid;if(n&&(v="legendfill-"+t.uid),!n&&(a.start!==void 0||a.stop!==void 0)){var x,b;d==="horizontal"?(x={x:a.start,y:0},b={x:a.stop,y:0}):d==="vertical"&&(x={x:0,y:a.start},b={x:0,y:a.stop}),x.x=t._xA.c2p(x.x===void 0?t._extremes.x.min[0].val:x.x,!0),x.y=t._yA.c2p(x.y===void 0?t._extremes.y.min[0].val:x.y,!0),b.x=t._xA.c2p(b.x===void 0?t._extremes.x.max[0].val:b.x,!0),b.y=t._yA.c2p(b.y===void 0?t._extremes.y.max[0].val:b.y,!0),e.call(Toe,r,v,"linear",a.colorscale,"fill",x,b,!0,!1)}else d==="horizontal"&&(d=d+"reversed"),e.call(na.gradient,r,v,d,a.colorscale,"fill")}else t.fillcolor&&e.call(Xd.fill,t.fillcolor)}na.singleFillStyle=function(e,t){var r=od.select(e.node()),n=r.data(),i=((n[0]||[])[0]||{}).trace||{};xoe(e,i,t,!1)};na.fillGroupStyle=function(e,t,r){e.style("stroke-width",0).each(function(n){var i=od.select(this);n[0].trace&&xoe(i,n[0].trace,t,r)})};var coe=uoe();na.symbolNames=[];na.symbolFuncs=[];na.symbolBackOffs=[];na.symbolNeedLines={};na.symbolNoDot={};na.symbolNoFill={};na.symbolList=[];Object.keys(coe).forEach(function(e){var t=coe[e],r=t.n;na.symbolList.push(r,String(r),e,r+100,String(r+100),e+"-open"),na.symbolNames[r]=e,na.symbolFuncs[r]=t.f,na.symbolBackOffs[r]=t.backoff||0,t.needLine&&(na.symbolNeedLines[r]=!0),t.noDot?na.symbolNoDot[r]=!0:na.symbolList.push(r+200,String(r+200),e+"-dot",r+300,String(r+300),e+"-open-dot"),t.noFill&&(na.symbolNoFill[r]=!0)});var vat=na.symbolNames.length,pat="M0,0.5L0.5,0L0,-0.5L-0.5,0Z";na.symbolNumber=function(e){if(Ab(e))e=+e;else if(typeof e=="string"){var t=0;e.indexOf("-open")>0&&(t=100,e=e.replace("-open","")),e.indexOf("-dot")>0&&(t+=200,e=e.replace("-dot","")),e=na.symbolNames.indexOf(e),e>=0&&(e+=t)}return e%100>=vat||e>=400?0:Math.floor(Math.max(e,0))};function boe(e,t,r,n){var i=e%100;return na.symbolFuncs[i](t,r,n)+(e>=200?pat:"")}var foe=iat("~f"),woe={radial:{type:"radial"},radialreversed:{type:"radial",reversed:!0},horizontal:{type:"linear",start:{x:1,y:0},stop:{x:0,y:0}},horizontalreversed:{type:"linear",start:{x:1,y:0},stop:{x:0,y:0},reversed:!0},vertical:{type:"linear",start:{x:0,y:1},stop:{x:0,y:0}},verticalreversed:{type:"linear",start:{x:0,y:1},stop:{x:0,y:0},reversed:!0}};na.gradient=function(e,t,r,n,i,a){var o=woe[n];return Toe(e,t,r,o.type,i,a,o.start,o.stop,!1,o.reversed)};function Toe(e,t,r,n,i,a,o,s,l,u){var c=i.length,f;n==="linear"?f={node:"linearGradient",attrs:{x1:o.x,y1:o.y,x2:s.x,y2:s.y,gradientUnits:l?"userSpaceOnUse":"objectBoundingBox"},reversed:u}:n==="radial"&&(f={node:"radialGradient",reversed:u});for(var h=new Array(c),d=0;d=0&&e.i===void 0&&(e.i=a.i),t.style("opacity",n.selectedOpacityFn?n.selectedOpacityFn(e):e.mo===void 0?o.opacity:e.mo),n.ms2mrc){var l;e.ms==="various"||o.size==="various"?l=3:l=n.ms2mrc(e.ms),e.mrc=l,n.selectedSizeFn&&(l=e.mrc=n.selectedSizeFn(e));var u=na.symbolNumber(e.mx||o.symbol)||0;e.om=u%200>=100;var c=NO(e,r),f=BO(e,r);t.attr("d",boe(u,l,c,f))}var h=!1,d,v,x;if(e.so)x=s.outlierwidth,v=s.outliercolor,d=o.outliercolor;else{var b=(s||{}).width;x=(e.mlw+1||b+1||(e.trace?(e.trace.marker.line||{}).width:0)+1)-1||0,"mlc"in e?v=e.mlcc=n.lineScale(e.mlc):du.isArrayOrTypedArray(s.color)?v=Xd.defaultLine:v=s.color,du.isArrayOrTypedArray(o.color)&&(d=Xd.defaultLine,h=!0),"mc"in e?d=e.mcc=n.markerScale(e.mc):d=o.color||o.colors||"rgba(0,0,0,0)",n.selectedColorFn&&(d=n.selectedColorFn(e))}if(e.om)t.call(Xd.stroke,d).style({"stroke-width":(x||1)+"px",fill:"none"});else{t.style("stroke-width",(e.isBlank?0:x)+"px");var g=o.gradient,E=e.mgt;E?h=!0:E=g&&g.type,du.isArrayOrTypedArray(E)&&(E=E[0],woe[E]||(E=0));var k=o.pattern,A=k&&na.getPatternAttr(k.shape,e.i,"");if(E&&E!=="none"){var L=e.mgc;L?h=!0:L=g.color;var _=r.uid;h&&(_+="-"+e.i),na.gradient(t,i,_,E,[[0,L],[1,d]],"fill")}else if(A){var C=!1,M=k.fgcolor;!M&&a&&a.color&&(M=a.color,C=!0);var p=na.getPatternAttr(M,e.i,a&&a.color||null),P=na.getPatternAttr(k.bgcolor,e.i,null),T=k.fgopacity,F=na.getPatternAttr(k.size,e.i,8),q=na.getPatternAttr(k.solidity,e.i,.3);C=C||e.mcc||du.isArrayOrTypedArray(k.shape)||du.isArrayOrTypedArray(k.bgcolor)||du.isArrayOrTypedArray(k.fgcolor)||du.isArrayOrTypedArray(k.size)||du.isArrayOrTypedArray(k.solidity);var V=r.uid;C&&(V+="-"+e.i),na.pattern(t,"point",i,V,A,F,q,e.mcc,k.fillmode,P,p,T)}else du.isArrayOrTypedArray(d)?Xd.fill(t,d[e.i]):Xd.fill(t,d);x&&Xd.stroke(t,v)}};na.makePointStyleFns=function(e){var t={},r=e.marker;return t.markerScale=na.tryColorscale(r,""),t.lineScale=na.tryColorscale(r,"line"),eL.traceIs(e,"symbols")&&(t.ms2mrc=lat.isBubble(e)?uat(e):function(){return(r.size||6)/2}),e.selectedpoints&&du.extendFlat(t,na.makeSelectedPointStyleFns(e)),t};na.makeSelectedPointStyleFns=function(e){var t={},r=e.selected||{},n=e.unselected||{},i=e.marker||{},a=r.marker||{},o=n.marker||{},s=i.opacity,l=a.opacity,u=o.opacity,c=l!==void 0,f=u!==void 0;(du.isArrayOrTypedArray(s)||c||f)&&(t.selectedOpacityFn=function(A){var L=A.mo===void 0?i.opacity:A.mo;return A.selected?c?l:L:f?u:_oe*L});var h=i.color,d=a.color,v=o.color;(d||v)&&(t.selectedColorFn=function(A){var L=A.mcc||h;return A.selected?d||L:v||L});var x=i.size,b=a.size,g=o.size,E=b!==void 0,k=g!==void 0;return eL.traceIs(e,"symbols")&&(E||k)&&(t.selectedSizeFn=function(A){var L=A.mrc||x/2;return A.selected?E?b/2:L:k?g/2:L}),t};na.makeSelectedTextStyleFns=function(e){var t={},r=e.selected||{},n=e.unselected||{},i=e.textfont||{},a=r.textfont||{},o=n.textfont||{},s=i.color,l=a.color,u=o.color;return t.selectedTextColorFn=function(c){var f=c.tc||s;return c.selected?l||f:u||(l?f:Xd.addOpacity(f,_oe))},t};na.selectedPointStyle=function(e,t){if(!(!e.size()||!t.selectedpoints)){var r=na.makeSelectedPointStyleFns(t),n=t.marker||{},i=[];r.selectedOpacityFn&&i.push(function(a,o){a.style("opacity",r.selectedOpacityFn(o))}),r.selectedColorFn&&i.push(function(a,o){Xd.fill(a,r.selectedColorFn(o))}),r.selectedSizeFn&&i.push(function(a,o){var s=o.mx||n.symbol||0,l=r.selectedSizeFn(o);a.attr("d",boe(na.symbolNumber(s),l,NO(o,t),BO(o,t))),o.mrc2=l}),i.length&&e.each(function(a){for(var o=od.select(this),s=0;s0?r:0}na.textPointStyle=function(e,t,r){if(e.size()){var n;if(t.selectedpoints){var i=na.makeSelectedTextStyleFns(t);n=i.selectedTextColorFn}var a=t.texttemplate,o=r._fullLayout;e.each(function(s){var l=od.select(this),u=a?du.extractOption(s,t,"txt","texttemplate"):du.extractOption(s,t,"tx","text");if(!u&&u!==0){l.remove();return}if(a){var c=t._module.formatLabels,f=c?c(s,t,o):{},h={};cat(h,t,s.i);var d=t._meta||{};u=du.texttemplateString(u,f,o._d3locale,h,s,d)}var v=s.tp||t.textposition,x=Soe(s,t),b=n?n(s):s.tc||t.textfont.color;l.call(na.font,{family:s.tf||t.textfont.family,weight:s.tw||t.textfont.weight,style:s.ty||t.textfont.style,variant:s.tv||t.textfont.variant,textcase:s.tC||t.textfont.textcase,lineposition:s.tE||t.textfont.lineposition,shadow:s.tS||t.textfont.shadow,size:x,color:b}).text(u).call(tL.convertToTspans,r).call(Aoe,v,x,s.mrc)})}};na.selectedTextStyle=function(e,t){if(!(!e.size()||!t.selectedpoints)){var r=na.makeSelectedTextStyleFns(t);e.each(function(n){var i=od.select(this),a=r.selectedTextColorFn(n),o=n.tp||t.textposition,s=Soe(n,t);Xd.fill(i,a);var l=eL.traceIs(t,"bar-like");Aoe(i,o,s,n.mrc2||n.mrc,l)})}};var hoe=.5;na.smoothopen=function(e,t){if(e.length<3)return"M"+e.join("L");var r="M"+e[0],n=[],i;for(i=1;i=l||A>=c&&A<=l)&&(L<=f&&L>=u||L>=f&&L<=u)&&(e=[A,L])}return e}na.applyBackoff=koe;na.makeTester=function(){var e=du.ensureSingleById(od.select("body"),"svg","js-plotly-tester",function(r){r.attr(aat.svgAttrs).style({position:"absolute",left:"-10000px",top:"-10000px",width:"9000px",height:"9000px","z-index":"1"})}),t=du.ensureSingle(e,"path","js-reference-point",function(r){r.attr("d","M0,0H1V1H0Z").style({"stroke-width":0,fill:"black"})});na.tester=e,na.testref=t};na.savedBBoxes={};var DO=0,yat=1e4;na.bBox=function(e,t,r){r||(r=doe(e));var n;if(r){if(n=na.savedBBoxes[r],n)return du.extendFlat({},n)}else if(e.childNodes.length===1){var i=e.childNodes[0];if(r=doe(i),r){var a=+i.getAttribute("x")||0,o=+i.getAttribute("y")||0,s=i.getAttribute("transform");if(!s){var l=na.bBox(i,!1,r);return a&&(l.left+=a,l.right+=a),o&&(l.top+=o,l.bottom+=o),l}if(r+="~"+a+"~"+o+"~"+s,n=na.savedBBoxes[r],n)return du.extendFlat({},n)}}var u,c;t?u=e:(c=na.tester.node(),u=e.cloneNode(!0),c.appendChild(u)),od.select(u).attr("transform",null).call(tL.positionText,0,0);var f=u.getBoundingClientRect(),h=na.testref.node().getBoundingClientRect();t||c.removeChild(u);var d={height:f.height,width:f.width,left:f.left-h.left,top:f.top-h.top,right:f.right-h.left,bottom:f.bottom-h.top};return DO>=yat&&(na.savedBBoxes={},DO=0),r&&(na.savedBBoxes[r]=d),DO++,du.extendFlat({},d)};function doe(e){var t=e.getAttribute("data-unformatted");if(t!==null)return t+e.getAttribute("data-math")+e.getAttribute("text-anchor")+e.getAttribute("style")}na.setClipUrl=function(e,t,r){e.attr("clip-path",OO(t,r))};function OO(e,t){if(!e)return null;var r=t._context,n=r._exportedPlot?"":r._baseUrl||"";return n?"url('"+n+"#"+e+"')":"url(#"+e+")"}na.getTranslate=function(e){var t=/.*\btranslate\((-?\d*\.?\d*)[^-\d]*(-?\d*\.?\d*)[^\d].*/,r=e.attr?"attr":"getAttribute",n=e[r]("transform")||"",i=n.replace(t,function(a,o,s){return[o,s].join(" ")}).split(" ");return{x:+i[0]||0,y:+i[1]||0}};na.setTranslate=function(e,t,r){var n=/(\btranslate\(.*?\);?)/,i=e.attr?"attr":"getAttribute",a=e.attr?"attr":"setAttribute",o=e[i]("transform")||"";return t=t||0,r=r||0,o=o.replace(n,"").trim(),o+=KS(t,r),o=o.trim(),e[a]("transform",o),o};na.getScale=function(e){var t=/.*\bscale\((\d*\.?\d*)[^\d]*(\d*\.?\d*)[^\d].*/,r=e.attr?"attr":"getAttribute",n=e[r]("transform")||"",i=n.replace(t,function(a,o,s){return[o,s].join(" ")}).split(" ");return{x:+i[0]||1,y:+i[1]||1}};na.setScale=function(e,t,r){var n=/(\bscale\(.*?\);?)/,i=e.attr?"attr":"getAttribute",a=e.attr?"attr":"setAttribute",o=e[i]("transform")||"";return t=t||1,r=r||1,o=o.replace(n,"").trim(),o+="scale("+t+","+r+")",o=o.trim(),e[a]("transform",o),o};var _at=/\s*sc.*/;na.setPointGroupScale=function(e,t,r){if(t=t||1,r=r||1,!!e){var n=t===1&&r===1?"":"scale("+t+","+r+")";e.each(function(){var i=(this.getAttribute("transform")||"").replace(_at,"");i+=n,i=i.trim(),this.setAttribute("transform",i)})}};var xat=/translate\([^)]*\)\s*$/;na.setTextPointsScale=function(e,t,r){e&&e.each(function(){var n,i=od.select(this),a=i.select("text");if(a.node()){var o=parseFloat(a.attr("x")||0),s=parseFloat(a.attr("y")||0),l=(i.attr("transform")||"").match(xat);t===1&&r===1?n=[]:n=[KS(o,s),"scale("+t+","+r+")",KS(-o,-s)],l&&n.push(l),i.attr("transform",n.join(""))}})};function BO(e,t){var r;return e&&(r=e.mf),r===void 0&&(r=t.marker&&t.marker.standoff||0),!t._geo&&!t._xA?-r:r}na.getMarkerStandoff=BO;var YS=Math.atan2,bb=Math.cos,E3=Math.sin;function voe(e,t){var r=t[0],n=t[1];return[r*bb(e)-n*E3(e),r*E3(e)+n*bb(e)]}var poe,goe,moe,yoe,zO,FO;function NO(e,t){var r=e.ma;r===void 0&&(r=t.marker.angle,(!r||du.isArrayOrTypedArray(r))&&(r=0));var n,i,a=t.marker.angleref;if(a==="previous"||a==="north"){if(t._geo){var o=t._geo.project(e.lonlat);n=o[0],i=o[1]}else{var s=t._xA,l=t._yA;if(s&&l)n=s.c2p(e.x),i=l.c2p(e.y);else return 90}if(t._geo){var u=e.lonlat[0],c=e.lonlat[1],f=t._geo.project([u,c+1e-5]),h=t._geo.project([u+1e-5,c]),d=YS(h[1]-i,h[0]-n),v=YS(f[1]-i,f[0]-n),x;if(a==="north")x=r/180*Math.PI;else if(a==="previous"){var b=u/180*Math.PI,g=c/180*Math.PI,E=poe/180*Math.PI,k=goe/180*Math.PI,A=E-b,L=bb(k)*E3(A),_=E3(k)*bb(g)-bb(k)*E3(g)*bb(A);x=-YS(L,_)-Math.PI,poe=u,goe=c}var C=voe(d,[bb(x),0]),M=voe(v,[E3(x),0]);r=YS(C[1]+M[1],C[0]+M[0])/Math.PI*180,a==="previous"&&!(FO===t.uid&&e.i===zO+1)&&(r=null)}if(a==="previous"&&!t._geo)if(FO===t.uid&&e.i===zO+1&&Ab(n)&&Ab(i)){var p=n-moe,P=i-yoe,T=t.line&&t.line.shape||"",F=T.slice(T.length-1);F==="h"&&(P=0),F==="v"&&(p=0),r+=YS(P,p)/Math.PI*180+90}else r=null}return moe=n,yoe=i,zO=e.i,FO=t.uid,r}na.getMarkerAngle=NO});var Mb=ye((frr,Roe)=>{"use strict";var k3=xa(),bat=uo(),wat=Xu(),UO=ba(),Sb=Mr(),Loe=Sb.strTranslate,rL=ao(),iL=va(),C3=Ll(),Poe=N1(),Tat=Nh().OPPOSITE_SIDE,Ioe=/ [XY][0-9]* /,VO=1.6,HO=1.6;function Aat(e,t,r){var n=e._fullLayout,i=r.propContainer,a=r.propName,o=r.placeholder,s=r.traceIndex,l=r.avoid||{},u=r.attributes,c=r.transform,f=r.containerGroup,h=1,d=i.title,v=(d&&d.text?d.text:"").trim(),x=!1,b=d&&d.font?d.font:{},g=b.family,E=b.size,k=b.color,A=b.weight,L=b.style,_=b.variant,C=b.textcase,M=b.lineposition,p=b.shadow,P=r.subtitlePropName,T=!!P,F=r.subtitlePlaceholder,q=(i.title||{}).subtitle||{text:"",font:{}},V=q.text.trim(),H=!1,X=1,G=q.font,N=G.family,W=G.size,re=G.color,ae=G.weight,_e=G.style,Me=G.variant,ke=G.textcase,ge=G.lineposition,ie=G.shadow,Te;a==="title.text"?Te="titleText":a.indexOf("axis")!==-1?Te="axisTitleText":a.indexOf("colorbar"!==-1)&&(Te="colorbarTitleText");var Ee=e._context.edits[Te];function Ae(kt,Ct){return kt===void 0||Ct===void 0?!1:kt.replace(Ioe," % ")===Ct.replace(Ioe," % ")}v===""?h=0:Ae(v,o)&&(Ee||(v=""),h=.2,x=!0),T&&(V===""?X=0:Ae(V,F)&&(Ee||(V=""),X=.2,H=!0)),r._meta?v=Sb.templateString(v,r._meta):n._meta&&(v=Sb.templateString(v,n._meta));var ze=v||V||Ee,Ce;f||(f=Sb.ensureSingle(n._infolayer,"g","g-"+t),Ce=n._hColorbarMoveTitle);var me=f.selectAll("text."+t).data(ze?[0]:[]);me.enter().append("text"),me.text(v).attr("class",t),me.exit().remove();var Re=null,ce=t+"-subtitle",Ge=V||Ee;if(T&&Ge&&(Re=f.selectAll("text."+ce).data(Ge?[0]:[]),Re.enter().append("text"),Re.text(V).attr("class",ce),Re.exit().remove()),!ze)return f;function nt(kt,Ct){Sb.syncOrAsync([ct,qt],{title:kt,subtitle:Ct})}function ct(kt){var Ct=kt.title,Yt=kt.subtitle,xr;!c&&Ce&&(c={}),c?(xr="",c.rotate&&(xr+="rotate("+[c.rotate,u.x,u.y]+")"),(c.offset||Ce)&&(xr+=Loe(0,(c.offset||0)-(Ce||0)))):xr=null,Ct.attr("transform",xr);function er(Et){if(Et){var dt=k3.select(Et.node().parentNode).select("."+ce);if(!dt.empty()){var Ht=Et.node().getBBox();if(Ht.height){var $t=Ht.y+Ht.height+VO*W;dt.attr("y",$t)}}}}if(Ct.style("opacity",h*iL.opacity(k)).call(rL.font,{color:iL.rgb(k),size:k3.round(E,2),family:g,weight:A,style:L,variant:_,textcase:C,shadow:p,lineposition:M}).attr(u).call(C3.convertToTspans,e,er),Yt){var Ke=f.select("."+t+"-math-group"),xt=Ct.node().getBBox(),bt=Ke.node()?Ke.node().getBBox():void 0,Lt=bt?bt.y+bt.height+VO*W:xt.y+xt.height+HO*W,St=Sb.extendFlat({},u,{y:Lt});Yt.attr("transform",xr),Yt.style("opacity",X*iL.opacity(re)).call(rL.font,{color:iL.rgb(re),size:k3.round(W,2),family:N,weight:ae,style:_e,variant:Me,textcase:ke,shadow:ie,lineposition:ge}).attr(St).call(C3.convertToTspans,e)}return wat.previousPromises(e)}function qt(kt){var Ct=kt.title,Yt=k3.select(Ct.node().parentNode);if(l&&l.selection&&l.side&&v){Yt.attr("transform",null);var xr=Tat[l.side],er=l.side==="left"||l.side==="top"?-1:1,Ke=bat(l.pad)?l.pad:2,xt=rL.bBox(Yt.node()),bt={t:0,b:0,l:0,r:0},Lt=e._fullLayout._reservedMargin;for(var St in Lt)for(var Et in Lt[St]){var dt=Lt[St][Et];bt[Et]=Math.max(bt[Et],dt)}var Ht={left:bt.l,top:bt.t,right:n.width-bt.r,bottom:n.height-bt.b},$t=l.maxShift||er*(Ht[l.side]-xt[l.side]),fr=0;if($t<0)fr=$t;else{var _r=l.offsetLeft||0,Br=l.offsetTop||0;xt.left-=_r,xt.right-=_r,xt.top-=Br,xt.bottom-=Br,l.selection.each(function(){var Nr=rL.bBox(this);Sb.bBoxIntersect(xt,Nr,Ke)&&(fr=Math.max(fr,er*(Nr[l.side]-xt[xr])+Ke))}),fr=Math.min($t,fr),i._titleScoot=Math.abs(fr)}if(fr>0||$t<0){var Or={left:[-fr,0],right:[fr,0],top:[0,-fr],bottom:[0,fr]}[l.side];Yt.attr("transform",Loe(Or[0],Or[1]))}}}me.call(nt,Re);function rt(kt,Ct){kt.text(Ct).on("mouseover.opacity",function(){k3.select(this).transition().duration(Poe.SHOW_PLACEHOLDER).style("opacity",1)}).on("mouseout.opacity",function(){k3.select(this).transition().duration(Poe.HIDE_PLACEHOLDER).style("opacity",0)})}if(Ee&&(v?me.on(".opacity",null):(rt(me,o),x=!0),me.call(C3.makeEditable,{gd:e}).on("edit",function(kt){s!==void 0?UO.call("_guiRestyle",e,a,kt,s):UO.call("_guiRelayout",e,a,kt)}).on("cancel",function(){this.text(this.attr("data-unformatted")).call(nt)}).on("input",function(kt){this.text(kt||" ").call(C3.positionText,u.x,u.y)}),T)){if(T&&!v){var ot=me.node().getBBox(),Rt=ot.y+ot.height+HO*W;Re.attr("y",Rt)}V?Re.on(".opacity",null):(rt(Re,F),H=!0),Re.call(C3.makeEditable,{gd:e}).on("edit",function(kt){UO.call("_guiRelayout",e,"title.subtitle.text",kt)}).on("cancel",function(){this.text(this.attr("data-unformatted")).call(nt)}).on("input",function(kt){this.text(kt||" ").call(C3.positionText,Re.attr("x"),Re.attr("y"))})}return me.classed("js-placeholder",x),Re&&Re.classed("js-placeholder",H),f}Roe.exports={draw:Aat,SUBTITLE_PADDING_EM:HO,SUBTITLE_PADDING_MATHJAX_EM:VO}});var ym=ye((hrr,Ooe)=>{"use strict";var Sat=xa(),Mat=e3().utcFormat,Nu=Mr(),Eat=Nu.numberFormat,gm=uo(),n_=Nu.cleanNumber,kat=Nu.ms2DateTime,Doe=Nu.dateTime2ms,mm=Nu.ensureNumber,zoe=Nu.isArrayOrTypedArray,a_=es(),nL=a_.FP_SAFE,bg=a_.BADNUM,Cat=a_.LOG_CLIP,Lat=a_.ONEWEEK,aL=a_.ONEDAY,oL=a_.ONEHOUR,Foe=a_.ONEMIN,qoe=a_.ONESEC,sL=af(),cL=ad(),lL=cL.HOUR_PATTERN,uL=cL.WEEKDAY_PATTERN;function JS(e){return Math.pow(10,e)}function GO(e){return e!=null}Ooe.exports=function(t,r){r=r||{};var n=t._id||"x",i=n.charAt(0);function a(A,L){if(A>0)return Math.log(A)/Math.LN10;if(A<=0&&L&&t.range&&t.range.length===2){var _=t.range[0],C=t.range[1];return .5*(_+C-2*Cat*Math.abs(_-C))}else return bg}function o(A,L,_,C){if((C||{}).msUTC&&gm(A))return+A;var M=Doe(A,_||t.calendar);if(M===bg)if(gm(A)){A=+A;var p=Math.floor(Nu.mod(A+.05,1)*10),P=Math.round(A-p/10);M=Doe(new Date(P))+p/10}else return bg;return M}function s(A,L,_){return kat(A,L,_||t.calendar)}function l(A){return t._categories[Math.round(A)]}function u(A){if(GO(A)){if(t._categoriesMap===void 0&&(t._categoriesMap={}),t._categoriesMap[A]!==void 0)return t._categoriesMap[A];t._categories.push(typeof A=="number"?String(A):A);var L=t._categories.length-1;return t._categoriesMap[A]=L,L}return bg}function c(A,L){for(var _=new Array(L),C=0;Ct.range[1]&&(_=!_);for(var C=_?-1:1,M=C*A,p=0,P=0;PF)p=P+1;else{p=M<(T+F)/2?P:P+1;break}}var q=t._B[p]||0;return isFinite(q)?v(A,t._m2,q):0},g=function(A){var L=t._rangebreaks.length;if(!L)return x(A,t._m,t._b);for(var _=0,C=0;Ct._rangebreaks[C].pmax&&(_=C+1);return x(A,t._m2,t._B[_])}}t.c2l=t.type==="log"?a:mm,t.l2c=t.type==="log"?JS:mm,t.l2p=b,t.p2l=g,t.c2p=t.type==="log"?function(A,L){return b(a(A,L))}:b,t.p2c=t.type==="log"?function(A){return JS(g(A))}:g,["linear","-"].indexOf(t.type)!==-1?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=n_,t.c2d=t.c2r=t.l2d=t.l2r=mm,t.d2p=t.r2p=function(A){return t.l2p(n_(A))},t.p2d=t.p2r=g,t.cleanPos=mm):t.type==="log"?(t.d2r=t.d2l=function(A,L){return a(n_(A),L)},t.r2d=t.r2c=function(A){return JS(n_(A))},t.d2c=t.r2l=n_,t.c2d=t.l2r=mm,t.c2r=a,t.l2d=JS,t.d2p=function(A,L){return t.l2p(t.d2r(A,L))},t.p2d=function(A){return JS(g(A))},t.r2p=function(A){return t.l2p(n_(A))},t.p2r=g,t.cleanPos=mm):t.type==="date"?(t.d2r=t.r2d=Nu.identity,t.d2c=t.r2c=t.d2l=t.r2l=o,t.c2d=t.c2r=t.l2d=t.l2r=s,t.d2p=t.r2p=function(A,L,_){return t.l2p(o(A,0,_))},t.p2d=t.p2r=function(A,L,_){return s(g(A),L,_)},t.cleanPos=function(A){return Nu.cleanDate(A,bg,t.calendar)}):t.type==="category"?(t.d2c=t.d2l=u,t.r2d=t.c2d=t.l2d=l,t.d2r=t.d2l_noadd=h,t.r2c=function(A){var L=d(A);return L!==void 0?L:t.fraction2r(.5)},t.l2r=t.c2r=mm,t.r2l=d,t.d2p=function(A){return t.l2p(t.r2c(A))},t.p2d=function(A){return l(g(A))},t.r2p=t.d2p,t.p2r=g,t.cleanPos=function(A){return typeof A=="string"&&A!==""?A:mm(A)}):t.type==="multicategory"&&(t.r2d=t.c2d=t.l2d=l,t.d2r=t.d2l_noadd=h,t.r2c=function(A){var L=h(A);return L!==void 0?L:t.fraction2r(.5)},t.r2c_just_indices=f,t.l2r=t.c2r=mm,t.r2l=h,t.d2p=function(A){return t.l2p(t.r2c(A))},t.p2d=function(A){return l(g(A))},t.r2p=t.d2p,t.p2r=g,t.cleanPos=function(A){return Array.isArray(A)||typeof A=="string"&&A!==""?A:mm(A)},t.setupMultiCategory=function(A){var L=t._traceIndices,_,C,M=t._matchGroup;if(M&&t._categories.length===0){for(var p in M)if(p!==n){var P=r[sL.id2name(p)];L=L.concat(P._traceIndices)}}var T=[[0,{}],[0,{}]],F=[];for(_=0;_P[1]&&(C[p?0:1]=_),C[0]===C[1]){var T=t.l2r(L),F=t.l2r(_);if(L!==void 0){var q=T+1;_!==void 0&&(q=Math.min(q,F)),C[p?1:0]=q}if(_!==void 0){var V=F+1;L!==void 0&&(V=Math.max(V,T)),C[p?0:1]=V}}}},t.cleanRange=function(A,L){t._cleanRange(A,L),t.limitRange(A)},t._cleanRange=function(A,L){L||(L={}),A||(A="range");var _=Nu.nestedProperty(t,A).get(),C,M;if(t.type==="date"?M=Nu.dfltRange(t.calendar):i==="y"?M=cL.DFLTRANGEY:t._name==="realaxis"?M=[0,1]:M=L.dfltRange||cL.DFLTRANGEX,M=M.slice(),(t.rangemode==="tozero"||t.rangemode==="nonnegative")&&(M[0]=0),!_||_.length!==2){Nu.nestedProperty(t,A).set(M);return}var p=_[0]===null,P=_[1]===null;for(t.type==="date"&&!t.autorange&&(_[0]=Nu.cleanDate(_[0],bg,t.calendar),_[1]=Nu.cleanDate(_[1],bg,t.calendar)),C=0;C<2;C++)if(t.type==="date"){if(!Nu.isDateTime(_[C],t.calendar)){t[A]=M;break}if(t.r2l(_[0])===t.r2l(_[1])){var T=Nu.constrain(t.r2l(_[0]),Nu.MIN_MS+1e3,Nu.MAX_MS-1e3);_[0]=t.l2r(T-1e3),_[1]=t.l2r(T+1e3);break}}else{if(!gm(_[C]))if(!(p||P)&&gm(_[1-C]))_[C]=_[1-C]*(C?10:.1);else{t[A]=M;break}if(_[C]<-nL?_[C]=-nL:_[C]>nL&&(_[C]=nL),_[0]===_[1]){var F=Math.max(1,Math.abs(_[0]*1e-6));_[0]-=F,_[1]+=F}}},t.setScale=function(A){var L=r._size;if(t.overlaying){var _=sL.getFromId({_fullLayout:r},t.overlaying);t.domain=_.domain}var C=A&&t._r?"_r":"range",M=t.calendar;t.cleanRange(C);var p=t.r2l(t[C][0],M),P=t.r2l(t[C][1],M),T=i==="y";if(T?(t._offset=L.t+(1-t.domain[1])*L.h,t._length=L.h*(t.domain[1]-t.domain[0]),t._m=t._length/(p-P),t._b=-t._m*P):(t._offset=L.l+t.domain[0]*L.w,t._length=L.w*(t.domain[1]-t.domain[0]),t._m=t._length/(P-p),t._b=-t._m*p),t._rangebreaks=[],t._lBreaks=0,t._m2=0,t._B=[],t.rangebreaks){var F,q;if(t._rangebreaks=t.locateBreaks(Math.min(p,P),Math.max(p,P)),t._rangebreaks.length){for(F=0;FP&&(V=!V),V&&t._rangebreaks.reverse();var H=V?-1:1;for(t._m2=H*t._length/(Math.abs(P-p)-t._lBreaks),t._B.push(-t._m2*(T?P:p)),F=0;FM&&(M+=7,pM&&(M+=24,p=C&&p=C&&A=ie.min&&(_eie.max&&(ie.max=Me),ke=!1)}ke&&P.push({min:_e,max:Me})}};for(_=0;_{"use strict";var Boe=uo(),jO=Mr(),Pat=es().BADNUM,fL=jO.isArrayOrTypedArray,Iat=jO.isDateTime,Rat=jO.cleanNumber,Noe=Math.round;Voe.exports=function(t,r,n){var i=t,a=n.noMultiCategory;if(fL(i)&&!i.length)return"-";if(!a&&Oat(i))return"multicategory";if(a&&Array.isArray(i[0])){for(var o=[],s=0;sa*2}function Uoe(e){return Math.max(1,(e-1)/1e3)}function qat(e,t){for(var r=e.length,n=Uoe(r),i=0,a=0,o={},s=0;si*2}function Oat(e){return fL(e[0])&&fL(e[1])}});var wg=ye((vrr,Koe)=>{"use strict";var Bat=xa(),Woe=uo(),o_=Mr(),hL=es().FP_SAFE,Nat=ba(),Uat=ao(),Zoe=af(),Vat=Zoe.getFromId,Hat=Zoe.isLinked;Koe.exports={applyAutorangeOptions:Yoe,getAutoRange:WO,makePadFn:ZO,doAutoRange:jat,findExtremes:Wat,concatExtremes:KO};function WO(e,t){var r,n,i=[],a=e._fullLayout,o=ZO(a,t,0),s=ZO(a,t,1),l=KO(e,t),u=l.min,c=l.max;if(u.length===0||c.length===0)return o_.simpleMap(t.range,t.r2l);var f=u[0].val,h=c[0].val;for(r=1;r0&&(P=k-o(_)-s(C),P>A?T/P>L&&(M=_,p=C,L=T/P):T/k>L&&(M={val:_.val,nopad:1},p={val:C.val,nopad:1},L=T/k));function F(G,N){return Math.max(G,s(N))}if(f===h){var q=f-1,V=f+1;if(g)if(f===0)i=[0,1];else{var H=(f>0?c:u).reduce(F,0),X=f/(1-Math.min(.5,H/k));i=f>0?[0,X]:[X,0]}else E?i=[Math.max(0,q),Math.max(1,V)]:i=[q,V]}else g?(M.val>=0&&(M={val:0,nopad:1}),p.val<=0&&(p={val:0,nopad:1})):E&&(M.val-L*o(M)<0&&(M={val:0,nopad:1}),p.val<=0&&(p={val:1,nopad:1})),L=(p.val-M.val-Hoe(t,_.val,C.val))/(k-o(M)-s(p)),i=[M.val-L*o(M),p.val+L*s(p)];return i=Yoe(i,t),t.limitRange&&t.limitRange(),v&&i.reverse(),o_.simpleMap(i,t.l2r||Number)}function Hoe(e,t,r){var n=0;if(e.rangebreaks)for(var i=e.locateBreaks(t,r),a=0;a0?r.ppadplus:r.ppadminus)||r.ppad||0),_=A((e._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),C=A(r.vpadplus||r.vpad),M=A(r.vpadminus||r.vpad);if(!u){if(E=1/0,k=-1/0,l)for(f=0;f0&&(E=h),h>k&&h-hL&&(E=h),h>k&&h=T;f--)P(f);return{min:n,max:i,opts:r}}function XO(e,t,r,n){Xoe(e,t,r,n,Zat)}function YO(e,t,r,n){Xoe(e,t,r,n,Xat)}function Xoe(e,t,r,n,i){for(var a=n.tozero,o=n.extrapad,s=!0,l=0;l=r&&(u.extrapad||!o)){s=!1;break}else i(t,u.val)&&u.pad<=r&&(o||!u.extrapad)&&(e.splice(l,1),l--)}if(s){var c=a&&t===0;e.push({val:t,pad:c?0:r,extrapad:c?!1:o})}}function joe(e){return Woe(e)&&Math.abs(e)=t}function Yat(e,t){var r=t.autorangeoptions;return r&&r.minallowed!==void 0&&dL(t,r.minallowed,r.maxallowed)?r.minallowed:r&&r.clipmin!==void 0&&dL(t,r.clipmin,r.clipmax)?Math.max(e,t.d2l(r.clipmin)):e}function Kat(e,t){var r=t.autorangeoptions;return r&&r.maxallowed!==void 0&&dL(t,r.minallowed,r.maxallowed)?r.maxallowed:r&&r.clipmax!==void 0&&dL(t,r.clipmin,r.clipmax)?Math.min(e,t.d2l(r.clipmax)):e}function dL(e,t,r){return t!==void 0&&r!==void 0?(t=e.d2l(t),r=e.d2l(r),t=l&&(a=l,r=l),o<=l&&(o=l,n=l)}}return r=Yat(r,t),n=Kat(n,t),[r,n]}});var Qa=ye((prr,yse)=>{"use strict";var w0=xa(),ph=uo(),P3=Xu(),QS=ba(),Vo=Mr(),I3=Vo.strTranslate,Eb=Ll(),Jat=Mb(),eM=va(),Xp=ao(),$at=Cd(),Joe=xO(),Yd=es(),Qat=Yd.ONEMAXYEAR,gL=Yd.ONEAVGYEAR,mL=Yd.ONEMINYEAR,eot=Yd.ONEMAXQUARTER,eB=Yd.ONEAVGQUARTER,yL=Yd.ONEMINQUARTER,tot=Yd.ONEMAXMONTH,R3=Yd.ONEAVGMONTH,_L=Yd.ONEMINMONTH,Yp=Yd.ONEWEEK,Fv=Yd.ONEDAY,s_=Fv/2,xm=Yd.ONEHOUR,tM=Yd.ONEMIN,xL=Yd.ONESEC,rot=Yd.ONEMILLI,iot=Yd.ONEMICROSEC,kb=Yd.MINUS_SIGN,TL=Yd.BADNUM,tB={K:"zeroline"},rB={K:"gridline",L:"path"},iB={K:"minor-gridline",L:"path"},lse={K:"tick",L:"path"},$oe={K:"tick",L:"text"},Qoe={width:["x","r","l","xl","xr"],height:["y","t","b","yt","yb"],right:["r","xr"],left:["l","xl"],top:["t","yt"],bottom:["b","yb"]},AL=Nh(),$S=AL.MID_SHIFT,Cb=AL.CAP_SHIFT,rM=AL.LINE_SPACING,not=AL.OPPOSITE_SIDE,bL=3,kn=yse.exports={};kn.setConvert=ym();var aot=L3(),Ay=af(),oot=Ay.idSort,sot=Ay.isLinked;kn.id2name=Ay.id2name;kn.name2id=Ay.name2id;kn.cleanId=Ay.cleanId;kn.list=Ay.list;kn.listIds=Ay.listIds;kn.getFromId=Ay.getFromId;kn.getFromTrace=Ay.getFromTrace;var use=wg();kn.getAutoRange=use.getAutoRange;kn.findExtremes=use.findExtremes;var lot=1e-4;function sB(e){var t=(e[1]-e[0])*lot;return[e[0]-t,e[1]+t]}kn.coerceRef=function(e,t,r,n,i,a){var o=n.charAt(n.length-1),s=r._fullLayout._subplots[o+"axis"],l=n+"ref",u={};return i||(i=s[0]||(typeof a=="string"?a:a[0])),a||(a=i),s=s.concat(s.map(function(c){return c+" domain"})),u[l]={valType:"enumerated",values:s.concat(a?typeof a=="string"?[a]:a:[]),dflt:i},Vo.coerce(e,t,u,l)};kn.getRefType=function(e){return e===void 0?e:e==="paper"?"paper":e==="pixel"?"pixel":/( domain)$/.test(e)?"domain":"range"};kn.coercePosition=function(e,t,r,n,i,a){var o,s,l=kn.getRefType(n);if(l!=="range")o=Vo.ensureNumber,s=r(i,a);else{var u=kn.getFromId(t,n);a=u.fraction2r(a),s=r(i,a),o=u.cleanPos}e[i]=o(s)};kn.cleanPosition=function(e,t,r){var n=r==="paper"||r==="pixel"?Vo.ensureNumber:kn.getFromId(t,r).cleanPos;return n(e)};kn.redrawComponents=function(e,t){t=t||kn.listIds(e);var r=e._fullLayout;function n(i,a,o,s){for(var l=QS.getComponentMethod(i,a),u={},c=0;c2e-6||((r-e._forceTick0)/e._minDtick%1+1.000001)%1>2e-6)&&(e._minDtick=0))};kn.saveRangeInitial=function(e,t){for(var r=kn.list(e,"",!0),n=!1,i=0;if*.3||u(n)||u(i))){var h=r.dtick/2;e+=e+ho){var s=Number(r.substr(1));a.exactYears>o&&s%12===0?e=kn.tickIncrement(e,"M6","reverse")+Fv*1.5:a.exactMonths>o?e=kn.tickIncrement(e,"M1","reverse")+Fv*15.5:e-=s_;var l=kn.tickIncrement(e,r);if(l<=n)return l}return e}kn.prepMinorTicks=function(e,t,r){if(!t.minor.dtick){delete e.dtick;var n=t.dtick&&ph(t._tmin),i;if(n){var a=kn.tickIncrement(t._tmin,t.dtick,!0);i=[t._tmin,a*.99+t._tmin*.01]}else{var o=Vo.simpleMap(t.range,t.r2l);i=[o[0],.8*o[0]+.2*o[1]]}if(e.range=Vo.simpleMap(i,t.l2r),e._isMinor=!0,kn.prepTicks(e,r),n){var s=ph(t.dtick),l=ph(e.dtick),u=s?t.dtick:+t.dtick.substring(1),c=l?e.dtick:+e.dtick.substring(1);s&&l?JO(u,c)?u===2*Yp&&c===2*Fv&&(e.dtick=Yp):u===2*Yp&&c===3*Fv?e.dtick=Yp:u===Yp&&!(t._input.minor||{}).nticks?e.dtick=Fv:rse(u/c,2.5)?e.dtick=u/2:e.dtick=u:String(t.dtick).charAt(0)==="M"?l?e.dtick="M1":JO(u,c)?u>=12&&c===2&&(e.dtick="M3"):e.dtick=t.dtick:String(e.dtick).charAt(0)==="L"?String(t.dtick).charAt(0)==="L"?JO(u,c)||(e.dtick=rse(u/c,2.5)?t.dtick/2:t.dtick):e.dtick="D1":e.dtick==="D2"&&+t.dtick>1&&(e.dtick=1)}e.range=t.range}t.minor._tick0Init===void 0&&(e.tick0=t.tick0)};function JO(e,t){return Math.abs((e/t+.5)%1-.5)<.001}function rse(e,t){return Math.abs(e/t-1)<.001}kn.prepTicks=function(e,t){var r=Vo.simpleMap(e.range,e.r2l,void 0,void 0,t);if(e.tickmode==="auto"||!e.dtick){var n=e.nticks,i;n||(e.type==="category"||e.type==="multicategory"?(i=e.tickfont?Vo.bigFont(e.tickfont.size||12):15,n=e._length/i):(i=e._id.charAt(0)==="y"?40:80,n=Vo.constrain(e._length/i,4,9)+1),e._name==="radialaxis"&&(n*=2)),e.minor&&e.minor.tickmode!=="array"||e.tickmode==="array"&&(n*=100),e._roughDTick=Math.abs(r[1]-r[0])/n,kn.autoTicks(e,e._roughDTick),e._minDtick>0&&e.dtick0?(a=n-1,o=n):(a=n,o=n);var s=e[a].value,l=e[o].value,u=Math.abs(l-s),c=r||u,f=0;c>=mL?u>=mL&&u<=Qat?f=u:f=gL:r===eB&&c>=yL?u>=yL&&u<=eot?f=u:f=eB:c>=_L?u>=_L&&u<=tot?f=u:f=R3:r===Yp&&c>=Yp?f=Yp:c>=Fv?f=Fv:r===s_&&c>=s_?f=s_:r===xm&&c>=xm&&(f=xm);var h;f>=u&&(f=u,h=!0);var d=i+f;if(t.rangebreaks&&f>0){for(var v=84,x=0,b=0;bYp&&(f=u)}(f>0||n===0)&&(e[n].periodX=i+f/2)}}kn.calcTicks=function(t,r){for(var n=t.type,i=t.calendar,a=t.ticklabelstep,o=t.ticklabelmode==="period",s=t.range[0]>t.range[1],l=!t.ticklabelindex||Vo.isArrayOrTypedArray(t.ticklabelindex)?t.ticklabelindex:[t.ticklabelindex],u=Vo.simpleMap(t.range,t.r2l,void 0,void 0,r),c=u[1]=(k?0:1);A--){var L=!A;A?(t._dtickInit=t.dtick,t._tick0Init=t.tick0):(t.minor._dtickInit=t.minor.dtick,t.minor._tick0Init=t.minor.tick0);var _=A?t:Vo.extendFlat({},t,t.minor);if(L?kn.prepMinorTicks(_,t,r):kn.prepTicks(_,r),_.tickmode==="array"){A?(b=[],v=ise(t,!L)):(g=[],x=ise(t,!L));continue}if(_.tickmode==="sync"){b=[],v=vot(t);continue}var C=sB(u),M=C[0],p=C[1],P=ph(_.dtick),T=n==="log"&&!(P||_.dtick.charAt(0)==="L"),F=kn.tickFirst(_,r);if(A){if(t._tmin=F,F=p:V<=p;V=kn.tickIncrement(V,G,c,i)){if(A&&H++,_.rangebreaks&&!c){if(V=h)break}if(b.length>d||V===q)break;q=V;var N={value:V};A?(T&&V!==(V|0)&&(N.simpleLabel=!0),a>1&&H%a&&(N.skipLabel=!0),b.push(N)):(N.minor=!0,g.push(N))}}if(!g||g.length<2)l=!1;else{var W=(g[1].value-g[0].value)*(s?-1:1);Oot(W,t.tickformat)||(l=!1)}if(!l)E=b;else{var re=b.concat(g);o&&b.length&&(re=re.slice(1)),re=re.sort(function(Rt,kt){return Rt.value-kt.value}).filter(function(Rt,kt,Ct){return kt===0||Rt.value!==Ct[kt-1].value});var ae=re.map(function(Rt,kt){return Rt.minor===void 0&&!Rt.skipLabel?kt:null}).filter(function(Rt){return Rt!==null});ae.forEach(function(Rt){l.map(function(kt){var Ct=Rt+kt;Ct>=0&&Ct-1;ze--){if(b[ze].drop){b.splice(ze,1);continue}b[ze].value=QO(b[ze].value,t);var ce=t.c2p(b[ze].value);(Ce?Re>ce-me:Reh||Yth&&(Ct.periodX=h),Yti&&hgL)t/=gL,n=i(10),e.dtick="M"+12*_m(t,n,vL);else if(a>R3)t/=R3,e.dtick="M"+_m(t,1,nse);else if(a>Fv){if(e.dtick=_m(t,Fv,e._hasDayOfWeekBreaks?[1,2,7,14]:pot),!r){var o=kn.getTickFormat(e),s=e.ticklabelmode==="period";s&&(e._rawTick0=e.tick0),/%[uVW]/.test(o)?e.tick0=Vo.dateTick0(e.calendar,2):e.tick0=Vo.dateTick0(e.calendar,1),s&&(e._dowTick0=e.tick0)}}else a>xm?e.dtick=_m(t,xm,nse):a>tM?e.dtick=_m(t,tM,ase):a>xL?e.dtick=_m(t,xL,ase):(n=i(10),e.dtick=_m(t,n,vL))}else if(e.type==="log"){e.tick0=0;var l=Vo.simpleMap(e.range,e.r2l);if(e._isMinor&&(t*=1.5),t>.7)e.dtick=Math.ceil(t);else if(Math.abs(l[1]-l[0])<1){var u=1.5*Math.abs((l[1]-l[0])/t);t=Math.abs(Math.pow(10,l[1])-Math.pow(10,l[0]))/u,n=i(10),e.dtick="L"+_m(t,n,vL)}else e.dtick=t>.3?"D2":"D1"}else e.type==="category"||e.type==="multicategory"?(e.tick0=0,e.dtick=Math.ceil(Math.max(t,1))):cB(e)?(e.tick0=0,n=1,e.dtick=_m(t,n,got)):(e.tick0=0,n=i(10),e.dtick=_m(t,n,vL));if(e.dtick===0&&(e.dtick=1),!ph(e.dtick)&&typeof e.dtick!="string"){var c=e.dtick;throw e.dtick=1,"ax.dtick error: "+String(c)}};function dse(e){var t=e.dtick;if(e._tickexponent=0,!ph(t)&&typeof t!="string"&&(t=1),(e.type==="category"||e.type==="multicategory")&&(e._tickround=null),e.type==="date"){var r=e.r2l(e.tick0),n=e.l2r(r).replace(/(^-|i)/g,""),i=n.length;if(String(t).charAt(0)==="M")i>10||n.substr(5)!=="01-01"?e._tickround="d":e._tickround=+t.substr(1)%12===0?"y":"m";else if(t>=Fv&&i<=10||t>=Fv*15)e._tickround="d";else if(t>=tM&&i<=16||t>=xm)e._tickround="M";else if(t>=xL&&i<=19||t>=tM)e._tickround="S";else{var a=e.l2r(r+t).replace(/^-/,"").length;e._tickround=Math.max(i,a)-20,e._tickround<0&&(e._tickround=4)}}else if(ph(t)||t.charAt(0)==="L"){var o=e.range.map(e.r2d||Number);ph(t)||(t=Number(t.substr(1))),e._tickround=2-Math.floor(Math.log(t)/Math.LN10+.01);var s=Math.max(Math.abs(o[0]),Math.abs(o[1])),l=Math.floor(Math.log(s)/Math.LN10+.01),u=e.minexponent===void 0?3:e.minexponent;Math.abs(l)>u&&(wL(e.exponentformat)&&!lB(l)?e._tickexponent=3*Math.round((l-1)/3):e._tickexponent=l)}else e._tickround=null}kn.tickIncrement=function(e,t,r,n){var i=r?-1:1;if(ph(t))return Vo.increment(e,i*t);var a=t.charAt(0),o=i*Number(t.substr(1));if(a==="M")return Vo.incrementMonth(e,o,n);if(a==="L")return Math.log(Math.pow(10,e)+o)/Math.LN10;if(a==="D"){var s=t==="D2"?hse:fse,l=e+i*.01,u=Vo.roundUp(Vo.mod(l,1),s,r);return Math.floor(l)+Math.log(w0.round(Math.pow(10,u),1))/Math.LN10}throw"unrecognized dtick "+String(t)};kn.tickFirst=function(e,t){var r=e.r2l||Number,n=Vo.simpleMap(e.range,r,void 0,void 0,t),i=n[1]=0&&g<=e._length?b:null};if(a&&Vo.isArrayOrTypedArray(e.ticktext)){var f=Vo.simpleMap(e.range,e.r2l),h=(Math.abs(f[1]-f[0])-(e._lBreaks||0))/1e4;for(u=0;u"+s;else{var u=nM(e),c=e._trueSide||e.side;(!u&&c==="top"||u&&c==="bottom")&&(o+="
")}t.text=o}function yot(e,t,r,n,i){var a=e.dtick,o=t.x,s=e.tickformat,l=typeof a=="string"&&a.charAt(0);if(i==="never"&&(i=""),n&&l!=="L"&&(a="L3",l="L"),s||l==="L")t.text=iM(Math.pow(10,o),e,i,n);else if(ph(a)||l==="D"&&Vo.mod(o+.01,1)<.1){var u=Math.round(o),c=Math.abs(u),f=e.exponentformat;f==="power"||wL(f)&&lB(u)?(u===0?t.text=1:u===1?t.text="10":t.text="10"+(u>1?"":kb)+c+"",t.fontSize*=1.25):(f==="e"||f==="E")&&c>2?t.text="1"+f+(u>0?"+":kb)+c:(t.text=iM(Math.pow(10,o),e,"","fakehover"),a==="D1"&&e._id.charAt(0)==="y"&&(t.dy-=t.fontSize/6))}else if(l==="D")t.text=String(Math.round(Math.pow(10,Vo.mod(o,1)))),t.fontSize*=.75;else throw"unrecognized dtick "+String(a);if(e.dtick==="D1"){var h=String(t.text).charAt(0);(h==="0"||h==="1")&&(e._id.charAt(0)==="y"?t.dx-=t.fontSize/4:(t.dy+=t.fontSize/2,t.dx+=(e.range[1]>e.range[0]?1:-1)*t.fontSize*(o<0?.5:.25)))}}function _ot(e,t){var r=e._categories[Math.round(t.x)];r===void 0&&(r=""),t.text=String(r)}function xot(e,t,r){var n=Math.round(t.x),i=e._categories[n]||[],a=i[1]===void 0?"":String(i[1]),o=i[0]===void 0?"":String(i[0]);r?t.text=o+" - "+a:(t.text=a,t.text2=o)}function bot(e,t,r,n,i){i==="never"?i="":e.showexponent==="all"&&Math.abs(t.x/e.dtick)<1e-6&&(i="hide"),t.text=iM(t.x,e,i,n)}function wot(e,t,r,n,i){if(e.thetaunit==="radians"&&!r){var a=t.x/180;if(a===0)t.text="0";else{var o=Tot(a);if(o[1]>=100)t.text=iM(Vo.deg2rad(t.x),e,i,n);else{var s=t.x<0;o[1]===1?o[0]===1?t.text="\u03C0":t.text=o[0]+"\u03C0":t.text=["",o[0],"","\u2044","",o[1],"","\u03C0"].join(""),s&&(t.text=kb+t.text)}}}else t.text=iM(t.x,e,i,n)}function Tot(e){function t(s,l){return Math.abs(s-l)<=1e-6}function r(s,l){return t(l,0)?s:r(l,s%l)}function n(s){for(var l=1;!t(Math.round(s*l)/l,s);)l*=10;return l}var i=n(e),a=e*i,o=Math.abs(r(a,i));return[Math.round(a/o),Math.round(i/o)]}var Aot=["f","p","n","\u03BC","m","","k","M","G","T"];function wL(e){return e==="SI"||e==="B"}function lB(e){return e>14||e<-15}function iM(e,t,r,n){var i=e<0,a=t._tickround,o=r||t.exponentformat||"B",s=t._tickexponent,l=kn.getTickFormat(t),u=t.separatethousands;if(n){var c={exponentformat:o,minexponent:t.minexponent,dtick:t.showexponent==="none"?t.dtick:ph(e)&&Math.abs(e)||1,range:t.showexponent==="none"?t.range.map(t.r2d):[0,e||1]};dse(c),a=(Number(c._tickround)||0)+4,s=c._tickexponent,t.hoverformat&&(l=t.hoverformat)}if(l)return t._numFormat(l)(e).replace(/-/g,kb);var f=Math.pow(10,-a)/2;if(o==="none"&&(s=0),e=Math.abs(e),e"+v+"":o==="B"&&s===9?e+="B":wL(o)&&(e+=Aot[s/3+5])}return i?kb+e:e}kn.getTickFormat=function(e){var t;function r(l){return typeof l!="string"?l:Number(l.replace("M",""))*R3}function n(l,u){var c=["L","D"];if(typeof l==typeof u){if(typeof l=="number")return l-u;var f=c.indexOf(l.charAt(0)),h=c.indexOf(u.charAt(0));return f===h?Number(l.replace(/(L|D)/g,""))-Number(u.replace(/(L|D)/g,"")):f-h}else return typeof l=="number"?1:-1}function i(l,u,c){var f=c||function(v){return v},h=u[0],d=u[1];return(!h&&typeof h!="number"||f(h)<=f(l))&&(!d&&typeof d!="number"||f(d)>=f(l))}function a(l,u){var c=u[0]===null,f=u[1]===null,h=n(l,u[0])>=0,d=n(l,u[1])<=0;return(c||h)&&(f||d)}var o,s;if(e.tickformatstops&&e.tickformatstops.length>0)switch(e.type){case"date":case"linear":{for(t=0;t=0&&i.unshift(i.splice(c,1).shift())}});var s={false:{left:0,right:0}};return Vo.syncOrAsync(i.map(function(l){return function(){if(l){var u=kn.getFromId(e,l);r||(r={}),r.axShifts=s,r.overlayingShiftedAx=o;var c=kn.drawOne(e,u,r);return u._shiftPusher&&oB(u,u._fullDepth||0,s,!0),u._r=u.range.slice(),u._rl=Vo.simpleMap(u._r,u.r2l),c}}}))};kn.drawOne=function(e,t,r){r=r||{};var n=r.axShifts||{},i=r.overlayingShiftedAx||[],a,o,s;t.setScale();var l=e._fullLayout,u=t._id,c=u.charAt(0),f=kn.counterLetter(u),h=l._plots[t._mainSubplot];if(!h)return;if(t._shiftPusher=t.autoshift||i.indexOf(t._id)!==-1||i.indexOf(t.overlaying)!==-1,t._shiftPusher&t.anchor==="free"){var d=t.linewidth/2||0;t.ticks==="inside"&&(d+=t.ticklen),oB(t,d,n,!0),oB(t,t.shift||0,n,!1)}(r.skipTitle!==!0||t._shift===void 0)&&(t._shift=qot(t,n));var v=h[c+"axislayer"],x=t._mainLinePosition,b=x+=t._shift,g=t._mainMirrorPosition,E=t._vals=kn.calcTicks(t),k=[t.mirror,b,g].join("_");for(a=0;a0?Ct.bottom-Rt:0,kt))));var Ke=0,xt=0;if(t._shiftPusher&&(Ke=Math.max(kt,Ct.height>0?rt==="l"?Rt-Ct.left:Ct.right-Rt:0),t.title.text!==l._dfltTitle[c]&&(xt=(t._titleStandoff||0)+(t._titleScoot||0),rt==="l"&&(xt+=sse(t))),t._fullDepth=Math.max(Ke,xt)),t.automargin){Yt={x:0,y:0,r:0,l:0,t:0,b:0};var bt=[0,1],Lt=typeof t._shift=="number"?t._shift:0;if(c==="x"){if(rt==="b"?Yt[rt]=t._depth:(Yt[rt]=t._depth=Math.max(Ct.width>0?Rt-Ct.top:0,kt),bt.reverse()),Ct.width>0){var St=Ct.right-(t._offset+t._length);St>0&&(Yt.xr=1,Yt.r=St);var Et=t._offset-Ct.left;Et>0&&(Yt.xl=0,Yt.l=Et)}}else if(rt==="l"?(t._depth=Math.max(Ct.height>0?Rt-Ct.left:0,kt),Yt[rt]=t._depth-Lt):(t._depth=Math.max(Ct.height>0?Ct.right-Rt:0,kt),Yt[rt]=t._depth+Lt,bt.reverse()),Ct.height>0){var dt=Ct.bottom-(t._offset+t._length);dt>0&&(Yt.yb=0,Yt.b=dt);var Ht=t._offset-Ct.top;Ht>0&&(Yt.yt=1,Yt.t=Ht)}Yt[f]=t.anchor==="free"?t.position:t._anchorAxis.domain[bt[0]],t.title.text!==l._dfltTitle[c]&&(Yt[rt]+=sse(t)+(t.title.standoff||0)),t.mirror&&t.anchor!=="free"&&(xr={x:0,y:0,r:0,l:0,t:0,b:0},xr[ot]=t.linewidth,t.mirror&&t.mirror!==!0&&(xr[ot]+=kt),t.mirror===!0||t.mirror==="ticks"?xr[f]=t._anchorAxis.domain[bt[1]]:(t.mirror==="all"||t.mirror==="allticks")&&(xr[f]=[t._counterDomainMin,t._counterDomainMax][bt[1]]))}qt&&(er=QS.getComponentMethod("rangeslider","autoMarginOpts")(e,t)),typeof t.automargin=="string"&&(ose(Yt,t.automargin),ose(xr,t.automargin)),P3.autoMargin(e,uB(t),Yt),P3.autoMargin(e,gse(t),xr),P3.autoMargin(e,mse(t),er)}),Vo.syncOrAsync(nt)}};function ose(e,t){if(e){var r=Object.keys(Qoe).reduce(function(n,i){return t.indexOf(i)!==-1&&Qoe[i].forEach(function(a){n[a]=1}),n},{});Object.keys(e).forEach(function(n){r[n]||(n.length===1?e[n]=0:delete e[n])})}}function Sot(e,t){var r=[],n,i=function(a,o){var s=a.xbnd[o];s!==null&&r.push(Vo.extendFlat({},a,{x:s}))};if(t.length){for(n=0;ne.range[1],s=e.ticklabelposition&&e.ticklabelposition.indexOf("inside")!==-1,l=!s;if(r){var u=o?-1:1;r=r*u}if(n){var c=e.side,f=s&&(c==="top"||c==="left")||l&&(c==="bottom"||c==="right")?1:-1;n=n*f}return e._id.charAt(0)==="x"?function(h){return I3(i+e._offset+e.l2p(nB(h))+r,a+n)}:function(h){return I3(a+n,i+e._offset+e.l2p(nB(h))+r)}};function nB(e){return e.periodX!==void 0?e.periodX:e.x}function Cot(e){var t=e.ticklabelposition||"",r=function(d){return t.indexOf(d)!==-1},n=r("top"),i=r("left"),a=r("right"),o=r("bottom"),s=r("inside"),l=o||i||n||a;if(!l&&!s)return[0,0];var u=e.side,c=l?(e.tickwidth||0)/2:0,f=bL,h=e.tickfont?e.tickfont.size:12;return(o||n)&&(c+=h*Cb,f+=(e.linewidth||0)/2),(i||a)&&(c+=(e.linewidth||0)/2,f+=bL),s&&u==="top"&&(f-=h*(1-Cb)),(i||n)&&(c=-c),(u==="bottom"||u==="right")&&(f=-f),[l?c:0,s?f:0]}kn.makeTickPath=function(e,t,r,n){n||(n={});var i=n.minor;if(i&&!e.minor)return"";var a=n.len!==void 0?n.len:i?e.minor.ticklen:e.ticklen,o=e._id.charAt(0),s=(e.linewidth||1)/2;return o==="x"?"M0,"+(t+s*r)+"v"+a*r:"M"+(t+s*r)+",0h"+a*r};kn.makeLabelFns=function(e,t,r){var n=e.ticklabelposition||"",i=function(F){return n.indexOf(F)!==-1},a=i("top"),o=i("left"),s=i("right"),l=i("bottom"),u=l||o||a||s,c=i("inside"),f=n==="inside"&&e.ticks==="inside"||!c&&e.ticks==="outside"&&e.tickson!=="boundaries",h=0,d=0,v=f?e.ticklen:0;if(c?v*=-1:u&&(v=0),f&&(h+=v,r)){var x=Vo.deg2rad(r);h=v*Math.cos(x)+1,d=v*Math.sin(x)}e.showticklabels&&(f||e.showline)&&(h+=.2*e.tickfont.size),h+=(e.linewidth||1)/2*(c?-1:1);var b={labelStandoff:h,labelShift:d},g,E,k,A,L=0,_=e.side,C=e._id.charAt(0),M=e.tickangle,p;if(C==="x")p=!c&&_==="bottom"||c&&_==="top",A=p?1:-1,c&&(A*=-1),g=d*A,E=t+h*A,k=p?1:-.2,Math.abs(M)===90&&(c?k+=$S:M===-90&&_==="bottom"?k=Cb:M===90&&_==="top"?k=$S:k=.5,L=$S/2*(M/90)),b.xFn=function(F){return F.dx+g+L*F.fontSize},b.yFn=function(F){return F.dy+E+F.fontSize*k},b.anchorFn=function(F,q){if(u){if(o)return"end";if(s)return"start"}return!ph(q)||q===0||q===180?"middle":q*A<0!==c?"end":"start"},b.heightFn=function(F,q,V){return q<-60||q>60?-.5*V:e.side==="top"!==c?-V:0};else if(C==="y"){if(p=!c&&_==="left"||c&&_==="right",A=p?1:-1,c&&(A*=-1),g=h,E=d*A,k=0,!c&&Math.abs(M)===90&&(M===-90&&_==="left"||M===90&&_==="right"?k=Cb:k=.5),c){var P=ph(M)?+M:0;if(P!==0){var T=Vo.deg2rad(P);L=Math.abs(Math.sin(T))*Cb*A,k=0}}b.xFn=function(F){return F.dx+t-(g+F.fontSize*k)*A+L*F.fontSize},b.yFn=function(F){return F.dy+E+F.fontSize*$S},b.anchorFn=function(F,q){return ph(q)&&Math.abs(q)===90?"middle":p?"end":"start"},b.heightFn=function(F,q,V){return e.side==="right"&&(q*=-1),q<-30?-V:q<30?-.5*V:0}}return b};function SL(e){return[e.text,e.x,e.axInfo,e.font,e.fontSize,e.fontColor].join("_")}kn.drawTicks=function(e,t,r){r=r||{};var n=t._id+"tick",i=[].concat(t.minor&&t.minor.ticks?r.vals.filter(function(o){return o.minor&&!o.noTick}):[]).concat(t.ticks?r.vals.filter(function(o){return!o.minor&&!o.noTick}):[]),a=r.layer.selectAll("path."+n).data(i,SL);a.exit().remove(),a.enter().append("path").classed(n,1).classed("ticks",1).classed("crisp",r.crisp!==!1).each(function(o){return eM.stroke(w0.select(this),o.minor?t.minor.tickcolor:t.tickcolor)}).style("stroke-width",function(o){return Xp.crispRound(e,o.minor?t.minor.tickwidth:t.tickwidth,1)+"px"}).attr("d",r.path).style("display",null),ML(t,[lse]),a.attr("transform",r.transFn)};kn.drawGrid=function(e,t,r){if(r=r||{},t.tickmode!=="sync"){var n=t._id+"grid",i=t.minor&&t.minor.showgrid,a=i?r.vals.filter(function(g){return g.minor}):[],o=t.showgrid?r.vals.filter(function(g){return!g.minor}):[],s=r.counterAxis;if(s&&kn.shouldShowZeroLine(e,t,s))for(var l=t.tickmode==="array",u=0;u=0;v--){var x=v?h:d;if(x){var b=x.selectAll("path."+n).data(v?o:a,SL);b.exit().remove(),b.enter().append("path").classed(n,1).classed("crisp",r.crisp!==!1),b.attr("transform",r.transFn).attr("d",r.path).each(function(g){return eM.stroke(w0.select(this),g.minor?t.minor.gridcolor:t.gridcolor||"#ddd")}).style("stroke-dasharray",function(g){return Xp.dashStyle(g.minor?t.minor.griddash:t.griddash,g.minor?t.minor.gridwidth:t.gridwidth)}).style("stroke-width",function(g){return(g.minor?f:t._gw)+"px"}).style("display",null),typeof r.path=="function"&&b.attr("d",r.path)}}ML(t,[rB,iB])}};kn.drawZeroLine=function(e,t,r){r=r||r;var n=t._id+"zl",i=kn.shouldShowZeroLine(e,t,r.counterAxis),a=r.layer.selectAll("path."+n).data(i?[{x:0,id:t._id}]:[]);a.exit().remove(),a.enter().append("path").classed(n,1).classed("zl",1).classed("crisp",r.crisp!==!1).each(function(){r.layer.selectAll("path").sort(function(o,s){return oot(o.id,s.id)})}),a.attr("transform",r.transFn).attr("d",r.path).call(eM.stroke,t.zerolinecolor||eM.defaultLine).style("stroke-width",Xp.crispRound(e,t.zerolinewidth,t._gw||1)+"px").style("display",null),ML(t,[tB])};kn.drawLabels=function(e,t,r){r=r||{};var n=e._fullLayout,i=t._id,a=r.cls||i+"tick",o=r.vals.filter(function(N){return N.text}),s=r.labelFns,l=r.secondary?0:t.tickangle,u=(t._prevTickAngles||{})[a],c=r.layer.selectAll("g."+a).data(t.showticklabels?o:[],SL),f=[];c.enter().append("g").classed(a,1).append("text").attr("text-anchor","middle").each(function(N){var W=w0.select(this),re=e._promises.length;W.call(Eb.positionText,s.xFn(N),s.yFn(N)).call(Xp.font,{family:N.font,size:N.fontSize,color:N.fontColor,weight:N.fontWeight,style:N.fontStyle,variant:N.fontVariant,textcase:N.fontTextcase,lineposition:N.fontLineposition,shadow:N.fontShadow}).text(N.text).call(Eb.convertToTspans,e),e._promises[re]?f.push(e._promises.pop().then(function(){h(W,l)})):h(W,l)}),ML(t,[$oe]),c.exit().remove(),r.repositionOnUpdate&&c.each(function(N){w0.select(this).select("text").call(Eb.positionText,s.xFn(N),s.yFn(N))});function h(N,W){N.each(function(re){var ae=w0.select(this),_e=ae.select(".text-math-group"),Me=s.anchorFn(re,W),ke=r.transFn.call(ae.node(),re)+(ph(W)&&+W!=0?" rotate("+W+","+s.xFn(re)+","+(s.yFn(re)-re.fontSize/2)+")":""),ge=Eb.lineCount(ae),ie=rM*re.fontSize,Te=s.heightFn(re,ph(W)?+W:0,(ge-1)*ie);if(Te&&(ke+=I3(0,Te)),_e.empty()){var Ee=ae.select("text");Ee.attr({transform:ke,"text-anchor":Me}),Ee.style("opacity",1),t._adjustTickLabelsOverflow&&t._adjustTickLabelsOverflow()}else{var Ae=Xp.bBox(_e.node()).width,ze=Ae*{end:-.5,start:.5}[Me];_e.attr("transform",ke+I3(ze,0))}})}t._adjustTickLabelsOverflow=function(){var N=t.ticklabeloverflow;if(!(!N||N==="allow")){var W=N.indexOf("hide")!==-1,re=t._id.charAt(0)==="x",ae=0,_e=re?e._fullLayout.width:e._fullLayout.height;if(N.indexOf("domain")!==-1){var Me=Vo.simpleMap(t.range,t.r2l);ae=t.l2p(Me[0])+t._offset,_e=t.l2p(Me[1])+t._offset}var ke=Math.min(ae,_e),ge=Math.max(ae,_e),ie=t.side,Te=1/0,Ee=-1/0;c.each(function(me){var Re=w0.select(this),ce=Re.select(".text-math-group");if(ce.empty()){var Ge=Xp.bBox(Re.node()),nt=0;re?(Ge.right>ge||Ge.leftge||Ge.top+(t.tickangle?0:me.fontSize/4)t["_visibleLabelMin_"+Me._id]?me.style("display","none"):ge.K==="tick"&&!ke&&me.style("display",null)})})})})},h(c,u+1?u:l);function d(){return f.length&&Promise.all(f)}var v=null;function x(){if(h(c,l),o.length&&t.autotickangles&&(t.type!=="log"||String(t.dtick).charAt(0)!=="D")){v=t.autotickangles[0];var N=0,W=[],re,ae=1;c.each(function(Ct){N=Math.max(N,Ct.fontSize);var Yt=t.l2p(Ct.x),xr=aB(this),er=Xp.bBox(xr.node());ae=Math.max(ae,Eb.lineCount(xr)),W.push({top:0,bottom:10,height:10,left:Yt-er.width/2,right:Yt+er.width/2+2,width:er.width+2})});var _e=(t.tickson==="boundaries"||t.showdividers)&&!r.secondary,Me=o.length,ke=Math.abs((o[Me-1].x-o[0].x)*t._m)/(Me-1),ge=_e?ke/2:ke,ie=_e?t.ticklen:N*1.25*ae,Te=Math.sqrt(Math.pow(ge,2)+Math.pow(ie,2)),Ee=ge/Te,Ae=t.autotickangles.map(function(Ct){return Ct*Math.PI/180}),ze=Ae.find(function(Ct){return Math.abs(Math.cos(Ct))<=Ee});ze===void 0&&(ze=Ae.reduce(function(Ct,Yt){return Math.abs(Math.cos(Ct))H*V&&(T=V,M[C]=p[C]=F[C])}var X=Math.abs(T-P);X-A>0?(X-=A,A*=1+A/X):A=0,t._id.charAt(0)!=="y"&&(A=-A),M[_]=E.p2r(E.r2p(p[_])+L*A),E.autorange==="min"||E.autorange==="max reversed"?(M[0]=null,E._rangeInitial0=void 0,E._rangeInitial1=void 0):(E.autorange==="max"||E.autorange==="min reversed")&&(M[1]=null,E._rangeInitial0=void 0,E._rangeInitial1=void 0),n._insideTickLabelsUpdaterange[E._name+".range"]=M}var G=Vo.syncOrAsync(b);return G&&G.then&&e._promises.push(G),G};function Lot(e,t,r){var n=t._id+"divider",i=r.vals,a=r.layer.selectAll("path."+n).data(i,SL);a.exit().remove(),a.enter().insert("path",":first-child").classed(n,1).classed("crisp",1).call(eM.stroke,t.dividercolor).style("stroke-width",Xp.crispRound(e,t.dividerwidth,1)+"px"),a.attr("transform",r.transFn).attr("d",r.path)}kn.getPxPosition=function(e,t){var r=e._fullLayout._size,n=t._id.charAt(0),i=t.side,a;if(t.anchor!=="free"?a=t._anchorAxis:n==="x"?a={_offset:r.t+(1-(t.position||0))*r.h,_length:0}:n==="y"&&(a={_offset:r.l+(t.position||0)*r.w+t._shift,_length:0}),i==="top"||i==="left")return a._offset;if(i==="bottom"||i==="right")return a._offset+a._length};function sse(e){var t=e.title.font.size,r=(e.title.text.match(Eb.BR_TAG_ALL)||[]).length;return e.title.hasOwnProperty("standoff")?t*(Cb+r*rM):r?t*(r+1)*rM:t}function Pot(e,t){var r=e._fullLayout,n=t._id,i=n.charAt(0),a=t.title.font.size,o,s=(t.title.text.match(Eb.BR_TAG_ALL)||[]).length;if(t.title.hasOwnProperty("standoff"))t.side==="bottom"||t.side==="right"?o=t._depth+t.title.standoff+a*Cb:(t.side==="top"||t.side==="left")&&(o=t._depth+t.title.standoff+a*($S+s*rM));else{var l=nM(t);if(t.type==="multicategory")o=t._depth;else{var u=1.5*a;l&&(u=.5*a,t.ticks==="outside"&&(u+=t.ticklen)),o=10+u+(t.linewidth?t.linewidth-1:0)}l||(i==="x"?o+=t.side==="top"?a*(t.showticklabels?1:0):a*(t.showticklabels?1.5:.5):o+=t.side==="right"?a*(t.showticklabels?1:.5):a*(t.showticklabels?.5:0))}var c=kn.getPxPosition(e,t),f,h,d;i==="x"?(h=t._offset+t._length/2,d=t.side==="top"?c-o:c+o):(d=t._offset+t._length/2,h=t.side==="right"?c+o:c-o,f={rotate:"-90",offset:0});var v;if(t.type!=="multicategory"){var x=t._selections[t._id+"tick"];if(v={selection:x,side:t.side},x&&x.node()&&x.node().parentNode){var b=Xp.getTranslate(x.node().parentNode);v.offsetLeft=b.x,v.offsetTop=b.y}t.title.hasOwnProperty("standoff")&&(v.pad=0)}return t._titleStandoff=o,Jat.draw(e,n+"title",{propContainer:t,propName:t._name+".title.text",placeholder:r._dfltTitle[i],avoid:v,transform:f,attributes:{x:h,y:d,"text-anchor":"middle"}})}kn.shouldShowZeroLine=function(e,t,r){var n=Vo.simpleMap(t.range,t.r2l);return n[0]*n[1]<=0&&t.zeroline&&(t.type==="linear"||t.type==="-")&&!(t.rangebreaks&&t.maskBreaks(0)===TL)&&(pse(t,0)||!Iot(e,t,r,n)||Rot(e,t))};kn.clipEnds=function(e,t){return t.filter(function(r){return pse(e,r.x)})};function pse(e,t){var r=e.l2p(t);return r>1&&r1)for(i=1;i=i.min&&e=iot:/%L/.test(t)?e>=rot:/%[SX]/.test(t)?e>=xL:/%M/.test(t)?e>=tM:/%[HI]/.test(t)?e>=xm:/%p/.test(t)?e>=s_:/%[Aadejuwx]/.test(t)?e>=Fv:/%[UVW]/.test(t)?e>=Yp:/%[Bbm]/.test(t)?e>=_L:/%[q]/.test(t)?e>=yL:/%[Yy]/.test(t)?e>=mL:!0}});var fB=ye((grr,_se)=>{"use strict";_se.exports=function(t,r,n){var i,a;if(n){var o=r==="reversed"||r==="min reversed"||r==="max reversed";i=n[o?1:0],a=n[o?0:1]}var s=t("autorangeoptions.minallowed",a===null?i:void 0),l=t("autorangeoptions.maxallowed",i===null?a:void 0);s===void 0&&t("autorangeoptions.clipmin"),l===void 0&&t("autorangeoptions.clipmax"),t("autorangeoptions.include")}});var hB=ye((mrr,xse)=>{"use strict";var Bot=fB();xse.exports=function(t,r,n,i){var a=r._template||{},o=r.type||a.type||"-";n("minallowed"),n("maxallowed");var s=n("range");if(!s){var l;!i.noInsiderange&&o!=="log"&&(l=n("insiderange"),l&&(l[0]===null||l[1]===null)&&(r.insiderange=!1,l=void 0),l&&(s=n("range",l)))}var u=r.getAutorangeDflt(s,i),c=n("autorange",u),f;s&&(s[0]===null&&s[1]===null||(s[0]===null||s[1]===null)&&(c==="reversed"||c===!0)||s[0]!==null&&(c==="min"||c==="max reversed")||s[1]!==null&&(c==="max"||c==="min reversed"))&&(s=void 0,delete r.range,r.autorange=!0,f=!0),f||(u=r.getAutorangeDflt(s,i),c=n("autorange",u)),c&&(Bot(n,c,s),(o==="linear"||o==="-")&&n("rangemode")),r.cleanRange()}});var wse=ye((yrr,bse)=>{var Not={left:0,top:0};bse.exports=Uot;function Uot(e,t,r){t=t||e.currentTarget||e.srcElement,Array.isArray(r)||(r=[0,0]);var n=e.clientX||0,i=e.clientY||0,a=Vot(t);return r[0]=n-a.left,r[1]=i-a.top,r}function Vot(e){return e===window||e===document||e===document.body?Not:e.getBoundingClientRect()}});var EL=ye((_rr,Tse)=>{"use strict";var Hot=Yq();function Got(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(r){e=!1}return e}Tse.exports=Hot&&Got()});var Sse=ye((xrr,Ase)=>{"use strict";Ase.exports=function(t,r,n,i,a){var o=(t-n)/(i-n),s=o+r/(i-n),l=(o+s)/2;return a==="left"||a==="bottom"?o:a==="center"||a==="middle"?l:a==="right"||a==="top"?s:o<2/3-l?o:s>4/3-l?s:l}});var kse=ye((brr,Ese)=>{"use strict";var Mse=Mr(),jot=[["sw-resize","s-resize","se-resize"],["w-resize","move","e-resize"],["nw-resize","n-resize","ne-resize"]];Ese.exports=function(t,r,n,i){return n==="left"?t=0:n==="center"?t=1:n==="right"?t=2:t=Mse.constrain(Math.floor(t*3),0,2),i==="bottom"?r=0:i==="middle"?r=1:i==="top"?r=2:r=Mse.constrain(Math.floor(r*3),0,2),jot[r][t]}});var Lse=ye((wrr,Cse)=>{"use strict";var Wot=g3(),Zot=L6(),Xot=DS().getGraphDiv,Yot=IS(),dB=Cse.exports={};dB.wrapped=function(e,t,r){e=Xot(e),e._fullLayout&&Zot.clear(e._fullLayout._uid+Yot.HOVERID),dB.raw(e,t,r)};dB.raw=function(t,r){var n=t._fullLayout,i=t._hoverdata;r||(r={}),!(r.target&&!t._dragged&&Wot.triggerHandler(t,"plotly_beforehover",r)===!1)&&(n._hoverlayer.selectAll("g").remove(),n._hoverlayer.selectAll("line").remove(),n._hoverlayer.selectAll("circle").remove(),t._hoverdata=void 0,r.target&&i&&t.emit("plotly_unhover",{event:r,points:i}))}});var gv=ye((Trr,Rse)=>{"use strict";var Kot=wse(),vB=Jq(),Jot=EL(),$ot=Mr().removeElement,Qot=ad(),Lb=Rse.exports={};Lb.align=Sse();Lb.getCursor=kse();var Pse=Lse();Lb.unhover=Pse.wrapped;Lb.unhoverRaw=Pse.raw;Lb.init=function(t){var r=t.gd,n=1,i=r._context.doubleClickDelay,a=t.element,o,s,l,u,c,f,h,d;r._mouseDownTime||(r._mouseDownTime=0),a.style.pointerEvents="all",a.onmousedown=b,Jot?(a._ontouchstart&&a.removeEventListener("touchstart",a._ontouchstart),a._ontouchstart=b,a.addEventListener("touchstart",b,{passive:!1})):a.ontouchstart=b;function v(k,A,L){return Math.abs(k)i&&(n=Math.max(n-1,1)),r._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(n,f),!d){var A;try{A=new MouseEvent("click",k)}catch(_){var L=pB(k);A=document.createEvent("MouseEvents"),A.initMouseEvent("click",k.bubbles,k.cancelable,k.view,k.detail,k.screenX,k.screenY,L[0],L[1],k.ctrlKey,k.altKey,k.shiftKey,k.metaKey,k.button,k.relatedTarget)}h.dispatchEvent(A)}r._dragging=!1,r._dragged=!1}};function Ise(){var e=document.createElement("div");e.className="dragcover";var t=e.style;return t.position="fixed",t.left=0,t.right=0,t.top=0,t.bottom=0,t.zIndex=999999999,t.background="none",document.body.appendChild(e),e}Lb.coverSlip=Ise;function pB(e){return Kot(e.changedTouches?e.changedTouches[0]:e,document.body)}});var Tg=ye((Arr,Dse)=>{"use strict";Dse.exports=function(t,r){(t.attr("class")||"").split(" ").forEach(function(n){n.indexOf("cursor-")===0&&t.classed(n,!1)}),r&&t.classed("cursor-"+r,!0)}});var qse=ye((Srr,Fse)=>{"use strict";var gB=Tg(),aM="data-savedcursor",zse="!!";Fse.exports=function(t,r){var n=t.attr(aM);if(r){if(!n){for(var i=(t.attr("class")||"").split(" "),a=0;a{"use strict";var mB=Su(),est=dh();Ose.exports={_isSubplotObj:!0,visible:{valType:"boolean",dflt:!0,editType:"legend"},bgcolor:{valType:"color",editType:"legend"},bordercolor:{valType:"color",dflt:est.defaultLine,editType:"legend"},borderwidth:{valType:"number",min:0,dflt:0,editType:"legend"},font:mB({editType:"legend"}),grouptitlefont:mB({editType:"legend"}),orientation:{valType:"enumerated",values:["v","h"],dflt:"v",editType:"legend"},traceorder:{valType:"flaglist",flags:["reversed","grouped"],extras:["normal"],editType:"legend"},tracegroupgap:{valType:"number",min:0,dflt:10,editType:"legend"},entrywidth:{valType:"number",min:0,editType:"legend"},entrywidthmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"pixels",editType:"legend"},indentation:{valType:"number",min:-15,dflt:0,editType:"legend"},itemsizing:{valType:"enumerated",values:["trace","constant"],dflt:"trace",editType:"legend"},itemwidth:{valType:"number",min:30,dflt:30,editType:"legend"},itemclick:{valType:"enumerated",values:["toggle","toggleothers",!1],dflt:"toggle",editType:"legend"},itemdoubleclick:{valType:"enumerated",values:["toggle","toggleothers",!1],dflt:"toggleothers",editType:"legend"},groupclick:{valType:"enumerated",values:["toggleitem","togglegroup"],dflt:"togglegroup",editType:"legend"},x:{valType:"number",editType:"legend"},xref:{valType:"enumerated",dflt:"paper",values:["container","paper"],editType:"layoutstyle"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"left",editType:"legend"},y:{valType:"number",editType:"legend"},yref:{valType:"enumerated",dflt:"paper",values:["container","paper"],editType:"layoutstyle"},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],editType:"legend"},uirevision:{valType:"any",editType:"none"},valign:{valType:"enumerated",values:["top","middle","bottom"],dflt:"middle",editType:"legend"},title:{text:{valType:"string",dflt:"",editType:"legend"},font:mB({editType:"legend"}),side:{valType:"enumerated",values:["top","left","top left","top center","top right"],editType:"legend"},editType:"legend"},editType:"legend"}});var CL=ye(kL=>{"use strict";kL.isGrouped=function(t){return(t.traceorder||"").indexOf("grouped")!==-1};kL.isVertical=function(t){return t.orientation!=="h"};kL.isReversed=function(t){return(t.traceorder||"").indexOf("reversed")!==-1}});var bB=ye((krr,Bse)=>{"use strict";var _B=ba(),Kp=Mr(),tst=Vs(),rst=vl(),ist=yB(),nst=s3(),xB=CL();function ast(e,t,r,n){var i=t[e]||{},a=tst.newContainer(r,e);function o(G,N){return Kp.coerce(i,a,ist,G,N)}var s=Kp.coerceFont(o,"font",r.font);o("bgcolor",r.paper_bgcolor),o("bordercolor");var l=o("visible");if(l){for(var u,c=function(G,N){var W=u._input,re=u;return Kp.coerce(W,re,rst,G,N)},f=r.font||{},h=Kp.coerceFont(o,"grouptitlefont",f,{overrideDflt:{size:Math.round(f.size*1.1)}}),d=0,v=!1,x="normal",b=(r.shapes||[]).filter(function(G){return G.showlegend}),g=n.concat(b).filter(function(G){return e===(G.legend||"legend")}),E=0;E(e==="legend"?1:0));if(A===!1&&(r[e]=void 0),!(A===!1&&!i.uirevision)&&(o("uirevision",r.uirevision),A!==!1)){o("borderwidth");var L=o("orientation"),_=o("yref"),C=o("xref"),M=L==="h",p=_==="paper",P=C==="paper",T,F,q,V="left";M?(T=0,_B.getComponentMethod("rangeslider","isVisible")(t.xaxis)?p?(F=1.1,q="bottom"):(F=1,q="top"):p?(F=-.1,q="top"):(F=0,q="bottom")):(F=1,q="auto",P?T=1.02:(T=1,V="right")),Kp.coerce(i,a,{x:{valType:"number",editType:"legend",min:P?-2:0,max:P?3:1,dflt:T}},"x"),Kp.coerce(i,a,{y:{valType:"number",editType:"legend",min:p?-2:0,max:p?3:1,dflt:F}},"y"),o("traceorder",x),xB.isGrouped(r[e])&&o("tracegroupgap"),o("entrywidth"),o("entrywidthmode"),o("indentation"),o("itemsizing"),o("itemwidth"),o("itemclick"),o("itemdoubleclick"),o("groupclick"),o("xanchor",V),o("yanchor",q),o("valign"),Kp.noneOrAll(i,a,["x","y"]);var H=o("title.text");if(H){o("title.side",M?"left":"top");var X=Kp.extendFlat({},s,{size:Kp.bigFont(s.size)});Kp.coerceFont(o,"title.font",X)}}}}Bse.exports=function(t,r,n){var i,a=n.slice(),o=r.shapes;if(o)for(i=0;i{"use strict";var D3=ba(),TB=Mr(),ost=TB.pushUnique,wB=!0;Nse.exports=function(t,r,n){var i=r._fullLayout;if(r._dragged||r._editing)return;var a=i.legend.itemclick,o=i.legend.itemdoubleclick,s=i.legend.groupclick;n===1&&a==="toggle"&&o==="toggleothers"&&wB&&r.data&&r._context.showTips&&TB.notifier(TB._(r,"Double-click on legend to isolate one trace"),"long"),wB=!1;var l;if(n===1?l=a:n===2&&(l=o),!l)return;var u=s==="togglegroup",c=i.hiddenlabels?i.hiddenlabels.slice():[],f=t.data()[0][0];if(f.groupTitle&&f.noClick)return;var h=r._fullData,d=(i.shapes||[]).filter(function(Rt){return Rt.showlegend}),v=h.concat(d),x=f.trace;x._isShape&&(x=x._fullInput);var b=x.legendgroup,g,E,k,A,L,_,C={},M=[],p=[],P=[];function T(Rt,kt){var Ct=M.indexOf(Rt),Yt=C.visible;return Yt||(Yt=C.visible=[]),M.indexOf(Rt)===-1&&(M.push(Rt),Ct=M.length-1),Yt[Ct]=kt,Ct}var F=(i.shapes||[]).map(function(Rt){return Rt._input}),q=!1;function V(Rt,kt){F[Rt].visible=kt,q=!0}function H(Rt,kt){if(!(f.groupTitle&&!u)){var Ct=Rt._fullInput||Rt,Yt=Ct._isShape,xr=Ct.index;xr===void 0&&(xr=Ct._index);var er=Ct.visible===!1?!1:kt;Yt?V(xr,er):T(xr,er)}}var X=x.legend,G=x._fullInput,N=G&&G._isShape;if(!N&&D3.traceIs(x,"pie-like")){var W=f.label,re=c.indexOf(W);if(l==="toggle")re===-1?c.push(W):c.splice(re,1);else if(l==="toggleothers"){var ae=re!==-1,_e=[];for(g=0;g{"use strict";Vse.exports={scrollBarWidth:6,scrollBarMinHeight:20,scrollBarColor:"#808BA4",scrollBarMargin:4,scrollBarEnterAttrs:{rx:20,ry:3,width:0,height:0},titlePad:2,itemGap:5}});var jse=ye((Prr,Gse)=>{"use strict";var Hse=ba(),SB=CL();Gse.exports=function(t,r,n){var i=r._inHover,a=SB.isGrouped(r),o=SB.isReversed(r),s={},l=[],u=!1,c={},f=0,h=0,d,v;function x(G,N,W){if(r.visible!==!1&&!(n&&G!==r._id))if(N===""||!SB.isGrouped(r)){var re="~~i"+f;l.push(re),s[re]=[W],f++}else l.indexOf(N)===-1?(l.push(N),u=!0,s[N]=[W]):s[N].push(W)}for(d=0;dP&&(p=P)}C[d][0]._groupMinRank=p,C[d][0]._preGroupSort=d}var T=function(G,N){return G[0]._groupMinRank-N[0]._groupMinRank||G[0]._preGroupSort-N[0]._preGroupSort},F=function(G,N){return G.trace.legendrank-N.trace.legendrank||G._preSort-N._preSort};for(C.forEach(function(G,N){G[0]._preGroupSort=N}),C.sort(T),d=0;d{"use strict";var LL=Mr();function Wse(e){return e.indexOf("e")!==-1?e.replace(/[.]?0+e/,"e"):e.indexOf(".")!==-1?e.replace(/[.]?0+$/,""):e}Pb.formatPiePercent=function(t,r){var n=Wse((t*100).toPrecision(3));return LL.numSeparate(n,r)+"%"};Pb.formatPieValue=function(t,r){var n=Wse(t.toPrecision(10));return LL.numSeparate(n,r)};Pb.getFirstFilled=function(t,r){if(LL.isArrayOrTypedArray(t))for(var n=0;n{"use strict";var sst=ao(),lst=va();Zse.exports=function(t,r,n,i){var a=n.marker.pattern;a&&a.shape?sst.pointStyle(t,n,i,r):lst.fill(t,r.color)}});var z3=ye((Drr,Jse)=>{"use strict";var Yse=va(),Kse=l_().castOption,ust=Xse();Jse.exports=function(t,r,n,i){var a=n.marker.line,o=Kse(a.color,r.pts)||Yse.defaultLine,s=Kse(a.width,r.pts)||0;t.call(ust,r,n,i).style("stroke-width",s).call(Yse.stroke,o)}});var CB=ye((zrr,ile)=>{"use strict";var qv=xa(),MB=ba(),mv=Mr(),$se=mv.strTranslate,ip=ao(),T0=va(),EB=Dv().extractOpts,PL=lu(),cst=z3(),fst=l_().castOption,hst=AB(),Qse=12,ele=5,Ib=2,dst=10,F3=5;ile.exports=function(t,r,n){var i=r._fullLayout;n||(n=i.legend);var a=n.itemsizing==="constant",o=n.itemwidth,s=(o+hst.itemGap*2)/2,l=$se(s,0),u=function(C,M,p,P){var T;if(C+1)T=C;else if(M&&M.width>0)T=M.width;else return 0;return a?P:Math.min(T,p)};t.each(function(C){var M=qv.select(this),p=mv.ensureSingle(M,"g","layers");p.style("opacity",C[0].trace.opacity);var P=n.indentation,T=n.valign,F=C[0].lineHeight,q=C[0].height;if(T==="middle"&&P===0||!F||!q)p.attr("transform",null);else{var V={top:1,bottom:-1}[T],H=V*(.5*(F-q+3))||0,X=n.indentation;p.attr("transform",$se(X,H))}var G=p.selectAll("g.legendfill").data([C]);G.enter().append("g").classed("legendfill",!0);var N=p.selectAll("g.legendlines").data([C]);N.enter().append("g").classed("legendlines",!0);var W=p.selectAll("g.legendsymbols").data([C]);W.enter().append("g").classed("legendsymbols",!0),W.selectAll("g.legendpoints").data([C]).enter().append("g").classed("legendpoints",!0)}).each(_).each(h).each(v).each(d).each(b).each(A).each(k).each(c).each(f).each(g).each(E);function c(C){var M=tle(C),p=M.showFill,P=M.showLine,T=M.showGradientLine,F=M.showGradientFill,q=M.anyFill,V=M.anyLine,H=C[0],X=H.trace,G,N,W=EB(X),re=W.colorscale,ae=W.reversescale,_e=function(Ae){if(Ae.size())if(p)ip.fillGroupStyle(Ae,r,!0);else{var ze="legendfill-"+X.uid;ip.gradient(Ae,r,ze,kB(ae),re,"fill")}},Me=function(Ae){if(Ae.size()){var ze="legendline-"+X.uid;ip.lineGroupStyle(Ae),ip.gradient(Ae,r,ze,kB(ae),re,"stroke")}},ke=PL.hasMarkers(X)||!q?"M5,0":V?"M5,-2":"M5,-3",ge=qv.select(this),ie=ge.select(".legendfill").selectAll("path").data(p||F?[C]:[]);if(ie.enter().append("path").classed("js-fill",!0),ie.exit().remove(),ie.attr("d",ke+"h"+o+"v6h-"+o+"z").call(_e),P||T){var Te=u(void 0,X.line,dst,ele);N=mv.minExtend(X,{line:{width:Te}}),G=[mv.minExtend(H,{trace:N})]}var Ee=ge.select(".legendlines").selectAll("path").data(P||T?[G]:[]);Ee.enter().append("path").classed("js-line",!0),Ee.exit().remove(),Ee.attr("d",ke+(T?"l"+o+",0.0001":"h"+o)).call(P?ip.lineGroupStyle:Me)}function f(C){var M=tle(C),p=M.anyFill,P=M.anyLine,T=M.showLine,F=M.showMarker,q=C[0],V=q.trace,H=!F&&!P&&!p&&PL.hasText(V),X,G;function N(ie,Te,Ee,Ae){var ze=mv.nestedProperty(V,ie).get(),Ce=mv.isArrayOrTypedArray(ze)&&Te?Te(ze):ze;if(a&&Ce&&Ae!==void 0&&(Ce=Ae),Ee){if(CeEe[1])return Ee[1]}return Ce}function W(ie){return q._distinct&&q.index&&ie[q.index]?ie[q.index]:ie[0]}if(F||H||T){var re={},ae={};if(F){re.mc=N("marker.color",W),re.mx=N("marker.symbol",W),re.mo=N("marker.opacity",mv.mean,[.2,1]),re.mlc=N("marker.line.color",W),re.mlw=N("marker.line.width",mv.mean,[0,5],Ib),ae.marker={sizeref:1,sizemin:1,sizemode:"diameter"};var _e=N("marker.size",mv.mean,[2,16],Qse);re.ms=_e,ae.marker.size=_e}T&&(ae.line={width:N("line.width",W,[0,10],ele)}),H&&(re.tx="Aa",re.tp=N("textposition",W),re.ts=10,re.tc=N("textfont.color",W),re.tf=N("textfont.family",W),re.tw=N("textfont.weight",W),re.ty=N("textfont.style",W),re.tv=N("textfont.variant",W),re.tC=N("textfont.textcase",W),re.tE=N("textfont.lineposition",W),re.tS=N("textfont.shadow",W)),X=[mv.minExtend(q,re)],G=mv.minExtend(V,ae),G.selectedpoints=null,G.texttemplate=null}var Me=qv.select(this).select("g.legendpoints"),ke=Me.selectAll("path.scatterpts").data(F?X:[]);ke.enter().insert("path",":first-child").classed("scatterpts",!0).attr("transform",l),ke.exit().remove(),ke.call(ip.pointStyle,G,r),F&&(X[0].mrc=3);var ge=Me.selectAll("g.pointtext").data(H?X:[]);ge.enter().append("g").classed("pointtext",!0).append("text").attr("transform",l),ge.exit().remove(),ge.selectAll("text").call(ip.textPointStyle,G,r)}function h(C){var M=C[0].trace,p=M.type==="waterfall";if(C[0]._distinct&&p){var P=C[0].trace[C[0].dir].marker;return C[0].mc=P.color,C[0].mlw=P.line.width,C[0].mlc=P.line.color,x(C,this,"waterfall")}var T=[];M.visible&&p&&(T=C[0].hasTotals?[["increasing","M-6,-6V6H0Z"],["totals","M6,6H0L-6,-6H-0Z"],["decreasing","M6,6V-6H0Z"]]:[["increasing","M-6,-6V6H6Z"],["decreasing","M6,6V-6H-6Z"]]);var F=qv.select(this).select("g.legendpoints").selectAll("path.legendwaterfall").data(T);F.enter().append("path").classed("legendwaterfall",!0).attr("transform",l).style("stroke-miterlimit",1),F.exit().remove(),F.each(function(q){var V=qv.select(this),H=M[q[0]].marker,X=u(void 0,H.line,F3,Ib);V.attr("d",q[1]).style("stroke-width",X+"px").call(T0.fill,H.color),X&&V.call(T0.stroke,H.line.color)})}function d(C){x(C,this)}function v(C){x(C,this,"funnel")}function x(C,M,p){var P=C[0].trace,T=P.marker||{},F=T.line||{},q=T.cornerradius?"M6,3a3,3,0,0,1-3,3H-3a3,3,0,0,1-3-3V-3a3,3,0,0,1,3-3H3a3,3,0,0,1,3,3Z":"M6,6H-6V-6H6Z",V=p?P.visible&&P.type===p:MB.traceIs(P,"bar"),H=qv.select(M).select("g.legendpoints").selectAll("path.legend"+p).data(V?[C]:[]);H.enter().append("path").classed("legend"+p,!0).attr("d",q).attr("transform",l),H.exit().remove(),H.each(function(X){var G=qv.select(this),N=X[0],W=u(N.mlw,T.line,F3,Ib);G.style("stroke-width",W+"px");var re=N.mcc;if(!n._inHover&&"mc"in N){var ae=EB(T),_e=ae.mid;_e===void 0&&(_e=(ae.max+ae.min)/2),re=ip.tryColorscale(T,"")(_e)}var Me=re||N.mc||T.color,ke=T.pattern,ge=ke&&ip.getPatternAttr(ke.shape,0,"");if(ge){var ie=ip.getPatternAttr(ke.bgcolor,0,null),Te=ip.getPatternAttr(ke.fgcolor,0,null),Ee=ke.fgopacity,Ae=rle(ke.size,8,10),ze=rle(ke.solidity,.5,1),Ce="legend-"+P.uid;G.call(ip.pattern,"legend",r,Ce,ge,Ae,ze,re,ke.fillmode,ie,Te,Ee)}else G.call(T0.fill,Me);W&&T0.stroke(G,N.mlc||F.color)})}function b(C){var M=C[0].trace,p=qv.select(this).select("g.legendpoints").selectAll("path.legendbox").data(M.visible&&MB.traceIs(M,"box-violin")?[C]:[]);p.enter().append("path").classed("legendbox",!0).attr("d","M6,6H-6V-6H6Z").attr("transform",l),p.exit().remove(),p.each(function(){var P=qv.select(this);if((M.boxpoints==="all"||M.points==="all")&&T0.opacity(M.fillcolor)===0&&T0.opacity((M.line||{}).color)===0){var T=mv.minExtend(M,{marker:{size:a?Qse:mv.constrain(M.marker.size,2,16),sizeref:1,sizemin:1,sizemode:"diameter"}});p.call(ip.pointStyle,T,r)}else{var F=u(void 0,M.line,F3,Ib);P.style("stroke-width",F+"px").call(T0.fill,M.fillcolor),F&&T0.stroke(P,M.line.color)}})}function g(C){var M=C[0].trace,p=qv.select(this).select("g.legendpoints").selectAll("path.legendcandle").data(M.visible&&M.type==="candlestick"?[C,C]:[]);p.enter().append("path").classed("legendcandle",!0).attr("d",function(P,T){return T?"M-15,0H-8M-8,6V-6H8Z":"M15,0H8M8,-6V6H-8Z"}).attr("transform",l).style("stroke-miterlimit",1),p.exit().remove(),p.each(function(P,T){var F=qv.select(this),q=M[T?"increasing":"decreasing"],V=u(void 0,q.line,F3,Ib);F.style("stroke-width",V+"px").call(T0.fill,q.fillcolor),V&&T0.stroke(F,q.line.color)})}function E(C){var M=C[0].trace,p=qv.select(this).select("g.legendpoints").selectAll("path.legendohlc").data(M.visible&&M.type==="ohlc"?[C,C]:[]);p.enter().append("path").classed("legendohlc",!0).attr("d",function(P,T){return T?"M-15,0H0M-8,-6V0":"M15,0H0M8,6V0"}).attr("transform",l).style("stroke-miterlimit",1),p.exit().remove(),p.each(function(P,T){var F=qv.select(this),q=M[T?"increasing":"decreasing"],V=u(void 0,q.line,F3,Ib);F.style("fill","none").call(ip.dashLine,q.line.dash,V),V&&T0.stroke(F,q.line.color)})}function k(C){L(C,this,"pie")}function A(C){L(C,this,"funnelarea")}function L(C,M,p){var P=C[0],T=P.trace,F=p?T.visible&&T.type===p:MB.traceIs(T,p),q=qv.select(M).select("g.legendpoints").selectAll("path.legend"+p).data(F?[C]:[]);if(q.enter().append("path").classed("legend"+p,!0).attr("d","M6,6H-6V-6H6Z").attr("transform",l),q.exit().remove(),q.size()){var V=T.marker||{},H=u(fst(V.line.width,P.pts),V.line,F3,Ib),X="pieLike",G=mv.minExtend(T,{marker:{line:{width:H}}},X),N=mv.minExtend(P,{trace:G},X);cst(q,N,G,r)}}function _(C){var M=C[0].trace,p,P=[];if(M.visible)switch(M.type){case"histogram2d":case"heatmap":P=[["M-15,-2V4H15V-2Z"]],p=!0;break;case"choropleth":case"choroplethmapbox":case"choroplethmap":P=[["M-6,-6V6H6V-6Z"]],p=!0;break;case"densitymapbox":case"densitymap":P=[["M-6,0 a6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0"]],p="radial";break;case"cone":P=[["M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z"],["M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z"],["M-6,-2 A2,2 0 0,0 -6,2 L6,0Z"]],p=!1;break;case"streamtube":P=[["M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z"],["M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z"],["M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z"]],p=!1;break;case"surface":P=[["M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z"],["M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z"]],p=!0;break;case"mesh3d":P=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6H6L0,6Z"]],p=!1;break;case"volume":P=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6H6L0,6Z"]],p=!0;break;case"isosurface":P=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6 A12,24 0 0,0 6,-6 L0,6Z"]],p=!1;break}var T=qv.select(this).select("g.legendpoints").selectAll("path.legend3dandfriends").data(P);T.enter().append("path").classed("legend3dandfriends",!0).attr("transform",l).style("stroke-miterlimit",1),T.exit().remove(),T.each(function(F,q){var V=qv.select(this),H=EB(M),X=H.colorscale,G=H.reversescale,N=function(_e){if(_e.size()){var Me="legendfill-"+M.uid;ip.gradient(_e,r,Me,kB(G,p==="radial"),X,"fill")}},W;if(X){if(!p){var ae=X.length;W=q===0?X[G?ae-1:0][1]:q===1?X[G?0:ae-1][1]:X[Math.floor((ae-1)/2)][1]}}else{var re=M.vertexcolor||M.facecolor||M.color;W=mv.isArrayOrTypedArray(re)?re[q]||re[0]:re}V.attr("d",F[0]),W?V.call(T0.fill,W):V.call(N)})}};function kB(e,t){var r=t?"radial":"horizontal";return r+(e?"":"reversed")}function tle(e){var t=e[0].trace,r=t.contours,n=PL.hasLines(t),i=PL.hasMarkers(t),a=t.visible&&t.fill&&t.fill!=="none",o=!1,s=!1;if(r){var l=r.coloring;l==="lines"?o=!0:n=l==="none"||l==="heatmap"||r.showlines,r.type==="constraint"?a=r._operation!=="=":(l==="fill"||l==="heatmap")&&(s=!0)}return{showMarker:i,showLine:n,showFill:a,showGradientLine:o,showGradientFill:s,anyLine:n||o,anyFill:a||s}}function rle(e,t,r){return e&&mv.isArrayOrTypedArray(e)?t:e>r?r:e}});var RB=ye((Frr,dle)=>{"use strict";var Sp=xa(),gh=Mr(),PB=Xu(),B3=ba(),nle=g3(),LB=gv(),mh=ao(),RL=va(),Rb=Ll(),ale=Use(),Vh=AB(),IB=Nh(),fle=IB.LINE_SPACING,O3=IB.FROM_TL,ole=IB.FROM_BR,sle=jse(),vst=CB(),lle=CL(),q3=1,pst=/^legend[0-9]*$/;dle.exports=function(t,r){if(r)ule(t,r);else{var n=t._fullLayout,i=n._legends,a=n._infolayer.selectAll('[class^="legend"]');a.each(function(){var u=Sp.select(this),c=u.attr("class"),f=c.split(" ")[0];f.match(pst)&&i.indexOf(f)===-1&&u.remove()});for(var o=0;o1)}var v=n.hiddenlabels||[];if(!s&&(!n.showlegend||!l.length))return o.selectAll("."+i).remove(),n._topdefs.select("#"+a).remove(),PB.autoMargin(e,i);var x=gh.ensureSingle(o,"g",i,function(M){s||M.attr("pointer-events","all")}),b=gh.ensureSingleById(n._topdefs,"clipPath",a,function(M){M.append("rect")}),g=gh.ensureSingle(x,"rect","bg",function(M){M.attr("shape-rendering","crispEdges")});g.call(RL.stroke,r.bordercolor).call(RL.fill,r.bgcolor).style("stroke-width",r.borderwidth+"px");var E=gh.ensureSingle(x,"g","scrollbox"),k=r.title;r._titleWidth=0,r._titleHeight=0;var A;k.text?(A=gh.ensureSingle(E,"text",i+"titletext"),A.attr("text-anchor","start").call(mh.font,k.font).text(k.text),DL(A,E,e,r,q3)):E.selectAll("."+i+"titletext").remove();var L=gh.ensureSingle(x,"rect","scrollbar",function(M){M.attr(Vh.scrollBarEnterAttrs).call(RL.fill,Vh.scrollBarColor)}),_=E.selectAll("g.groups").data(l);_.enter().append("g").attr("class","groups"),_.exit().remove();var C=_.selectAll("g.traces").data(gh.identity);C.enter().append("g").attr("class","traces"),C.exit().remove(),C.style("opacity",function(M){var p=M[0].trace;return B3.traceIs(p,"pie-like")?v.indexOf(M[0].label)!==-1?.5:1:p.visible==="legendonly"?.5:1}).each(function(){Sp.select(this).call(mst,e,r)}).call(vst,e,r).each(function(){s||Sp.select(this).call(yst,e,i)}),gh.syncOrAsync([PB.previousPromises,function(){return bst(e,_,C,r)},function(){var M=n._size,p=r.borderwidth,P=r.xref==="paper",T=r.yref==="paper";if(k.text&&gst(A,r,p),!s){var F,q;P?F=M.l+M.w*r.x-O3[zL(r)]*r._width:F=n.width*r.x-O3[zL(r)]*r._width,T?q=M.t+M.h*(1-r.y)-O3[FL(r)]*r._effHeight:q=n.height*(1-r.y)-O3[FL(r)]*r._effHeight;var V=wst(e,i,F,q);if(V)return;if(n.margin.autoexpand){var H=F,X=q;F=P?gh.constrain(F,0,n.width-r._width):H,q=T?gh.constrain(q,0,n.height-r._effHeight):X,F!==H&&gh.log("Constrain "+i+".x to make legend fit inside graph"),q!==X&&gh.log("Constrain "+i+".y to make legend fit inside graph")}mh.setTranslate(x,F,q)}if(L.on(".drag",null),x.on("wheel",null),s||r._height<=r._maxHeight||e._context.staticPlot){var G=r._effHeight;s&&(G=r._height),g.attr({width:r._width-p,height:G-p,x:p/2,y:p/2}),mh.setTranslate(E,0,0),b.select("rect").attr({width:r._width-2*p,height:G-2*p,x:p,y:p}),mh.setClipUrl(E,a,e),mh.setRect(L,0,0,0,0),delete r._scrollY}else{var N=Math.max(Vh.scrollBarMinHeight,r._effHeight*r._effHeight/r._height),W=r._effHeight-N-2*Vh.scrollBarMargin,re=r._height-r._effHeight,ae=W/re,_e=Math.min(r._scrollY||0,re);g.attr({width:r._width-2*p+Vh.scrollBarWidth+Vh.scrollBarMargin,height:r._effHeight-p,x:p/2,y:p/2}),b.select("rect").attr({width:r._width-2*p+Vh.scrollBarWidth+Vh.scrollBarMargin,height:r._effHeight-2*p,x:p,y:p+_e}),mh.setClipUrl(E,a,e),ze(_e,N,ae),x.on("wheel",function(){_e=gh.constrain(r._scrollY+Sp.event.deltaY/W*re,0,re),ze(_e,N,ae),_e!==0&&_e!==re&&Sp.event.preventDefault()});var Me,ke,ge,ie=function(Ge,nt,ct){var qt=(ct-nt)/ae+Ge;return gh.constrain(qt,0,re)},Te=function(Ge,nt,ct){var qt=(nt-ct)/ae+Ge;return gh.constrain(qt,0,re)},Ee=Sp.behavior.drag().on("dragstart",function(){var Ge=Sp.event.sourceEvent;Ge.type==="touchstart"?Me=Ge.changedTouches[0].clientY:Me=Ge.clientY,ge=_e}).on("drag",function(){var Ge=Sp.event.sourceEvent;Ge.buttons===2||Ge.ctrlKey||(Ge.type==="touchmove"?ke=Ge.changedTouches[0].clientY:ke=Ge.clientY,_e=ie(ge,Me,ke),ze(_e,N,ae))});L.call(Ee);var Ae=Sp.behavior.drag().on("dragstart",function(){var Ge=Sp.event.sourceEvent;Ge.type==="touchstart"&&(Me=Ge.changedTouches[0].clientY,ge=_e)}).on("drag",function(){var Ge=Sp.event.sourceEvent;Ge.type==="touchmove"&&(ke=Ge.changedTouches[0].clientY,_e=Te(ge,Me,ke),ze(_e,N,ae))});E.call(Ae)}function ze(Ge,nt,ct){r._scrollY=e._fullLayout[i]._scrollY=Ge,mh.setTranslate(E,0,-Ge),mh.setRect(L,r._width,Vh.scrollBarMargin+Ge*ct,Vh.scrollBarWidth,nt),b.select("rect").attr("y",p+Ge)}if(e._context.edits.legendPosition){var Ce,me,Re,ce;x.classed("cursor-move",!0),LB.init({element:x.node(),gd:e,prepFn:function(Ge){if(Ge.target!==L.node()){var nt=mh.getTranslate(x);Re=nt.x,ce=nt.y}},moveFn:function(Ge,nt){if(Re!==void 0&&ce!==void 0){var ct=Re+Ge,qt=ce+nt;mh.setTranslate(x,ct,qt),Ce=LB.align(ct,r._width,M.l,M.l+M.w,r.xanchor),me=LB.align(qt+r._height,-r._height,M.t+M.h,M.t,r.yanchor)}},doneFn:function(){if(Ce!==void 0&&me!==void 0){var Ge={};Ge[i+".x"]=Ce,Ge[i+".y"]=me,B3.call("_guiRelayout",e,Ge)}},clickFn:function(Ge,nt){var ct=o.selectAll("g.traces").filter(function(){var qt=this.getBoundingClientRect();return nt.clientX>=qt.left&&nt.clientX<=qt.right&&nt.clientY>=qt.top&&nt.clientY<=qt.bottom});ct.size()>0&&hle(e,x,ct,Ge,nt)}})}}],e)}}function IL(e,t,r){var n=e[0],i=n.width,a=t.entrywidthmode,o=n.trace.legendwidth||t.entrywidth;return a==="fraction"?t._maxWidth*o:r+(o||i)}function hle(e,t,r,n,i){var a=r.data()[0][0].trace,o={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a.index,data:e.data,layout:e.layout,frames:e._transitionData._frames,config:e._context,fullData:e._fullData,fullLayout:e._fullLayout};a._group&&(o.group=a._group),B3.traceIs(a,"pie-like")&&(o.label=r.datum()[0].label);var s=nle.triggerHandler(e,"plotly_legendclick",o);if(n===1){if(s===!1)return;t._clickTimeout=setTimeout(function(){e._fullLayout&&ale(r,e,n)},e._context.doubleClickDelay)}else if(n===2){t._clickTimeout&&clearTimeout(t._clickTimeout),e._legendMouseDownTime=0;var l=nle.triggerHandler(e,"plotly_legenddoubleclick",o);l!==!1&&s!==!1&&ale(r,e,n)}}function mst(e,t,r){var n=qL(r),i=e.data()[0][0],a=i.trace,o=B3.traceIs(a,"pie-like"),s=!r._inHover&&t._context.edits.legendText&&!o,l=r._maxNameLength,u,c;i.groupTitle?(u=i.groupTitle.text,c=i.groupTitle.font):(c=r.font,r.entries?u=i.text:(u=o?i.label:a.name,a._meta&&(u=gh.templateString(u,a._meta))));var f=gh.ensureSingle(e,"text",n+"text");f.attr("text-anchor","start").call(mh.font,c).text(s?cle(u,l):u);var h=r.indentation+r.itemwidth+Vh.itemGap*2;Rb.positionText(f,h,0),s?f.call(Rb.makeEditable,{gd:t,text:u}).call(DL,e,t,r).on("edit",function(d){this.text(cle(d,l)).call(DL,e,t,r);var v=i.trace._fullInput||{},x={};return x.name=d,v._isShape?B3.call("_guiRelayout",t,"shapes["+a.index+"].name",x.name):B3.call("_guiRestyle",t,x,a.index)}):DL(f,e,t,r)}function cle(e,t){var r=Math.max(4,t);if(e&&e.trim().length>=r/2)return e;e=e||"";for(var n=r-e.length;n>0;n--)e+=" ";return e}function yst(e,t,r){var n=t._context.doubleClickDelay,i,a=1,o=gh.ensureSingle(e,"rect",r+"toggle",function(s){t._context.staticPlot||s.style("cursor","pointer").attr("pointer-events","all"),s.call(RL.fill,"rgba(0,0,0,0)")});t._context.staticPlot||(o.on("mousedown",function(){i=new Date().getTime(),i-t._legendMouseDownTimen&&(a=Math.max(a-1,1)),hle(t,s,e,a,Sp.event)}}))}function DL(e,t,r,n,i){n._inHover&&e.attr("data-notex",!0),Rb.convertToTspans(e,r,function(){_st(t,r,n,i)})}function _st(e,t,r,n){var i=e.data()[0][0];if(!r._inHover&&i&&!i.trace.showlegend){e.remove();return}var a=e.select("g[class*=math-group]"),o=a.node(),s=qL(r);r||(r=t._fullLayout[s]);var l=r.borderwidth,u;n===q3?u=r.title.font:i.groupTitle?u=i.groupTitle.font:u=r.font;var c=u.size*fle,f,h;if(o){var d=mh.bBox(o);f=d.height,h=d.width,n===q3?mh.setTranslate(a,l,l+f*.75):mh.setTranslate(a,0,f*.25)}else{var v="."+s+(n===q3?"title":"")+"text",x=e.select(v),b=Rb.lineCount(x),g=x.node();if(f=c*b,h=g?mh.bBox(g).width:0,n===q3)r.title.side==="left"&&(h+=Vh.itemGap*2),Rb.positionText(x,l+Vh.titlePad,l+c);else{var E=Vh.itemGap*2+r.indentation+r.itemwidth;i.groupTitle&&(E=Vh.itemGap,h-=r.indentation+r.itemwidth),Rb.positionText(x,E,-c*((b-1)/2-.3))}}n===q3?(r._titleWidth=h,r._titleHeight=f):(i.lineHeight=c,i.height=Math.max(f,16)+3,i.width=h)}function xst(e){var t=0,r=0,n=e.title.side;return n&&(n.indexOf("left")!==-1&&(t=e._titleWidth),n.indexOf("top")!==-1&&(r=e._titleHeight)),[t,r]}function bst(e,t,r,n){var i=e._fullLayout,a=qL(n);n||(n=i[a]);var o=i._size,s=lle.isVertical(n),l=lle.isGrouped(n),u=n.entrywidthmode==="fraction",c=n.borderwidth,f=2*c,h=Vh.itemGap,d=n.indentation+n.itemwidth+h*2,v=2*(c+h),x=FL(n),b=n.y<0||n.y===0&&x==="top",g=n.y>1||n.y===1&&x==="bottom",E=n.tracegroupgap,k={};n._maxHeight=Math.max(b||g?i.height/2:o.h,30);var A=0;n._width=0,n._height=0;var L=xst(n);if(s)r.each(function(ge){var ie=ge[0].height;mh.setTranslate(this,c+L[0],c+L[1]+n._height+ie/2+h),n._height+=ie,n._width=Math.max(n._width,ge[0].width)}),A=d+n._width,n._width+=h+d+f,n._height+=v,l&&(t.each(function(ge,ie){mh.setTranslate(this,0,ie*n.tracegroupgap)}),n._height+=(n._lgroupsLength-1)*n.tracegroupgap);else{var _=zL(n),C=n.x<0||n.x===0&&_==="right",M=n.x>1||n.x===1&&_==="left",p=g||b,P=i.width/2;n._maxWidth=Math.max(C?p&&_==="left"?o.l+o.w:P:M?p&&_==="right"?o.r+o.w:P:o.w,2*d);var T=0,F=0;r.each(function(ge){var ie=IL(ge,n,d);T=Math.max(T,ie),F+=ie}),A=null;var q=0;if(l){var V=0,H=0,X=0;t.each(function(){var ge=0,ie=0;Sp.select(this).selectAll("g.traces").each(function(Ee){var Ae=IL(Ee,n,d),ze=Ee[0].height;mh.setTranslate(this,L[0],L[1]+c+h+ze/2+ie),ie+=ze,ge=Math.max(ge,Ae),k[Ee[0].trace.legendgroup]=ge});var Te=ge+h;H>0&&Te+c+H>n._maxWidth?(q=Math.max(q,H),H=0,X+=V+E,V=ie):V=Math.max(V,ie),mh.setTranslate(this,H,X),H+=Te}),n._width=Math.max(q,H)+c,n._height=X+V+v}else{var G=r.size(),N=F+f+(G-1)*h=n._maxWidth&&(q=Math.max(q,_e),re=0,ae+=W,n._height+=W,W=0),mh.setTranslate(this,L[0]+c+re,L[1]+c+ae+ie/2+h),_e=re+Te+h,re+=Ee,W=Math.max(W,ie)}),N?(n._width=re+f,n._height=W+v):(n._width=Math.max(q,_e)+f,n._height+=W+v)}}n._width=Math.ceil(Math.max(n._width+L[0],n._titleWidth+2*(c+Vh.titlePad))),n._height=Math.ceil(Math.max(n._height+L[1],n._titleHeight+2*(c+Vh.itemGap))),n._effHeight=Math.min(n._height,n._maxHeight);var Me=e._context.edits,ke=Me.legendText||Me.legendPosition;r.each(function(ge){var ie=Sp.select(this).select("."+a+"toggle"),Te=ge[0].height,Ee=ge[0].trace.legendgroup,Ae=IL(ge,n,d);l&&Ee!==""&&(Ae=k[Ee]);var ze=ke?d:A||Ae;!s&&!u&&(ze+=h/2),mh.setRect(ie,0,-Te/2,ze,Te)})}function wst(e,t,r,n){var i=e._fullLayout,a=i[t],o=zL(a),s=FL(a),l=a.xref==="paper",u=a.yref==="paper";e._fullLayout._reservedMargin[t]={};var c=a.y<.5?"b":"t",f=a.x<.5?"l":"r",h={r:i.width-r,l:r+a._width,b:i.height-n,t:n+a._effHeight};if(l&&u)return PB.autoMargin(e,t,{x:a.x,y:a.y,l:a._width*O3[o],r:a._width*ole[o],b:a._effHeight*ole[s],t:a._effHeight*O3[s]});l?e._fullLayout._reservedMargin[t][c]=h[c]:u||a.orientation==="v"?e._fullLayout._reservedMargin[t][f]=h[f]:e._fullLayout._reservedMargin[t][c]=h[c]}function zL(e){return gh.isRightAnchor(e)?"right":gh.isCenterAnchor(e)?"center":"left"}function FL(e){return gh.isBottomAnchor(e)?"bottom":gh.isMiddleAnchor(e)?"middle":"top"}function qL(e){return e._id||"legend"}});var qB=ye(FB=>{"use strict";var Db=xa(),Sy=uo(),vle=id(),Rf=Mr(),Tst=Rf.pushUnique,DB=Rf.strTranslate,Ast=Rf.strRotate,Sst=g3(),A0=Ll(),Mst=qse(),bm=ao(),sd=va(),OL=gv(),wm=Qa(),Est=ad().zindexSeparator,U3=ba(),Ag=rp(),zb=IS(),kst=bB(),Cst=RB(),wle=zb.YANGLE,zB=Math.PI*wle/180,Lst=1/Math.sin(zB),Pst=Math.cos(zB),Ist=Math.sin(zB),Bc=zb.HOVERARROWSIZE,Us=zb.HOVERTEXTPAD,ple={box:!0,ohlc:!0,violin:!0,candlestick:!0},Rst={scatter:!0,scattergl:!0,splom:!0};function gle(e,t){return e.distance-t.distance}FB.hover=function(t,r,n,i){t=Rf.getGraphDiv(t);var a=r.target;Rf.throttle(t._fullLayout._uid+zb.HOVERID,zb.HOVERMINTIME,function(){Dst(t,r,n,i,a)})};FB.loneHover=function(t,r){var n=!0;Array.isArray(t)||(n=!1,t=[t]);var i=r.gd,a=Ele(i),o=kle(i),s=t.map(function(b){var g=b._x0||b.x0||b.x||0,E=b._x1||b.x1||b.x||0,k=b._y0||b.y0||b.y||0,A=b._y1||b.y1||b.y||0,L=b.eventData;if(L){var _=Math.min(g,E),C=Math.max(g,E),M=Math.min(k,A),p=Math.max(k,A),P=b.trace;if(U3.traceIs(P,"gl3d")){var T=i._fullLayout[P.scene]._scene.container,F=T.offsetLeft,q=T.offsetTop;_+=F,C+=F,M+=q,p+=q}L.bbox={x0:_+o,x1:C+o,y0:M+a,y1:p+a},r.inOut_bbox&&r.inOut_bbox.push(L.bbox)}else L=!1;return{color:b.color||sd.defaultLine,x0:b.x0||b.x||0,x1:b.x1||b.x||0,y0:b.y0||b.y||0,y1:b.y1||b.y||0,xLabel:b.xLabel,yLabel:b.yLabel,zLabel:b.zLabel,text:b.text,name:b.name,idealAlign:b.idealAlign,borderColor:b.borderColor,fontFamily:b.fontFamily,fontSize:b.fontSize,fontColor:b.fontColor,fontWeight:b.fontWeight,fontStyle:b.fontStyle,fontVariant:b.fontVariant,nameLength:b.nameLength,textAlign:b.textAlign,trace:b.trace||{index:0,hoverinfo:""},xa:{_offset:0},ya:{_offset:0},index:0,hovertemplate:b.hovertemplate||!1,hovertemplateLabels:b.hovertemplateLabels||!1,eventData:L}}),l=!1,u=Ale(s,{gd:i,hovermode:"closest",rotateLabels:l,bgColor:r.bgColor||sd.background,container:Db.select(r.container),outerContainer:r.outerContainer||r.container}),c=u.hoverLabels,f=5,h=0,d=0;c.sort(function(b,g){return b.y0-g.y0}).each(function(b,g){var E=b.y0-b.by/2;E-fC[0]._length||ce<0||ce>M[0]._length)return OL.unhoverRaw(e,t)}if(t.pointerX=Re+C[0]._offset,t.pointerY=ce+M[0]._offset,"xval"in t?X=Ag.flat(a,t.xval):X=Ag.p2c(C,Re),"yval"in t?G=Ag.flat(a,t.yval):G=Ag.p2c(M,ce),!Sy(X[0])||!Sy(G[0]))return Rf.warn("Fx.hover failed",t,e),OL.unhoverRaw(e,t)}var ct=1/0;function qt(Ni,_n){for(W=0;WEe&&(V.splice(0,Ee),ct=V[0].distance),f&&q!==0&&V.length===0){Te.distance=q,Te.index=!1;var ft=ae._module.hoverPoints(Te,ge,ie,"closest",{hoverLayer:s._hoverlayer});if(ft&&(ft=ft.filter(function(Vr){return Vr.spikeDistance<=q})),ft&&ft.length){var jt,Zt=ft.filter(function(Vr){return Vr.xa.showspikes&&Vr.xa.spikesnap!=="hovered data"});if(Zt.length){var yr=Zt[0];Sy(yr.x0)&&Sy(yr.y0)&&(jt=ot(yr),(!Ae.vLinePoint||Ae.vLinePoint.spikeDistance>jt.spikeDistance)&&(Ae.vLinePoint=jt))}var Fr=ft.filter(function(Vr){return Vr.ya.showspikes&&Vr.ya.spikesnap!=="hovered data"});if(Fr.length){var Zr=Fr[0];Sy(Zr.x0)&&Sy(Zr.y0)&&(jt=ot(Zr),(!Ae.hLinePoint||Ae.hLinePoint.spikeDistance>jt.spikeDistance)&&(Ae.hLinePoint=jt))}}}}}qt();function rt(Ni,_n,$i){for(var zn=null,Wn=1/0,It,ft=0;ft0&&Math.abs(Ni.distance)dt-1;Nr--)Or(V[Nr]);V=fr,Yt()}var ut=e._hoverdata,Ne=[],Ye=Ele(e),Ve=kle(e);for(N=0;N1||V.length>1)||h==="closest"&&ze&&V.length>1,ri=sd.combine(s.plot_bgcolor||sd.background,s.paper_bgcolor),bi=Ale(V,{gd:e,hovermode:h,rotateLabels:jr,bgColor:ri,container:s._hoverlayer,outerContainer:s._paper.node(),commonLabelOpts:s.hoverlabel,hoverdistance:s.hoverdistance}),nn=bi.hoverLabels;if(Ag.isUnifiedHover(h)||(Fst(nn,jr,s,bi.commonLabelBoundingBox),Mle(nn,jr,s._invScaleX,s._invScaleY)),i&&i.tagName){var Wi=U3.getComponentMethod("annotations","hasClickToShow")(e,Ne);Mst(Db.select(i),Wi?"pointer":"")}!i||n||!Bst(e,t,ut)||(ut&&e.emit("plotly_unhover",{event:t,points:ut}),e.emit("plotly_hover",{event:t,points:e._hoverdata,xaxes:C,yaxes:M,xvals:X,yvals:G}))}function Tle(e){return[e.trace.index,e.index,e.x0,e.y0,e.name,e.attr,e.xa?e.xa._id:"",e.ya?e.ya._id:""].join(",")}var zst=/([\s\S]*)<\/extra>/;function Ale(e,t){var r=t.gd,n=r._fullLayout,i=t.hovermode,a=t.rotateLabels,o=t.bgColor,s=t.container,l=t.outerContainer,u=t.commonLabelOpts||{};if(e.length===0)return[[]];var c=t.fontFamily||zb.HOVERFONT,f=t.fontSize||zb.HOVERFONTSIZE,h=t.fontWeight||n.font.weight,d=t.fontStyle||n.font.style,v=t.fontVariant||n.font.variant,x=t.fontTextcase||n.font.textcase,b=t.fontLineposition||n.font.lineposition,g=t.fontShadow||n.font.shadow,E=e[0],k=E.xa,A=E.ya,L=i.charAt(0),_=L+"Label",C=E[_];if(C===void 0&&k.type==="multicategory")for(var M=0;Mn.width-ut&&(Ne=n.width-ut),Lt.attr("d","M"+(Br-Ne)+",0L"+(Br-Ne+Bc)+","+Nr+Bc+"H"+ut+"v"+Nr+(Us*2+_r.height)+"H"+-ut+"V"+Nr+Bc+"H"+(Br-Ne-Bc)+"Z"),Br=Ne,W.minX=Br-ut,W.maxX=Br+ut,k.side==="top"?(W.minY=Or-(Us*2+_r.height),W.maxY=Or-Us):(W.minY=Or+Us,W.maxY=Or+(Us*2+_r.height))}else{var Ye,Ve,Xe;A.side==="right"?(Ye="start",Ve=1,Xe="",Br=k._offset+k._length):(Ye="end",Ve=-1,Xe="-",Br=k._offset),Or=A._offset+(E.y0+E.y1)/2,St.attr("text-anchor",Ye),Lt.attr("d","M0,0L"+Xe+Bc+","+Bc+"V"+(Us+_r.height/2)+"h"+Xe+(Us*2+_r.width)+"V-"+(Us+_r.height/2)+"H"+Xe+Bc+"V-"+Bc+"Z"),W.minY=Or-(Us+_r.height/2),W.maxY=Or+(Us+_r.height/2),A.side==="right"?(W.minX=Br+Bc,W.maxX=Br+Bc+(Us*2+_r.width)):(W.minX=Br-Bc-(Us*2+_r.width),W.maxX=Br-Bc);var ht=_r.height/2,Le=P-_r.top-ht,xe="clip"+n._uid+"commonlabel"+A._id,Se;if(Br<_r.width+2*Us+Bc){Se="M-"+(Bc+Us)+"-"+ht+"h-"+(_r.width-Us)+"V"+ht+"h"+(_r.width-Us)+"Z";var lt=_r.width-Br+Us;A0.positionText(St,lt,Le),Ye==="end"&&St.selectAll("tspan").each(function(){var Vt=Db.select(this),ar=bm.tester.append("text").text(Vt.text()).call(bm.font,fr),Qr=N3(r,ar.node());Math.round(Qr.width)