From 7ea2b0ac190f9d220ab26bf59399cd74ee271f2c Mon Sep 17 00:00:00 2001 From: louisnw Date: Sun, 21 May 2023 15:42:57 +0100 Subject: [PATCH] =?UTF-8?q?-=20Significant=20refactoring=20resulting=20in?= =?UTF-8?q?=20a=2034%=20reduction=20in=20size=20of=20the=20codebase=20(exc?= =?UTF-8?q?luding=20the=20Lightweight=20Charts=20package)=20and=20greater?= =?UTF-8?q?=20efficiency.=20-=20Upgraded=20to=20Lightweight=20Charts=20v4.?= =?UTF-8?q?0.1.=20-=20Added=20a=20=E2=80=98hover=E2=80=99=20item=20to=20th?= =?UTF-8?q?e=20returning=20dictionary=20from=20subscribe=5Fclick.=20-=20Ma?= =?UTF-8?q?rkers=20and=20SubCharts=20no=20longer=20use=20a=20UUID=20for=20?= =?UTF-8?q?identification,=20but=20an=208=20character=20string.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +- docs/source/conf.py | 2 +- docs/source/docs.md | 20 +- docs/source/index.md | 1 + lightweight_charts/js.py | 760 ++++++++++++-------------------- lightweight_charts/pkg.py | 9 +- lightweight_charts/pywebview.py | 82 ---- lightweight_charts/util.py | 79 ++-- lightweight_charts/widgets.py | 29 +- setup.py | 2 +- 10 files changed, 336 insertions(+), 663 deletions(-) delete mode 100644 lightweight_charts/pywebview.py diff --git a/README.md b/README.md index 281c918..2c091a0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Documentation](https://img.shields.io/badge/documentation-006ee3)](https://lightweight-charts-python.readthedocs.io/en/latest/docs.html) -![cover](cover.png) +![cover](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/cover.png) lightweight-charts-python aims to provide a simple and pythonic way to access and implement [TradingView's Lightweight Charts](https://www.tradingview.com/lightweight-charts/). @@ -42,7 +42,7 @@ if __name__ == '__main__': chart.show(block=True) ``` -![setting_data image](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/1_setting_data/setting_data.png) +![setting_data image](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/examples/1_setting_data/setting_data.png) ___ ### 2. Updating bars in real-time: @@ -76,7 +76,7 @@ if __name__ == '__main__': ``` -![live data gif](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/2_live_data/live_data.gif) +![live data gif](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/2_live_data/live_data.gif?raw=true) ___ ### 3. Updating bars from tick data in real-time: @@ -106,7 +106,7 @@ if __name__ == '__main__': sleep(0.3) ``` -![tick data gif](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/3_tick_data/tick_data.gif) +![tick data gif](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/examples/3_tick_data/tick_data.gif) ___ ### 4. Line Indicators: @@ -140,7 +140,7 @@ if __name__ == '__main__': chart.show(block=True) ``` -![line indicators image](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/4_line_indicators/line_indicators.png) +![line indicators image](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/examples/4_line_indicators/line_indicators.png) ___ ### 5. Styling: @@ -177,7 +177,7 @@ if __name__ == '__main__': chart.show(block=True) ``` -![styling image](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/5_styling/styling.png) +![styling image](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/examples/5_styling/styling.png) ___ ### 6. Callbacks: @@ -203,7 +203,7 @@ if __name__ == '__main__': chart.show(block=True) ``` -![callbacks gif](https://github.com/louisnw01/lightweight-charts-python/blob/main/examples/6_callbacks/callbacks.gif) +![callbacks gif](https://raw.githubusercontent.com/louisnw01/lightweight-charts-python/main/examples/6_callbacks/callbacks.gif) ___ [![Documentation](https://img.shields.io/badge/documentation-006ee3)](https://lightweight-charts-python.readthedocs.io/en/latest/docs.html) @@ -213,4 +213,3 @@ ___ _This package is an independent creation and has not been endorsed, sponsored, or approved by TradingView. The author of this package does not have any official relationship with TradingView, and the package does not represent the views or opinions of TradingView._ - diff --git a/docs/source/conf.py b/docs/source/conf.py index dd105c4..dab74d0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,7 +1,7 @@ project = 'lightweight-charts-python' copyright = '2023, louisnw' author = 'louisnw' -release = '1.0.3' +release = '1.0.7' extensions = ["myst_parser"] diff --git a/docs/source/docs.md b/docs/source/docs.md index 8bb8acc..9b44c43 100644 --- a/docs/source/docs.md +++ b/docs/source/docs.md @@ -6,7 +6,7 @@ [![License](https://img.shields.io/github/license/louisnw01/lightweight-charts-python?color=9c2400)](https://github.com/louisnw01/lightweight-charts-python/blob/main/LICENSE) [![Stars - lightweight-charts-python](https://img.shields.io/github/stars/louisnw01/lightweight-charts-python?style=social)](https://github.com/louisnw01/lightweight-charts-python) [![Forks - lightweight-charts-python](https://img.shields.io/github/forks/louisnw01/lightweight-charts-python?style=social)](https://github.com/louisnw01/lightweight-charts-python) - +___ ## Common Methods These methods can be used within the `Chart`, `SubChart`, `QtChart`, and `WxChart` objects. @@ -57,17 +57,17 @@ Creates and returns a [Line](#line) object. ___ ### `marker` -`time: datetime` | `position: 'above'/'below'/'inside'` | `shape: 'arrow_up'/'arrow_down'/'circle'/'square'` | `color: str` | `text: str` | `-> UUID` +`time: datetime` | `position: 'above'/'below'/'inside'` | `shape: 'arrow_up'/'arrow_down'/'circle'/'square'` | `color: str` | `text: str` | `-> str` -Adds a marker to the chart, and returns its UUID. +Adds a marker to the chart, and returns its id. If the `time` parameter is not given, the marker will be placed at the latest bar. ___ ### `remove_marker` -`m_id: UUID` +`marker_id: str` -Removes the marker with the given UUID. +Removes the marker with the given id. Usage: ```python @@ -162,13 +162,13 @@ ___ Subscribes the given function to a chart 'click' event. -The event emits a dictionary containing the bar at the time clicked, with the keys: +The event emits a dictionary containing the bar at the time clicked, the id of the `Chart` or `SubChart`, and the hover price: -`time | open | high | low | close` +`time | open | high | low | close | id | hover` ___ ### `create_subchart` -`volume_enabled: bool` | `position: 'left'/'right'/'top'/'bottom'`, `width: float` | `height: float` | `sync: bool/UUID` | `-> SubChart` +`volume_enabled: bool` | `position: 'left'/'right'/'top'/'bottom'`, `width: float` | `height: float` | `sync: bool/str` | `-> SubChart` Creates and returns a [SubChart](#subchart) object, placing it adjacent to the declaring `Chart` or `SubChart`. @@ -176,9 +176,7 @@ Creates and returns a [SubChart](#subchart) object, placing it adjacent to the d `height` | `width`: Specifies the size of the `SubChart`, where `1` is the width/height of the window (100%) -`sync`: If given as `True`, the `SubChart`'s time scale will follow that of the declaring `Chart` or `SubChart`. If a `UUID` object is passed, the `SubChart` will follow the panel with the given `UUID`. - -Chart `UUID`'s can be accessed from the`chart.id` and `subchart.id` attributes. +`sync`: If given as `True`, the `SubChart`'s time scale will follow that of the declaring `Chart` or `SubChart`. If a `str` is passed, the `SubChart` will follow the panel with the given id. Chart ids can be accessed from the`chart.id` and `subchart.id` attributes. ```{important} `width` and `height` must be given as a number between 0 and 1. diff --git a/docs/source/index.md b/docs/source/index.md index f6ddc5d..4eff9bb 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -4,6 +4,7 @@ :maxdepth: 2 docs +Github Repository ``` ```{include} ../../README.md diff --git a/lightweight_charts/js.py b/lightweight_charts/js.py index 4c84db7..ae5a025 100644 --- a/lightweight_charts/js.py +++ b/lightweight_charts/js.py @@ -1,34 +1,39 @@ import pandas as pd -from uuid import UUID, uuid4 from datetime import timedelta, datetime -from typing import Dict, Union, Literal +from typing import Union, Literal -from lightweight_charts.pkg import LWC_3_5_0 -from lightweight_charts.util import LINE_TYPE, POSITION, SHAPE, CROSSHAIR_MODE, _crosshair_mode, _line_type, \ - MissingColumn, _js_bool, _price_scale_mode, PRICE_SCALE_MODE, _position, _shape, IDGen, _valid_color +from lightweight_charts.pkg import LWC_4_0_1 +from lightweight_charts.util import LINE_STYLE, MARKER_POSITION, MARKER_SHAPE, CROSSHAIR_MODE, _crosshair_mode, _line_style, \ + MissingColumn, _js_bool, _price_scale_mode, PRICE_SCALE_MODE, _marker_position, _marker_shape, IDGen class Line: - def __init__(self, lwc, line_id, color, width): - self._lwc = lwc - self.loaded = False - self.id = line_id - self.color = color - self.width = width + def __init__(self, parent, color, width): + self._parent = parent + self.id = self._parent._rand.generate() + self._parent.run_script(f''' + var {self.id} = {self._parent.id}.chart.addLineSeries({{ + color: '{color}', + lineWidth: {width}, + }})''') def set(self, data: pd.DataFrame): """ Sets the line data.\n - :param data: columns: date/time, price + :param data: columns: date/time, value """ - self._lwc._set_line_data(self.id, data) + df = self._parent._df_datetime_format(data) + self._parent.run_script(f'{self.id}.setData({df.to_dict("records")})') def update(self, series: pd.Series): """ Updates the line data.\n - :param series: labels: date/time, price + :param series: labels: date/time, value """ - self._lwc._update_line_data(self.id, series) + series = self._parent._series_datetime_format(series) + self._parent.run_script(f'{self.id}.update({series.to_dict()})') + + def marker(self): pass class API: @@ -40,51 +45,34 @@ class API: if isinstance(data['time'], int): data['time'] = datetime.fromtimestamp(data['time']) else: - data['time'] = datetime(data['time']['year'], data['time']['month'], data['time']['day']) + data['time'] = datetime.strptime(data['time'], '%Y-%m-%d') click_func(data) if click_func else None class LWC: def __init__(self, volume_enabled: bool = True, inner_width: float = 1.0, inner_height: float = 1.0): - self.id = uuid4() - self.js_queue = [] + self._volume_enabled = volume_enabled + self._inner_width = inner_width + self._inner_height = inner_height + self._position = 'left' self.loaded = False - self._rand = IDGen() - self._chart_var = 'chart' - + self.id = self._rand.generate() + self._append_js = f'document.body.append({self.id}.div)' + self._scripts = [] + self._script_func = None + self._html = HTML + self._last_bar = None + self._interval = None + self._background_color = '#000000' + self._volume_up_color = 'rgba(83,141,131,0.8)' + self._volume_down_color = 'rgba(200,127,130,0.8)' self._js_api = API() - self._js_api_code = '' - - self.volume_enabled = volume_enabled - self.inner_width = inner_width - self.inner_height = inner_height - self._html = HTML.replace('__INNER_WIDTH__', str(self.inner_width)).replace('__INNER_HEIGHT__', str(self.inner_height)) - - self.last_bar = None - self.interval = None - self._lines: Dict[UUID, Line] = {} - self._subcharts: Dict[UUID, LWC] = {self.id: self} - - self.background_color = '#000000' - self.volume_up_color = 'rgba(83,141,131,0.8)' - self.volume_down_color = 'rgba(200,127,130,0.8)' - - def _on_js_load(self): pass - - def _stored(self, func, *args, **kwargs): - if self.loaded: - return False - self.js_queue.append((func, args, kwargs)) - return True - - def _set_last_bar(self, bar: pd.Series): self.last_bar = bar + self._js_api_code = None def _set_interval(self, df: pd.DataFrame): - df['time'] = pd.to_datetime(df['time']) - intervals = df['time'].diff() - counts = intervals.value_counts() - self.interval = counts.index[0] + common_interval = pd.to_datetime(df['time']).diff().value_counts() + self._interval = common_interval.index[0] def _df_datetime_format(self, df: pd.DataFrame): if 'date' in df.columns: @@ -101,81 +89,85 @@ class LWC: def _datetime_format(self, string): string = pd.to_datetime(string) - if self.interval != timedelta(days=1): + if self._interval != timedelta(days=1): string = string.timestamp() - string = self.interval.total_seconds() * (string // self.interval.total_seconds()) + string = self._interval.total_seconds() * (string // self._interval.total_seconds()) else: string = string.strftime('%Y-%m-%d') return string - def run_script(self, script): pass + def _on_js_load(self): + self.loaded = True + for script in self._scripts: + self.run_script(script) + + def _create_chart(self): + self.run_script(f''' + {self.id} = makeChart({self._inner_width}, {self._inner_height}) + {self.id}.div.style.float = "{self._position}" + {self._append_js} + window.addEventListener('resize', function() {{ + {self.id}.chart.resize(window.innerWidth*{self.id}.scale.width, window.innerHeight*{self.id}.scale.height) + }}); + ''') + + def run_script(self, script): + """ + For advanced users; evaluates JavaScript within the Webview. + """ + self._script_func(script) if self.loaded else self._scripts.append(script) def set(self, df: pd.DataFrame): """ Sets the initial data for the chart.\n :param df: columns: date/time, open, high, low, close, volume (if volume enabled). """ - if self._stored('set', df): - return None - - df = self._df_datetime_format(df) - self._set_last_bar(df.iloc[-1]) - bars = df - if self.volume_enabled: - if 'volume' not in df: + bars = self._df_datetime_format(df) + self._last_bar = bars.iloc[-1] + if self._volume_enabled: + if 'volume' not in bars: raise MissingColumn("Volume enabled, but 'volume' column was not found.") - volume = df.drop(columns=['open', 'high', 'low', 'close']) - volume = volume.rename(columns={'volume': 'value'}) - volume['color'] = self.volume_down_color - volume.loc[df['close'] > df['open'], 'color'] = self.volume_up_color - - self.run_script(f'{self._chart_var}.volumeSeries.setData({volume.to_dict(orient="records")})') - bars = df.drop(columns=['volume']) + volume = bars.drop(columns=['open', 'high', 'low', 'close']).rename(columns={'volume': 'value'}) + volume['color'] = self._volume_down_color + volume.loc[bars['close'] > bars['open'], 'color'] = self._volume_up_color + self.run_script(f'{self.id}.volumeSeries.setData({volume.to_dict(orient="records")})') + bars = bars.drop(columns=['volume']) bars = bars.to_dict(orient='records') - self.run_script(f'{self._chart_var}.series.setData({bars})') + self.run_script(f'{self.id}.series.setData({bars})') def update(self, series, from_tick=False): """ Updates the data from a bar; if series['time'] is the same time as the last bar, the last bar will be overwritten.\n - :param series: columns: date/time, open, high, low, close, volume (if volume enabled). + :param series: labels: date/time, open, high, low, close, volume (if volume enabled). """ - if self._stored('update', series, from_tick): - return None - series = self._series_datetime_format(series) if not from_tick else series - self._set_last_bar(series) - if self.volume_enabled: + self._last_bar = series + if self._volume_enabled: if 'volume' not in series: raise MissingColumn("Volume enabled, but 'volume' column was not found.") - volume = series.drop(['open', 'high', 'low', 'close']) - volume = volume.rename({'volume': 'value'}) - volume['color'] = self.volume_up_color if series['close'] > series['open'] else self.volume_down_color - self.run_script(f'{self._chart_var}.volumeSeries.update({volume.to_dict()})') + volume = series.drop(['open', 'high', 'low', 'close']).rename({'volume': 'value'}) + volume['color'] = self._volume_up_color if series['close'] > series['open'] else self._volume_down_color + self.run_script(f'{self.id}.volumeSeries.update({volume.to_dict()})') series = series.drop(['volume']) - - dictionary = series.to_dict() - self.run_script(f'{self._chart_var}.series.update({dictionary})') + self.run_script(f'{self.id}.series.update({series.to_dict()})') def update_from_tick(self, series): """ Updates the data from a tick.\n - :param series: columns: date/time, price, volume (if volume enabled). + :param series: labels: date/time, price, volume (if volume enabled). """ - if self._stored('update_from_tick', series): - return None - series = self._series_datetime_format(series) bar = pd.Series() - if series['time'] == self.last_bar['time']: - bar = self.last_bar - bar['high'] = max(self.last_bar['high'], series['price']) - bar['low'] = min(self.last_bar['low'], series['price']) + if series['time'] == self._last_bar['time']: + bar = self._last_bar + bar['high'] = max(self._last_bar['high'], series['price']) + bar['low'] = min(self._last_bar['low'], series['price']) bar['close'] = series['price'] - if self.volume_enabled: + if self._volume_enabled: if 'volume' not in series: raise MissingColumn("Volume enabled, but 'volume' column was not found.") bar['volume'] = series['volume'] @@ -189,53 +181,11 @@ class LWC: def create_line(self, color: str = 'rgba(214, 237, 255, 0.6)', width: int = 2): """ Creates and returns a Line object.)\n - :return a Line object used to set/update the line. """ - line_id = uuid4() - self._lines[line_id] = Line(self, line_id, color, width) - return self._lines[line_id] + return Line(self, color, width) - def _set_line_data(self, line_id, df: pd.DataFrame): - if self._stored('_set_line_data', line_id, df): - return None - line = self._lines[line_id] - - if not line.loaded: - var = self._rand.generate() - self.run_script(f''' - let lineSeries{var} = {{ - color: '{line.color}', - lineWidth: {line.width}, - }}; - let line{var} = {{ - series: {self._chart_var}.chart.addLineSeries(lineSeries{var}), - id: '{line_id}', - }}; - lines.push(line{var}) - ''') - line.loaded = True - df = self._df_datetime_format(df) - self.run_script(f''' - lines.forEach(function (line) {{ - if ('{line_id}' === line.id) {{ - line.series.setData({df.to_dict('records')}) - }} - }})''') - - def _update_line_data(self, line_id, series: pd.Series): - if self._stored('_update_line_data', line_id, series): - return None - - series = self._series_datetime_format(series) - self.run_script(f''' - lines.forEach(function (line) {{ - if ('{line_id}' === line.id) {{ - line.series.update({series.to_dict()}) - }} - }})''') - - def marker(self, time: datetime = None, position: POSITION = 'below', shape: SHAPE = 'arrow_up', - color: str = '#2196F3', text: str = '', m_id: UUID = None) -> UUID: + def marker(self, time: datetime = None, position: MARKER_POSITION = 'below', shape: MARKER_SHAPE = 'arrow_up', + color: str = '#2196F3', text: str = '') -> str: """ Creates a new marker.\n :param time: The time that the marker will be placed at. If no time is given, it will be placed at the last bar. @@ -243,98 +193,79 @@ class LWC: :param color: The color of the marker (rgb, rgba or hex). :param shape: The shape of the marker. :param text: The text to be placed with the marker. - :return: The UUID of the marker placed. + :return: The id of the marker placed. """ - _valid_color(color) - if not m_id: - m_id = uuid4() - if self._stored('marker', time, position, shape, color, text, m_id): - return m_id - try: - time = self.last_bar['time'] if not time else self._datetime_format(time) + time = self._last_bar['time'] if not time else self._datetime_format(time) except TypeError: raise TypeError('Chart marker created before data was set.') - time = time if isinstance(time, float) else f"'{time}'" - + marker_id = self._rand.generate() self.run_script(f""" - markers.push({{ - time: {time}, - position: '{_position(position)}', - color: '{color}', shape: '{_shape(shape)}', - text: '{text}', - id: '{m_id}' - }}); - {self._chart_var}.series.setMarkers(markers)""") - return m_id + markers.push({{ + time: {time if isinstance(time, float) else f"'{time}'"}, + position: '{_marker_position(position)}', + color: '{color}', + shape: '{_marker_shape(shape)}', + text: '{text}', + id: '{marker_id}' + }}); + {self.id}.series.setMarkers(markers)""") + return marker_id - def remove_marker(self, m_id: UUID): + def remove_marker(self, marker_id: str): """ - Removes the marker with the given UUID.\n + Removes the marker with the given id.\n """ - if self._stored('remove_marker', m_id): - return None - self.run_script(f''' - markers.forEach(function (marker) {{ - if ('{m_id}' === marker.id) {{ - markers.splice(markers.indexOf(marker), 1) - {self._chart_var}.series.setMarkers(markers) - }} - }});''') + markers.forEach(function (marker) {{ + if ('{marker_id}' === marker.id) {{ + markers.splice(markers.indexOf(marker), 1) + {self.id}.series.setMarkers(markers) + }} + }});''') def horizontal_line(self, price: Union[float, int], color: str = 'rgb(122, 146, 202)', width: int = 1, - style: LINE_TYPE = 'solid', text: str = '', axis_label_visible=True): + style: LINE_STYLE = 'solid', text: str = '', axis_label_visible=True): """ Creates a horizontal line at the given price.\n """ - if self._stored('horizontal_line', price, color, width, style, text, axis_label_visible): - return None - var = self._rand.generate() self.run_script(f""" - let priceLine{var} = {{ - price: {price}, - color: '{color}', - lineWidth: {width}, - lineStyle: LightweightCharts.LineStyle.{_line_type(style)}, - axisLabelVisible: {'true' if axis_label_visible else 'false'}, - title: '{text}', - }}; - let line{var} = {{ - line: {self._chart_var}.series.createPriceLine(priceLine{var}), - price: {price}, - }}; - horizontal_lines.push(line{var})""") + let priceLine{var} = {{ + price: {price}, + color: '{color}', + lineWidth: {width}, + lineStyle: {_line_style(style)}, + axisLabelVisible: {_js_bool(axis_label_visible)}, + title: '{text}', + }}; + let line{var} = {{ + line: {self.id}.series.createPriceLine(priceLine{var}), + price: {price}, + }}; + horizontal_lines.push(line{var})""") def remove_horizontal_line(self, price: Union[float, int]): """ Removes a horizontal line at the given price. """ - if self._stored('remove_horizontal_line', price): - return None - self.run_script(f''' - horizontal_lines.forEach(function (line) {{ - if ({price} === line.price) {{ - {self._chart_var}.series.removePriceLine(line.line); - horizontal_lines.splice(horizontal_lines.indexOf(line), 1) - }} - }});''') + horizontal_lines.forEach(function (line) {{ + if ({price} === line.price) {{ + {self.id}.series.removePriceLine(line.line); + horizontal_lines.splice(horizontal_lines.indexOf(line), 1) + }} + }});''') - def config(self, mode: PRICE_SCALE_MODE = None, title: str = None, right_padding: float = None): + def config(self, mode: PRICE_SCALE_MODE = 'normal', title: str = None, right_padding: float = None): """ :param mode: Chart price scale mode. :param title: Last price label text. :param right_padding: How many bars of empty space to the right of the last bar. """ - if self._stored('config', mode, title, right_padding): - return None - - self.run_script(f'{self._chart_var}.chart.timeScale().scrollToPosition({right_padding}, false)') if right_padding is not None else None - self.run_script(f'{self._chart_var}.series.applyOptions({{title: "{title}"}})') if title else None - self.run_script( - f"{self._chart_var}.chart.priceScale().applyOptions({{mode: LightweightCharts.PriceScaleMode.{_price_scale_mode(mode)}}})") if mode else None + self.run_script(f'{self.id}.chart.timeScale().scrollToPosition({right_padding}, false)') if right_padding is not None else None + self.run_script(f'{self.id}.series.applyOptions({{title: "{title}"}})') if title else None + self.run_script(f"{self.id}.chart.priceScale().applyOptions({{mode: {_price_scale_mode(mode)}}})") def time_scale(self, visible: bool = True, time_visible: bool = True, seconds_visible: bool = False): """ @@ -344,18 +275,12 @@ class LWC: :param seconds_visible: Seconds visibility control. :return: """ - if self._stored('time_scale', visible, time_visible, seconds_visible): - return None - - time_scale_visible = f'visible: {_js_bool(visible)},' - time = f'timeVisible: {_js_bool(time_visible)},' - seconds = f'secondsVisible: {_js_bool(seconds_visible)},' self.run_script(f''' - {self._chart_var}.chart.applyOptions({{ + {self.id}.chart.applyOptions({{ timeScale: {{ - {time_scale_visible if visible is not None else ''} - {time if time_visible is not None else ''} - {seconds if seconds_visible is not None else ''} + visible: {_js_bool(visible)}, + timeVisible: {_js_bool(time_visible)}, + secondsVisible: {_js_bool(seconds_visible)}, }} }})''') @@ -364,44 +289,38 @@ class LWC: """ Global layout options for the chart. """ - if self._stored('layout', background_color, text_color, font_size, font_family): - return None - - self.background_color = background_color if background_color else self.background_color + self._background_color = background_color if background_color else self._background_color self.run_script(f""" - document.body.style.backgroundColor = '{self.background_color}' - {self._chart_var}.chart.applyOptions({{ + document.body.style.backgroundColor = '{self._background_color}' + {self.id}.chart.applyOptions({{ layout: {{ - {f'backgroundColor: "{background_color}",' if background_color else ''} + background: {{ + color: "{self._background_color}", + }}, {f'textColor: "{text_color}",' if text_color else ''} {f'fontSize: {font_size},' if font_size else ''} {f'fontFamily: "{font_family}",' if font_family else ''} }}}})""") - def grid(self, vert_enabled: bool = True, horz_enabled: bool = True, color: str = 'rgba(29, 30, 38, 5)', style: LINE_TYPE = 'solid'): + def grid(self, vert_enabled: bool = True, horz_enabled: bool = True, color: str = 'rgba(29, 30, 38, 5)', style: LINE_STYLE = 'solid'): """ Grid styling for the chart. """ - if self._stored('grid', vert_enabled, horz_enabled, color, style): - return None - self.run_script(f""" - {self._chart_var}.chart.applyOptions({{ + {self.id}.chart.applyOptions({{ grid: {{ - {f'''vertLines: {{ - {f'visible: {_js_bool(vert_enabled)},' if vert_enabled is not None else ''} - {f'color: "{color}",' if color else ''} - {f'style: LightweightCharts.LineStyle.{_line_type(style)},' if style else ''} - }},''' if vert_enabled is not None or color or style else ''} - - {f'''horzLines: {{ - {f'visible: {_js_bool(horz_enabled)},' if horz_enabled is not None else ''} - {f'color: "{color}",' if color else ''} - {f'style: LightweightCharts.LineStyle.{_line_type(style)},' if style else ''} - }},''' if horz_enabled is not None or color or style else ''} + vertLines: {{ + visible: {_js_bool(vert_enabled)}, + color: "{color}", + style: {_line_style(style)}, + }}, + horzLines: {{ + visible: {_js_bool(horz_enabled)}, + color: "{color}", + style: {_line_style(style)}, + }}, }} - }}) - """) + }})""") def candle_style(self, up_color: str = 'rgba(39, 157, 130, 100)', down_color: str = 'rgba(200, 97, 100, 100)', wick_enabled: bool = True, border_enabled: bool = True, border_up_color: str = '', @@ -409,20 +328,16 @@ class LWC: """ Candle styling for each of its parts. """ - if self._stored('candle_style', up_color, down_color, wick_enabled, border_enabled, - border_up_color, border_down_color, wick_up_color, wick_down_color): - return None - self.run_script(f""" - {self._chart_var}.series.applyOptions({{ - {f'upColor: "{up_color}",' if up_color else ''} - {f'downColor: "{down_color}",' if down_color else ''} - {f'wickVisible: {_js_bool(wick_enabled)},' if wick_enabled is not None else ''} - {f'borderVisible: {_js_bool(border_enabled)},' if border_enabled is not None else ''} - {f'borderUpColor: "{border_up_color}",' if border_up_color else ''} - {f'borderDownColor: "{border_down_color}",' if border_down_color else ''} - {f'wickUpColor: "{wick_up_color}",' if wick_up_color else ''} - {f'wickDownColor: "{wick_down_color}",' if wick_down_color else ''} + {self.id}.series.applyOptions({{ + upColor: "{up_color}", + downColor: "{down_color}", + wickVisible: {_js_bool(wick_enabled)}, + borderVisible: {_js_bool(border_enabled)}, + {f'borderUpColor: "{border_up_color}",' if border_up_color else up_color if border_enabled else ''} + {f'borderDownColor: "{border_down_color}",' if border_down_color else down_color if border_enabled else ''} + {f'wickUpColor: "{wick_up_color}",' if wick_up_color else wick_up_color if wick_enabled else ''} + {f'wickDownColor: "{wick_down_color}",' if wick_down_color else wick_down_color if wick_enabled else ''} }})""") def volume_config(self, scale_margin_top: float = 0.8, scale_margin_bottom: float = 0.0, @@ -436,13 +351,10 @@ class LWC: :param up_color: Volume color for upward direction (rgb, rgba or hex) :param down_color: Volume color for downward direction (rgb, rgba or hex) """ - if self._stored('volume_config', scale_margin_top, scale_margin_bottom, up_color, down_color): - return None - - self.volume_up_color = up_color if up_color else self.volume_up_color - self.volume_down_color = down_color if down_color else self.volume_down_color + self._volume_up_color = up_color if up_color else self._volume_up_color + self._volume_down_color = down_color if down_color else self._volume_down_color self.run_script(f''' - {self._chart_var}.volumeSeries.priceScale().applyOptions({{ + {self.id}.volumeSeries.priceScale().applyOptions({{ scaleMargins: {{ top: {scale_margin_top}, bottom: {scale_margin_bottom}, @@ -450,40 +362,35 @@ class LWC: }})''') def crosshair(self, mode: CROSSHAIR_MODE = 'normal', vert_width: int = 1, vert_color: str = None, - vert_style: LINE_TYPE = None, vert_label_background_color: str = None, horz_width: int = 1, - horz_color: str = None, horz_style: LINE_TYPE = None, horz_label_background_color: str = None): + vert_style: LINE_STYLE = 'dashed', vert_label_background_color: str = 'rgb(46, 46, 46)', horz_width: int = 1, + horz_color: str = None, horz_style: LINE_STYLE = 'dashed', horz_label_background_color: str = 'rgb(55, 55, 55)'): """ Crosshair formatting for its vertical and horizontal axes. """ - if self._stored('crosshair', mode, vert_width, vert_color, vert_style, vert_label_background_color, - horz_width, horz_color, horz_style, horz_label_background_color): - return None - - args = f"LightweightCharts.CrosshairMode.{_crosshair_mode(mode)}", \ - f"{vert_width}}}", f"'{vert_color}'}}", f"LightweightCharts.LineStyle.{_line_type(vert_style)}}}",\ - f"'{vert_label_background_color}'}}", \ - f"{horz_width}}}", f"'{horz_color}'}}", f"LightweightCharts.LineStyle.{_line_type(horz_style)}}}",\ - f"'{horz_label_background_color}'}}" - for key, arg in zip( - ('mode', 'vertLine: {width', 'vertLine: {color', 'vertLine: {style', 'vertLine: {labelBackgroundColor', - 'horzLine: {width', 'horzLine: {color', 'horzLine: {style', 'horzLine: {labelBackgroundColor'), args): - if 'None' in arg: - continue - self.run_script(f''' - {self._chart_var}.chart.applyOptions({{ - crosshair: {{ - {key}: {arg} + self.run_script(f''' + {self.id}.chart.applyOptions({{ + crosshair: {{ + mode: {_crosshair_mode(mode)}, + vertLine: {{ + width: {vert_width}, + {f'color: "{vert_color}",' if vert_color else ''} + style: {_line_style(vert_style)}, + labelBackgroundColor: "{vert_label_background_color}" + }}, + horzLine: {{ + width: {horz_width}, + {f'color: "{horz_color}",' if horz_color else ''} + style: {_line_style(horz_style)}, + labelBackgroundColor: "{horz_label_background_color}" + }} }}}})''') def watermark(self, text: str, font_size: int = 44, color: str = 'rgba(180, 180, 200, 0.5)'): """ Adds a watermark to the chart. """ - if self._stored('watermark', text, font_size, color): - return None - self.run_script(f''' - {self._chart_var}.chart.applyOptions({{ + {self.id}.chart.applyOptions({{ watermark: {{ visible: true, fontSize: {font_size}, @@ -499,18 +406,15 @@ class LWC: """ Configures the legend of the chart. """ - if self._stored('legend', visible, ohlc, percent, color, font_size, font_family): - return None - if visible: self.run_script(f''' - {f"{self._chart_var}.legend.style.color = '{color}'" if color else ''} - {f"{self._chart_var}.legend.style.fontSize = {font_size}" if font_size else ''} - {f"{self._chart_var}.legend.style.fontFamily = '{font_family}'" if font_family else ''} + {f"{self.id}.legend.style.color = '{color}'" if color else ''} + {f"{self.id}.legend.style.fontSize = {font_size}" if font_size else ''} + {f"{self.id}.legend.style.fontFamily = '{font_family}'" if font_family else ''} - {self._chart_var}.chart.subscribeCrosshairMove((param) => {{ + {self.id}.chart.subscribeCrosshairMove((param) => {{ if (param.time){{ - const data = param.seriesPrices.get({self._chart_var}.series); + const data = param.seriesData.get({self.id}.series); if (!data) {{return}} let percentMove = ((data.close-data.open)/data.open)*100 let ohlc = `open: ${{legendItemFormat(data.open)}} @@ -521,44 +425,38 @@ class LWC: let finalString = '' {'finalString += ohlc' if ohlc else ''} {'finalString += percent' if percent else ''} - {self._chart_var}.legend.innerHTML = finalString + {self.id}.legend.innerHTML = finalString }} else {{ - {self._chart_var}.legend.innerHTML = '' + {self.id}.legend.innerHTML = '' }} }});''') def subscribe_click(self, function: object): - if self._stored('subscribe_click', function): - return None - - self._js_api.click_funcs[str(self.id)] = function - var = self._rand.generate() + """ + Subscribes the given function to a chart click event. + The event returns a dictionary containing the bar object at the time clicked, and the price at the crosshair. + """ + self._js_api.click_funcs[self.id] = function self.run_script(f''' - {self._chart_var}.chart.subscribeClick((param) => {{ + {self.id}.chart.subscribeClick((param) => {{ if (!param.point) {{return}} - let prices{var} = param.seriesPrices.get({self._chart_var}.series); - let data{var} = {{ + let prices = param.seriesData.get({self.id}.series); + let data = {{ time: param.time, - open: prices{var}.open, - high: prices{var}.high, - low: prices{var}.low, - close: prices{var}.close, + open: prices.open, + high: prices.high, + low: prices.low, + close: prices.close, + hover: {self.id}.series.coordinateToPrice(param.point.y), id: '{self.id}' }} - {self._js_api_code}(data{var}) + {self._js_api_code}(data) }})''') def create_subchart(self, volume_enabled: bool = True, position: Literal['left', 'right', 'top', 'bottom'] = 'left', - width: float = 0.5, height: float = 0.5, sync: Union[bool, UUID] = False): - subchart = SubChart(self, volume_enabled, position, width, height, sync) - self._subcharts[subchart.id] = subchart - return subchart - - def _pywebview_subchart(self, volume_enabled, position, width, height, sync, parent=None): - subchart = PyWebViewSubChart(self if not parent else parent, volume_enabled, position, width, height, sync) - self._subcharts[subchart.id] = subchart - return subchart.id + width: float = 0.5, height: float = 0.5, sync: Union[bool, str] = False): + return SubChart(self, volume_enabled, position, width, height, sync) class SubChart(LWC): @@ -566,207 +464,96 @@ class SubChart(LWC): super().__init__(volume_enabled, width, height) self._chart = parent._chart if isinstance(parent, SubChart) else parent self._parent = parent - + self._position = position self._rand = self._chart._rand - self._chart_var = f'window.{self._rand.generate()}' + self.id = f'window.{self._rand.generate()}' + self._append_js = f'{self._parent.id}.div.parentNode.insertBefore({self.id}.div, {self._parent.id}.div.nextSibling)' self._js_api = self._chart._js_api self._js_api_code = self._chart._js_api_code - self.position = position - - self._create_panel(sync) - - def _stored(self, func, *args, **kwargs): - if self._chart.loaded: - return False - self._chart.js_queue.append((f'SUB{func}', (self.id,)+args, kwargs)) - return True + self._create_chart() + if not sync: + return + sync_parent_var = self._parent.id if isinstance(sync, bool) else sync + self.run_script(f''' + {sync_parent_var}.chart.timeScale().subscribeVisibleLogicalRangeChange((timeRange) => {{ + {self.id}.chart.timeScale().setVisibleLogicalRange(timeRange) + }});''') def run_script(self, script): self._chart.run_script(script) - def _create_panel(self, sync): - if self._stored('_create_panel', sync): - return None - - parent_div = 'chartsDiv' if self._parent._chart_var == 'chart' else self._parent._chart_var+'div' - - sub_sync = '' - if sync: - sync_parent_var = self._chart._subcharts[sync]._chart_var if isinstance(sync, UUID) else self._parent._chart_var - sub_sync = f''' - {sync_parent_var}.chart.timeScale().subscribeVisibleLogicalRangeChange((timeRange) => {{ - {self._chart_var}.chart.timeScale().setVisibleLogicalRange(timeRange) - }}); - ''' - self.run_script(f''' - {self._chart_var}div = document.createElement('div') - //{self._chart_var}div.style.position = 'relative' - {self._chart_var}div.style.float = "{self.position}" - - //chartsDiv.style.display = 'inline-block' - chartsDiv.style.float = 'left' - - {self._chart_var} = {{}} - {self._chart_var}.scale = {{ - width: {self.inner_width}, - height: {self.inner_height} - }} - {self._chart_var}.chart = makeChart(window.innerWidth*{self._chart_var}.scale.width, - window.innerHeight*{self._chart_var}.scale.height, {self._chart_var}div) - {self._chart_var}.series = makeCandlestickSeries({self._chart_var}.chart) - {self._chart_var}.volumeSeries = makeVolumeSeries({self._chart_var}.chart) - - {self._chart_var}.legend = document.createElement('div') - {self._chart_var}.legend.style.position = 'absolute' - {self._chart_var}.legend.style.zIndex = 1000 - {self._chart_var}.legend.style.width = '{(self.inner_width*100)-8}vw' - {self._chart_var}.legend.style.top = '10px' - {self._chart_var}.legend.style.left = '10px' - {self._chart_var}.legend.style.fontFamily = 'Monaco' - {self._chart_var}.legend.style.fontSize = '11px' - {self._chart_var}.legend.style.color = 'rgb(191, 195, 203)' - {self._chart_var}div.appendChild({self._chart_var}.legend) - - {parent_div}.parentNode.insertBefore({self._chart_var}div, {parent_div}.nextSibling) - charts.push({self._chart_var}) - - {self._chart_var}.chart.priceScale('').applyOptions({{ - scaleMargins: {{ - top: 0.8, - bottom: 0, - }} - }}); - {sub_sync} - ''') - - -class PyWebViewSubChart(SubChart): - def create_subchart(self, volume_enabled: bool = True, position: Literal['left', 'right', 'top', 'bottom'] = 'left', - width: float = 0.5, height: float = 0.5, sync: Union[bool, UUID] = False): - return self._chart._pywebview_subchart(volume_enabled, position, width, height, sync, parent=self) - - def create_line(self, color: str = 'rgba(214, 237, 255, 0.6)', width: int = 2): - return super().create_line(color, width).id - SCRIPT = """ document.body.style.backgroundColor = '#000000' - const markers = [] const horizontal_lines = [] -const lines = [] -const charts = [] - const up = 'rgba(39, 157, 130, 100)' const down = 'rgba(200, 97, 100, 100)' - -function makeChart(width, height, div) { - return LightweightCharts.createChart(div, { - width: width, - height: height, +function makeChart(innerWidth, innerHeight) { + let chart = {} + chart.scale = { + width: innerWidth, + height: innerHeight + } + chart.div = document.createElement('div') + chart.chart = LightweightCharts.createChart(chart.div, { + width: window.innerWidth*innerWidth, + height: window.innerHeight*innerHeight, layout: { textColor: '#d1d4dc', - backgroundColor: '#000000', - fontSize: 12, - }, - rightPriceScale: { - scaleMargins: { - top: 0.3, - bottom: 0.25, + background: { + color:'#000000', + type: LightweightCharts.ColorType.Solid, + }, + fontSize: 12 }, + rightPriceScale: { + scaleMargins: {top: 0.3, bottom: 0.25}, }, - timeScale: { - timeVisible: true, - secondsVisible: false, - }, + timeScale: {timeVisible: true, secondsVisible: false}, crosshair: { mode: LightweightCharts.CrosshairMode.Normal, + vertLine: { + labelBackgroundColor: 'rgb(46, 46, 46)' + }, + horzLine: { + labelBackgroundColor: 'rgb(55, 55, 55)' + } }, grid: { - vertLines: { - color: 'rgba(29, 30, 38, 5)', - }, - horzLines: { - color: 'rgba(29, 30, 58, 5)', - }, - }, - handleScroll: { - vertTouchDrag: true, + vertLines: {color: 'rgba(29, 30, 38, 5)'}, + horzLines: {color: 'rgba(29, 30, 58, 5)'}, }, + handleScroll: {vertTouchDrag: true}, }) -} -function makeCandlestickSeries(chart){ - return chart.addCandlestickSeries({ - color: 'rgb(0, 120, 255)', - upColor: up, - borderUpColor: up, - wickUpColor: up, + chart.series = chart.chart.addCandlestickSeries({color: 'rgb(0, 120, 255)', upColor: up, borderUpColor: up, wickUpColor: up, + downColor: down, borderDownColor: down, wickDownColor: down, lineWidth: 2, + }) + chart.volumeSeries = chart.chart.addHistogramSeries({ + color: '#26a69a', + priceFormat: {type: 'volume'}, + priceScaleId: '', + }) + chart.legend = document.createElement('div') + chart.legend.style.position = 'absolute' + chart.legend.style.zIndex = 1000 + chart.legend.style.width = `${(chart.scale.width*100)-8}vw` + chart.legend.style.top = '10px' + chart.legend.style.left = '10px' + chart.legend.style.fontFamily = 'Monaco' + chart.legend.style.fontSize = '11px' + chart.legend.style.color = 'rgb(191, 195, 203)' + chart.div.appendChild(chart.legend) - downColor: down, - borderDownColor: down, - wickDownColor: down, - lineWidth: 2, - }) + chart.chart.priceScale('').applyOptions({ + scaleMargins: {top: 0.8, bottom: 0} + }); + return chart } - -function makeVolumeSeries(chart) { - return chart.addHistogramSeries({ - color: '#26a69a', - priceFormat: { - type: 'volume', - }, - priceScaleId: '', -}); -} - -const chartsDiv = document.createElement('div') - -var chart = {} -chart.scale = { - width: __INNER_WIDTH__, - height: __INNER_HEIGHT__ -} -chart.chart = makeChart(window.innerWidth*chart.scale.width, window.innerHeight*chart.scale.height, chartsDiv) -chart.series = makeCandlestickSeries(chart.chart) -chart.volumeSeries = makeVolumeSeries(chart.chart) - - -document.body.appendChild(chartsDiv) - -chart.legend = document.createElement('div') -chart.legend.style.position = 'absolute' -chart.legend.style.zIndex = 1000 -chart.legend.style.width = `${(chart.scale.width*100)-8}vw` -chart.legend.style.top = '10px' -chart.legend.style.left = '10px' -chart.legend.style.fontFamily = 'Monaco' -chart.legend.style.fontSize = '11px' -chart.legend.style.color = 'rgb(191, 195, 203)' -document.body.appendChild(chart.legend) - -chart.chart.priceScale('').applyOptions({ - scaleMargins: { - top: 0.8, - bottom: 0, - } -}); - -window.addEventListener('resize', function() { - let width = window.innerWidth; - let height = window.innerHeight; - chart.chart.resize(width*chart.scale.width, height*chart.scale.height) - - charts.forEach(function (subchart) {{ - subchart.chart.resize(width*subchart.scale.width, height*subchart.scale.height) - }}); - -}); - function legendItemFormat(num) { - return num.toFixed(2).toString().padStart(8, ' ') +return num.toFixed(2).toString().padStart(8, ' ') } - """ HTML = f""" @@ -774,7 +561,7 @@ HTML = f""" lightweight-charts-python - + -
- + """ diff --git a/lightweight_charts/pkg.py b/lightweight_charts/pkg.py index f5bb152..0321a27 100644 --- a/lightweight_charts/pkg.py +++ b/lightweight_charts/pkg.py @@ -1,10 +1,9 @@ -LWC_3_5_0 = """ +LWC_4_0_1 = """ /*! * @license - * TradingView Lightweight Charts v3.5.0 - * Copyright (c) 2020 TradingView, Inc. + * TradingView Lightweight Charts™ v4.0.1 + * Copyright (c) 2023 TradingView, Inc. * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 */ -!function(){"use strict";var t,i;function n(t,i){var n,h=((n={})[0]=[],n[1]=[t.lineWidth,t.lineWidth],n[2]=[2*t.lineWidth,2*t.lineWidth],n[3]=[6*t.lineWidth,6*t.lineWidth],n[4]=[t.lineWidth,4*t.lineWidth],n)[i];t.setLineDash(h)}function h(t,i,n,h){t.beginPath();var s=t.lineWidth%2?.5:0;t.moveTo(n,i+s),t.lineTo(h,i+s),t.stroke()}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps"}(t||(t={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(i||(i={}));var s=function(t,i){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,i){t.__proto__=i}||function(t,i){for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])})(t,i)};function r(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=t}s(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var e=function(){return(e=Object.assign||function(t){for(var i,n=1,h=arguments.length;n=i.from;--s){var r=n.m[s];t.moveTo(r.g,r.p),t.arc(r.g,r.p,h,0,2*Math.PI)}t.fill()};t.fillStyle=n.k,h(n.N+2),t.fillStyle=n.S,h(n.N)}},i}(p);var k={from:0,to:1},x=function(){function t(t,i){this.C=new g,this.D=[],this.T=[],this.L=!0,this.B=t,this.A=i,this.C.i(this.D)}return t.prototype.O=function(t){var i=this,n=this.B.V();n.length!==this.D.length&&(this.T=n.map((function(){return{m:[{g:0,p:0,P:0,F:0}],S:"",k:i.B.I().layout.backgroundColor,N:0,M:null}})),this.D=this.T.map((function(t){var i=new y;return i._(t),i})),this.C.i(this.D)),this.L=!0},t.prototype.W=function(t,i,n){return this.L&&(this.R(),this.L=!1),this.C},t.prototype.R=function(){var t=this,i=this.B.V(),n=this.A.j(),h=this.B.U();i.forEach((function(i,s){var r=t.T[s],e=i.q(n);if(null!==e&&i.H()){var u=l(i.Y());r.S=e.K,r.k=e.$,r.N=e.N,r.m[0].F=e.F,r.m[0].p=i.Z().X(e.F,u.J),r.m[0].P=n,r.m[0].g=h.G(n),r.M=k}else r.M=null}))},t}(),N=function(){function t(t){this.tt=t}return t.prototype.h=function(t,i,s,r){if(null!==this.tt){var e=this.tt.it.H,u=this.tt.nt.H;if(e||u){t.save();var a=Math.round(this.tt.g*i),o=Math.round(this.tt.p*i),l=Math.ceil(this.tt.ht*i),f=Math.ceil(this.tt.st*i);t.lineCap="butt",e&&a>=0&&(t.lineWidth=Math.floor(this.tt.it.rt*i),t.strokeStyle=this.tt.it.et,t.fillStyle=this.tt.it.et,n(t,this.tt.it.ut),function(t,i,n,h){t.beginPath();var s=t.lineWidth%2?.5:0;t.moveTo(i+s,n),t.lineTo(i+s,h),t.stroke()}(t,a,0,f)),u&&o>=0&&(t.lineWidth=Math.floor(this.tt.nt.rt*i),t.strokeStyle=this.tt.nt.et,t.fillStyle=this.tt.nt.et,n(t,this.tt.nt.ut),h(t,o,0,l)),t.restore()}}},t}(),S=function(){function t(t){this.L=!0,this.at={it:{rt:1,ut:0,et:"",H:!1},nt:{rt:1,ut:0,et:"",H:!1},ht:0,st:0,g:0,p:0},this.ot=new N(this.at),this.lt=t}return t.prototype.O=function(){this.L=!0},t.prototype.W=function(t,i){return this.L&&(this.R(),this.L=!1),this.ot},t.prototype.R=function(){var t=this.lt.H(),i=l(this.lt.ft()),n=i.ct().I().crosshair,h=this.at;h.nt.H=t&&this.lt.vt(i),h.it.H=t&&this.lt._t(),h.nt.rt=n.horzLine.width,h.nt.ut=n.horzLine.style,h.nt.et=n.horzLine.color,h.it.rt=n.vertLine.width,h.it.ut=n.vertLine.style,h.it.et=n.vertLine.color,h.ht=i.dt(),h.st=i.wt(),h.g=this.lt.Mt(),h.p=this.lt.bt()},t}(),C={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function D(t){return t<0?0:t>255?255:Math.round(t)||0}var T=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,E=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,L=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,B=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function A(t){var i,n=function(t){var i;if((t=t.toLowerCase())in C&&(t=C[t]),i=B.exec(t)||L.exec(t))return[D(parseInt(i[1],10)),D(parseInt(i[2],10)),D(parseInt(i[3],10))];if(i=E.exec(t))return[D(parseInt(i[1],16)),D(parseInt(i[2],16)),D(parseInt(i[3],16))];if(i=T.exec(t))return[D(17*parseInt(i[1],16)),D(17*parseInt(i[2],16)),D(17*parseInt(i[3],16))];throw new Error("Cannot parse color: "+t)}(t);return{gt:"rgb("+n[0]+", "+n[1]+", "+n[2]+")",yt:(i=n,.199*i[0]+.687*i[1]+.114*i[2]>160?"black":"white")}}function O(t,i,n,h,s,r){t.fillRect(i+r,n,h-2*r,r),t.fillRect(i+r,n+s-r,h-2*r,r),t.fillRect(i,n,r,s),t.fillRect(i+h-r,n,r,s)}function V(t,i,n){t.save(),t.scale(i,i),n(),t.restore()}function z(t,i,n,h,s,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,h,s),t.restore()}var P,F=function(){function t(t,i){this._(t,i)}return t.prototype._=function(t,i){this.tt=t,this.kt=i},t.prototype.h=function(t,i,n,h,s,r){if(this.tt.H){t.font=i.xt;var e=this.tt.Nt||!this.tt.St?i.Ct:0,u=i.Dt,a=i.Tt,o=i.Et,l=i.Lt,f=i.Bt,c=this.tt.At,v=Math.ceil(n.Ot(t,c)),_=i.Vt,d=i.zt+a+o,w=Math.ceil(.5*d),M=u+v+l+f+e,b=this.kt.Pt;this.kt.Ft&&(b=this.kt.Ft);var m,g,p=(b=Math.round(b))-w,y=p+d,k="right"===s,x=k?h:0,N=Math.ceil(h*r),S=x;if(t.fillStyle=this.kt.gt,t.lineWidth=1,t.lineCap="butt",c){k?(m=x-e,g=(S=x-M)+f):(S=x+M,m=x+e,g=x+u+e+l);var C=Math.max(1,Math.floor(r)),D=Math.max(1,Math.floor(u*r)),T=k?N:0,E=Math.round(p*r),L=Math.round(S*r),B=Math.round(b*r)-Math.floor(.5*r),A=B+C+(B-E),O=Math.round(m*r);t.save(),t.beginPath(),t.moveTo(T,E),t.lineTo(L,E),t.lineTo(L,A),t.lineTo(T,A),t.fill(),t.fillStyle=this.tt.$,t.fillRect(k?N-D:0,E,D,A-E),this.tt.Nt&&(t.fillStyle=this.kt.et,t.fillRect(T,B,O-T,C)),t.textAlign="left",t.fillStyle=this.kt.et,V(t,r,(function(){t.fillText(c,g,y-o-_)})),t.restore()}}},t.prototype.wt=function(t,i){return this.tt.H?t.zt+t.Tt+t.Et:0},t}(),I=function(){function t(t){this.It={Pt:0,et:"#FFF",gt:"#000"},this.Wt={At:"",H:!1,Nt:!0,St:!1,$:""},this.Rt={At:"",H:!1,Nt:!1,St:!0,$:""},this.L=!0,this.jt=new(t||F)(this.Wt,this.It),this.Ut=new(t||F)(this.Rt,this.It)}return t.prototype.At=function(){return this.Wt.At},t.prototype.Pt=function(){return this.qt(),this.It.Pt},t.prototype.O=function(){this.L=!0},t.prototype.wt=function(t,i){return void 0===i&&(i=!1),Math.max(this.jt.wt(t,i),this.Ut.wt(t,i))},t.prototype.Ht=function(){return this.It.Ft||0},t.prototype.Yt=function(t){this.It.Ft=t},t.prototype.Kt=function(){return this.qt(),this.Wt.H||this.Rt.H},t.prototype.$t=function(){return this.qt(),this.Wt.H},t.prototype.W=function(t){return this.qt(),this.Wt.Nt=this.Wt.Nt&&t.I().drawTicks,this.Rt.Nt=this.Rt.Nt&&t.I().drawTicks,this.jt._(this.Wt,this.It),this.Ut._(this.Rt,this.It),this.jt},t.prototype.Xt=function(){return this.qt(),this.jt._(this.Wt,this.It),this.Ut._(this.Rt,this.It),this.Ut},t.prototype.qt=function(){this.L&&(this.Wt.Nt=!0,this.Rt.Nt=!1,this.Zt(this.Wt,this.Rt,this.It))},t}(),W=function(t){function i(i,n,h){var s=t.call(this)||this;return s.lt=i,s.Jt=n,s.Gt=h,s}return r(i,t),i.prototype.Zt=function(t,i,n){t.H=!1;var h=this.lt.I().horzLine;if(h.labelVisible){var s=this.Jt.Y();if(this.lt.H()&&!this.Jt.Qt()&&null!==s){var r=A(h.labelBackgroundColor);n.gt=r.gt,n.et=r.yt;var e=this.Gt(this.Jt);n.Pt=e.Pt,t.At=this.Jt.ti(e.F,s),t.H=!0}}},i}(I),R=/[1-9]/g,j=function(){function t(){this.tt=null}return t.prototype._=function(t){this.tt=t},t.prototype.h=function(t,i,n){var h=this;if(null!==this.tt&&!1!==this.tt.H&&0!==this.tt.At.length){t.font=i.xt;var s=Math.round(i.ii.Ot(t,this.tt.At,R));if(!(s<=0)){t.save();var r=i.ni,e=s+2*r,u=e/2,a=this.tt.dt,o=this.tt.Pt,f=Math.floor(o-u)+.5;f<0?(o+=Math.abs(0-f),f=Math.floor(o-u)+.5):f+e>a&&(o-=Math.abs(a-(f+e)),f=Math.floor(o-u)+.5);var c=f+e,v=0+i.Dt+i.Tt+i.zt+i.Et;t.fillStyle=this.tt.gt;var _=Math.round(f*n),d=Math.round(0*n),w=Math.round(c*n),M=Math.round(v*n);t.fillRect(_,d,w-_,M-d);var b=Math.round(this.tt.Pt*n),m=d,g=Math.round((m+i.Dt+i.Ct)*n);t.fillStyle=this.tt.et;var p=Math.max(1,Math.floor(n)),y=Math.floor(.5*n);t.fillRect(b-y,m,p,g-m);var k=v-i.Vt-i.Et;t.textAlign="left",t.fillStyle=this.tt.et,V(t,n,(function(){t.fillText(l(h.tt).At,f+r,k)})),t.restore()}}},t}(),U=function(){function t(t,i,n){this.L=!0,this.ot=new j,this.at={H:!1,gt:"#4c525e",et:"white",At:"",dt:0,Pt:NaN},this.A=t,this.hi=i,this.Gt=n}return t.prototype.O=function(){this.L=!0},t.prototype.W=function(){return this.L&&(this.R(),this.L=!1),this.ot._(this.at),this.ot},t.prototype.R=function(){var t=this.at;t.H=!1;var i=this.A.I().vertLine;if(i.labelVisible){var n=this.hi.U();if(!n.Qt()){var h=n.si(this.A.j());t.dt=n.dt();var s=this.Gt();if(s.P){t.Pt=s.Pt,t.At=n.ri(l(h)),t.H=!0;var r=A(i.labelBackgroundColor);t.gt=r.gt,t.et=r.yt}}}},t}(),q=function(){function t(){this.ei=null,this.ui=0}return t.prototype.ai=function(){return this.ui},t.prototype.oi=function(t){this.ui=t},t.prototype.Z=function(){return this.ei},t.prototype.li=function(t){this.ei=t},t.prototype.fi=function(t,i){return[]},t.prototype.ci=function(t){return[]},t.prototype.vi=function(){return[]},t.prototype.H=function(){return!0},t}();!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet"}(P||(P={}));var H=function(t){function i(i,n){var h=t.call(this)||this;h._i=null,h.di=NaN,h.wi=0,h.Mi=!0,h.bi=new Map,h.mi=!1,h.gi=NaN,h.pi=NaN,h.yi=NaN,h.ki=NaN,h.hi=i,h.xi=n,h.Ni=new x(i,h);var s,r;h.Si=(s=function(){return h.di},r=function(){return h.pi},function(t){var i=r(),n=s();if(t===l(h._i).Ci())return{F:n,Pt:i};var e=l(t.Y());return{F:t.Di(i,e),Pt:i}});var e=function(t,i){return function(){return{P:h.hi.U().si(t()),Pt:i()}}}((function(){return h.wi}),(function(){return h.Mt()}));return h.Ti=new U(h,i,e),h.Ei=new S(h),h}return r(i,t),i.prototype.I=function(){return this.xi},i.prototype.Li=function(t,i){this.yi=t,this.ki=i},i.prototype.Bi=function(){this.yi=NaN,this.ki=NaN},i.prototype.Ai=function(){return this.yi},i.prototype.Oi=function(){return this.ki},i.prototype.Vi=function(t,i,n){this.mi||(this.mi=!0),this.Mi=!0,this.zi(t,i,n)},i.prototype.j=function(){return this.wi},i.prototype.Mt=function(){return this.gi},i.prototype.bt=function(){return this.pi},i.prototype.H=function(){return this.Mi},i.prototype.Pi=function(){this.Mi=!1,this.Fi(),this.di=NaN,this.gi=NaN,this.pi=NaN,this._i=null,this.Bi()},i.prototype.ci=function(t){return null!==this._i?[this.Ei,this.Ni]:[]},i.prototype.vt=function(t){return t===this._i&&this.xi.horzLine.visible},i.prototype._t=function(){return this.xi.vertLine.visible},i.prototype.fi=function(t,i){this.Mi&&this._i===t||this.bi.clear();var n=[];return this._i===t&&n.push(this.Ii(this.bi,i,this.Si)),n},i.prototype.vi=function(){return this.Mi?[this.Ti]:[]},i.prototype.ft=function(){return this._i},i.prototype.Wi=function(){this.Ei.O(),this.bi.forEach((function(t){return t.O()})),this.Ti.O(),this.Ni.O()},i.prototype.Ri=function(t){return t&&!t.Ci().Qt()?t.Ci():null},i.prototype.zi=function(t,i,n){this.ji(t,i,n)&&this.Wi()},i.prototype.ji=function(t,i,n){var h=this.gi,s=this.pi,r=this.di,e=this.wi,u=this._i,a=this.Ri(n);this.wi=t,this.gi=isNaN(t)?NaN:this.hi.U().G(t),this._i=n;var o=null!==a?a.Y():null;return null!==a&&null!==o?(this.di=i,this.pi=a.X(i,o)):(this.di=NaN,this.pi=NaN),h!==this.gi||s!==this.pi||e!==this.wi||r!==this.di||u!==this._i},i.prototype.Fi=function(){var t=this.hi.V().map((function(t){return t.qi().Ui()})).filter(b),i=0===t.length?null:Math.max.apply(Math,t);this.wi=null!==i?i:NaN},i.prototype.Ii=function(t,i,n){var h=t.get(i);return void 0===h&&(h=new W(this,i,n),t.set(i,h)),h},i}(q),Y=".";function K(t,i){if(!v(t))return"n/a";if(!_(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}var $=function(){function t(t,i){if(i||(i=1),v(t)&&_(t)||(t=100),t<0)throw new TypeError("invalid base");this.Jt=t,this.Hi=i,this.Yi()}return t.prototype.format=function(t){var i=t<0?"−":"";return t=Math.abs(t),i+this.Ki(t)},t.prototype.Yi=function(){if(this.$i=0,this.Jt>0&&this.Hi>0)for(var t=this.Jt;t>1;)t/=10,this.$i++},t.prototype.Ki=function(t){var i=this.Jt/this.Hi,n=Math.floor(t),h="",s=void 0!==this.$i?this.$i:NaN;if(i>1){var r=+(Math.round(t*i)-n*i).toFixed(this.$i);r>=i&&(r-=i,n+=1),h=Y+K(+r.toFixed(this.$i)*this.Hi,s)}else n=Math.round(n*i)/i,s>0&&(h=Y+K(0,s));return n.toFixed(0)+h},t}(),X=function(t){function i(i){return void 0===i&&(i=100),t.call(this,i)||this}return r(i,t),i.prototype.format=function(i){return t.prototype.format.call(this,i)+"%"},i}($),Z=function(){function t(){this.Xi=[]}return t.prototype.Zi=function(t,i,n){var h={Ji:t,Gi:i,Qi:!0===n};this.Xi.push(h)},t.prototype.tn=function(t){var i=this.Xi.findIndex((function(i){return t===i.Ji}));i>-1&&this.Xi.splice(i,1)},t.prototype.nn=function(t){this.Xi=this.Xi.filter((function(i){return i.Gi===t}))},t.prototype.hn=function(t,i){var n=u([],this.Xi);this.Xi=this.Xi.filter((function(t){return!t.Qi})),n.forEach((function(n){return n.Ji(t,i)}))},t.prototype.sn=function(){return this.Xi.length>0},t.prototype.rn=function(){this.Xi=[]},t}(),J=function(){function t(t,i){this.en=t,this.un=i}return t.prototype.an=function(t){return null!==t&&(this.en===t.en&&this.un===t.un)},t.prototype.on=function(){return new t(this.en,this.un)},t.prototype.ln=function(){return this.en},t.prototype.fn=function(){return this.un},t.prototype.cn=function(){return this.un-this.en},t.prototype.Qt=function(){return this.un===this.en||Number.isNaN(this.un)||Number.isNaN(this.en)},t.prototype.vn=function(i){return null===i?this:new t(Math.min(this.ln(),i.ln()),Math.max(this.fn(),i.fn()))},t.prototype._n=function(t){if(v(t)&&0!==this.un-this.en){var i=.5*(this.un+this.en),n=this.un-i,h=this.en-i;n*=t,h*=t,this.un=i+n,this.en=i+h}},t.prototype.dn=function(t){v(t)&&(this.un+=t,this.en+=t)},t.prototype.wn=function(){return{minValue:this.en,maxValue:this.un}},t.Mn=function(i){return null===i?null:new t(i.minValue,i.maxValue)},t}();function G(t,i,n){return Math.min(Math.max(t,i),n)}function Q(t,i,n){return i-t<=n}function tt(t){return t<=0?NaN:Math.log(t)/Math.log(10)}function it(t){var i=Math.ceil(t);return i%2!=0?i-1:i}function nt(t){var i=Math.ceil(t);return i%2==0?i-1:i}function ht(t,i){var n=100*(t-i)/i;return i<0?-n:n}function st(t,i){var n=ht(t.ln(),i),h=ht(t.fn(),i);return new J(n,h)}function rt(t,i){var n=100*(t-i)/i+100;return i<0?-n:n}function et(t,i){var n=rt(t.ln(),i),h=rt(t.fn(),i);return new J(n,h)}function ut(t){var i=Math.abs(t);if(i<1e-8)return 0;var n=tt(i+1e-4)+4;return t<0?-n:n}function at(t){var i=Math.abs(t);if(i<1e-8)return 0;var n=Math.pow(10,i-4)-1e-4;return t<0?-n:n}function ot(t){if(null===t)return null;var i=ut(t.ln()),n=ut(t.fn());return new J(i,n)}var lt,ft=function(){function t(t,i){if(this.bn=t,this.mn=i,function(t){if(t<0)return!1;for(var i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.bn))this.gn=[2,2.5,2];else{this.gn=[];for(var n=this.bn;1!==n;){if(n%2==0)this.gn.push(2),n/=2;else{if(n%5!=0)throw new Error("unexpected base");this.gn.push(2,2.5),n/=5}if(this.gn.length>100)throw new Error("something wrong with base")}}}return t.prototype.pn=function(t,i,n){for(var h,s,r,e=0===this.bn?0:1/this.bn,u=1e-9,a=Math.pow(10,Math.max(0,Math.ceil(tt(t-i)))),o=0,l=this.mn[0];;){var f=Q(a,e,u)&&a>e+u,c=Q(a,n*l,u),v=Q(a,1,u);if(!(f&&c&&v))break;a/=l,l=this.mn[++o%this.mn.length]}if(a<=e+u&&(a=e),a=Math.max(1,a),this.gn.length>0&&(h=a,s=1,r=u,Math.abs(h-s)e+u;)a/=l,l=this.gn[++o%this.gn.length];return a},t}(),ct=function(){function t(t,i,n,h){this.yn=[],this.Jt=t,this.bn=i,this.kn=n,this.xn=h}return t.prototype.pn=function(t,i){if(t=o?1:-1,v=null,_=0,d=a-(f+=f<0?l:0);d>o;d-=l){var w=this.xn(d,i,!0);null!==v&&Math.abs(w-v)u||(_1)throw new Error("Invalid top margin - expect value between 0 and 1, given="+i);if(n<0||n>1||i+n>1)throw new Error("Invalid bottom margin - expect value between 0 and 1, given="+n);if(i+n>1)throw new Error("Invalid margins - sum of margins must be less than 1, given="+(i+n));this.uh(),this.Yn=null}},t.prototype.ah=function(){return this.xi.autoScale},t.prototype.Ln=function(){return 1===this.xi.mode},t.prototype.oh=function(){return 2===this.xi.mode},t.prototype.lh=function(){return 3===this.xi.mode},t.prototype.eh=function(){return{fh:this.xi.autoScale,_h:this.xi.invertScale,eh:this.xi.mode}},t.prototype.rh=function(t){var i=this.eh(),n=null;void 0!==t.fh&&(this.xi.autoScale=t.fh),void 0!==t.eh&&(this.xi.mode=t.eh,2!==t.eh&&3!==t.eh||(this.xi.autoScale=!0),this.Pn.Fn=!1),1===i.eh&&t.eh!==i.eh&&(!function(t){if(null===t)return!1;var i=at(t.ln()),n=at(t.fn());return isFinite(i)&&isFinite(n)}(this.Vn)?this.xi.autoScale=!0:null!==(n=function(t){if(null===t)return null;var i=at(t.ln()),n=at(t.fn());return new J(i,n)}(this.Vn))&&this.dh(n)),1===t.eh&&t.eh!==i.eh&&null!==(n=ot(this.Vn))&&this.dh(n);var h=i.eh!==this.xi.mode;h&&(2===i.eh||this.oh())&&this.sh(),h&&(3===i.eh||this.lh())&&this.sh(),void 0!==t._h&&i._h!==t._h&&(this.xi.invertScale=t._h,this.wh()),this.Un.hn(i,this.eh())},t.prototype.Mh=function(){return this.Un},t.prototype.zt=function(){return this.Jn.fontSize},t.prototype.wt=function(){return this.An},t.prototype.bh=function(t){this.An!==t&&(this.An=t,this.uh(),this.Yn=null)},t.prototype.mh=function(){if(this.On)return this.On;var t=this.wt()-this.gh()-this.ph();return this.On=t,t},t.prototype.yh=function(){return this.kh(),this.Vn},t.prototype.dh=function(t,i){var n=this.Vn;(i||null===n&&null!==t||null!==n&&!n.an(t))&&(this.Yn=null,this.Vn=t)},t.prototype.Qt=function(){return this.kh(),0===this.An||!this.Vn||this.Vn.Qt()},t.prototype.xh=function(t){return this._h()?t:this.wt()-1-t},t.prototype.X=function(t,i){return this.oh()?t=ht(t,i):this.lh()&&(t=rt(t,i)),this.ih(t,i)},t.prototype.Nh=function(t,i,n){this.kh();for(var h=this.ph(),s=l(this.yh()),r=s.ln(),e=s.fn(),u=this.mh()-1,a=this._h(),o=u/(e-r),f=void 0===n?0:n.from,c=void 0===n?t.length:n.to,v=this.Sh(),_=f;_= left"),this.Es=t,this.Ls=i}return t.prototype.hs=function(){return this.Es},t.prototype.ss=function(){return this.Ls},t.prototype.Bs=function(){return this.Ls-this.Es+1},t.prototype.As=function(t){return this.Es<=t&&t<=this.Ls},t.prototype.an=function(t){return this.Es===t.hs()&&this.Ls===t.ss()},t}();function Ct(t,i){return null===t||null===i?t===i:t.an(i)}var Dt,Tt=function(){function t(){this.Os=new Map,this.ys=null}return t.prototype.Vs=function(t){var i=this;this.ys=null,this.Os.clear(),t.forEach((function(t,n){var h=i.Os.get(t.zs);void 0===h&&(h=[],i.Os.set(t.zs,h)),h.push({Ps:n,P:t.P,Fs:t.zs})}))},t.prototype.Is=function(t,i){var n=Math.ceil(i/t);return null!==this.ys&&this.ys.Ws===n||(this.ys={Bn:this.Rs(n),Ws:n}),this.ys.Bn},t.prototype.Rs=function(t){for(var i=[],n=0,h=Array.from(this.Os.keys()).sort((function(t,i){return i-t}));n=t&&d-c>=t&&(i.push(_),c=d)}for(;uthis.$s[this.$s.length-1].P.Cs)return i?this.$s.length-1:null;for(var n=0;n=1,a=u?t:h+(t-h)*e;n.dr(a),u||setTimeout(r,20)};r()},t.prototype.O=function(t){this.Gs=!0,this.$s=t,this.Xs.Vs(t),this.Er()},t.prototype.Kr=function(){return this.Qs},t.prototype.$r=function(){return this.tr},t.prototype.Xr=function(){return this.ir},t.prototype.Lr=function(){return this.Ks||0},t.prototype.Zr=function(t){var i=t.Bs();this.Dr(this.Ys/i),this.rr=t.ss()-this.Lr(),this.Er(),this.Gs=!0,this.hi.Vr(),this.hi.zr()},t.prototype.Jr=function(){var t=this.yr(),i=this.kr();null!==t&&null!==i&&this.Zr(new St(t,i+this.xi.rightOffset))},t.prototype.Gr=function(t){var i=new St(t.from,t.to);this.Zr(i)},t.prototype.ri=function(t){return void 0!==this.Gn.timeFormatter?this.Gn.timeFormatter(t.Ss||t.Cs):this.Qr.os(new Date(1e3*t.Cs))},t.prototype.yr=function(){return 0===this.$s.length?null:0},t.prototype.kr=function(){return 0===this.$s.length?null:this.$s.length-1},t.prototype.te=function(t){return(this.Ys-1-t)/this.er},t.prototype.Or=function(t){var i=this.te(t),n=this.Lr()+this.rr-i;return Math.round(1e6*n)/1e6},t.prototype.Dr=function(t){var i=this.er;this.er=t,this.Tr(),i!==this.er&&(this.Gs=!0,this.ie())},t.prototype.br=function(){if(this.Gs)if(this.Gs=!1,this.Qt())this.ne(Et.Hs());else{var t=this.Lr(),i=this.Ys/this.er,n=this.rr+t,h=new St(n-i+1,n);this.ne(new Et(h))}},t.prototype.Tr=function(){var t=this.he();if(this.eri&&(this.er=i,this.Gs=!0)}},t.prototype.he=function(){return this.xi.fixLeftEdge&&this.xi.fixRightEdge?this.Ys/this.$s.length:this.xi.minBarSpacing},t.prototype.Er=function(){var t=this.se();this.rr>t&&(this.rr=t,this.Gs=!0);var i=this.re();null!==i&&this.rr=1e-15&&t<1?t.toFixed(this.Se).replace(/\.?0+$/,""):String(t)).replace(/(\.[1-9]*)0+$/,(function(t,i){return i}))},t}();function Wt(t,i,n,h){if(0!==i.length){var s=i[h.from].g,r=i[h.from].p;t.moveTo(s,r);for(var e=h.from+1;ethis.v.M.from&&(t.lineTo(this.v.m[this.v.M.to-1].g,this.v.Te),t.lineTo(this.v.m[this.v.M.from].g,this.v.Te));t.closePath();var s=t.createLinearGradient(0,0,0,this.v.Te);s.addColorStop(0,this.v.Le),s.addColorStop(1,this.v.Be),t.fillStyle=s,t.fill()}},i}(p),jt=function(t){function i(){var i=null!==t&&t.apply(this,arguments)||this;return i.v=null,i}return r(i,t),i.prototype._=function(t){this.v=t},i.prototype.u=function(t){if(null!==this.v&&0!==this.v.m.length&&null!==this.v.M){if(t.lineCap="butt",t.lineWidth=this.v.rt,n(t,this.v.ut),t.strokeStyle=this.v.S,t.lineJoin="round",t.beginPath(),1===this.v.m.length){var i=this.v.m[0];t.moveTo(i.g-this.v.De/2,i.p),t.lineTo(i.g+this.v.De/2,i.p)}else Wt(t,this.v.m,this.v.Ee,this.v.M);t.stroke()}},i}(p);function Ut(t,i,n,h,s){void 0===h&&(h=0),void 0===s&&(s=t.length);for(var r=s-h;0>1,u=h+e;n(t[u],i)?(h=u+1,r-=e+1):r=e}return h}function qt(t,i,n,h,s){void 0===h&&(h=0),void 0===s&&(s=t.length);for(var r=s-h;0>1,u=h+e;n(i,t[u])?r=e:(h=u+1,r-=e+1)}return h}function Ht(t,i){return t.P0&&r=h&&(u=r-1),e>0&&e=2)Math.max(1,Math.floor(i))%2!=this.tu%2&&this.tu--;this.iu=this.tt.hu?Math.min(this.tu,Math.floor(i)):this.tu;for(var s=null,r=this.iu<=this.tu&&this.tt.Pr>=Math.floor(1.5*i),e=this.tt.M.from;ed+M-1&&(g=(p=d+M-1)-f+1),t.fillRect(m,g,l-m,p-g+1)}var y=o+b,k=Math.max(d,Math.round(u.Lh*i)-a),x=k+f-1;x>d+M-1&&(k=(x=d+M-1)-f+1),t.fillRect(c+1,k,y-c,x-k+1)}}}},t.prototype.nu=function(t){var i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(l(this.tt).Pr,t)))},t}(),Gt=function(t){function i(i,n){return t.call(this,i,n,!1)||this}return r(i,t),i.prototype.Ke=function(t,i,n){i.Br(this.ze,m(this.Pe)),t.Ch(this.ze,n,m(this.Pe))},i.prototype.ru=function(t,i,n){return{P:t,open:i.J[0],high:i.J[1],low:i.J[2],close:i.J[3],g:NaN,Dh:NaN,Th:NaN,Eh:NaN,Lh:NaN}},i.prototype.je=function(){var t=this,i=this.Fe.Xe();this.ze=this.Fe.qi().Ze().map((function(n){return t.Je(n.Ps,n,i)}))},i}($t),Qt=function(t){function i(){var i=null!==t&&t.apply(this,arguments)||this;return i.ot=new Jt,i}return r(i,t),i.prototype.W=function(t,i){if(!this.Fe.H())return null;var n=this.Fe.I();this.Re();var h={qi:this.ze,Pr:this.Ie.U().Pr(),su:n.openVisible,hu:n.thinBars,M:this.Pe};return this.ot._(h),this.ot},i.prototype.qe=function(){var t=this;this.ze.forEach((function(i){i.et=t.Fe.Xe().uu(i.P).eu}))},i.prototype.Je=function(t,i,n){return e(e({},this.ru(t,i,n)),{et:n.uu(t).eu})},i}(Gt),ti=function(){function t(){this.tt=null,this.tu=0}return t.prototype._=function(t){this.tt=t},t.prototype.h=function(t,i,n,h){if(null!==this.tt&&0!==this.tt.qi.length&&null!==this.tt.M){if(this.tu=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);var n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),h=Math.floor(t*n*i),s=Math.floor(t*i),r=Math.min(h,s);return Math.max(Math.floor(i),r)}(this.tt.Pr,i),this.tu>=2)Math.floor(i)%2!=this.tu%2&&this.tu--;var s=this.tt.qi;this.tt.au&&this.ou(t,s,this.tt.M,i),this.tt.lu&&this.fu(t,s,this.tt.M,this.tt.Pr,i);var r=this.cu(i);(!this.tt.lu||this.tu>2*r)&&this.vu(t,s,this.tt.M,i)}},t.prototype.ou=function(t,i,n,h){if(null!==this.tt){var s="",r=Math.min(Math.floor(h),Math.floor(this.tt.Pr*h));r=Math.max(Math.floor(h),Math.min(r,this.tu));for(var e=Math.floor(.5*r),u=null,a=n.from;a2*e)O(t,l,c,f-l+1,v-c+1,e);else{var _=f-l+1;t.fillRect(l,c,_,v-c+1)}u=f}},t.prototype.vu=function(t,i,n,h){if(null!==this.tt)for(var s="",r=this.cu(h),e=n.from;eo||t.fillRect(l,a,f-l+1,o-a+1)}},t}(),ii=function(t){function i(){var i=null!==t&&t.apply(this,arguments)||this;return i.ot=new ti,i}return r(i,t),i.prototype.W=function(t,i){if(!this.Fe.H())return null;var n=this.Fe.I();this.Re();var h={qi:this.ze,Pr:this.Ie.U().Pr(),au:n.wickVisible,lu:n.borderVisible,M:this.Pe};return this.ot._(h),this.ot},i.prototype.qe=function(){var t=this;this.ze.forEach((function(i){var n=t.Fe.Xe().uu(i.P);i.et=n.eu,i._u=n.du,i.$=n.wu}))},i.prototype.Je=function(t,i,n){var h=n.uu(t);return e(e({},this.ru(t,i,n)),{et:h.eu,_u:h.du,$:h.wu})},i}(Gt),ni=function(){function t(){this.tt=null,this.Mu=[]}return t.prototype._=function(t){this.tt=t,this.Mu=[]},t.prototype.h=function(t,i,n,h){if(null!==this.tt&&0!==this.tt.m.length&&null!==this.tt.M){this.Mu.length||this.bu(i);for(var s=Math.max(1,Math.floor(i)),r=Math.round(this.tt.mu*i)-Math.floor(s/2),e=r+s,u=this.tt.M.from;ul.pu?l.ss=o.hs-i-1:o.hs=l.ss+i+1))}var f=Math.ceil(this.tt.Pr*t);for(h=this.tt.M.from;h0&&f<4)for(h=this.tt.M.from;hf&&(o.gu>o.pu?o.ss-=1:o.hs+=1)}}else this.Mu=[]},t}();function hi(t){return{m:[],Pr:t,mu:NaN,M:null}}function si(t,i,n){return{P:t,F:i,g:NaN,p:NaN,et:n}}var ri=function(t){function i(i,n){var h=t.call(this,i,n,!1)||this;return h.C=new g,h.yu=hi(0),h.ot=new ni,h}return r(i,t),i.prototype.W=function(t,i){return this.Fe.H()?(this.Re(),this.C):null},i.prototype.je=function(){var t=this.Ie.U().Pr();this.yu=hi(t);for(var i=0,n=0,h=this.Fe.I().color,s=0,r=this.Fe.qi().Ze();sMath.ceil(this.tt.wt*i))){var u=Math.ceil(this.tt.dt*i);t.lineCap="butt",t.strokeStyle=this.tt.et,t.lineWidth=Math.floor(this.tt.rt*i),n(t,this.tt.ut),h(t,e,0,u)}}},t}(),ci=function(){function t(t){this.zu={dt:0,wt:0,p:0,et:"rgba(0, 0, 0, 0)",rt:1,ut:0,H:!1},this.Pu=new fi,this.L=!0,this.Fe=t,this.Ie=t.ct(),this.Pu._(this.zu)}return t.prototype.O=function(){this.L=!0},t.prototype.W=function(t,i){return this.Fe.H()?(this.L&&(this.Fu(t,i),this.L=!1),this.Pu):null},t}(),vi=function(t){function i(i){return t.call(this,i)||this}return r(i,t),i.prototype.Fu=function(t,i){this.zu.H=!1;var n=this.Fe.Z(),h=n.eh().eh;if(2===h||3===h){var s=this.Fe.I();if(s.baseLineVisible&&this.Fe.H()){var r=this.Fe.Y();null!==r&&(this.zu.H=!0,this.zu.p=n.X(r.J,r.J),this.zu.dt=i,this.zu.wt=t,this.zu.et=s.baseLineColor,this.zu.rt=s.baseLineWidth,this.zu.ut=s.baseLineStyle)}}},i}(ci);function _i(t,i){return nt(Math.min(Math.max(t,12),30)*i)}function di(t,i){switch(t){case"arrowDown":case"arrowUp":return _i(i,1);case"circle":return _i(i,.8);case"square":return _i(i,.7)}}function wi(t){return it(_i(t,1))}function Mi(t){return Math.max(_i(t,.1),3)}function bi(t,i,n,h,s){var r=di("square",n),e=(r-1)/2,u=t-e,a=i-e;return h>=u&&h<=u+r&&s>=a&&s<=a+r}function mi(t,i,n,h,s){var r=(di("arrowUp",s)-1)/2,e=(nt(s/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,h),i.lineTo(n,h-r),i.lineTo(n+r,h),i.lineTo(n+e,h),i.lineTo(n+e,h+r),i.lineTo(n-e,h+r),i.lineTo(n-e,h)):(i.moveTo(n-r,h),i.lineTo(n,h+r),i.lineTo(n+r,h),i.lineTo(n+e,h),i.lineTo(n+e,h-r),i.lineTo(n-e,h-r),i.lineTo(n-e,h)),i.fill()}function gi(t,i,n,h,s,r){return bi(i,n,h,s,r)}var pi=function(t){function i(){var i=null!==t&&t.apply(this,arguments)||this;return i.tt=null,i.Du=new ai,i.oe=-1,i.le="",i.Iu="",i}return r(i,t),i.prototype._=function(t){this.tt=t},i.prototype.Tu=function(t,i){this.oe===t&&this.le===i||(this.oe=t,this.le=i,this.Iu=Vt(t,i),this.Du.Nu())},i.prototype.Wu=function(t,i){if(null===this.tt||null===this.tt.M)return null;for(var n=this.tt.M.from;n=t&&s<=t+n&&r>=i-e&&r<=i+e}(t.g,t.At.p,t.At.dt,t.At.wt,i,n))||function(t,i,n){if(0===t.Ye)return!1;switch(t.Hu){case"arrowDown":case"arrowUp":return gi(0,t.g,t.p,t.Ye,i,n);case"circle":return function(t,i,n,h,s){var r=2+di("circle",n)/2,e=t-h,u=i-s;return Math.sqrt(e*e+u*u)<=r}(t.g,t.p,t.Ye,i,n);case"square":return bi(t.g,t.p,t.Ye,i,n)}t.Hu}(t,i,n)}function xi(t,i,n,h,s,r,e,u,a){var o=v(n)?n:n.close,l=v(n)?n:n.high,f=v(n)?n:n.low,c=v(i.size)?Math.max(i.size,0):1,_=wi(u.Pr())*c,d=_/2;switch(t.Ye=_,i.position){case"inBar":return t.p=e.X(o,a),void(void 0!==t.At&&(t.At.p=t.p+d+r+.6*s));case"aboveBar":return t.p=e.X(l,a)-d-h.Yu,void 0!==t.At&&(t.At.p=t.p-d-.6*s,h.Yu+=1.2*s),void(h.Yu+=_+r);case"belowBar":return t.p=e.X(f,a)+d+h.Ku,void 0!==t.At&&(t.At.p=t.p+d+r+.6*s,h.Ku+=1.2*s),void(h.Ku+=_+r)}i.position}var Ni=function(){function t(t,i){this.L=!0,this.$u=!0,this.Xu=!0,this.Zu=null,this.ot=new pi,this.Ju=t,this.hi=i,this.tt={m:[],M:null}}return t.prototype.O=function(t){this.L=!0,this.Xu=!0,"data"===t&&(this.$u=!0)},t.prototype.W=function(t,i,n){if(!this.Ju.H())return null;this.L&&this.Re();var h=this.hi.I().layout;return this.ot.Tu(h.fontSize,h.fontFamily),this.ot._(this.tt),this.ot},t.prototype.Gu=function(){if(this.Xu){if(this.Ju.Qu().length>0){var t=this.hi.U().Pr(),i=Mi(t),n=1.5*wi(t)+2*i;this.Zu={above:n,below:n}}else this.Zu=null;this.Xu=!1}return this.Zu},t.prototype.Re=function(){var t=this.Ju.Z(),i=this.hi.U(),n=this.Ju.Qu();this.$u&&(this.tt.m=n.map((function(t){return{P:t.time,g:0,p:0,Ye:0,Hu:t.shape,et:t.color,ju:t.ju,Uu:t.id,At:void 0}})),this.$u=!1);var h=this.hi.I().layout;this.tt.M=null;var s=i.Mr();if(null!==s){var r=this.Ju.Y();if(null!==r&&0!==this.tt.m.length){var e=NaN,u=Mi(i.Pr()),a={Yu:u,Ku:u};this.tt.M=Kt(this.tt.m,s,!0);for(var o=this.tt.M.from;o0&&(f.At={qu:l.text,p:0,dt:0,wt:0});var c=this.Ju.ta(l.time);null!==c&&xi(f,l,c,a,h.fontSize,u,t,i,r.J)}this.L=!1}}},t}(),Si=function(t){function i(i){return t.call(this,i)||this}return r(i,t),i.prototype.Fu=function(t,i){var n=this.zu;n.H=!1;var h=this.Fe.I();if(h.priceLineVisible&&this.Fe.H()){var s=this.Fe.ia(0===h.priceLineSource);s.na||(n.H=!0,n.p=s.Pt,n.et=this.Fe.ha(s.et),n.dt=i,n.wt=t,n.rt=h.priceLineWidth,n.ut=h.priceLineStyle)}},i}(ci),Ci=function(t){function i(i){var n=t.call(this)||this;return n.lt=i,n}return r(i,t),i.prototype.Zt=function(t,i,n){if(t.H=!1,i.H=!1,this.lt.H()){var h=this.lt.I(),s=h.lastValueVisible,r=""!==this.lt.sa(),e=0===h.seriesLastValueMode,u=this.lt.ia(!1);if(!u.na){s&&(t.At=this.ra(u,s,e),t.H=0!==t.At.length),(r||e)&&(i.At=this.ea(u,s,r,e),i.H=i.At.length>0);var a=this.lt.ha(u.et),o=A(a);n.gt=o.gt,n.et=o.yt,n.Pt=u.Pt,i.$=this.lt.ct().I().layout.backgroundColor,t.$=a}}},i.prototype.ea=function(t,i,n,h){var s="",r=this.lt.sa();return n&&0!==r.length&&(s+=r+" "),i&&h&&(s+=this.lt.Z().oh()?t.ua:t.aa),s.trim()},i.prototype.ra=function(t,i,n){return i?n?this.lt.Z().oh()?t.aa:t.ua:t.At:""},i}(I),Di=function(){function t(t,i){this.Vn=t,this.oa=i||null}return t.prototype.yh=function(){return this.Vn},t.prototype.rs=function(){return this.oa},t.prototype.wn=function(){return null===this.Vn?null:{priceRange:this.Vn.wn(),margins:this.oa||void 0}},t.Mn=function(i){return null===i?null:new t(J.Mn(i.priceRange),i.margins)},t}(),Ti=function(t){function i(i,n){var h=t.call(this,i)||this;return h.la=n,h}return r(i,t),i.prototype.Fu=function(t,i){var n=this.zu;if(n.H=!1,this.Fe.H()){var h=this.la.fa();if(null!==h){var s=this.la.I();n.H=!0,n.p=h,n.et=s.color,n.dt=i,n.wt=t,n.rt=s.lineWidth,n.ut=s.lineStyle}}},i}(ci),Ei=function(t){function i(i,n){var h=t.call(this)||this;return h.Ju=i,h.la=n,h}return r(i,t),i.prototype.Zt=function(t,i,n){t.H=!1,i.H=!1;var h=this.la.I(),s=h.axisLabelVisible,r=""!==h.title;if(s&&this.Ju.H()){var e=this.la.fa();if(null!==e){r&&(i.At=h.title,i.H=!0),i.$=this.Ju.ct().I().layout.backgroundColor,t.At=this.Ju.Z().$h(h.price),t.H=!0;var u=A(h.color);n.gt=u.gt,n.et=u.yt,n.Pt=e}}},i}(I),Li=function(){function t(t,i){this.Ju=t,this.xi=i,this.ca=new Ti(t,this),this.Eu=new Ei(t,this),this.va=new li(this.Eu,t,t.ct())}return t.prototype.hh=function(t){c(this.xi,t),this.O(),this.Ju.ct().zr()},t.prototype.I=function(){return this.xi},t.prototype.ci=function(){return[this.ca,this.va]},t.prototype._a=function(){return this.Eu},t.prototype.O=function(){this.ca.O(),this.Eu.O()},t.prototype.fa=function(){var t=this.Ju,i=t.Z();if(t.ct().U().Qt()||i.Qt())return null;var n=t.Y();return null===n?null:i.X(this.xi.price,n.J)},t}(),Bi=function(t){function i(i){var n=t.call(this)||this;return n.hi=i,n}return r(i,t),i.prototype.ct=function(){return this.hi},i}(q),Ai={eu:"",wu:"",du:""},Oi=function(){function t(t){this.Ju=t}return t.prototype.uu=function(t,i){var n=this.Ju.da(),h=this.Ju.I();switch(n){case"Line":return this.wa(h);case"Area":return this.Ma(h);case"Bar":return this.ba(h,t,i);case"Candlestick":return this.ma(h,t,i);case"Histogram":return this.ga(h,t,i)}throw new Error("Unknown chart style")},t.prototype.ba=function(t,i,n){var h=e({},Ai),s=t.upColor,r=t.downColor,u=s,a=r,o=l(this.pa(i,n)),c=f(o.J[0])<=f(o.J[3]);return h.eu=c?s:r,h.wu=c?u:a,h},t.prototype.ma=function(t,i,n){var h=e({},Ai),s=t.upColor,r=t.downColor,u=t.borderUpColor,a=t.borderDownColor,o=t.wickUpColor,c=t.wickDownColor,v=l(this.pa(i,n)),_=f(v.J[0])<=f(v.J[3]);return h.eu=_?s:r,h.wu=_?u:a,h.du=_?o:c,h},t.prototype.Ma=function(t){return e(e({},Ai),{eu:t.lineColor})},t.prototype.wa=function(t){return e(e({},Ai),{eu:t.color})},t.prototype.ga=function(t,i,n){var h=e({},Ai),s=l(this.pa(i,n));return h.eu=void 0!==s.et?s.et:t.color,h},t.prototype.pa=function(t,i){return void 0!==i?i.J:this.Ju.qi().ya(t)},t}(),Vi=30,zi=function(){function t(){this.ka=[],this.xa=new Map,this.Na=new Map}return t.prototype.Sa=function(){this.ka=[],this.xa.clear(),this.Na.clear()},t.prototype.Ca=function(){return this.Ye()>0?this.ka[this.ka.length-1]:null},t.prototype.Da=function(){return this.Ye()>0?this.Ta(0):null},t.prototype.Ui=function(){return this.Ye()>0?this.Ta(this.ka.length-1):null},t.prototype.Ye=function(){return this.ka.length},t.prototype.Qt=function(){return 0===this.Ye()},t.prototype.As=function(t){return null!==this.Ea(t,0)},t.prototype.ya=function(t){return this.La(t)},t.prototype.La=function(t,i){void 0===i&&(i=0);var n=this.Ea(t,i);return null===n?null:e(e({},this.Ba(n)),{Ps:this.Ta(n)})},t.prototype.Ze=function(){return this.ka},t.prototype.Aa=function(t,i,n){if(this.Qt())return null;for(var h=null,s=0,r=n;sthis.ka[this.ka.length-1].Ps?this.za(t):1!==t.length||t[0].Ps!==this.ka[this.ka.length-1].Ps?this.Pa(t):this.Fa(t[0]))},t.prototype.Ta=function(t){return this.ka[t].Ps},t.prototype.Ba=function(t){return this.ka[t]},t.prototype.Ea=function(t,i){var n=this.Ia(t);if(null===n&&0!==i)switch(i){case-1:return this.Wa(t);case 1:return this.Ra(t);default:throw new TypeError("Unknown search mode")}return n},t.prototype.Wa=function(t){var i=this.ja(t);return i>0&&(i-=1),i!==this.ka.length&&this.Ta(i)t}))},t.prototype.qa=function(t,i,n){for(var h=null,s=t;sh.Ya&&(h.Ya=r)))}return h},t.prototype.Ka=function(t){var i=Math.floor(t.Ps/Vi);this.xa.forEach((function(t){return t.delete(i)}))},t.prototype.Va=function(t){a(0!==t.length,"plotRows should not be empty"),this.Na.clear(),this.xa.clear(),this.ka=t.concat(this.ka)},t.prototype.za=function(t){a(0!==t.length,"plotRows should not be empty"),this.Na.clear(),this.xa.clear(),this.ka=this.ka.concat(t)},t.prototype.Fa=function(t){a(!this.Qt(),"plot list should not be empty"),a(this.ka[this.ka.length-1].Ps===t.Ps,"last row index should match new row index"),this.Ka(t),this.Na.delete(t.Ps),this.ka[this.ka.length-1]=t},t.prototype.Pa=function(t){a(0!==t.length,"plot rows should not be empty"),this.Na.clear(),this.xa.clear(),this.ka=function(t,i){var n=function(t,i){var n=t.length,h=i.length,s=n+h,r=0,e=0;for(;ri[e].Ps?e++:(r++,e++,s--);return s}(t,i),h=new Array(n),s=0,r=0,e=t.length,u=i.length,a=0;for(;si[r].Ps?(h[a]=i[r],r++):(h[a]=i[r],s++,r++),a++;for(;s=0&&r.Ph(t),null!==r&&(r.zh(),this.$o(r)),this.Hn=null},t.prototype.Ou=function(t){return t===this.Vo?"left":t===this.Po?"right":"overlay"},t.prototype.Xo=function(){return this.Vo},t.prototype.Zo=function(){return this.Po},t.prototype.Jo=function(t,i){t.Wh(i)},t.prototype.Go=function(t,i){t.Rh(i),this.qo()},t.prototype.Qo=function(t){t.jh()},t.prototype.tl=function(t,i){t.Uh(i)},t.prototype.il=function(t,i){t.qh(i),this.qo()},t.prototype.nl=function(t){t.Hh()},t.prototype.qo=function(){this.qn.forEach((function(t){t.Wi()}))},t.prototype.Ci=function(){var t=null;return this.hi.I().rightPriceScale.visible&&0!==this.Po.Ah().length?t=this.Po:this.hi.I().leftPriceScale.visible&&0!==this.Vo.Ah().length?t=this.Vo:0!==this.qn.length&&(t=this.qn[0].Z()),null===t&&(t=this.Po),t},t.prototype.$o=function(t){null!==t&&t.ah()&&this.hl(t)},t.prototype.sl=function(t){var i=this.Ao.Mr();t.rh({fh:!0}),null!==i&&t.Gh(i),this.qo()},t.prototype.rl=function(){this.hl(this.Vo),this.hl(this.Po)},t.prototype.el=function(){var t=this;this.$o(this.Vo),this.$o(this.Po),this.qn.forEach((function(i){t.Au(i)&&t.$o(i.Z())})),this.qo(),this.hi.zr()},t.prototype.Oh=function(){return null===this.Hn&&(this.Hn=vt(this.qn)),this.Hn},t.prototype.ul=function(){return this.Bo},t.prototype.al=function(){return this.Oo},t.prototype.hl=function(t){var i=t.Jh();if(i&&i.length>0&&!this.Ao.Qt()){var n=this.Ao.Mr();null!==n&&t.Gh(n)}t.Wi()},t.prototype.Yo=function(){var t=this.Oh();if(0===t.length)return{ol:0,Ho:0};for(var i=0,n=0,h=0;hn&&(n=s))}return{ol:i,Ho:n}},t.prototype.Ko=function(t,i,n){var h=this.Wo(i);if(null===h&&(h=this.zo(i,this.hi.I().overlayPriceScales)),this.qn.push(t),!Pt(i)){var s=this.Eo.get(i)||[];s.push(t),this.Eo.set(i,s)}h.Vh(t),t.li(h),t.oi(n),this.$o(h),this.Hn=null},t.prototype.Fo=function(t,i,n){i.eh!==n.eh&&this.hl(t)},t.prototype.zo=function(t,i){var n=e({visible:!0,autoScale:!0},M(i)),h=new Mt(t,n,this.hi.I().layout,this.hi.I().localization);return h.bh(this.wt()),h},t}(),qi=function(t){function i(i){var n=t.call(this)||this;return n.ll=new Map,n.tt=i,n}return r(i,t),i.prototype.u=function(t){},i.prototype.l=function(t){if(this.tt.H){t.save();for(var i=0,n=0,h=this.tt.fl;nthis.tt.dt?a.jr=this.tt.dt/s:a.jr=1,i+=a.vl*a.jr}}var r=0;switch(this.tt._l){case"top":r=0;break;case"center":r=Math.max((this.tt.wt-i)/2,0);break;case"bottom":r=Math.max(this.tt.wt-i,0)}t.fillStyle=this.tt.et;for(var e=0,u=this.tt.fl;e20&&(this.gl=null,i=!0),this.Ao.qh(t),this.Vr(),i},t.prototype.$l=function(){this.Ao.Hh(),this.zr(),this.gl=null},t.prototype.V=function(){return this.ml},t.prototype.Jl=function(t,i,n){this.A.Li(t,i);var h=NaN,s=this.Ao.Ar(t),r=this.Ao.Mr();null!==r&&(s=Math.min(Math.max(r.hs(),s),r.ss()));var e=n.Ci(),u=e.Y();null!==u&&(h=e.Di(i,u)),h=this.Sl.mo(h,s,n),this.A.Vi(s,h,n),this.Gl(),this.kl.hn(this.A.j(),{x:t,y:i})},t.prototype.Ql=function(){this.Il().Pi(),this.Gl(),this.kl.hn(null,null)},t.prototype.ro=function(){var t=this.A.ft();if(null!==t){var i=this.A.Ai(),n=this.A.Oi();this.Jl(i,n,t)}this.A.Wi()},t.prototype.tf=function(t,i){var n=this.Ao.si(0);void 0!==i&&this.Ao.O(i);var h=this.Ao.si(0),s=this.Ao.Lr(),r=this.Ao.Mr();if(null!==r&&null!==n&&null!==h){var e=r.As(s),u=n.Cs>h.Cs,a=null!==t&&t>s&&!u,o=e&&this.Ao.I().shiftVisibleRangeOnNewBar;if(a&&!o&&null!==t){var l=t-s;this.Ao.dr(this.Ao.Fr()-l)}}this.Ao.Rr(t)},t.prototype.oo=function(t){null!==t&&t.el()},t.prototype.Bu=function(t){var i=this.bl.find((function(i){return i.Oh().includes(t)}));return void 0===i?null:i},t.prototype.Vr=function(){this.Cl.Wi(),this.bl.forEach((function(t){return t.el()})),this.ro()},t.prototype.rn=function(){this.bl.forEach((function(t){return t.rn()})),this.bl.length=0,this.xi.localization.priceFormatter=void 0,this.xi.localization.timeFormatter=void 0},t.prototype.if=function(){return this.Nl},t.prototype.Vu=function(){return this.Nl.I()},t.prototype.Ro=function(){return this.yl},t.prototype.nf=function(t,i){var n=this.bl[0],h=this.hf(i,t,n);return this.ml.push(h),1===this.ml.length?this.Tl():this.zr(),h},t.prototype.sf=function(t){var i=this.Bu(t),n=this.ml.indexOf(t);a(-1!==n,"Series not found"),this.ml.splice(n,1),l(i).Ph(t),t.rn&&t.rn()},t.prototype.ho=function(t,i){var n=l(this.Bu(t));n.Ph(t);var h=this.zl(i);if(null===h){var s=t.ai();n.Vh(t,i,s)}else{s=h.ft===n?t.ai():void 0;h.ft.Vh(t,i,s)}},t.prototype.Jr=function(){var t=new Ft(2);t.ge(),this.El(t)},t.prototype.rf=function(t){var i=new Ft(2);i.ye(t),this.El(i)},t.prototype.ke=function(){var t=new Ft(2);t.ke(),this.El(t)},t.prototype._r=function(t){var i=new Ft(2);i._r(t),this.El(i)},t.prototype.dr=function(t){var i=new Ft(2);i.dr(t),this.El(i)},t.prototype.ef=function(){return this.xi.rightPriceScale.visible?"right":"left"},t.prototype.jl=function(t,i){var n=new Ft(i);if(null!==t){var h=this.bl.indexOf(t);n.we(h,{Me:i})}return n},t.prototype.Ll=function(t,i){return void 0===i&&(i=2),this.jl(this.Bu(t),i)},t.prototype.El=function(t){this.xl&&this.xl(t),this.bl.forEach((function(t){return t.al().To().O()}))},t.prototype.Gl=function(){this.El(new Ft(1))},t.prototype.hf=function(t,i,n){var h=new Fi(this,t,i),s=void 0!==t.priceScaleId?t.priceScaleId:this.ef();return n.Vh(h,s),Pt(s)||h.hh(t),h},t}(),$i={allowDownsampling:!0};var Xi=function(){function t(t,i){var n=this;this._resolutionMediaQueryList=null,this._resolutionListener=function(t){return n._onResolutionChanged()},this._canvasConfiguredListeners=[],this.canvas=t,this._canvasSize={width:this.canvas.clientWidth,height:this.canvas.clientHeight},this._options=i,this._configureCanvas(),this._installResolutionListener()}return t.prototype.destroy=function(){this._canvasConfiguredListeners.length=0,this._uninstallResolutionListener(),this.canvas=null},Object.defineProperty(t.prototype,"canvasSize",{get:function(){return{width:this._canvasSize.width,height:this._canvasSize.height}},enumerable:!0,configurable:!0}),t.prototype.resizeCanvas=function(t){this._canvasSize={width:t.width,height:t.height},this._configureCanvas()},Object.defineProperty(t.prototype,"pixelRatio",{get:function(){var t=this.canvas.ownerDocument.defaultView;if(null==t)throw new Error("No window is associated with the canvas");return t.devicePixelRatio>1||this._options.allowDownsampling?t.devicePixelRatio:1},enumerable:!0,configurable:!0}),t.prototype.subscribeCanvasConfigured=function(t){this._canvasConfiguredListeners.push(t)},t.prototype.unsubscribeCanvasConfigured=function(t){this._canvasConfiguredListeners=this._canvasConfiguredListeners.filter((function(i){return i!=t}))},t.prototype._configureCanvas=function(){var t=this.pixelRatio;this.canvas.style.width=this._canvasSize.width+"px",this.canvas.style.height=this._canvasSize.height+"px",this.canvas.width=this._canvasSize.width*t,this.canvas.height=this._canvasSize.height*t,this._emitCanvasConfigured()},t.prototype._emitCanvasConfigured=function(){var t=this;this._canvasConfiguredListeners.forEach((function(i){return i.call(t)}))},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this.canvas.ownerDocument.defaultView;if(null==t)throw new Error("No window is associated with the canvas");var i=t.devicePixelRatio;this._resolutionMediaQueryList=t.matchMedia("all and (resolution: "+i+"dppx)"),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){this._configureCanvas(),this._reinstallResolutionListener()},t}(),Zi=function(){function t(t,i){this.ht=t,this.st=i}return t.prototype.an=function(t){return this.ht===t.ht&&this.st===t.st},t}();function Ji(t){return t.ownerDocument&&t.ownerDocument.defaultView&&t.ownerDocument.defaultView.devicePixelRatio||1}function Gi(t){var i=l(t.getContext("2d"));return i.setTransform(1,0,0,1,0,0),i}function Qi(t,i){var n=t.createElement("canvas"),h=Ji(n);return n.style.width=i.ht+"px",n.style.height=i.st+"px",n.width=i.ht*h,n.height=i.st*h,n}function tn(t,i){var n=l(t.ownerDocument).createElement("canvas");t.appendChild(n);var h=function(t,i){return void 0===i&&(i=$i),new Xi(t,i)}(n);return h.resizeCanvas({width:i.ht,height:i.st}),h}var nn="undefined"!=typeof window;var hn=function(){if(!nn)return!1;var t=!!navigator.maxTouchPoints||!!navigator.msMaxTouchPoints||!!nn&&("ontouchstart"in window||Boolean(window.DocumentTouch&&document instanceof window.DocumentTouch));return"onorientationchange"in window&&t}();var sn=function(){if(!nn)return!1;var t=/Android/i.test(navigator.userAgent),i=/iPhone|iPad|iPod|AppleWebKit.+Mobile/i.test(navigator.userAgent);return t||i}(),rn=function(){function t(t,i,n){this.uf=0,this.af=null,this.lf=null,this.ff=!1,this.cf=null,this.vf=!1,this._f=!1,this.df=null,this.wf=null,this.Mf=null,this.bf=null,this.mf=0,this.gf=!1,this.pf=!1,this.yf=!1,this.kf=t,this.xf=i,this.xi=n,this.Nf()}return t.prototype.rn=function(){null!==this.df&&(this.df(),this.df=null),null!==this.wf&&(this.wf(),this.wf=null),null!==this.Mf&&(this.Mf(),this.Mf=null),this.Sf(),this.Cf()},t.prototype.Df=function(t){var i=this;this.wf&&this.wf();var n=this.Tf.bind(this);this.wf=function(){i.kf.removeEventListener("mousemove",n)},this.kf.addEventListener("mousemove",n),an(t)&&this.Tf(t);var h=this.Ef(t);this.Lf(h,this.xf.Bf)},t.prototype.Cf=function(){null!==this.af&&clearTimeout(this.af),this.uf=0,this.af=null},t.prototype.Tf=function(t){if(!this.yf||an(t)){var i=this.Ef(t);this.Lf(i,this.xf.Af)}},t.prototype.Of=function(t){if((!("button"in t)||0===t.button)&&null===this.bf){var i=an(t);if(!this.pf||!i){this.gf=!0;var n=this.Ef(t),h=f(this.cf),s=Math.abs(h.g-n.Vf),r=Math.abs(h.p-n.zf),e=s+r>5;if(e||!i){if(e&&!this.vf&&i){var u=.5*s,a=r>=u&&!this.xi.Pf,o=u>r&&!this.xi.Ff;a||o||(this.pf=!0)}e&&(this.vf=!0,this._f=!0,i&&this.Sf()),this.pf||(this.Lf(n,this.xf.If),i&&on(t))}}}},t.prototype.Wf=function(t){if(!("button"in t)||0===t.button){var i=this.Ef(t);this.Sf(),this.cf=null,this.yf=!1,this.Mf&&(this.Mf(),this.Mf=null),an(t)&&this.Rf(t),this.Lf(i,this.xf.jf),++this.uf,this.af&&this.uf>1?(this.Lf(i,this.xf.Uf),this.Cf()):this._f||this.Lf(i,this.xf.qf),an(t)&&(on(t),this.Rf(t),0===t.touches.length&&(this.ff=!1))}},t.prototype.Sf=function(){null!==this.lf&&(clearTimeout(this.lf),this.lf=null)},t.prototype.Hf=function(t){if(!("button"in t)||0===t.button){var i=this.Ef(t);this._f=!1,this.vf=!1,this.pf=!1,an(t)&&this.Df(t),this.cf={g:i.Vf,p:i.zf},this.Mf&&(this.Mf(),this.Mf=null);var n=this.Of.bind(this),h=this.Wf.bind(this),s=this.kf.ownerDocument.documentElement;this.Mf=function(){s.removeEventListener("touchmove",n),s.removeEventListener("touchend",h),s.removeEventListener("mousemove",n),s.removeEventListener("mouseup",h)},s.addEventListener("touchmove",n,{passive:!1}),s.addEventListener("touchend",h,{passive:!1}),this.Sf(),an(t)&&1===t.touches.length?this.lf=setTimeout(this.Yf.bind(this,t),240):(s.addEventListener("mousemove",n),s.addEventListener("mouseup",h)),this.yf=!0,this.Lf(i,this.xf.Kf),this.af||(this.uf=0,this.af=setTimeout(this.Cf.bind(this),500))}},t.prototype.Nf=function(){var t=this;this.kf.addEventListener("mouseenter",this.Df.bind(this)),this.kf.addEventListener("touchcancel",this.Sf.bind(this));var i=this.kf.ownerDocument,n=function(i){t.xf.$f&&(i.composed&&t.kf.contains(i.composedPath()[0])||i.target&&t.kf.contains(i.target)||t.xf.$f())};this.df=function(){i.removeEventListener("mousedown",n),i.removeEventListener("touchstart",n)},i.addEventListener("mousedown",n),i.addEventListener("touchstart",n,{passive:!0}),this.kf.addEventListener("mouseleave",this.Rf.bind(this)),this.kf.addEventListener("touchstart",this.Hf.bind(this),{passive:!0}),hn||this.kf.addEventListener("mousedown",this.Hf.bind(this)),this.Xf(),this.kf.addEventListener("touchmove",(function(){}),{passive:!1})},t.prototype.Xf=function(){var t=this;void 0===this.xf.Zf&&void 0===this.xf.Jf&&void 0===this.xf.Gf||(this.kf.addEventListener("touchstart",(function(i){return t.Qf(i.touches)}),{passive:!0}),this.kf.addEventListener("touchmove",(function(i){if(2===i.touches.length&&null!==t.bf&&void 0!==t.xf.Jf){var n=un(i.touches[0],i.touches[1])/t.mf;t.xf.Jf(t.bf,n),on(i)}}),{passive:!1}),this.kf.addEventListener("touchend",(function(i){t.Qf(i.touches)})))},t.prototype.Qf=function(t){1===t.length&&(this.gf=!1),2!==t.length||this.gf||this.ff?this.tc():this.ic(t)},t.prototype.ic=function(t){var i=en(this.kf);this.bf={g:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,p:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.mf=un(t[0],t[1]),void 0!==this.xf.Zf&&this.xf.Zf(),this.Sf()},t.prototype.tc=function(){null!==this.bf&&(this.bf=null,void 0!==this.xf.Gf&&this.xf.Gf())},t.prototype.Rf=function(t){this.wf&&this.wf();var i=this.Ef(t);this.Lf(i,this.xf.nc)},t.prototype.Yf=function(t){var i=this.Ef(t);this.Lf(i,this.xf.hc),this._f=!0,this.ff=!0},t.prototype.Lf=function(t,i){i&&i.call(this.xf,t)},t.prototype.Ef=function(t){var i;i="touches"in t&&t.touches.length?t.touches[0]:"changedTouches"in t&&t.changedTouches.length?t.changedTouches[0]:t;var n=en(this.kf);return{sc:i.clientX,rc:i.clientY,Vf:i.pageX,zf:i.pageY,ec:i.screenX,uc:i.screenY,ac:i.clientX-n.left,oc:i.clientY-n.top,lc:t.ctrlKey,fc:t.altKey,cc:t.shiftKey,vc:t.metaKey,pe:t.type.startsWith("mouse")?"mouse":"touch",_c:t.view}},t}();function en(t){return t.getBoundingClientRect()||{left:0,top:0}}function un(t,i){var n=t.clientX-i.clientX,h=t.clientY-i.clientY;return Math.sqrt(n*n+h*h)}function an(t){return Boolean(t.touches)}function on(t){t.cancelable&&t.preventDefault()}var ln=function(){function t(t,i,n,h){this.Du=new ai(200),this.oe=0,this.dc="",this.Iu="",this.xu=[],this.wc=new Map,this.oe=t,this.dc=i,this.Iu=Vt(t,n,h)}return t.prototype.rn=function(){this.Du.Nu(),this.xu=[],this.wc.clear()},t.prototype.Mc=function(t,i,n,h,s){var r=this.bc(t,i);if("left"!==s){var e=Ji(t.canvas);n-=Math.floor(r.mc*e)}h-=Math.floor(r.wt/2),t.drawImage(r.gc,n,h,r.dt,r.wt)},t.prototype.bc=function(t,i){var n,h=this;if(this.wc.has(i))n=o(this.wc.get(i));else{if(this.xu.length>=200){var s=o(this.xu.shift());this.wc.delete(s)}var r=Ji(t.canvas),e=Math.ceil(this.oe/4.5),u=Math.round(this.oe/10),a=Math.ceil(this.Du.Ot(t,i)),l=it(Math.round(a+2*e)),f=it(this.oe+2*e),c=Qi(document,new Zi(l,f));n={At:i,mc:Math.round(Math.max(1,a)),dt:Math.ceil(l*r),wt:Math.ceil(f*r),gc:c},0!==a&&(this.xu.push(n.At),this.wc.set(n.At,n)),V(t=Gi(n.gc),r,(function(){t.font=h.Iu,t.fillStyle=h.dc,t.fillText(i,0,f-e-u)}))}return n},t}(),fn=function(){function t(t,i,n,h){var s=this;this.Jt=null,this.yc=null,this.kc=null,this.xc=!1,this.Nc=new ai(50),this.Sc=new ln(11,"#000"),this.dc=null,this.Iu=null,this.Cc=0,this.Dc=function(){s.Tc(s.Nl.I()),s._i.Ec().ct().zr()},this.Lc=function(){s._i.Ec().ct().zr()},this._i=t,this.xi=i,this.Nl=n,this.Bc="left"===h,this.Ac=document.createElement("div"),this.Ac.style.height="100%",this.Ac.style.overflow="hidden",this.Ac.style.width="25px",this.Ac.style.left="0",this.Ac.style.position="relative",this.Oc=tn(this.Ac,new Zi(16,16)),this.Oc.subscribeCanvasConfigured(this.Dc);var r=this.Oc.canvas;r.style.position="absolute",r.style.zIndex="1",r.style.left="0",r.style.top="0",this.Vc=tn(this.Ac,new Zi(16,16)),this.Vc.subscribeCanvasConfigured(this.Lc);var e=this.Vc.canvas;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0";var u={Kf:this.zc.bind(this),If:this.Pc.bind(this),$f:this.Fc.bind(this),jf:this.Ic.bind(this),Uf:this.Wc.bind(this),Bf:this.Rc.bind(this),nc:this.jc.bind(this)};this.Uc=new rn(this.Vc.canvas,u,{Pf:!1,Ff:!0})}return t.prototype.rn=function(){this.Uc.rn(),this.Vc.unsubscribeCanvasConfigured(this.Lc),this.Vc.destroy(),this.Oc.unsubscribeCanvasConfigured(this.Dc),this.Oc.destroy(),null!==this.Jt&&this.Jt.Ih().nn(this),this.Jt=null,null!==this.kc&&(clearTimeout(this.kc),this.kc=null),this.Sc.rn()},t.prototype.qc=function(){return this.Ac},t.prototype.K=function(){return this.xi.backgroundColor},t.prototype.S=function(){return l(this.Jt).I().borderColor},t.prototype.Hc=function(){return this.xi.textColor},t.prototype.zt=function(){return this.xi.fontSize},t.prototype.Yc=function(){return Vt(this.zt(),this.xi.fontFamily)},t.prototype.Kc=function(){var t=this.Nl.I(),i=this.dc!==t.et,n=this.Iu!==t.xt;return(i||n)&&(this.Tc(t),this.dc=t.et),n&&(this.Nc.Nu(),this.Iu=t.xt),t},t.prototype.$c=function(){if(null===this.Jt)return 0;var t=34,i=this.Kc(),n=Gi(this.Oc.canvas),h=this.Jt.Bn();n.font=this.Yc(),h.length>0&&(t=Math.max(this.Nc.Ot(n,h[0].Tn),this.Nc.Ot(n,h[h.length-1].Tn)));for(var s=this.Xc(),r=s.length;r--;){var e=this.Nc.Ot(n,s[r].At());e>t&&(t=e)}var u=Math.ceil(i.Dt+i.Ct+i.Lt+i.Bt+t);return u+=u%2},t.prototype.Zc=function(t){if(t.ht<0||t.st<0)throw new Error("Try to set invalid size to PriceAxisWidget "+JSON.stringify(t));null!==this.yc&&this.yc.an(t)||(this.yc=t,this.Oc.resizeCanvas({width:t.ht,height:t.st}),this.Vc.resizeCanvas({width:t.ht,height:t.st}),this.Ac.style.width=t.ht+"px",this.Ac.style.height=t.st+"px",this.Ac.style.minWidth=t.ht+"px")},t.prototype.Jc=function(){return l(this.yc).ht},t.prototype.li=function(t){this.Jt!==t&&(null!==this.Jt&&this.Jt.Ih().nn(this),this.Jt=t,t.Ih().Zi(this.jn.bind(this),this))},t.prototype.Z=function(){return this.Jt},t.prototype.Nu=function(){var t=this._i.Gc();this._i.Ec().ct().sl(t,l(this.Z()))},t.prototype.Qc=function(t){if(null!==this.yc){if(1!==t){var i=Gi(this.Oc.canvas);this.tv(),this.iv(i,this.Oc.pixelRatio),this.fu(i,this.Oc.pixelRatio),this.nv(i,this.Oc.pixelRatio),this.hv(i,this.Oc.pixelRatio)}var n=Gi(this.Vc.canvas),h=this.yc.ht,s=this.yc.st;V(n,this.Vc.pixelRatio,(function(){n.clearRect(0,0,h,s)})),this.sv(n,this.Vc.pixelRatio)}},t.prototype.rv=function(){return this.Oc.canvas},t.prototype.zc=function(t){if(null!==this.Jt&&!this.Jt.Qt()&&this._i.Ec().I().handleScale.axisPressedMouseMove.price){var i=this._i.Ec().ct(),n=this._i.Gc();this.xc=!0,i.Jo(n,this.Jt,t.oc)}},t.prototype.Pc=function(t){if(null!==this.Jt&&this._i.Ec().I().handleScale.axisPressedMouseMove.price){var i=this._i.Ec().ct(),n=this._i.Gc(),h=this.Jt;i.Go(n,h,t.oc)}},t.prototype.Fc=function(){if(null!==this.Jt&&this._i.Ec().I().handleScale.axisPressedMouseMove.price){var t=this._i.Ec().ct(),i=this._i.Gc(),n=this.Jt;this.xc&&(this.xc=!1,t.Qo(i,n))}},t.prototype.Ic=function(t){if(null!==this.Jt&&this._i.Ec().I().handleScale.axisPressedMouseMove.price){var i=this._i.Ec().ct(),n=this._i.Gc();this.xc=!1,i.Qo(n,this.Jt)}},t.prototype.Wc=function(t){this._i.Ec().I().handleScale.axisDoubleClickReset&&this.Nu()},t.prototype.Rc=function(t){null!==this.Jt&&(!this._i.Ec().ct().I().handleScale.axisPressedMouseMove.price||this.Jt.oh()||this.Jt.lh()||this.ev(1))},t.prototype.jc=function(t){this.ev(0)},t.prototype.Xc=function(){var t=this,i=[],n=null===this.Jt?void 0:this.Jt;return function(h){for(var s=0;s0&&(t=s[0].Pt())}));var u=i.filter((function(i){return i.Pt()<=t})),a=i.filter((function(i){return i.Pt()>t}));if(u.sort((function(t,i){return i.Pt()-t.Pt()})),u.length&&a.length&&a.push(u[0]),a.sort((function(t,i){return t.Pt()-i.Pt()})),i.forEach((function(t){return t.Yt(t.Pt())})),this.Jt.I().alignLabels){for(var o=1;o(_=v.Ht())-f&&l.Yt(_-f)}for(var c=1;c1&&this.Wv(),null!==this.uv&&this.uv.Qc(t),null!==this.av&&this.av.Qc(t),1!==t){var i=Gi(this.Oc.canvas);i.save(),this.iv(i,this.Rv(),this.Oc.pixelRatio),this.Mv&&(this.jv(i,this.Oc.pixelRatio),this.Uv(i,this.Oc.pixelRatio),this.qv(i,this.Oc.pixelRatio)),i.restore()}var n=Gi(this.Vc.canvas);n.clearRect(0,0,Math.ceil(this.yc.ht*this.Vc.pixelRatio),Math.ceil(this.yc.st*this.Vc.pixelRatio)),this.Hv(n,this.Vc.pixelRatio)}},t.prototype.Yv=function(){return this.uv},t.prototype.Kv=function(){return this.av},t.prototype.Rv=function(){return this.bv.I().layout.backgroundColor},t.prototype.mv=function(){null!==this.Mv&&this.Mv.ul().nn(this),this.Mv=null},t.prototype.iv=function(t,i,n){var h=this;V(t,n,(function(){z(t,0,0,h.yc.ht,h.yc.st,i)}))},t.prototype.jv=function(t,i){var n=l(this.Mv),h=n.al().To().W(n.wt(),n.dt());null!==h&&(t.save(),h.h(t,i,!1),t.restore())},t.prototype.Uv=function(t,i){var n=this.hi().Fl();this.$v(n,t,i),this.Xv(n,t,i)},t.prototype.Hv=function(t,i){this.Xv(this.hi().Il(),t,i)},t.prototype.qv=function(t,i){for(var n=l(this.Mv).Oh(),h=0,s=n;hi.Fs?t:i}var wn=function(){function t(t){var i=this;this.Qv=null,this.t_=null,this.ue=null,this.i_=!1,this.yc=new Zi(0,0),this.Dc=function(){return i.bv.ct().zr()},this.Lc=function(){return i.bv.ct().zr()},this.bv=t,this.xi=t.I().layout,this.n_=document.createElement("tr"),this.h_=document.createElement("td"),this.h_.style.padding="0",this.s_=document.createElement("td"),this.s_.style.padding="0",this.Ac=document.createElement("td"),this.Ac.style.height="25px",this.Ac.style.padding="0",this.r_=document.createElement("div"),this.r_.style.width="100%",this.r_.style.height="100%",this.r_.style.position="relative",this.r_.style.overflow="hidden",this.Ac.appendChild(this.r_),this.Oc=tn(this.r_,new Zi(16,16)),this.Oc.subscribeCanvasConfigured(this.Dc);var n=this.Oc.canvas;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.Vc=tn(this.r_,new Zi(16,16)),this.Vc.subscribeCanvasConfigured(this.Lc);var h=this.Vc.canvas;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0",this.n_.appendChild(this.h_),this.n_.appendChild(this.Ac),this.n_.appendChild(this.s_),this.e_(),this.bv.ct().Ro().Zi(this.e_.bind(this),this),this.Uc=new rn(this.Vc.canvas,this,{Pf:!0,Ff:!1})}return t.prototype.rn=function(){this.Uc.rn(),null!==this.Qv&&this.Qv.rn(),null!==this.t_&&this.t_.rn(),this.Vc.unsubscribeCanvasConfigured(this.Lc),this.Vc.destroy(),this.Oc.unsubscribeCanvasConfigured(this.Dc),this.Oc.destroy()},t.prototype.qc=function(){return this.n_},t.prototype.u_=function(){return this.Qv},t.prototype.a_=function(){return this.t_},t.prototype.Kf=function(t){if(!this.i_){this.i_=!0;var i=this.bv.ct();!i.U().Qt()&&this.bv.I().handleScale.axisPressedMouseMove.time&&i.Ul(t.ac)}},t.prototype.$f=function(){var t=this.bv.ct();!t.U().Qt()&&this.i_&&(this.i_=!1,this.bv.I().handleScale.axisPressedMouseMove.time&&t.Zl())},t.prototype.If=function(t){var i=this.bv.ct();!i.U().Qt()&&this.bv.I().handleScale.axisPressedMouseMove.time&&i.Xl(t.ac)},t.prototype.jf=function(t){this.i_=!1;var i=this.bv.ct();i.U().Qt()&&!this.bv.I().handleScale.axisPressedMouseMove.time||i.Zl()},t.prototype.Uf=function(){this.bv.I().handleScale.axisDoubleClickReset&&this.bv.ct().ke()},t.prototype.Bf=function(t){this.bv.ct().I().handleScale.axisPressedMouseMove.time&&this.ev(1)},t.prototype.nc=function(t){this.ev(0)},t.prototype.Iv=function(){return this.yc},t.prototype.o_=function(t,i,n){this.yc&&this.yc.an(t)||(this.yc=t,this.Oc.resizeCanvas({width:t.ht,height:t.st}),this.Vc.resizeCanvas({width:t.ht,height:t.st}),this.Ac.style.width=t.ht+"px",this.Ac.style.height=t.st+"px"),null!==this.Qv&&this.Qv.Zc(new Zi(i,t.st)),null!==this.t_&&this.t_.Zc(new Zi(n,t.st))},t.prototype.l_=function(){var t=this.f_();return Math.ceil(t.Dt+t.Ct+t.zt+t.Tt+t.Et)},t.prototype.O=function(){this.bv.ct().U().Bn()},t.prototype.rv=function(){return this.Oc.canvas},t.prototype.Qc=function(t){if(0!==t){if(1!==t){var i=Gi(this.Oc.canvas);this.iv(i,this.Oc.pixelRatio),this.fu(i,this.Oc.pixelRatio),this.nv(i,this.Oc.pixelRatio),null!==this.Qv&&this.Qv.Qc(t),null!==this.t_&&this.t_.Qc(t)}var n=Gi(this.Vc.canvas),h=this.Vc.pixelRatio;n.clearRect(0,0,Math.ceil(this.yc.ht*h),Math.ceil(this.yc.st*h)),this.c_([this.bv.ct().Il()],n,h)}},t.prototype.iv=function(t,i){var n=this;V(t,i,(function(){z(t,0,0,n.yc.ht,n.yc.st,n.Rv())}))},t.prototype.fu=function(t,i){if(this.bv.I().timeScale.borderVisible){t.save(),t.fillStyle=this.v_();var n=Math.max(1,Math.floor(this.f_().Dt*i));t.fillRect(0,0,Math.ceil(this.yc.ht*i),n),t.restore()}},t.prototype.nv=function(t,i){var n=this,h=this.bv.ct().U().Bn();if(h&&0!==h.length){var s=h.reduce(dn,h[0]).Fs;s>30&&s<40&&(s=30),t.save(),t.strokeStyle=this.v_();var r=this.f_(),e=r.Dt+r.Ct+r.Tt+r.zt-r.Vt;t.textAlign="center",t.fillStyle=this.v_();var u=Math.floor(this.f_().Dt*i),a=Math.max(1,Math.floor(i)),o=Math.floor(.5*i);if(this.bv.ct().U().I().borderVisible){t.beginPath();for(var l=Math.round(r.Ct*i),f=h.length;f--;){var c=Math.round(h[f].Dn*i);t.rect(c-o,u,a,l)}t.fill()}t.fillStyle=this.fe(),V(t,i,(function(){t.font=n.__();for(var i=0,r=h;i=s&&t.fillText(o.Tn,o.Dn,e)}}))}},t.prototype.c_=function(t,i,n){for(var h=this.f_(),s=0,r=t;s0&&(this.hi.Vr(),this.hi.ro(),this.hi.zr()),this.S_.O()}this.Qc(t)},t.prototype.Ne=function(t){var i=this.hi.U();switch(t.pe){case 0:i.Jr();break;case 1:i.Gr(t.J);break;case 2:i._r(t.J);break;case 3:i.dr(t.J);break;case 4:i.Wr()}},t.prototype.xl=function(t){var i=this;null!==this.g_?this.g_.vn(t):this.g_=t,this.p_||(this.p_=!0,this.M_=window.requestAnimationFrame((function(){i.p_=!1,i.M_=0,null!==i.g_&&(i.L_(i.g_),i.g_=null)})))},t.prototype.P_=function(){this.D_()},t.prototype.D_=function(){for(var t=this.hi.Pl(),i=t.length,n=this.w_.length,h=i;h=0;--s)if(Math.floor(n.getTime()/Cn[s].q_)!==Math.floor(h.getTime()/Cn[s].q_))return Cn[s].Fs}return 20}function Tn(t){if(!Bt(t))throw new Error("time must be of type BusinessDay");var i=new Date(Date.UTC(t.year,t.month-1,t.day,0,0,0,0));return{Cs:Math.round(i.getTime()/1e3),Ss:t}}function En(t){if(!At(t))throw new Error("time must be of type isUTCTimestamp");return{Cs:t}}function Ln(t){return 0===t.length?null:Bt(t[0].time)?Tn:En}function Bn(t){return At(t)?En(t):Bt(t)?Tn(t):Tn(An(t))}function An(t){var i=new Date(t);if(isNaN(i.getTime()))throw new Error("Invalid date string="+t+", expected format=yyyy-mm-dd");return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function On(t){d(t.time)&&(t.time=An(t.time))}function Vn(t){return{Ps:0,H_:new Map,Fh:t}}var zn=function(){function t(){this.Y_=new Map,this.K_=new Map,this.X_=new Map,this.Z_=[]}return t.prototype.rn=function(){this.Y_.clear(),this.K_.clear(),this.X_.clear(),this.Z_=[]},t.prototype.J_=function(t,i){var n=this;this.X_.has(t)&&this.Y_.forEach((function(i){return i.H_.delete(t)}));var h=[];if(0!==i.length){!function(t){t.forEach(On)}(i);var s=l(Ln(i)),r=kn(t.da());h=i.map((function(i){var h=s(i.time),e=n.Y_.get(h.Cs);void 0===e&&(e=Vn(h),n.Y_.set(h.Cs,e));var u=r(h,e.Ps,i);return e.H_.set(t,u),u}))}return this.G_(),this.Q_(t,h),this.td(t)},t.prototype.sf=function(t){return this.J_(t,[])},t.prototype.nd=function(t,i){On(i);var n=l(Ln([i]))(i.time),h=this.X_.get(t);if(void 0!==h&&n.Css.Ps)return{barsBefore:t.from-r,barsAfter:e-t.to};var u={barsBefore:null===h||h.Ps===r?t.from-r:h.Ps-r,barsAfter:null===s||s.Ps===e?e-t.to:e-s.Ps};return null!==h&&null!==s&&(u.from=h.P.Ss||h.P.Cs,u.to=s.P.Ss||s.P.Cs),u},t.prototype.setData=function(t){this.Fe.da(),this.ld.vd(this.Fe,t)},t.prototype.update=function(t){this.Fe.da(),this.ld.uo(this.Fe,t)},t.prototype.setMarkers=function(t){var i=t.map((function(t){return e(e({},t),{time:Bn(t.time)})}));this.Fe.lo(i)},t.prototype.applyOptions=function(t){var i=In(t);this.Fe.hh(i)},t.prototype.options=function(){return M(this.Fe.I())},t.prototype.priceScale=function(){return this.fd.priceScale(this.Fe.Z().nh())},t.prototype.createPriceLine=function(t){var i=c(M(Pn),t),n=this.Fe.fo(i);return new Fn(n)},t.prototype.removePriceLine=function(t){this.Fe.co(t.od())},t.prototype.seriesType=function(){return this.Fe.da()},t}(),Rn=function(t){function i(){return null!==t&&t.apply(this,arguments)||this}return r(i,t),i.prototype.applyOptions=function(i){bt(i),t.prototype.applyOptions.call(this,i)},i}(Wn),jn={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,drawTicks:!0,scaleMargins:{bottom:.1,top:.2}},Un={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:Ot,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"},qn={width:0,height:0,layout:{backgroundColor:"#FFFFFF",textColor:"#191919",fontSize:11,fontFamily:Ot},crosshair:{vertLine:{color:"#758696",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#4c525e"},horzLine:{color:"#758696",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#4c525e"},mode:1},grid:{vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},overlayPriceScales:e({},jn),leftPriceScale:e(e({},jn),{visible:!1}),rightPriceScale:e(e({},jn),{visible:!0}),timeScale:{rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0},watermark:Un,localization:{locale:nn?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:!0,mouseWheel:!0,pinch:!0}},Hn={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},Yn={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},Kn={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBackgroundColor:""},$n={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBackgroundColor:""},Xn={color:"#26a69a",base:0},Zn={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}},Jn=function(){function t(t,i){this._d=t,this.dd=i}return t.prototype.applyOptions=function(t){this._d.ct().Vl(this.dd,t)},t.prototype.options=function(){return this.Jt().I()},t.prototype.width=function(){return Pt(this.dd)?this._d.V_("left"===this.dd?"left":"right"):0},t.prototype.Jt=function(){return l(this._d.ct().zl(this.dd)).Z},t}(),Gn=function(){function t(t){this.wd=new Z,this.tr=new Z,this.hi=t,this.Ao().Kr().Zi(this.Md.bind(this)),this.Ao().$r().Zi(this.bd.bind(this))}return t.prototype.rn=function(){this.Ao().Kr().nn(this),this.Ao().$r().nn(this),this.wd.rn()},t.prototype.scrollPosition=function(){return this.Ao().Fr()},t.prototype.scrollToPosition=function(t,i){i?this.Ao().Yr(t,1e3):this.hi.dr(t)},t.prototype.scrollToRealTime=function(){this.Ao().Hr()},t.prototype.getVisibleRange=function(){var t,i,n=this.Ao().gr();return null===n?null:{from:null!==(t=n.from.Ss)&&void 0!==t?t:n.from.Cs,to:null!==(i=n.to.Ss)&&void 0!==i?i:n.to.Cs}},t.prototype.setVisibleRange=function(t){var i={from:Bn(t.from),to:Bn(t.to)},n=this.Ao().Nr(i);this.hi.rf(n)},t.prototype.getVisibleLogicalRange=function(){var t=this.Ao().mr();return null===t?null:{from:t.hs(),to:t.ss()}},t.prototype.setVisibleLogicalRange=function(t){a(t.from<=t.to,"The from index cannot be after the to index."),this.hi.rf(t)},t.prototype.resetTimeScale=function(){this.hi.ke()},t.prototype.fitContent=function(){this.hi.Jr()},t.prototype.logicalToCoordinate=function(t){var i=this.hi.U();return i.Qt()?null:i.G(t)},t.prototype.coordinateToLogical=function(t){var i=this.hi.U();return i.Qt()?null:i.Ar(t)},t.prototype.timeToCoordinate=function(t){var i=Bn(t),n=this.hi.U(),h=n.wr(i,!1);return null===h?null:n.G(h)},t.prototype.coordinateToTime=function(t){var i,n=this.hi.U(),h=n.Ar(t),s=n.si(h);return null===s?null:null!==(i=s.Ss)&&void 0!==i?i:s.Cs},t.prototype.subscribeVisibleTimeRangeChange=function(t){this.wd.Zi(t)},t.prototype.unsubscribeVisibleTimeRangeChange=function(t){this.wd.tn(t)},t.prototype.subscribeVisibleLogicalRangeChange=function(t){this.tr.Zi(t)},t.prototype.unsubscribeVisibleLogicalRangeChange=function(t){this.tr.tn(t)},t.prototype.applyOptions=function(t){this.Ao().hh(t)},t.prototype.options=function(){return M(this.Ao().I())},t.prototype.Ao=function(){return this.hi.U()},t.prototype.Md=function(){this.wd.sn()&&this.wd.hn(this.getVisibleRange())},t.prototype.bd=function(){this.tr.sn()&&this.tr.hn(this.getVisibleLogicalRange())},t}();function Qn(t){if(void 0!==t&&"custom"!==t.type){var i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;for(var i=0;i<8;i++){var n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}}function th(t){return function(t){if(w(t.handleScale)){var i=t.handleScale;t.handleScale={axisDoubleClickReset:i,axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale&&w(t.handleScale.axisPressedMouseMove)){var n=t.handleScale.axisPressedMouseMove;t.handleScale.axisPressedMouseMove={time:n,price:n}}var h=t.handleScroll;w(h)&&(t.handleScroll={horzTouchDrag:h,vertTouchDrag:h,mouseWheel:h,pressedMouseMove:h})}(t),function(t){if(t.priceScale){t.leftPriceScale=t.leftPriceScale||{},t.rightPriceScale=t.rightPriceScale||{};var i=t.priceScale.position;delete t.priceScale.position,t.leftPriceScale=c(t.leftPriceScale,t.priceScale),t.rightPriceScale=c(t.rightPriceScale,t.priceScale),"left"===i&&(t.leftPriceScale.visible=!0,t.rightPriceScale.visible=!1),"right"===i&&(t.leftPriceScale.visible=!1,t.rightPriceScale.visible=!0),"none"===i&&(t.leftPriceScale.visible=!1,t.rightPriceScale.visible=!1),t.overlayPriceScales=t.overlayPriceScales||{},void 0!==t.priceScale.invertScale&&(t.overlayPriceScales.invertScale=t.priceScale.invertScale),void 0!==t.priceScale.scaleMargins&&(t.overlayPriceScales.scaleMargins=t.priceScale.scaleMargins)}}(t),t}var ih=function(){function t(t,i){var n=this;this.md=new zn,this.gd=new Map,this.pd=new Map,this.yd=new Z,this.kd=new Z;var h=void 0===i?M(qn):c(M(qn),th(i));this._d=new Mn(t,h),this._d.zv().Zi((function(t){n.yd.sn()&&n.yd.hn(n.xd(t()))}),this),this._d.Wl().Zi((function(t){n.kd.sn()&&n.kd.hn(n.xd(t()))}),this);var s=this._d.ct();this.Nd=new Gn(s)}return t.prototype.remove=function(){this._d.zv().nn(this),this._d.Wl().nn(this),this.Nd.rn(),this._d.rn(),this.gd.clear(),this.pd.clear(),this.yd.rn(),this.kd.rn(),this.md.rn()},t.prototype.resize=function(t,i,n){this._d.C_(t,i,n)},t.prototype.addAreaSeries=function(t){void 0===t&&(t={}),Qn((t=In(t)).priceFormat);var i=c(M(Zn),$n,t),n=this._d.ct().nf("Area",i),h=new Wn(n,this,this);return this.gd.set(h,n),this.pd.set(n,h),h},t.prototype.addBarSeries=function(t){void 0===t&&(t={}),Qn((t=In(t)).priceFormat);var i=c(M(Zn),Yn,t),n=this._d.ct().nf("Bar",i),h=new Wn(n,this,this);return this.gd.set(h,n),this.pd.set(n,h),h},t.prototype.addCandlestickSeries=function(t){void 0===t&&(t={}),bt(t=In(t)),Qn(t.priceFormat);var i=c(M(Zn),Hn,t),n=this._d.ct().nf("Candlestick",i),h=new Rn(n,this,this);return this.gd.set(h,n),this.pd.set(n,h),h},t.prototype.addHistogramSeries=function(t){void 0===t&&(t={}),Qn((t=In(t)).priceFormat);var i=c(M(Zn),Xn,t),n=this._d.ct().nf("Histogram",i),h=new Wn(n,this,this);return this.gd.set(h,n),this.pd.set(n,h),h},t.prototype.addLineSeries=function(t){void 0===t&&(t={}),Qn((t=In(t)).priceFormat);var i=c(M(Zn),Kn,t),n=this._d.ct().nf("Line",i),h=new Wn(n,this,this);return this.gd.set(h,n),this.pd.set(n,h),h},t.prototype.removeSeries=function(t){var i=o(this.gd.get(t)),n=this.md.sf(i);this._d.ct().sf(i),this.Sd(n),this.gd.delete(t),this.pd.delete(i)},t.prototype.vd=function(t,i){this.Sd(this.md.J_(t,i))},t.prototype.uo=function(t,i){this.Sd(this.md.nd(t,i))},t.prototype.subscribeClick=function(t){this.yd.Zi(t)},t.prototype.unsubscribeClick=function(t){this.yd.tn(t)},t.prototype.subscribeCrosshairMove=function(t){this.kd.Zi(t)},t.prototype.unsubscribeCrosshairMove=function(t){this.kd.tn(t)},t.prototype.priceScale=function(t){return void 0===t&&(t=this._d.ct().ef()),new Jn(this._d,t)},t.prototype.timeScale=function(){return this.Nd},t.prototype.applyOptions=function(t){this._d.hh(th(t))},t.prototype.options=function(){return this._d.I()},t.prototype.takeScreenshot=function(){return this._d.B_()},t.prototype.Sd=function(t){var i=this._d.ct();i.tf(t.U.Lr,t.U.ad),t.sd.forEach((function(t,i){return i.uo(t.ed,t.Tl)})),i.Vr()},t.prototype.Cd=function(t){return o(this.pd.get(t))},t.prototype.xd=function(t){var i=this,n=new Map;t.j_.forEach((function(t,h){n.set(i.Cd(h),t)}));var h=void 0===t.R_?void 0:this.Cd(t.R_);return{time:t.P&&(t.P.Ss||t.P.Cs),point:t.W_,hoveredSeries:h,hoveredMarkerId:t.U_,seriesPrices:n}},t}();var nh=Object.freeze({__proto__:null,version:function(){return"3.5.0"},get LineStyle(){return i},get LineType(){return t},get CrosshairMode(){return P},get PriceScaleMode(){return lt},get PriceLineSource(){return _t},get TickMarkType(){return Dt},isBusinessDay:Bt,isUTCTimestamp:At,createChart:function(t,i){var n;if(d(t)){var h=document.getElementById(t);a(null!==h,"Cannot find element in DOM with id="+t),n=h}else n=t;return new ih(n,i)}});window.LightweightCharts=nh}(); - +!function(){"use strict";var t,i;function n(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(n)}function s(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function e(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function r(t){if(void 0===t)throw new Error("Value is undefined");return t}function h(t){if(null===t)throw new Error("Value is null");return t}function l(t){return h(r(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(t||(t={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(i||(i={}));const a={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function o(t){return t<0?0:t>255?255:Math.round(t)||0}function _(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const u=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,c=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,d=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,f=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function p(t){(t=t.toLowerCase())in a&&(t=a[t]);{const i=f.exec(t)||d.exec(t);if(i)return[o(parseInt(i[1],10)),o(parseInt(i[2],10)),o(parseInt(i[3],10)),_(i.length<5?1:parseFloat(i[4]))]}{const i=c.exec(t);if(i)return[o(parseInt(i[1],16)),o(parseInt(i[2],16)),o(parseInt(i[3],16)),1]}{const i=u.exec(t);if(i)return[o(17*parseInt(i[1],16)),o(17*parseInt(i[2],16)),o(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function v(t){const i=p(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class m{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}p(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}v(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}g(){return this.h.length>0}M(){this.h=[]}}function b(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]?t[i]=n[i]:b(t[i],n[i]));return t}function g(t){return"number"==typeof t&&isFinite(t)}function w(t){return"number"==typeof t&&t%1==0}function M(t){return"string"==typeof t}function S(t){return"boolean"==typeof t}function x(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?x(e):e);return n}function y(t){return null!==t}function k(t){return null===t?void 0:t}const C="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function T(t,i,n){return void 0===i&&(i=C),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class P{constructor(t){this.S={k:1,C:5,T:NaN,P:"",R:"",D:"",O:"",B:0,A:0,L:0,I:0,N:0},this.V=t}F(){const t=this.S,i=this.W(),n=this.j();return t.T===i&&t.R===n||(t.T=i,t.R=n,t.P=T(i,n),t.I=2.5/12*i,t.B=t.I,t.A=i/12*t.C,t.L=i/12*t.C,t.N=0),t.D=this.$(),t.O=this.H(),this.S}$(){return this.V.F().layout.textColor}H(){return this.V.U()}W(){return this.V.F().layout.fontSize}j(){return this.V.F().layout.fontFamily}}class R{constructor(){this.q=[]}Y(t){this.q=t}X(t,i,n){this.q.forEach((s=>{s.X(t,i,n)}))}}class D{X(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}K(t,i,n){t.useMediaCoordinateSpace((t=>this.G(t,i,n)))}G(t,i,n){}}class O extends D{constructor(){super(...arguments),this.J=null}tt(t){this.J=t}Z({context:t}){if(null===this.J||null===this.J.it)return;const i=this.J.it,n=this.J,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.nt[e];t.moveTo(i.st,i.et),t.arc(i.st,i.et,s,0,2*Math.PI)}t.fill()};n.rt>0&&(t.fillStyle=n.ht,s(n.lt+n.rt)),t.fillStyle=n.ot,s(n.lt)}}function B(){return{nt:[{st:0,et:0,_t:0,ut:0}],ot:"",ht:"",lt:0,rt:0,it:null}}const E={from:0,to:1};class A{constructor(t,i){this.ct=new R,this.dt=[],this.ft=[],this.vt=!0,this.V=t,this.bt=i,this.ct.Y(this.dt)}gt(t){const i=this.V.wt();i.length!==this.dt.length&&(this.ft=i.map(B),this.dt=this.ft.map((t=>{const i=new O;return i.tt(t),i})),this.ct.Y(this.dt)),this.vt=!0}Mt(){return this.vt&&(this.St(),this.vt=!1),this.ct}St(){const t=this.V.wt(),i=this.bt.xt(),n=this.V.yt();t.forEach(((t,s)=>{var e;const r=this.ft[s],l=t.kt(i);if(null===l||!t.Ct())return void(r.it=null);const a=h(t.Tt());r.ot=l.Pt,r.lt=l.lt,r.rt=l.Rt,r.nt[0].ut=l.ut,r.nt[0].et=t.Ot().Dt(l.ut,a.Bt),r.ht=null!==(e=l.Et)&&void 0!==e?e:this.V.At(r.nt[0].et/t.Ot().Lt()),r.nt[0]._t=i,r.nt[0].st=n.zt(i),r.it=E}))}}class L{X(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class z extends L{constructor(t){super(),this.It=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:e,verticalPixelRatio:r}){if(null===this.It)return;const h=this.It.Nt.Ct,l=this.It.Vt.Ct;if(!h&&!l)return;const a=Math.round(this.It.st*e),o=Math.round(this.It.et*r);t.lineCap="butt",h&&a>=0&&(t.lineWidth=Math.floor(this.It.Nt.rt*e),t.strokeStyle=this.It.Nt.D,t.fillStyle=this.It.Nt.D,n(t,this.It.Nt.Ft),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,a,0,i.height)),l&&o>=0&&(t.lineWidth=Math.floor(this.It.Vt.rt*r),t.strokeStyle=this.It.Vt.D,t.fillStyle=this.It.Vt.D,n(t,this.It.Vt.Ft),s(t,o,0,i.width))}}class I{constructor(t){this.vt=!0,this.Wt={Nt:{rt:1,Ft:0,D:"",Ct:!1},Vt:{rt:1,Ft:0,D:"",Ct:!1},st:0,et:0},this.jt=new z(this.Wt),this.$t=t}gt(){this.vt=!0}Mt(){return this.vt&&(this.St(),this.vt=!1),this.jt}St(){const t=this.$t.Ct(),i=h(this.$t.Ht()),n=i.Ut().F().crosshair,s=this.Wt;s.Vt.Ct=t&&this.$t.qt(i),s.Nt.Ct=t&&this.$t.Yt(),s.Vt.rt=n.horzLine.width,s.Vt.Ft=n.horzLine.style,s.Vt.D=n.horzLine.color,s.Nt.rt=n.vertLine.width,s.Nt.Ft=n.vertLine.style,s.Nt.D=n.vertLine.color,s.st=this.$t.Xt(),s.et=this.$t.Zt()}}function N(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function V(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function F(t,i){return Array.isArray(t)?t.map((t=>0===t?t:t+i)):t+i}function W(t,i,n,s,e,r){let h,l,a,o;if(Array.isArray(r))if(2===r.length){const t=Math.max(0,r[0]),i=Math.max(0,r[1]);h=t,l=t,a=i,o=i}else{if(4!==r.length)throw new Error("Wrong border radius - it should be like css border radius");h=Math.max(0,r[0]),l=Math.max(0,r[1]),a=Math.max(0,r[2]),o=Math.max(0,r[3])}else{const t=Math.max(0,r);h=t,l=t,a=t,o=t}t.beginPath(),t.moveTo(i+h,n),t.lineTo(i+s-l,n),0!==l&&t.arcTo(i+s,n,i+s,n+l,l),t.lineTo(i+s,n+e-a),0!==a&&t.arcTo(i+s,n+e,i+s-a,n+e,a),t.lineTo(i+o,n+e),0!==o&&t.arcTo(i,n+e,i,n+e-o,o),t.lineTo(i,n+h),0!==h&&t.arcTo(i,n,i+h,n,h)}function j(t,i,n,s,e,r,h=0,l=0,a=""){if(t.save(),!h||!a||a===r)return W(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){W(t,i+h,n+h,s-2*h,e-2*h,F(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){W(t,i+o,n+o,s-h,e-h,F(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function $(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class H{constructor(t,i){this.tt(t,i)}tt(t,i){this.It=t,this.Kt=i}Lt(t,i){return this.It.Ct?t.T+t.I+t.B:0}X(t,i,n,s){if(!this.It.Ct||0===this.It.Gt.length)return;const e=this.It.D,r=this.Kt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.P;const l=this.Jt(t,i,n,s),a=l.Qt,o=(t,i)=>{l.ti?j(h,a.ii,a.ni,a.si,a.ei,t,a.ri,[a.lt,0,0,a.lt],i):j(h,a.hi,a.ni,a.si,a.ei,t,a.ri,[0,a.lt,a.lt,0],i)};return o(r,"transparent"),this.It.li&&(h.fillStyle=e,h.fillRect(a.hi,a.ai,a.oi-a.hi,a._i)),o("transparent",r),this.It.ui&&(h.fillStyle=i.O,h.fillRect(l.ti?a.ci-a.ri:0,a.ni,a.ri,a.di-a.ni)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.fi;t.font=i.P,t.textAlign=h.ti?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.It.Gt,n.pi,(n.ni+n.di)/2+n.vi)}))}Jt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.It.li||!this.It.mi?i.C:0,u=this.It.bi?i.k:0,c=i.I+this.Kt.gi,d=i.B+this.Kt.wi,f=i.A,p=i.L,v=this.It.Gt,m=i.T,b=n.Mi(r,v),g=Math.ceil(n.Si(r,v)),w=m+c+d,M=i.k+f+p+g+_,S=Math.max(1,Math.floor(o));let x=Math.round(w*o);x%2!=S%2&&(x+=1);const y=u>0?Math.max(1,Math.floor(u*a)):0,k=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Kt.xi)&&void 0!==e?e:this.Kt.yi,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+S/2-x/2),D=R+x,O="right"===s,B=O?l.width-u:u,E=O?h.width-y:y;let A,L,z;return O?(A=E-k,L=E-C,z=B-_-f-u):(A=E+k,L=E+C,z=B+_+f),{ti:O,Qt:{ni:R,ai:P,di:D,si:k,ei:x,lt:2*a,ri:y,ii:A,hi:E,oi:L,_i:S,ci:h.width},fi:{ni:R/o,di:D/o,pi:z,vi:b}}}}class U{constructor(t){this.ki={yi:0,t:"#000",wi:0,gi:0},this.Ci={Gt:"",Ct:!1,li:!0,mi:!1,Et:"",D:"#FFF",ui:!1,bi:!1},this.Ti={Gt:"",Ct:!1,li:!1,mi:!0,Et:"",D:"#FFF",ui:!0,bi:!0},this.vt=!0,this.Pi=new(t||H)(this.Ci,this.ki),this.Ri=new(t||H)(this.Ti,this.ki)}Gt(){return this.Di(),this.Ci.Gt}yi(){return this.Di(),this.ki.yi}gt(){this.vt=!0}Lt(t,i=!1){return Math.max(this.Pi.Lt(t,i),this.Ri.Lt(t,i))}Oi(){return this.ki.xi||0}Bi(t){this.ki.xi=t}Ei(){return this.Di(),this.Ci.Ct||this.Ti.Ct}Ai(){return this.Di(),this.Ci.Ct}Mt(t){return this.Di(),this.Ci.li=this.Ci.li&&t.F().ticksVisible,this.Ti.li=this.Ti.li&&t.F().ticksVisible,this.Pi.tt(this.Ci,this.ki),this.Ri.tt(this.Ti,this.ki),this.Pi}Li(){return this.Di(),this.Pi.tt(this.Ci,this.ki),this.Ri.tt(this.Ti,this.ki),this.Ri}Di(){this.vt&&(this.Ci.li=!0,this.Ti.li=!1,this.zi(this.Ci,this.Ti,this.ki))}}class q extends U{constructor(t,i,n){super(),this.$t=t,this.Ii=i,this.Ni=n}zi(t,i,n){t.Ct=!1;const s=this.$t.F().horzLine;if(!s.labelVisible)return;const e=this.Ii.Tt();if(!this.$t.Ct()||this.Ii.Vi()||null===e)return;const r=v(s.labelBackgroundColor);n.t=r.t,t.D=r.i;const h=2/12*this.Ii.T();n.gi=h,n.wi=h;const l=this.Ni(this.Ii);n.yi=l.yi,t.Gt=this.Ii.Fi(l.ut,e),t.Ct=!0}}const Y=/[1-9]/g;class X{constructor(){this.It=null}tt(t){this.It=t}X(t,i){if(null===this.It||!1===this.It.Ct||0===this.It.Gt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.P,Math.round(i.Wi.Si(t,h(this.It).Gt,Y)))));if(n<=0)return;const s=i.ji,e=n+2*s,r=e/2,l=this.It.$i;let a=this.It.yi,o=Math.floor(a-r)+.5;o<0?(a+=Math.abs(0-o),o=Math.floor(a-r)+.5):o+e>l&&(a-=Math.abs(l-(o+e)),o=Math.floor(a-r)+.5);const _=o+e,u=Math.ceil(0+i.k+i.C+i.I+i.T+i.B);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=h(this.It);t.fillStyle=e.t;const r=Math.round(o*n),l=Math.round(0*s),a=Math.round(_*n),c=Math.round(u*s),d=Math.round(2*n);if(t.beginPath(),t.moveTo(r,l),t.lineTo(r,c-d),t.arcTo(r,c,r+d,c,d),t.lineTo(a-d,c),t.arcTo(a,c,a,c-d,d),t.lineTo(a,l),t.fill(),e.li){const r=Math.round(e.yi*n),h=l,a=Math.round((h+i.C)*s);t.fillStyle=e.D;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,h,o,a-h)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=h(this.It),e=0+i.k+i.C+i.I+i.T/2;t.font=i.P,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.D;const r=i.Wi.Mi(t,"Apr0");t.translate(o+s,e+r),t.fillText(n.Gt,0,0)}))}}class Z{constructor(t,i,n){this.vt=!0,this.jt=new X,this.Wt={Ct:!1,t:"#4c525e",D:"white",Gt:"",$i:0,yi:NaN,li:!0},this.bt=t,this.Hi=i,this.Ni=n}gt(){this.vt=!0}Mt(){return this.vt&&(this.St(),this.vt=!1),this.jt.tt(this.Wt),this.jt}St(){const t=this.Wt;t.Ct=!1;const i=this.bt.F().vertLine;if(!i.labelVisible)return;const n=this.Hi.yt();if(n.Vi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.yi=s.yi;const e=n.Ui(this.bt.xt());t.Gt=n.qi(h(e)),t.Ct=!0;const r=v(i.labelBackgroundColor);t.t=r.t,t.D=r.i,t.li=n.F().ticksVisible}}class K{constructor(){this.Yi=null,this.Xi=0}Zi(){return this.Xi}Ki(t){this.Xi=t}Ot(){return this.Yi}Gi(t){this.Yi=t}Ji(t){return[]}Qi(){return[]}Ct(){return!0}}var G;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet"}(G||(G={}));class J extends K{constructor(t,i){super(),this.tn=null,this.nn=NaN,this.sn=0,this.en=!0,this.rn=new Map,this.hn=!1,this.ln=NaN,this.an=NaN,this.on=NaN,this._n=NaN,this.Hi=t,this.un=i,this.cn=new A(t,this);this.dn=((t,i)=>n=>{const s=i(),e=t();if(n===h(this.tn).fn())return{ut:e,yi:s};{const t=h(n.Tt());return{ut:n.pn(s,t),yi:s}}})((()=>this.nn),(()=>this.an));const n=((t,i)=>()=>{const n=this.Hi.yt().vn(t()),s=i();return n&&Number.isFinite(s)?{_t:n,yi:s}:null})((()=>this.sn),(()=>this.Xt()));this.mn=new Z(this,t,n),this.bn=new I(this)}F(){return this.un}gn(t,i){this.on=t,this._n=i}wn(){this.on=NaN,this._n=NaN}Mn(){return this.on}Sn(){return this._n}xn(t,i,n){this.hn||(this.hn=!0),this.en=!0,this.yn(t,i,n)}xt(){return this.sn}Xt(){return this.ln}Zt(){return this.an}Ct(){return this.en}kn(){this.en=!1,this.Cn(),this.nn=NaN,this.ln=NaN,this.an=NaN,this.tn=null,this.wn()}Tn(t){return null!==this.tn?[this.bn,this.cn]:[]}qt(t){return t===this.tn&&this.un.horzLine.visible}Yt(){return this.un.vertLine.visible}Pn(t,i){this.en&&this.tn===t||this.rn.clear();const n=[];return this.tn===t&&n.push(this.Rn(this.rn,i,this.dn)),n}Qi(){return this.en?[this.mn]:[]}Ht(){return this.tn}Dn(){this.bn.gt(),this.rn.forEach((t=>t.gt())),this.mn.gt(),this.cn.gt()}On(t){return t&&!t.fn().Vi()?t.fn():null}yn(t,i,n){this.Bn(t,i,n)&&this.Dn()}Bn(t,i,n){const s=this.ln,e=this.an,r=this.nn,h=this.sn,l=this.tn,a=this.On(n);this.sn=t,this.ln=isNaN(t)?NaN:this.Hi.yt().zt(t),this.tn=n;const o=null!==a?a.Tt():null;return null!==a&&null!==o?(this.nn=i,this.an=a.Dt(i,o)):(this.nn=NaN,this.an=NaN),s!==this.ln||e!==this.an||h!==this.sn||r!==this.nn||l!==this.tn}Cn(){const t=this.Hi.wt().map((t=>t.An().En())).filter(y),i=0===t.length?null:Math.max(...t);this.sn=null!==i?i:NaN}Rn(t,i,n){let s=t.get(i);return void 0===s&&(s=new q(this,i,n),t.set(i,s)),s}}function Q(t){return"left"===t||"right"===t}class tt{constructor(t){this.Ln=new Map,this.zn=[],this.In=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Vn:Math.max(t.Vn,i.Vn),Fn:t.Fn||i.Fn}}(this.Ln.get(t),i);this.Ln.set(t,n)}Wn(){return this.In}jn(t){const i=this.Ln.get(t);return void 0===i?{Vn:this.In}:{Vn:Math.max(this.In,i.Vn),Fn:i.Fn}}$n(){this.Hn(),this.zn=[{Un:0}]}qn(t){this.Hn(),this.zn=[{Un:1,Bt:t}]}Yn(t){this.Xn(),this.zn.push({Un:5,Bt:t})}Hn(){this.Xn(),this.zn.push({Un:6})}Zn(){this.Hn(),this.zn=[{Un:4}]}Kn(t){this.Hn(),this.zn.push({Un:2,Bt:t})}Gn(t){this.Hn(),this.zn.push({Un:3,Bt:t})}Jn(){return this.zn}Qn(t){for(const i of t.zn)this.ts(i);this.In=Math.max(this.In,t.In),t.Ln.forEach(((t,i)=>{this.Nn(i,t)}))}static ns(){return new tt(2)}static ss(){return new tt(3)}ts(t){switch(t.Un){case 0:this.$n();break;case 1:this.qn(t.Bt);break;case 2:this.Kn(t.Bt);break;case 3:this.Gn(t.Bt);break;case 4:this.Zn();break;case 5:this.Yn(t.Bt);break;case 6:this.Xn()}}Xn(){const t=this.zn.findIndex((t=>5===t.Un));-1!==t&&this.zn.splice(t,1)}}const it=".";function nt(t,i){if(!g(t))return"n/a";if(!w(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class st{constructor(t,i){if(i||(i=1),g(t)&&w(t)||(t=100),t<0)throw new TypeError("invalid base");this.Ii=t,this.es=i,this.rs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.hs(t)}rs(){if(this.ls=0,this.Ii>0&&this.es>0){let t=this.Ii;for(;t>1;)t/=10,this.ls++}}hs(t){const i=this.Ii/this.es;let n=Math.floor(t),s="";const e=void 0!==this.ls?this.ls:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.ls);r>=i&&(r-=i,n+=1),s=it+nt(+r.toFixed(this.ls)*this.es,e)}else n=Math.round(n*i)/i,e>0&&(s=it+nt(0,e));return n.toFixed(0)+s}}class et extends st{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class rt{constructor(t){this.os=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this._s(t):t<999995?i+this._s(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this._s(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this._s(t/1e9)+"B")}_s(t){let i;const n=Math.pow(10,this.os);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this.os).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function ht(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const l=t.context,a=i[s.from];let o=r(t,a),_=a;if(s.to-s.from<2){const t=e/2;l.beginPath();const i={st:a.st-t,et:a.et},n={st:a.st+t,et:a.et};return l.moveTo(i.st,i.et),l.lineTo(n.st,n.et),void h(l,o,i,n)}const u=(t,i)=>{h(l,o,_,i),l.beginPath(),o=t,_=i};let c=_;l.beginPath(),l.moveTo(a.st,a.et);for(let e=s.from+1;e>1,h=s+e;n(t[h],i)?(s=h+1,r-=e+1):r=e}return s}function bt(t,i,n,s=0,e=t.length){let r=e-s;for(;0>1,h=s+e;n(i,t[h])?r=e:(s=h+1,r-=e+1)}return s}function gt(t,i){return t._t0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Ts.As().Es(t._t))))}Ls(){this.Cs=null}Ds(){this.xs&&(this.zs(),this.xs=!1),this.ys&&(this.Bs(),this.ys=!1),this.Ss&&(this.Is(),this.Ss=!1)}Is(){const t=this.Ts.Ot(),i=this.Ps.yt();if(this.Ls(),i.Vi()||t.Vi())return;const n=i.Ns();if(null===n)return;if(0===this.Ts.An().Vs())return;const s=this.Ts.Tt();null!==s&&(this.Cs=Mt(this.ks,n,this.Rs),this.Fs(t,i,s.Bt),this.Ws())}}class xt extends St{constructor(t,i){super(t,i,!0)}Fs(t,i,n){i.js(this.ks,k(this.Cs)),t.$s(this.ks,n,k(this.Cs))}Hs(t,i){return{_t:t,ut:i,st:NaN,et:NaN}}zs(){const t=this.Ts.As();this.ks=this.Ts.An().Us().map((i=>{const n=i.Bt[3];return this.qs(i.Ys,n,t)}))}}class yt extends xt{constructor(t,i){super(t,i),this.Os=new R,this.Xs=new dt,this.Zs=new vt,this.Os.Y([this.Xs,this.Zs])}qs(t,i,n){return Object.assign(Object.assign({},this.Hs(t,i)),n.Es(t))}Ws(){const t=this.Ts.F();this.Xs.tt({cs:t.lineType,nt:this.ks,Ft:t.lineStyle,rt:t.lineWidth,ds:null,fs:t.invertFilledArea,it:this.Cs,us:this.Ps.yt().Ks()}),this.Zs.tt({cs:t.lineType,nt:this.ks,Ft:t.lineStyle,rt:t.lineWidth,it:this.Cs,us:this.Ps.yt().Ks()})}}class kt extends L{constructor(){super(...arguments),this.It=null,this.Gs=0,this.Js=0}tt(t){this.It=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.It||0===this.It.An.length||null===this.It.it)return;if(this.Gs=this.Qs(i),this.Gs>=2){Math.max(1,Math.floor(i))%2!=this.Gs%2&&this.Gs--}this.Js=this.It.te?Math.min(this.Gs,Math.floor(i)):this.Gs;let s=null;const e=this.Js<=this.Gs&&this.It.Ks>=Math.floor(1.5*i);for(let r=this.It.it.from;rf+v-1&&(e=f+v-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.he*n)-l),e=s+_-1;e>f+v-1&&(e=f+v-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}Qs(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(h(this.It).Ks,t)))}}class Ct extends St{constructor(t,i){super(t,i,!1)}Fs(t,i,n){i.js(this.ks,k(this.Cs)),t.le(this.ks,n,k(this.Cs))}ae(t,i,n){return{_t:t,oe:i.Bt[0],_e:i.Bt[1],ue:i.Bt[2],ce:i.Bt[3],st:NaN,re:NaN,ne:NaN,se:NaN,he:NaN}}zs(){const t=this.Ts.As();this.ks=this.Ts.An().Us().map((i=>this.qs(i.Ys,i,t)))}}class Tt extends Ct{constructor(){super(...arguments),this.Os=new kt}qs(t,i,n){return Object.assign(Object.assign({},this.ae(t,i,n)),n.Es(t))}Ws(){const t=this.Ts.F();this.Os.tt({An:this.ks,Ks:this.Ps.yt().Ks(),ee:t.openVisible,te:t.thinBars,it:this.Cs})}}function Pt(t,i,n){return Math.min(Math.max(t,i),n)}function Rt(t,i,n){return i-t<=n}function Dt(t){return t<=0?NaN:Math.log(t)/Math.log(10)}function Ot(t){const i=Math.ceil(t);return i%2==0?i-1:i}class Bt extends ct{constructor(){super(...arguments),this.vs=null}ps(t,i){var n;const{context:s,mediaSize:e}=t,r=this.J,{de:h,fe:l,pe:a,ve:o}=i,_=null!==(n=r.ds)&&void 0!==n?n:e.height,u=e.height;if(null!==this.vs&&this.vs.topFillColor1===h&&this.vs.topFillColor2===l&&this.vs.bottomFillColor1===a&&this.vs.bottomFillColor2===o&&this.vs.baseLevelCoordinate===_&&this.vs.bottom===u)return this.vs.fillStyle;const c=s.createLinearGradient(0,0,0,u),d=Pt(_/u,0,1);return c.addColorStop(0,h),c.addColorStop(d,l),c.addColorStop(d,a),c.addColorStop(1,o),this.vs={topFillColor1:h,topFillColor2:l,bottomFillColor1:a,bottomFillColor2:o,fillStyle:c,baseLevelCoordinate:_,bottom:u},c}}class Et extends pt{constructor(){super(...arguments),this.me=null}ws(t,i){const{context:n,mediaSize:s}=t,e=this.J,{be:r,ge:h}=i,{ds:l}=e,a=s.height;if(null!==this.me&&this.me.topLineColor===r&&this.me.bottomLineColor===h&&this.me.baseLevelCoordinate===l&&this.me.bottom===a)return this.me.strokeStyle;const o=n.createLinearGradient(0,0,0,a),_=Pt(l/a,0,1);return o.addColorStop(0,r),o.addColorStop(_,r),o.addColorStop(_,h),o.addColorStop(1,h),this.me={topLineColor:r,bottomLineColor:h,strokeStyle:o,baseLevelCoordinate:l,bottom:a},o}}class At extends xt{constructor(t,i){super(t,i),this.Os=new R,this.we=new Bt,this.Me=new Et,this.Os.Y([this.we,this.Me])}qs(t,i,n){return Object.assign(Object.assign({},this.Hs(t,i)),n.Es(t))}Ws(){const t=this.Ts.Tt();if(null===t)return;const i=this.Ts.F(),n=this.Ts.Ot().Dt(i.baseValue.price,t.Bt),s=this.Ps.yt().Ks();this.we.tt({nt:this.ks,rt:i.lineWidth,Ft:i.lineStyle,cs:i.lineType,ds:n,fs:!1,it:this.Cs,us:s}),this.Me.tt({nt:this.ks,rt:i.lineWidth,Ft:i.lineStyle,cs:i.lineType,ds:n,it:this.Cs,us:s})}}class Lt extends L{constructor(){super(...arguments),this.It=null,this.Gs=0}tt(t){this.It=t}Z(t){if(null===this.It||0===this.It.An.length||null===this.It.it)return;const{horizontalPixelRatio:i}=t;if(this.Gs=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.It.Ks,i),this.Gs>=2){Math.floor(i)%2!=this.Gs%2&&this.Gs--}const n=this.It.An;this.It.Se&&this.xe(t,n,this.It.it),this.It.ui&&this.ye(t,n,this.It.it);const s=this.ke(i);(!this.It.ui||this.Gs>2*s)&&this.Ce(t,n,this.It.it)}xe(t,i,n){if(null===this.It)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.It.Ks*e));l=Math.max(Math.floor(e),Math.min(l,this.Gs));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)N(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}Ce(t,i,n){if(null===this.It)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.ke(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class zt extends Ct{constructor(){super(...arguments),this.Os=new Lt}qs(t,i,n){return Object.assign(Object.assign({},this.ae(t,i,n)),n.Es(t))}Ws(){const t=this.Ts.F();this.Os.tt({An:this.ks,Ks:this.Ps.yt().Ks(),Se:t.wickVisible,ui:t.borderVisible,it:this.Cs})}}class It extends L{constructor(){super(...arguments),this.It=null,this.Re=[]}tt(t){this.It=t,this.Re=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.It||0===this.It.nt.length||null===this.It.it)return;this.Re.length||this.De(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.It.Oe*n)-Math.floor(s/2),r=e+s;for(let i=this.It.it.from;is.Ee?s.ci=n.Ms-i-1:n.Ms=s.ci+i+1))}let s=Math.ceil(this.It.Ks*t);for(let t=this.It.it.from;t0&&s<4)for(let t=this.It.it.from;ts&&(i.Be>i.Ee?i.ci-=1:i.Ms+=1)}}}class Nt extends xt{constructor(){super(...arguments),this.Os=new It}qs(t,i,n){return Object.assign(Object.assign({},this.Hs(t,i)),n.Es(t))}Ws(){const t={nt:this.ks,Ks:this.Ps.yt().Ks(),it:this.Cs,Oe:this.Ts.Ot().Dt(this.Ts.F().base,h(this.Ts.Tt()).Bt)};this.Os.tt(t)}}class Vt extends xt{constructor(){super(...arguments),this.Os=new vt}qs(t,i,n){return Object.assign(Object.assign({},this.Hs(t,i)),n.Es(t))}Ws(){const t=this.Ts.F(),i={nt:this.ks,Ft:t.lineStyle,cs:t.lineType,rt:t.lineWidth,it:this.Cs,us:this.Ps.yt().Ks()};this.Os.tt(i)}}const Ft=/[2-9]/g;class Wt{constructor(t=50){this.Ae=0,this.Le=1,this.ze=1,this.Ie={},this.Ne=new Map,this.Ve=t}Fe(){this.Ae=0,this.Ne.clear(),this.Le=1,this.ze=1,this.Ie={}}Si(t,i,n){return this.We(t,i,n).width}Mi(t,i,n){const s=this.We(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}We(t,i,n){const s=n||Ft,e=String(i).replace(s,"0");if(this.Ne.has(e))return r(this.Ne.get(e)).je;if(this.Ae===this.Ve){const t=this.Ie[this.ze];delete this.Ie[this.ze],this.Ne.delete(t),this.ze++,this.Ae--}t.save(),t.textBaseline="middle";const h=t.measureText(e);return t.restore(),0===h.width&&i.length||(this.Ne.set(e,{je:h,$e:this.Le}),this.Ie[this.Le]=e,this.Ae++,this.Le++),h}}class jt{constructor(t){this.He=null,this.S=null,this.Ue="right",this.qe=t}Ye(t,i,n){this.He=t,this.S=i,this.Ue=n}X(t){null!==this.S&&null!==this.He&&this.He.X(t,this.S,this.qe,this.Ue)}}class $t{constructor(t,i,n){this.Xe=t,this.qe=new Wt(50),this.Ze=i,this.V=n,this.W=-1,this.jt=new jt(this.qe)}Mt(){const t=this.V.Ke(this.Ze);if(null===t)return null;const i=t.Ge(this.Ze)?t.Je():this.Ze.Ot();if(null===i)return null;const n=t.Qe(i);if("overlay"===n)return null;const s=this.V.tr();return s.T!==this.W&&(this.W=s.T,this.qe.Fe()),this.jt.Ye(this.Xe.Li(),s,n),this.jt}}class Ht extends L{constructor(){super(...arguments),this.It=null}tt(t){this.It=t}ir(t,i){var n;if(!(null===(n=this.It)||void 0===n?void 0:n.Ct))return null;const{et:s,rt:e,nr:r}=this.It;return i>=s-e-7&&i<=s+e+7?{sr:this.It,nr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:e,verticalPixelRatio:r}){if(null===this.It)return;if(!1===this.It.Ct)return;const h=Math.round(this.It.et*r);h<0||h>i.height||(t.lineCap="butt",t.strokeStyle=this.It.D,t.lineWidth=Math.floor(this.It.rt*e),n(t,this.It.Ft),s(t,h,0,i.width))}}class Ut{constructor(t){this.er={et:0,D:"rgba(0, 0, 0, 0)",rt:1,Ft:0,Ct:!1},this.rr=new Ht,this.vt=!0,this.Ts=t,this.Ps=t.Ut(),this.rr.tt(this.er)}gt(){this.vt=!0}Mt(){return this.Ts.Ct()?(this.vt&&(this.hr(),this.vt=!1),this.rr):null}}class qt extends Ut{constructor(t){super(t)}hr(){this.er.Ct=!1;const t=this.Ts.Ot(),i=t.lr().lr;if(2!==i&&3!==i)return;const n=this.Ts.F();if(!n.baseLineVisible||!this.Ts.Ct())return;const s=this.Ts.Tt();null!==s&&(this.er.Ct=!0,this.er.et=t.Dt(s.Bt,s.Bt),this.er.D=n.baseLineColor,this.er.rt=n.baseLineWidth,this.er.Ft=n.baseLineStyle)}}class Yt extends L{constructor(){super(...arguments),this.It=null}tt(t){this.It=t}ar(){return this.It}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.It;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Ee.x*i)+r,l=s.Ee.y*n;t.fillStyle=s._r,t.beginPath();const a=Math.max(2,1.5*s.ur)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.cr,t.beginPath(),t.arc(h,l,s.lt*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.dr,t.beginPath(),t.arc(h,l,s.lt*i+e/2,0,2*Math.PI,!1),t.stroke()}}const Xt=[{pr:0,vr:.25,mr:4,br:10,gr:.25,wr:0,Mr:.4,Sr:.8},{pr:.25,vr:.525,mr:10,br:14,gr:0,wr:0,Mr:.8,Sr:0},{pr:.525,vr:1,mr:14,br:14,gr:0,wr:0,Mr:0,Sr:0}];function Zt(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=p(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function Kt(t,i){const n=t%2600/2600;let s;for(const t of Xt)if(n>=t.pr&&n<=t.vr){s=t;break}e(void 0!==s,"Last price animation internal logic error");const r=(n-s.pr)/(s.vr-s.pr);return{cr:Zt(i,r,s.gr,s.wr),dr:Zt(i,r,s.Mr,s.Sr),lt:(h=r,l=s.mr,a=s.br,l+(a-l)*h)};var h,l,a}class Gt{constructor(t){this.jt=new Yt,this.vt=!0,this.yr=!0,this.kr=performance.now(),this.Cr=this.kr-1,this.Tr=t}Pr(){this.Cr=this.kr-1,this.gt()}Rr(){if(this.gt(),2===this.Tr.F().lastPriceAnimation){const t=performance.now(),i=this.Cr-t;if(i>0)return void(i<650&&(this.Cr+=2600));this.kr=t,this.Cr=t+2600}}gt(){this.vt=!0}Dr(){this.yr=!0}Ct(){return 0!==this.Tr.F().lastPriceAnimation}Or(){switch(this.Tr.F().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Cr}}Mt(){return this.vt?(this.St(),this.vt=!1,this.yr=!1):this.yr&&(this.Br(),this.yr=!1),this.jt}St(){this.jt.tt(null);const t=this.Tr.Ut().yt(),i=t.Ns(),n=this.Tr.Tt();if(null===i||null===n)return;const s=this.Tr.Er(!0);if(s.Ar||!i.Lr(s.Ys))return;const e={x:t.zt(s.Ys),y:this.Tr.Ot().Dt(s.ut,n.Bt)},r=s.D,h=this.Tr.F().lineWidth,l=Kt(this.zr(),r);this.jt.tt({_r:r,ur:h,cr:l.cr,dr:l.dr,lt:l.lt,Ee:e})}Br(){const t=this.jt.ar();if(null!==t){const i=Kt(this.zr(),t._r);t.cr=i.cr,t.dr=i.dr,t.lt=i.lt}}zr(){return this.Or()?performance.now()-this.kr:2599}}function Jt(t,i){return Ot(Math.min(Math.max(t,12),30)*i)}function Qt(t,i){switch(t){case"arrowDown":case"arrowUp":return Jt(i,1);case"circle":return Jt(i,.8);case"square":return Jt(i,.7)}}function ti(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(Jt(t,1))}function ii(t){return Math.max(Jt(t,.1),3)}function ni(t,i,n,s,e){const r=Qt("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function si(t,i,n,s,e){const r=(Qt("arrowUp",e)-1)/2,h=(Ot(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function ei(t,i,n,s,e,r){return ni(i,n,s,e,r)}class ri extends D{constructor(){super(...arguments),this.It=null,this.qe=new Wt,this.W=-1,this.j="",this.Ir=""}tt(t){this.It=t}Ye(t,i){this.W===t&&this.j===i||(this.W=t,this.j=i,this.Ir=T(t,i),this.qe.Fe())}ir(t,i){if(null===this.It||null===this.It.it)return null;for(let n=this.It.it.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Gt.st,t.Gt.et,t.Gt.$i,t.Gt.Lt,i,n))||function(t,i,n){if(0===t.Vs)return!1;switch(t.Fr){case"arrowDown":case"arrowUp":return ei(0,t.st,t.et,t.Vs,i,n);case"circle":return function(t,i,n,s,e){const r=2+Qt("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.st,t.et,t.Vs,i,n);case"square":return ni(t.st,t.et,t.Vs,i,n)}}(t,i,n)}function ai(t,i,n,s,e,r,h,l,a){const o=g(n)?n:n.ce,_=g(n)?n:n._e,u=g(n)?n:n.ue,c=g(i.size)?Math.max(i.size,0):1,d=ti(l.Ks())*c,f=d/2;switch(t.Vs=d,i.position){case"inBar":return t.et=h.Dt(o,a),void(void 0!==t.Gt&&(t.Gt.et=t.et+f+r+.6*e));case"aboveBar":return t.et=h.Dt(_,a)-f-s.Wr,void 0!==t.Gt&&(t.Gt.et=t.et-f-.6*e,s.Wr+=1.2*e),void(s.Wr+=d+r);case"belowBar":return t.et=h.Dt(u,a)+f+s.jr,void 0!==t.Gt&&(t.Gt.et=t.et+f+r+.6*e,s.jr+=1.2*e),void(s.jr+=d+r)}i.position}class oi{constructor(t,i){this.vt=!0,this.$r=!0,this.Hr=!0,this.Ur=null,this.jt=new ri,this.Tr=t,this.Hi=i,this.It={nt:[],it:null}}gt(t){this.vt=!0,this.Hr=!0,"data"===t&&(this.$r=!0)}Mt(t){if(!this.Tr.Ct())return null;this.vt&&this.qr();const i=this.Hi.F().layout;return this.jt.Ye(i.fontSize,i.fontFamily),this.jt.tt(this.It),this.jt}Yr(){if(this.Hr){if(this.Tr.Xr().length>0){const t=this.Hi.yt().Ks(),i=ii(t),n=1.5*ti(t)+2*i;this.Ur={above:n,below:n}}else this.Ur=null;this.Hr=!1}return this.Ur}qr(){const t=this.Tr.Ot(),i=this.Hi.yt(),n=this.Tr.Xr();this.$r&&(this.It.nt=n.map((t=>({_t:t.time,st:0,et:0,Vs:0,Fr:t.shape,D:t.color,Nr:t.internalId,nr:t.id,Gt:void 0}))),this.$r=!1);const s=this.Hi.F().layout;this.It.it=null;const e=i.Ns();if(null===e)return;const r=this.Tr.Tt();if(null===r)return;if(0===this.It.nt.length)return;let h=NaN;const l=ii(i.Ks()),a={Wr:l,jr:l};this.It.it=Mt(this.It.nt,e,!0);for(let e=this.It.it.from;e0&&(_.Gt={Vr:o.text,st:0,et:0,$i:0,Lt:0});const u=this.Tr.Zr(o.time);null!==u&&ai(_,o,u,a,s.fontSize,l,t,i,r.Bt)}this.vt=!1}}class _i extends Ut{constructor(t){super(t)}hr(){const t=this.er;t.Ct=!1;const i=this.Ts.F();if(!i.priceLineVisible||!this.Ts.Ct())return;const n=this.Ts.Er(0===i.priceLineSource);n.Ar||(t.Ct=!0,t.et=n.yi,t.D=this.Ts.Kr(n.D),t.rt=i.priceLineWidth,t.Ft=i.priceLineStyle)}}class ui extends U{constructor(t){super(),this.$t=t}zi(t,i,n){t.Ct=!1,i.Ct=!1;const s=this.$t;if(!s.Ct())return;const e=s.F(),r=e.lastValueVisible,h=""!==s.Gr(),l=0===e.seriesLastValueMode,a=s.Er(!1);if(a.Ar)return;r&&(t.Gt=this.Jr(a,r,l),t.Ct=0!==t.Gt.length),(h||l)&&(i.Gt=this.Qr(a,r,h,l),i.Ct=i.Gt.length>0);const o=s.Kr(a.D),_=v(o);n.t=_.t,n.yi=a.yi,i.Et=s.Ut().At(a.yi/s.Ot().Lt()),t.Et=o,t.D=_.i,i.D=_.i}Qr(t,i,n,s){let e="";const r=this.$t.Gr();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.Ot().th()?t.ih:t.nh),e.trim()}Jr(t,i,n){return i?n?this.$t.Ot().th()?t.nh:t.ih:t.Gt:""}}class ci{constructor(t,i){this.sh=t,this.eh=i}rh(t){return null!==t&&(this.sh===t.sh&&this.eh===t.eh)}hh(){return new ci(this.sh,this.eh)}lh(){return this.sh}ah(){return this.eh}oh(){return this.eh-this.sh}Vi(){return this.eh===this.sh||Number.isNaN(this.eh)||Number.isNaN(this.sh)}Qn(t){return null===t?this:new ci(Math.min(this.lh(),t.lh()),Math.max(this.ah(),t.ah()))}_h(t){if(!g(t))return;if(0===this.eh-this.sh)return;const i=.5*(this.eh+this.sh);let n=this.eh-i,s=this.sh-i;n*=t,s*=t,this.eh=i+n,this.sh=i+s}uh(t){g(t)&&(this.eh+=t,this.sh+=t)}dh(){return{minValue:this.sh,maxValue:this.eh}}static fh(t){return null===t?null:new ci(t.minValue,t.maxValue)}}class di{constructor(t,i){this.ph=t,this.mh=i||null}bh(){return this.ph}gh(){return this.mh}dh(){return null===this.ph?null:{priceRange:this.ph.dh(),margins:this.mh||void 0}}static fh(t){return null===t?null:new di(ci.fh(t.priceRange),t.margins)}}class fi extends Ut{constructor(t,i){super(t),this.wh=i}hr(){const t=this.er;t.Ct=!1;const i=this.wh.F();if(!this.Ts.Ct()||!i.lineVisible)return;const n=this.wh.Mh();null!==n&&(t.Ct=!0,t.et=n,t.D=i.color,t.rt=i.lineWidth,t.Ft=i.lineStyle,t.nr=this.wh.F().id)}}class pi extends U{constructor(t,i){super(),this.Tr=t,this.wh=i}zi(t,i,n){t.Ct=!1,i.Ct=!1;const s=this.wh.F(),e=s.axisLabelVisible,r=""!==s.title,h=this.Tr;if(!e||!h.Ct())return;const l=this.wh.Mh();if(null===l)return;r&&(i.Gt=s.title,i.Ct=!0),i.Et=h.Ut().At(l/h.Ot().Lt()),t.Gt=this.Sh(s.price),t.Ct=!0;const a=v(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.D=o,i.D=o,n.yi=l}Sh(t){const i=this.Tr.Tt();return null===i?"":this.Tr.Ot().Fi(t,i.Bt)}}class vi{constructor(t,i){this.Tr=t,this.un=i,this.xh=new fi(t,this),this.Xe=new pi(t,this),this.yh=new $t(this.Xe,t,t.Ut())}kh(t){b(this.un,t),this.gt(),this.Tr.Ut().Ch()}F(){return this.un}Th(){return this.xh}Ph(){return this.yh}Rh(){return this.Xe}gt(){this.xh.gt(),this.Xe.gt()}Mh(){const t=this.Tr,i=t.Ot();if(t.Ut().yt().Vi()||i.Vi())return null;const n=t.Tt();return null===n?null:i.Dt(this.un.price,n.Bt)}}class mi extends K{constructor(t){super(),this.Hi=t}Ut(){return this.Hi}}const bi={Bar:(t,i,n,s)=>{var e;const r=i.upColor,a=i.downColor,o=h(t(n,s)),_=l(o.Bt[0])<=l(o.Bt[3]);return{ie:null!==(e=o.D)&&void 0!==e?e:_?r:a}},Candlestick:(t,i,n,s)=>{var e,r,a;const o=i.upColor,_=i.downColor,u=i.borderUpColor,c=i.borderDownColor,d=i.wickUpColor,f=i.wickDownColor,p=h(t(n,s)),v=l(p.Bt[0])<=l(p.Bt[3]);return{ie:null!==(e=p.D)&&void 0!==e?e:v?o:_,Pe:null!==(r=p.Et)&&void 0!==r?r:v?u:c,Te:null!==(a=p.Dh)&&void 0!==a?a:v?d:f}},Area:(t,i,n,s)=>{var e,r,l,a;const o=h(t(n,s));return{ie:null!==(e=o.ot)&&void 0!==e?e:i.lineColor,ot:null!==(r=o.ot)&&void 0!==r?r:i.lineColor,bs:null!==(l=o.bs)&&void 0!==l?l:i.topColor,gs:null!==(a=o.gs)&&void 0!==a?a:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,l,a,o,_;const u=h(t(n,s));return{ie:u.Bt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,be:null!==(e=u.be)&&void 0!==e?e:i.topLineColor,ge:null!==(r=u.ge)&&void 0!==r?r:i.bottomLineColor,de:null!==(l=u.de)&&void 0!==l?l:i.topFillColor1,fe:null!==(a=u.fe)&&void 0!==a?a:i.topFillColor2,pe:null!==(o=u.pe)&&void 0!==o?o:i.bottomFillColor1,ve:null!==(_=u.ve)&&void 0!==_?_:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const l=h(t(n,s));return{ie:null!==(e=l.D)&&void 0!==e?e:i.color,ot:null!==(r=l.D)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ie:null!==(e=h(t(n,s)).D)&&void 0!==e?e:i.color}}};class gi{constructor(t){this.Oh=(t,i)=>void 0!==i?i.Bt:this.Tr.An().Bh(t),this.Tr=t,this.Eh=bi[t.Ah()]}Es(t,i){return this.Eh(this.Oh,this.Tr.F(),t,i)}}var wi;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(wi||(wi={}));const Mi=30;class Si{constructor(){this.Lh=[],this.zh=new Map,this.Ih=new Map}Nh(){return this.Vs()>0?this.Lh[this.Lh.length-1]:null}Vh(){return this.Vs()>0?this.Fh(0):null}En(){return this.Vs()>0?this.Fh(this.Lh.length-1):null}Vs(){return this.Lh.length}Vi(){return 0===this.Vs()}Lr(t){return null!==this.Wh(t,0)}Bh(t){return this.jh(t)}jh(t,i=0){const n=this.Wh(t,i);return null===n?null:Object.assign(Object.assign({},this.$h(n)),{Ys:this.Fh(n)})}Us(){return this.Lh}Hh(t,i,n){if(this.Vi())return null;let s=null;for(const e of n){s=xi(s,this.Uh(t,i,e))}return s}tt(t){this.Ih.clear(),this.zh.clear(),this.Lh=t}Fh(t){return this.Lh[t].Ys}$h(t){return this.Lh[t]}Wh(t,i){const n=this.qh(t);if(null===n&&0!==i)switch(i){case-1:return this.Yh(t);case 1:return this.Xh(t);default:throw new TypeError("Unknown search mode")}return n}Yh(t){let i=this.Zh(t);return i>0&&(i-=1),i!==this.Lh.length&&this.Fh(i)t.Ysi.Ys>t))}Gh(t,i,n){let s=null;for(let e=t;es.Qh&&(s.Qh=t)))}return s}Uh(t,i,n){if(this.Vi())return null;let s=null;const e=h(this.Vh()),r=h(this.En()),l=Math.max(t,e),a=Math.min(i,r),o=Math.ceil(l/Mi)*Mi,_=Math.max(o,Math.floor(a/Mi)*Mi);{const t=this.Zh(l),e=this.Kh(Math.min(a,o,i));s=xi(s,this.Gh(t,e,n))}let u=this.zh.get(n);void 0===u&&(u=new Map,this.zh.set(n,u));for(let t=Math.max(o+1,l);t<_;t+=Mi){const i=Math.floor(t/Mi);let e=u.get(i);if(void 0===e){const t=this.Zh(i*Mi),s=this.Kh((i+1)*Mi-1);e=this.Gh(t,s,n),u.set(i,e)}s=xi(s,e)}{const t=this.Zh(_),i=this.Kh(a);s=xi(s,this.Gh(t,i,n))}return s}}function xi(t,i){if(null===t)return i;if(null===i)return t;return{Jh:Math.min(t.Jh,i.Jh),Qh:Math.max(t.Qh,i.Qh)}}class yi extends mi{constructor(t,i,n){super(t),this.It=new Si,this.xh=new _i(this),this.tl=[],this.il=new qt(this),this.nl=null,this.sl=null,this.el=[],this.rl=[],this.hl=null,this.un=i,this.ll=n;const s=new ui(this);this.rn=[s],this.yh=new $t(s,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.nl=new Gt(this)),this.al(),this.ol()}M(){null!==this.hl&&clearTimeout(this.hl)}Kr(t){return this.un.priceLineColor||t}Er(t){const i={Ar:!0},n=this.Ot();if(this.Ut().yt().Vi()||n.Vi()||this.It.Vi())return i;const s=this.Ut().yt().Ns(),e=this.Tt();if(null===s||null===e)return i;let r,h;if(t){const t=this.It.Nh();if(null===t)return i;r=t,h=t.Ys}else{const t=this.It.jh(s.ci(),-1);if(null===t)return i;if(r=this.It.Bh(t.Ys),null===r)return i;h=t.Ys}const l=r.Bt[3],a=this.As().Es(h,{Bt:r}),o=n.Dt(l,e.Bt);return{Ar:!1,ut:l,Gt:n.Fi(l,e.Bt),ih:n._l(l),nh:n.ul(l,e.Bt),D:a.ie,yi:o,Ys:h}}As(){return null!==this.sl||(this.sl=new gi(this)),this.sl}F(){return this.un}kh(t){const i=t.priceScaleId;void 0!==i&&i!==this.un.priceScaleId&&this.Ut().cl(this,i),b(this.un,t),void 0!==t.priceFormat&&(this.al(),this.Ut().dl()),this.Ut().fl(this),this.Ut().pl(),this.bn.gt("options")}tt(t,i){this.It.tt(t),this.vl(),this.bn.gt("data"),this.cn.gt("data"),null!==this.nl&&(i&&i.ml?this.nl.Rr():0===t.length&&this.nl.Pr());const n=this.Ut().Ke(this);this.Ut().bl(n),this.Ut().fl(this),this.Ut().pl(),this.Ut().Ch()}gl(t){this.el=t,this.vl();const i=this.Ut().Ke(this);this.cn.gt("data"),this.Ut().bl(i),this.Ut().fl(this),this.Ut().pl(),this.Ut().Ch()}wl(){return this.el}Xr(){return this.rl}Ml(t){const i=new vi(this,t);return this.tl.push(i),this.Ut().fl(this),i}Sl(t){const i=this.tl.indexOf(t);-1!==i&&this.tl.splice(i,1),this.Ut().fl(this)}Ah(){return this.ll}Tt(){const t=this.xl();return null===t?null:{Bt:t.Bt[3],yl:t._t}}xl(){const t=this.Ut().yt().Ns();if(null===t)return null;const i=t.Ms();return this.It.jh(i,1)}An(){return this.It}Zr(t){const i=this.It.Bh(t);return null===i?null:"Bar"===this.ll||"Candlestick"===this.ll?{oe:i.Bt[0],_e:i.Bt[1],ue:i.Bt[2],ce:i.Bt[3]}:i.Bt[3]}kl(t){const i=this.nl;return null!==i&&i.Ct()?(null===this.hl&&i.Or()&&(this.hl=setTimeout((()=>{this.hl=null,this.Ut().Cl()}),0)),i.Dr(),[i]):[]}Tn(){const t=[];this.Tl()||t.push(this.il),t.push(this.bn,this.xh,this.cn);const i=this.tl.map((t=>t.Th()));return t.push(...i),t}Ji(t){return[this.yh,...this.tl.map((t=>t.Ph()))]}Pn(t,i){if(i!==this.Yi&&!this.Tl())return[];const n=[...this.rn];for(const t of this.tl)n.push(t.Rh());return n}Pl(t,i){if(void 0!==this.un.autoscaleInfoProvider){const n=this.un.autoscaleInfoProvider((()=>{const n=this.Rl(t,i);return null===n?null:n.dh()}));return di.fh(n)}return this.Rl(t,i)}Dl(){return this.un.priceFormat.minMove}Ol(){return this.Bl}Dn(){var t;this.bn.gt(),this.cn.gt();for(const t of this.rn)t.gt();for(const t of this.tl)t.gt();this.xh.gt(),this.il.gt(),null===(t=this.nl)||void 0===t||t.gt()}Ot(){return h(super.Ot())}kt(t){if(!(("Line"===this.ll||"Area"===this.ll||"Baseline"===this.ll)&&this.un.crosshairMarkerVisible))return null;const i=this.It.Bh(t);if(null===i)return null;return{ut:i.Bt[3],lt:this.El(),Et:this.Al(),Rt:this.Ll(),Pt:this.zl(t)}}Gr(){return this.un.title}Ct(){return this.un.visible}Tl(){return!Q(this.Ot().Il())}Rl(t,i){if(!w(t)||!w(i)||this.It.Vi())return null;const n="Line"===this.ll||"Area"===this.ll||"Baseline"===this.ll||"Histogram"===this.ll?[3]:[2,1],s=this.It.Hh(t,i,n);let e=null!==s?new ci(s.Jh,s.Qh):null;if("Histogram"===this.Ah()){const t=this.un.base,i=new ci(t,t);e=null!==e?e.Qn(i):i}return new di(e,this.cn.Yr())}El(){switch(this.ll){case"Line":case"Area":case"Baseline":return this.un.crosshairMarkerRadius}return 0}Al(){switch(this.ll){case"Line":case"Area":case"Baseline":{const t=this.un.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}Ll(){switch(this.ll){case"Line":case"Area":case"Baseline":return this.un.crosshairMarkerBorderWidth}return 0}zl(t){switch(this.ll){case"Line":case"Area":case"Baseline":{const t=this.un.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.As().Es(t).ie}al(){switch(this.un.priceFormat.type){case"custom":this.Bl={format:this.un.priceFormat.formatter};break;case"volume":this.Bl=new rt(this.un.priceFormat.precision);break;case"percent":this.Bl=new et(this.un.priceFormat.precision);break;default:{const t=Math.pow(10,this.un.priceFormat.precision);this.Bl=new st(t,this.un.priceFormat.minMove*t)}}null!==this.Yi&&this.Yi.Nl()}vl(){const t=this.Ut().yt();if(!t.Vl()||this.It.Vi())return void(this.rl=[]);const i=h(this.It.Vh());this.rl=this.el.map(((n,s)=>{const e=h(t.Fl(n.time,!0)),r=et instanceof yi)).reduce(((t,s)=>{if(n.Ge(s)||!s.Ct())return t;const e=s.Ot(),r=s.An();if(e.Vi()||!r.Lr(i))return t;const h=r.Bh(i);if(null===h)return t;const a=l(s.Tt());return t.concat([e.Dt(h.Bt[3],a.Bt)])}),[]);if(0===a.length)return s;a.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const o=a[0];return s=e.pn(o,r),s}}class Ci extends L{constructor(){super(...arguments),this.It=null}tt(t){this.It=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:s,verticalPixelRatio:e}){if(null===this.It)return;const r=Math.max(1,Math.floor(s));t.lineWidth=r,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const l=h(this.It);if(l.$l){t.strokeStyle=l.Hl,n(t,l.Ul),t.beginPath();for(const n of l.ql){const e=Math.round(n.Yl*s);t.moveTo(e,-r),t.lineTo(e,i.height+r)}t.stroke()}if(l.Xl){t.strokeStyle=l.Zl,n(t,l.Kl),t.beginPath();for(const n of l.Gl){const s=Math.round(n.Yl*e);t.moveTo(-r,s),t.lineTo(i.width+r,s)}t.stroke()}}))}}class Ti{constructor(t){this.jt=new Ci,this.vt=!0,this.tn=t}gt(){this.vt=!0}Mt(){if(this.vt){const t=this.tn.Ut().F().grid,i={Xl:t.horzLines.visible,$l:t.vertLines.visible,Zl:t.horzLines.color,Hl:t.vertLines.color,Kl:t.horzLines.style,Ul:t.vertLines.style,Gl:this.tn.fn().Jl(),ql:this.tn.Ut().yt().Jl()||[]};this.jt.tt(i),this.vt=!1}return this.jt}}class Pi{constructor(t){this.bn=new Ti(t)}Th(){return this.bn}}const Ri={Ql:4,ta:1e-4};function Di(t,i){const n=100*(t-i)/i;return i<0?-n:n}function Oi(t,i){const n=Di(t.lh(),i),s=Di(t.ah(),i);return new ci(n,s)}function Bi(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function Ei(t,i){const n=Bi(t.lh(),i),s=Bi(t.ah(),i);return new ci(n,s)}function Ai(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Dt(n+i.ta)+i.Ql;return t<0?-s:s}function Li(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.Ql)-i.ta;return t<0?-s:s}function zi(t,i){if(null===t)return null;const n=Ai(t.lh(),i),s=Ai(t.ah(),i);return new ci(n,s)}function Ii(t,i){if(null===t)return null;const n=Li(t.lh(),i),s=Li(t.ah(),i);return new ci(n,s)}function Ni(t){if(null===t)return Ri;const i=Math.abs(t.ah()-t.lh());if(i>=1||i<1e-15)return Ri;const n=Math.ceil(Math.abs(Math.log10(i))),s=Ri.Ql+n;return{Ql:s,ta:1/Math.pow(10,s)}}class Vi{constructor(t,i){if(this.ia=t,this.na=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.ia))this.sa=[2,2.5,2];else{this.sa=[];for(let t=this.ia;1!==t;){if(t%2==0)this.sa.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.sa.push(2,2.5),t/=5}if(this.sa.length>100)throw new Error("something wrong with base")}}}ea(t,i,n){const s=0===this.ia?0:1/this.ia;let e=Math.pow(10,Math.max(0,Math.ceil(Dt(t-i)))),r=0,h=this.na[0];for(;;){const t=Rt(e,s,1e-14)&&e>s+1e-14,i=Rt(e,n*h,1e-14),l=Rt(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.na[++r%this.na.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.sa.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.sa[++r%this.sa.length];var l,a,o;return e}}class Fi{constructor(t,i,n,s){this.ra=[],this.Ii=t,this.ia=i,this.ha=n,this.la=s}ea(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.la(n,i,!0);null!==d&&Math.abs(s-d)l||(fh(t.Zi())-h(i.Zi())))}var ji;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(ji||(ji={}));const $i=new et,Hi=new st(100,1);class Ui{constructor(t,i,n,s){this.fa=0,this.pa=null,this.ph=null,this.va=null,this.ma={ba:!1,ga:null},this.wa=0,this.Ma=0,this.Sa=new m,this.xa=new m,this.ya=[],this.ka=null,this.Ca=null,this.Ta=null,this.Pa=null,this.Bl=Hi,this.Ra=Ni(null),this.Da=t,this.un=i,this.Oa=n,this.Ba=s,this.Ea=new Fi(this,100,this.Aa.bind(this),this.La.bind(this))}Il(){return this.Da}F(){return this.un}kh(t){if(b(this.un,t),this.Nl(),void 0!==t.mode&&this.za({lr:t.mode}),void 0!==t.scaleMargins){const i=r(t.scaleMargins.top),n=r(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.Ia(),this.Ca=null}}Na(){return this.un.autoScale}da(){return 1===this.un.mode}th(){return 2===this.un.mode}Va(){return 3===this.un.mode}lr(){return{Fn:this.un.autoScale,Fa:this.un.invertScale,lr:this.un.mode}}za(t){const i=this.lr();let n=null;void 0!==t.Fn&&(this.un.autoScale=t.Fn),void 0!==t.lr&&(this.un.mode=t.lr,2!==t.lr&&3!==t.lr||(this.un.autoScale=!0),this.ma.ba=!1),1===i.lr&&t.lr!==i.lr&&(!function(t,i){if(null===t)return!1;const n=Li(t.lh(),i),s=Li(t.ah(),i);return isFinite(n)&&isFinite(s)}(this.ph,this.Ra)?this.un.autoScale=!0:(n=Ii(this.ph,this.Ra),null!==n&&this.Wa(n))),1===t.lr&&t.lr!==i.lr&&(n=zi(this.ph,this.Ra),null!==n&&this.Wa(n));const s=i.lr!==this.un.mode;s&&(2===i.lr||this.th())&&this.Nl(),s&&(3===i.lr||this.Va())&&this.Nl(),void 0!==t.Fa&&i.Fa!==t.Fa&&(this.un.invertScale=t.Fa,this.ja()),this.xa.m(i,this.lr())}$a(){return this.xa}T(){return this.Oa.fontSize}Lt(){return this.fa}Ha(t){this.fa!==t&&(this.fa=t,this.Ia(),this.Ca=null)}Ua(){if(this.pa)return this.pa;const t=this.Lt()-this.qa()-this.Ya();return this.pa=t,t}bh(){return this.Xa(),this.ph}Wa(t,i){const n=this.ph;(i||null===n&&null!==t||null!==n&&!n.rh(t))&&(this.Ca=null,this.ph=t)}Vi(){return this.Xa(),0===this.fa||!this.ph||this.ph.Vi()}Za(t){return this.Fa()?t:this.Lt()-1-t}Dt(t,i){return this.th()?t=Di(t,i):this.Va()&&(t=Bi(t,i)),this.La(t,i)}$s(t,i,n){this.Xa();const s=this.Ya(),e=h(this.bh()),r=e.lh(),l=e.ah(),a=this.Ua()-1,o=this.Fa(),_=a/(l-r),u=void 0===n?0:n.from,c=void 0===n?t.length:n.to,d=this.Ka();for(let n=u;nt.Dn()))}Nl(){this.Ca=null;const t=this.uo();let i=100;null!==t&&(i=Math.round(1/t.Dl())),this.Bl=Hi,this.th()?(this.Bl=$i,i=100):this.Va()?(this.Bl=new st(100,1),i=100):null!==t&&(this.Bl=t.Ol()),this.Ea=new Fi(this,i,this.Aa.bind(this),this.La.bind(this)),this.Ea.oa()}io(){this.ka=null}uo(){return this.ya[0]||null}qa(){return this.Fa()?this.un.scaleMargins.bottom*this.Lt()+this.Ma:this.un.scaleMargins.top*this.Lt()+this.wa}Ya(){return this.Fa()?this.un.scaleMargins.top*this.Lt()+this.wa:this.un.scaleMargins.bottom*this.Lt()+this.Ma}Xa(){this.ma.ba||(this.ma.ba=!0,this.fo())}Ia(){this.pa=null}La(t,i){if(this.Xa(),this.Vi())return 0;t=this.da()&&t?Ai(t,this.Ra):t;const n=h(this.bh()),s=this.Ya()+(this.Ua()-1)*(t-n.lh())/n.oh();return this.Za(s)}Aa(t,i){if(this.Xa(),this.Vi())return 0;const n=this.Za(t),s=h(this.bh()),e=s.lh()+s.oh()*((n-this.Ya())/(this.Ua()-1));return this.da()?Li(e,this.Ra):e}ja(){this.Ca=null,this.Ea.oa()}fo(){const t=this.ma.ga;if(null===t)return;let i=null;const n=this.co();let s=0,e=0;for(const r of n){if(!r.Ct())continue;const n=r.Tt();if(null===n)continue;const l=r.Pl(t.Ms(),t.ci());let a=l&&l.bh();if(null!==a){switch(this.un.mode){case 1:a=zi(a,this.Ra);break;case 2:a=Oi(a,n.Bt);break;case 3:a=Ei(a,n.Bt)}if(i=null===i?a:i.Qn(h(a)),null!==l){const t=l.gh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.wa&&e===this.Ma||(this.wa=s,this.Ma=e,this.Ca=null,this.Ia()),null!==i){if(i.lh()===i.ah()){const t=this.uo(),n=5*(null===t||this.th()||this.Va()?1:t.Dl());this.da()&&(i=Ii(i,this.Ra)),i=new ci(i.lh()-n,i.ah()+n),this.da()&&(i=zi(i,this.Ra))}if(this.da()){const t=Ii(i,this.Ra),n=Ni(t);if(r=n,l=this.Ra,r.Ql!==l.Ql||r.ta!==l.ta){const s=null!==this.va?Ii(this.va,this.Ra):null;this.Ra=n,i=zi(t,n),null!==s&&(this.va=zi(s,n))}}this.Wa(i)}else null===this.ph&&(this.Wa(new ci(-.5,.5)),this.Ra=Ni(null));var r,l;this.ma.ba=!0}Ka(){return this.th()?Di:this.Va()?Bi:this.da()?t=>Ai(t,this.Ra):null}Sh(t,i){return void 0===this.Ba.priceFormatter?(void 0===i&&(i=this.Ol()),i.format(t)):this.Ba.priceFormatter(t)}}class qi{constructor(t,i){this.ya=[],this.po=new Map,this.fa=0,this.vo=0,this.mo=1e3,this.ka=null,this.bo=new m,this.wo=t,this.Hi=i,this.Mo=new Pi(this);const n=i.F();this.So=this.xo("left",n.leftPriceScale),this.yo=this.xo("right",n.rightPriceScale),this.So.$a().l(this.ko.bind(this,this.So),this),this.yo.$a().l(this.ko.bind(this,this.yo),this),this.Co(n)}Co(t){if(t.leftPriceScale&&this.So.kh(t.leftPriceScale),t.rightPriceScale&&this.yo.kh(t.rightPriceScale),t.localization&&(this.So.Nl(),this.yo.Nl()),t.overlayPriceScales){const i=Array.from(this.po.values());for(const n of i){const i=h(n[0].Ot());i.kh(t.overlayPriceScales),t.localization&&i.Nl()}}}To(t){switch(t){case"left":return this.So;case"right":return this.yo}return this.po.has(t)?r(this.po.get(t))[0].Ot():null}M(){this.Ut().Po().v(this),this.So.$a().v(this),this.yo.$a().v(this),this.ya.forEach((t=>{t.M&&t.M()})),this.bo.m()}Ro(){return this.mo}Do(t){this.mo=t}Ut(){return this.Hi}$i(){return this.vo}Lt(){return this.fa}Oo(t){this.vo=t,this.Bo()}Ha(t){this.fa=t,this.So.Ha(t),this.yo.Ha(t),this.ya.forEach((i=>{if(this.Ge(i)){const n=i.Ot();null!==n&&n.Ha(t)}})),this.Bo()}jl(){return this.ya}Ge(t){const i=t.Ot();return null===i||this.So!==i&&this.yo!==i}Qa(t,i,n){const s=void 0!==n?n:this.Ao().Eo+1;this.Lo(t,i,s)}no(t){const i=this.ya.indexOf(t);e(-1!==i,"removeDataSource: invalid data source"),this.ya.splice(i,1);const n=h(t.Ot()).Il();if(this.po.has(n)){const i=r(this.po.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.po.delete(n))}const s=t.Ot();s&&s.jl().indexOf(t)>=0&&s.no(t),null!==s&&(s.io(),this.zo(s)),this.ka=null}Qe(t){return t===this.So?"left":t===this.yo?"right":"overlay"}Io(){return this.So}No(){return this.yo}Vo(t,i){t.ro(i)}Fo(t,i){t.ho(i),this.Bo()}Wo(t){t.lo()}jo(t,i){t.ao(i)}$o(t,i){t.oo(i),this.Bo()}Ho(t){t._o()}Bo(){this.ya.forEach((t=>{t.Dn()}))}fn(){let t=null;return this.Hi.F().rightPriceScale.visible&&0!==this.yo.jl().length?t=this.yo:this.Hi.F().leftPriceScale.visible&&0!==this.So.jl().length?t=this.So:0!==this.ya.length&&(t=this.ya[0].Ot()),null===t&&(t=this.yo),t}Je(){let t=null;return this.Hi.F().rightPriceScale.visible?t=this.yo:this.Hi.F().leftPriceScale.visible&&(t=this.So),t}zo(t){null!==t&&t.Na()&&this.Uo(t)}qo(t){const i=this.wo.Ns();t.za({Fn:!0}),null!==i&&t.do(i),this.Bo()}Yo(){this.Uo(this.So),this.Uo(this.yo)}Xo(){this.zo(this.So),this.zo(this.yo),this.ya.forEach((t=>{this.Ge(t)&&this.zo(t.Ot())})),this.Bo(),this.Hi.Ch()}Ja(){return null===this.ka&&(this.ka=Wi(this.ya)),this.ka}Zo(){return this.bo}Ko(){return this.Mo}Uo(t){const i=t.co();if(i&&i.length>0&&!this.wo.Vi()){const i=this.wo.Ns();null!==i&&t.do(i)}t.Dn()}Ao(){const t=this.Ja();if(0===t.length)return{Go:0,Eo:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{Go:i,Eo:n}}Lo(t,i,n){let s=this.To(i);if(null===s&&(s=this.xo(i,this.Hi.F().overlayPriceScales)),this.ya.push(t),!Q(i)){const n=this.po.get(i)||[];n.push(t),this.po.set(i,n)}s.Qa(t),t.Gi(s),t.Ki(n),this.zo(s),this.ka=null}ko(t,i,n){i.lr!==n.lr&&this.Uo(t)}xo(t,i){const n=Object.assign({visible:!0,autoScale:!0},x(i)),s=new Ui(t,n,this.Hi.F().layout,this.Hi.F().localization);return s.Ha(this.Lt()),s}}const Yi=t=>t.getUTCFullYear(),Xi=t=>nt((t=>t.getUTCDate())(t),2),Zi=(t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}),Ki=(t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}),Gi=t=>nt((t=>t.getUTCMonth()+1)(t),2),Ji=t=>nt(Yi(t)%100,2),Qi=t=>nt(Yi(t),4);class tn{constructor(t="yyyy-MM-dd",i="default"){this.Jo=t,this.Qo=i}t_(t){return function(t,i,n){return i.replace(/yyyy/g,Qi(t)).replace(/yy/g,Ji(t)).replace(/MMMM/g,Zi(t,n)).replace(/MMM/g,Ki(t,n)).replace(/MM/g,Gi(t)).replace(/dd/g,Xi(t))}(t,this.Jo,this.Qo)}}class nn{constructor(t){this.i_=t||"%h:%m:%s"}t_(t){return this.i_.replace("%h",nt(t.getUTCHours(),2)).replace("%m",nt(t.getUTCMinutes(),2)).replace("%s",nt(t.getUTCSeconds(),2))}}const sn={n_:"yyyy-MM-dd",s_:"%h:%m:%s",e_:" ",r_:"default"};class en{constructor(t={}){const i=Object.assign(Object.assign({},sn),t);this.h_=new tn(i.n_,i.r_),this.l_=new nn(i.s_),this.a_=i.e_}t_(t){return`${this.h_.t_(t)}${this.a_}${this.l_.t_(t)}`}}class rn{constructor(t,i=50){this.Ae=0,this.Le=1,this.ze=1,this.Ne=new Map,this.Ie=new Map,this.o_=t,this.Ve=i}t_(t){const i=t._t,n=void 0===i.__?new Date(1e3*i.u_).getTime():new Date(Date.UTC(i.__.year,i.__.month-1,i.__.day)).getTime(),s=this.Ne.get(n);if(void 0!==s)return s.c_;if(this.Ae===this.Ve){const t=this.Ie.get(this.ze);this.Ie.delete(this.ze),this.Ne.delete(r(t)),this.ze++,this.Ae--}const e=this.o_(t);return this.Ne.set(n,{c_:e,$e:this.Le}),this.Ie.set(this.Le,n),this.Ae++,this.Le++,e}}class hn{constructor(t,i){e(t<=i,"right should be >= left"),this.d_=t,this.f_=i}Ms(){return this.d_}ci(){return this.f_}p_(){return this.f_-this.d_+1}Lr(t){return this.d_<=t&&t<=this.f_}rh(t){return this.d_===t.Ms()&&this.f_===t.ci()}}function ln(t,i){return null===t||null===i?t===i:t.rh(i)}class an{constructor(){this.v_=new Map,this.Ne=null}m_(t,i){this.b_(i),this.Ne=null;for(let n=i;n{t<=n[0].Ys?i.push(s):n.splice(mt(n,t,(i=>i.Ysi-t))){if(!this.v_.get(n))continue;const s=i;i=[];const e=s.length;let h=0;const l=r(this.v_.get(n)),a=l.length;let o=1/0,_=-1/0;for(let n=0;n=t&&a-_>=t&&(i.push(r),_=a)}for(;hthis.D_[this.D_.length-1]._t.u_)return i?this.D_.length-1:null;const n=mt(this.D_,t.u_,((t,i)=>t._t.u_0}Ns(){return this.Z_(),this.E_.C_()}K_(){return this.Z_(),this.E_.T_()}G_(){const t=this.Ns();if(null===t)return null;const i={from:t.Ms(),to:t.ci()};return this.J_(i)}J_(t){const i=Math.round(t.from),n=Math.round(t.to),s=h(this.Q_()),e=h(this.tu());return{from:h(this.vn(Math.max(s,i))),to:h(this.vn(Math.min(e,n)))}}iu(t){return{from:h(this.Fl(t.from,!0)),to:h(this.Fl(t.to,!0))}}$i(){return this.vo}Oo(t){if(!isFinite(t)||t<=0)return;if(this.vo===t)return;const i=this.K_(),n=this.vo;if(this.vo=t,this.A_=!0,this.un.lockVisibleTimeRangeOnResize&&0!==n){const i=this.j_*t/n;this.j_=i}if(this.un.fixLeftEdge&&null!==i&&i.Ms()<=0){const i=n-t;this.W_-=Math.round(i/this.j_)+1,this.A_=!0}this.nu(),this.su()}zt(t){if(this.Vi()||!w(t))return 0;const i=this.eu()+this.W_-t;return this.vo-(i+.5)*this.j_-1}js(t,i){const n=this.eu(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!_?n.cu=!1:n.cu=u&&t.Ys<=a||c&&t.Ys>=o,d++}return this.F_.length=d,this.V_=this.F_,this.F_}du(){this.A_=!0,this.Kn(this.un.barSpacing),this.Gn(this.un.rightOffset)}fu(t){this.A_=!0,this.R_=t,this.su(),this.Y_()}pu(t,i){const n=this.hu(t),s=this.Ks(),e=s+i*(s/10);this.Kn(e),this.un.rightBarStaysOnScroll||this.Gn(this.ou()+(n-this.hu(t)))}ro(t){this.Pa&&this._o(),null===this.Ta&&null===this.N_&&(this.Vi()||(this.Ta=t,this.vu()))}ho(t){if(null===this.N_)return;const i=Pt(this.vo-t,0,this.vo),n=Pt(this.vo-h(this.Ta),0,this.vo);0!==i&&0!==n&&this.Kn(this.N_.Ks*i/n)}lo(){null!==this.Ta&&(this.Ta=null,this.mu())}ao(t){null===this.Pa&&null===this.N_&&(this.Vi()||(this.Pa=t,this.vu()))}oo(t){if(null===this.Pa)return;const i=(this.Pa-t)/this.Ks();this.W_=h(this.N_).ou+i,this.A_=!0,this.su()}_o(){null!==this.Pa&&(this.Pa=null,this.mu())}bu(){this.gu(this.un.rightOffset)}gu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.W_,s=performance.now();this.Hi.Yn({wu:t=>(t-s)/i>=1,Mu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.A_=!0,this.D_=t,this.O_.m_(t,i),this.su()}Su(){return this.L_}xu(){return this.z_}yu(){return this.I_}eu(){return this.R_||0}ku(t){const i=t.p_();this.au(this.vo/i),this.W_=t.ci()-this.eu(),this.su(),this.A_=!0,this.Hi.lu(),this.Hi.Ch()}Cu(){const t=this.Q_(),i=this.tu();null!==t&&null!==i&&this.ku(new hn(t,i+this.un.rightOffset))}Tu(t){const i=new hn(t.from,t.to);this.ku(i)}qi(t){return void 0!==this.Ba.timeFormatter?this.Ba.timeFormatter(t.M_):this.Pu.t_(new Date(1e3*t._t.u_))}_u(){const{handleScroll:t,handleScale:i}=this.Hi.F();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Q_(){return 0===this.D_.length?null:0}tu(){return 0===this.D_.length?null:this.D_.length-1}Ru(t){return(this.vo-1-t)/this.j_}hu(t){const i=this.Ru(t),n=this.eu()+this.W_-i;return Math.round(1e6*n)/1e6}au(t){const i=this.j_;this.j_=t,this.nu(),i!==this.j_&&(this.A_=!0,this.Du())}Z_(){if(!this.A_)return;if(this.A_=!1,this.Vi())return void this.Ou(on.P_());const t=this.eu(),i=this.vo/this.j_,n=this.W_+t,s=new hn(n-i+1,n);this.Ou(new on(s))}nu(){const t=this.Bu();if(this.j_t&&(this.j_=t,this.A_=!0)}}Bu(){return this.un.fixLeftEdge&&this.un.fixRightEdge&&0!==this.D_.length?this.vo/this.D_.length:this.un.minBarSpacing}su(){const t=this.Eu();this.W_>t&&(this.W_=t,this.A_=!0);const i=this.Au();null!==i&&this.W_this.Lu(t))),this.B_.set(t.w_,i)),i.t_(t)}Lu(t){const i=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.w_,this.un.timeVisible,this.un.secondsVisible);if(void 0!==this.un.tickMarkFormatter){const n=this.un.tickMarkFormatter(t.M_,i,this.Ba.locale);if(null!==n)return n}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.__?new Date(1e3*t.u_):new Date(Date.UTC(t.__.year,t.__.month-1,t.__.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t._t,i,this.Ba.locale)}Ou(t){const i=this.E_;this.E_=t,ln(i.C_(),this.E_.C_())||this.L_.m(),ln(i.T_(),this.E_.T_())||this.z_.m(),this.Du()}Du(){this.V_=null}q_(){this.Du(),this.B_.clear()}H_(){const t=this.Ba.dateFormat;this.un.timeVisible?this.Pu=new en({n_:t,s_:this.un.secondsVisible?"%h:%m:%s":"%h:%m",e_:" ",r_:this.Ba.locale}):this.Pu=new tn(t,this.Ba.locale)}Y_(){if(!this.un.fixLeftEdge)return;const t=this.Q_();if(null===t)return;const i=this.Ns();if(null===i)return;const n=i.Ms()-t;if(n<0){const t=this.W_-n-1;this.Gn(t)}this.nu()}X_(){this.su(),this.nu()}}class vn extends D{constructor(t){super(),this.zu=new Map,this.It=t}Z(t){}G(t){if(!this.It.Ct)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.It.Iu){if(0===t.Gt.length)continue;i.font=t.P;const e=this.Nu(i,t.Gt);e>n.width?t.pu=n.width/e:t.pu=1,s+=t.Vu*t.pu}let e=0;switch(this.It.Fu){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.It.D;for(const t of this.It.Iu){i.save();let s=0;switch(this.It.Wu){case"left":i.textAlign="left",s=t.Vu/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.Vu/2}i.translate(s,e),i.textBaseline="top",i.font=t.P,i.scale(t.pu,t.pu),i.fillText(t.Gt,0,t.ju),i.restore(),e+=t.Vu*t.pu}}Nu(t,i){const n=this.$u(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}$u(t){let i=this.zu.get(t);return void 0===i&&(i=new Map,this.zu.set(t,i)),i}}class mn{constructor(t){this.vt=!0,this.Wt={Ct:!1,D:"",Iu:[],Fu:"center",Wu:"center"},this.jt=new vn(this.Wt),this.$t=t}gt(){this.vt=!0}Mt(){return this.vt&&(this.St(),this.vt=!1),this.jt}St(){const t=this.$t.F(),i=this.Wt;i.Ct=t.visible,i.Ct&&(i.D=t.color,i.Wu=t.horzAlign,i.Fu=t.vertAlign,i.Iu=[{Gt:t.text,P:T(t.fontSize,t.fontFamily,t.fontStyle),Vu:1.2*t.fontSize,ju:0,pu:0}])}}class bn extends K{constructor(t,i){super(),this.un=i,this.bn=new mn(this)}Pn(){return[]}Tn(){return[this.bn]}F(){return this.un}Dn(){this.bn.gt()}}!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(un||(un={}));class gn{constructor(t,i){this.Hu=[],this.Uu=[],this.vo=0,this.qu=null,this.Yu=new m,this.Xu=new m,this.Zu=null,this.Ku=t,this.un=i,this.Gu=new P(this),this.wo=new pn(this,i.timeScale,this.un.localization),this.bt=new J(this,i.crosshair),this.Ju=new ki(i.crosshair),this.Qu=new bn(this,i.watermark),this.tc(),this.Hu[0].Do(2e3),this.ic=this.nc(0),this.sc=this.nc(1)}dl(){this.ec(tt.ss())}Ch(){this.ec(tt.ns())}Cl(){this.ec(new tt(1))}fl(t){const i=this.rc(t);this.ec(i)}hc(){return this.qu}lc(t){const i=this.qu;this.qu=t,null!==i&&this.fl(i.ac),null!==t&&this.fl(t.ac)}F(){return this.un}kh(t){b(this.un,t),this.Hu.forEach((i=>i.Co(t))),void 0!==t.timeScale&&this.wo.kh(t.timeScale),void 0!==t.localization&&this.wo.U_(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.Yu.m(),this.ic=this.nc(0),this.sc=this.nc(1),this.dl()}oc(t,i){if("left"===t)return void this.kh({leftPriceScale:i});if("right"===t)return void this.kh({rightPriceScale:i});const n=this._c(t);null!==n&&(n.Ot.kh(i),this.Yu.m())}_c(t){for(const i of this.Hu){const n=i.To(t);if(null!==n)return{Ht:i,Ot:n}}return null}yt(){return this.wo}uc(){return this.Hu}cc(){return this.Qu}dc(){return this.bt}fc(){return this.Xu}vc(t,i){t.Ha(i),this.lu()}Oo(t){this.vo=t,this.wo.Oo(this.vo),this.Hu.forEach((i=>i.Oo(t))),this.lu()}tc(t){const i=new qi(this.wo,this);void 0!==t?this.Hu.splice(t,0,i):this.Hu.push(i);const n=void 0===t?this.Hu.length-1:t,s=tt.ss();return s.Nn(n,{Vn:0,Fn:!0}),this.ec(s),i}Vo(t,i,n){t.Vo(i,n)}Fo(t,i,n){t.Fo(i,n),this.pl(),this.ec(this.mc(t,2))}Wo(t,i){t.Wo(i),this.ec(this.mc(t,2))}jo(t,i,n){i.Na()||t.jo(i,n)}$o(t,i,n){i.Na()||(t.$o(i,n),this.pl(),this.ec(this.mc(t,2)))}Ho(t,i){i.Na()||(t.Ho(i),this.ec(this.mc(t,2)))}qo(t,i){t.qo(i),this.ec(this.mc(t,2))}bc(t){this.wo.ro(t)}gc(t,i){const n=this.yt();if(n.Vi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.pu(t,i),this.lu()}wc(t){this.Mc(0),this.Sc(t),this.xc()}yc(t){this.wo.ho(t),this.lu()}kc(){this.wo.lo(),this.Ch()}Mc(t){this.wo.ao(t)}Sc(t){this.wo.oo(t),this.lu()}xc(){this.wo._o(),this.Ch()}wt(){return this.Uu}Cc(t,i,n,s){this.bt.gn(t,i);let e=NaN,r=this.wo.ru(t);const h=this.wo.Ns();null!==h&&(r=Math.min(Math.max(h.Ms(),r),h.ci()));const l=s.fn(),a=l.Tt();null!==a&&(e=l.pn(i,a)),e=this.Ju.Wl(e,r,s),this.bt.xn(r,e,s),this.Cl(),this.Xu.m(this.bt.xt(),{x:t,y:i},n)}Tc(){this.dc().kn(),this.Cl(),this.Xu.m(null,null,null)}pl(){const t=this.bt.Ht();if(null!==t){const i=this.bt.Mn(),n=this.bt.Sn();this.Cc(i,n,null,t)}this.bt.Dn()}Pc(t,i,n){const s=this.wo.vn(0);void 0!==i&&void 0!==n&&this.wo.gt(i,n);const e=this.wo.vn(0),r=this.wo.eu(),h=this.wo.Ns();if(null!==h&&null!==s&&null!==e){const i=h.Lr(r),n=s.u_>e.u_,l=null!==t&&t>r&&!n,a=i&&this.wo.F().shiftVisibleRangeOnNewBar;if(l&&!a){const i=t-r;this.wo.Gn(this.wo.ou()-i)}}this.wo.fu(t)}bl(t){null!==t&&t.Xo()}Ke(t){const i=this.Hu.find((i=>i.Ja().includes(t)));return void 0===i?null:i}lu(){this.Qu.Dn(),this.Hu.forEach((t=>t.Xo())),this.pl()}M(){this.Hu.forEach((t=>t.M())),this.Hu.length=0,this.un.localization.priceFormatter=void 0,this.un.localization.timeFormatter=void 0}Rc(){return this.Gu}tr(){return this.Gu.F()}Po(){return this.Yu}Dc(t,i){const n=this.Hu[0],s=this.Oc(i,t,n);return this.Uu.push(s),1===this.Uu.length?this.dl():this.Ch(),s}Bc(t){const i=this.Ke(t),n=this.Uu.indexOf(t);e(-1!==n,"Series not found"),this.Uu.splice(n,1),h(i).no(t),t.M&&t.M()}cl(t,i){const n=h(this.Ke(t));n.no(t);const s=this._c(i);if(null===s){const s=t.Zi();n.Qa(t,i,s)}else{const e=s.Ht===n?t.Zi():void 0;s.Ht.Qa(t,i,e)}}Cu(){const t=tt.ns();t.$n(),this.ec(t)}Ec(t){const i=tt.ns();i.qn(t),this.ec(i)}Zn(){const t=tt.ns();t.Zn(),this.ec(t)}Kn(t){const i=tt.ns();i.Kn(t),this.ec(i)}Gn(t){const i=tt.ns();i.Gn(t),this.ec(i)}Yn(t){const i=tt.ns();i.Yn(t),this.ec(i)}Hn(){const t=tt.ns();t.Hn(),this.ec(t)}Ac(){return this.un.rightPriceScale.visible?"right":"left"}Lc(){return this.sc}U(){return this.ic}At(t){const i=this.sc,n=this.ic;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.Zu||this.Zu.bs!==n||this.Zu.gs!==i)this.Zu={bs:n,gs:i,zc:new Map};else{const i=this.Zu.zc.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=p(t),[l,a,u,c]=p(i),d=[o(s+n*(l-s)),o(e+n*(a-e)),o(r+n*(u-r)),_(h+n*(c-h))];return`rgba(${d[0]}, ${d[1]}, ${d[2]}, ${d[3]})`}(n,i,t/100);return this.Zu.zc.set(t,s),s}mc(t,i){const n=new tt(i);if(null!==t){const s=this.Hu.indexOf(t);n.Nn(s,{Vn:i})}return n}rc(t,i){return void 0===i&&(i=2),this.mc(this.Ke(t),i)}ec(t){this.Ku&&this.Ku(t),this.Hu.forEach((t=>t.Ko().Th().gt()))}Oc(t,i,n){const s=new yi(this,t,i),e=void 0!==t.priceScaleId?t.priceScaleId:this.Ac();return n.Qa(s,e),Q(e)||s.kh(t),s}nc(t){const i=this.un.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function wn(t){return!g(t)&&!M(t)}function Mn(t){return g(t)}function Sn(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function xn(t,i){return t.width===i.width&&t.height===i.height}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(cn||(cn={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(dn||(dn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(fn||(fn={}));var yn=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var kn=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=Sn({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return Sn({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=Sn(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;xn(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=Sn(this._transformBitmapSize(t,this._canvasElementClientSize)),s=xn(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&xn(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=Cn(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new yn(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=Cn(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return Sn({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):Sn({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=Sn({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function Cn(t){return t.ownerDocument.defaultView}var Tn=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function Pn(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new Tn(e,n,s)}const Rn="undefined"!=typeof window;function Dn(){return!!Rn&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function On(){return!!Rn&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function Bn(t){return t+t%2}function En(t,i){return t.Ic-i.Ic}function An(t,i,n){const s=(t.Ic-i.Ic)/(t._t-i._t);return Math.sign(s)*Math.min(Math.abs(s),n)}class Ln{constructor(t,i,n,s){this.Nc=null,this.Vc=null,this.Fc=null,this.Wc=null,this.jc=null,this.$c=0,this.Hc=0,this.Uc=t,this.qc=i,this.Yc=n,this.es=s}Xc(t,i){if(null!==this.Nc){if(this.Nc._t===i)return void(this.Nc.Ic=t);if(Math.abs(this.Nc.Ic-t)50)return;let n=0;const s=An(this.Nc,this.Vc,this.qc),e=En(this.Nc,this.Vc),r=[s],h=[e];if(n+=e,null!==this.Fc){const t=An(this.Vc,this.Fc,this.qc);if(Math.sign(t)===Math.sign(s)){const i=En(this.Vc,this.Fc);if(r.push(t),h.push(i),n+=i,null!==this.Wc){const t=An(this.Fc,this.Wc,this.qc);if(Math.sign(t)===Math.sign(s)){const i=En(this.Fc,this.Wc);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return s.resizeCanvasElement(i),s}function In(t){Rn&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class Nn{constructor(t,i,n){this.Kc=0,this.Gc=null,this.Jc={st:Number.NEGATIVE_INFINITY,et:Number.POSITIVE_INFINITY},this.Qc=0,this.td=null,this.nd={st:Number.NEGATIVE_INFINITY,et:Number.POSITIVE_INFINITY},this.sd=null,this.ed=!1,this.rd=null,this.hd=null,this.ld=!1,this.ad=!1,this.od=!1,this._d=null,this.ud=null,this.dd=null,this.fd=null,this.pd=null,this.vd=null,this.md=null,this.bd=0,this.gd=!1,this.wd=!1,this.Md=!1,this.Sd=0,this.xd=null,this.yd=!On(),this.kd=t=>{this.Cd(t)},this.Td=t=>{if(this.Pd(t)){const i=this.Rd(t);if(++this.Qc,this.td&&this.Qc>1){const{Dd:n}=this.Od(Wn(t),this.nd);n<30&&!this.od&&this.Bd(i,this.Ad.Ed),this.Ld()}}else{const i=this.Rd(t);if(++this.Kc,this.Gc&&this.Kc>1){const{Dd:n}=this.Od(Wn(t),this.Jc);n<5&&!this.ad&&this.zd(i,this.Ad.Id),this.Nd()}}},this.Vd=t,this.Ad=i,this.un=n,this.Fd()}M(){null!==this._d&&(this._d(),this._d=null),null!==this.ud&&(this.ud(),this.ud=null),null!==this.fd&&(this.fd(),this.fd=null),null!==this.pd&&(this.pd(),this.pd=null),null!==this.vd&&(this.vd(),this.vd=null),null!==this.dd&&(this.dd(),this.dd=null),this.Wd(),this.Nd()}jd(t){this.fd&&this.fd();const i=this.$d.bind(this);if(this.fd=()=>{this.Vd.removeEventListener("mousemove",i)},this.Vd.addEventListener("mousemove",i),this.Pd(t))return;const n=this.Rd(t);this.zd(n,this.Ad.Hd),this.yd=!0}Nd(){null!==this.Gc&&clearTimeout(this.Gc),this.Kc=0,this.Gc=null,this.Jc={st:Number.NEGATIVE_INFINITY,et:Number.POSITIVE_INFINITY}}Ld(){null!==this.td&&clearTimeout(this.td),this.Qc=0,this.td=null,this.nd={st:Number.NEGATIVE_INFINITY,et:Number.POSITIVE_INFINITY}}$d(t){if(this.Md||null!==this.hd)return;if(this.Pd(t))return;const i=this.Rd(t);this.zd(i,this.Ad.Ud),this.yd=!0}qd(t){const i=$n(t.changedTouches,h(this.xd));if(null===i)return;if(this.Sd=jn(t),null!==this.md)return;if(this.wd)return;this.gd=!0;const n=this.Od(Wn(i),h(this.hd)),{Yd:s,Xd:e,Dd:r}=n;if(this.ld||!(r<5)){if(!this.ld){const t=.5*s,i=e>=t&&!this.un.Zd(),n=t>e&&!this.un.Kd();i||n||(this.wd=!0),this.ld=!0,this.od=!0,this.Wd(),this.Ld()}if(!this.wd){const n=this.Rd(t,i);this.Bd(n,this.Ad.Gd),Fn(t)}}}Jd(t){if(0!==t.button)return;const i=this.Od(Wn(t),h(this.rd)),{Dd:n}=i;if(n>=5&&(this.ad=!0,this.Nd()),this.ad){const i=this.Rd(t);this.zd(i,this.Ad.Qd)}}Od(t,i){const n=Math.abs(i.st-t.st),s=Math.abs(i.et-t.et);return{Yd:n,Xd:s,Dd:n+s}}tf(t){let i=$n(t.changedTouches,h(this.xd));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.xd=null,this.Sd=jn(t),this.Wd(),this.hd=null,this.vd&&(this.vd(),this.vd=null);const n=this.Rd(t,i);if(this.Bd(n,this.Ad.if),++this.Qc,this.td&&this.Qc>1){const{Dd:t}=this.Od(Wn(i),this.nd);t<30&&!this.od&&this.Bd(n,this.Ad.Ed),this.Ld()}else this.od||(this.Bd(n,this.Ad.nf),this.Ad.nf&&Fn(t));0===this.Qc&&Fn(t),0===t.touches.length&&this.ed&&(this.ed=!1,Fn(t))}Cd(t){if(0!==t.button)return;const i=this.Rd(t);if(this.rd=null,this.Md=!1,this.pd&&(this.pd(),this.pd=null),Dn()){this.Vd.ownerDocument.documentElement.removeEventListener("mouseleave",this.kd)}if(!this.Pd(t))if(this.zd(i,this.Ad.sf),++this.Kc,this.Gc&&this.Kc>1){const{Dd:n}=this.Od(Wn(t),this.Jc);n<5&&!this.ad&&this.zd(i,this.Ad.Id),this.Nd()}else this.ad||this.zd(i,this.Ad.ef)}Wd(){null!==this.sd&&(clearTimeout(this.sd),this.sd=null)}rf(t){if(null!==this.xd)return;const i=t.changedTouches[0];this.xd=i.identifier,this.Sd=jn(t);const n=this.Vd.ownerDocument.documentElement;this.od=!1,this.ld=!1,this.wd=!1,this.hd=Wn(i),this.vd&&(this.vd(),this.vd=null);{const i=this.qd.bind(this),s=this.tf.bind(this);this.vd=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Wd(),this.sd=setTimeout(this.hf.bind(this,t),240)}const s=this.Rd(t,i);this.Bd(s,this.Ad.lf),this.td||(this.Qc=0,this.td=setTimeout(this.Ld.bind(this),500),this.nd=Wn(i))}af(t){if(0!==t.button)return;const i=this.Vd.ownerDocument.documentElement;Dn()&&i.addEventListener("mouseleave",this.kd),this.ad=!1,this.rd=Wn(t),this.pd&&(this.pd(),this.pd=null);{const t=this.Jd.bind(this),n=this.Cd.bind(this);this.pd=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.Md=!0,this.Pd(t))return;const n=this.Rd(t);this.zd(n,this.Ad._f),this.Gc||(this.Kc=0,this.Gc=setTimeout(this.Nd.bind(this),500),this.Jc=Wn(t))}Fd(){this.Vd.addEventListener("mouseenter",this.jd.bind(this)),this.Vd.addEventListener("touchcancel",this.Wd.bind(this));{const t=this.Vd.ownerDocument,i=t=>{this.Ad.uf&&(t.composed&&this.Vd.contains(t.composedPath()[0])||t.target&&this.Vd.contains(t.target)||this.Ad.uf())};this.ud=()=>{t.removeEventListener("touchstart",i)},this._d=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}On()&&(this.dd=()=>{this.Vd.removeEventListener("dblclick",this.Td)},this.Vd.addEventListener("dblclick",this.Td)),this.Vd.addEventListener("mouseleave",this.cf.bind(this)),this.Vd.addEventListener("touchstart",this.rf.bind(this),{passive:!0}),In(this.Vd),this.Vd.addEventListener("mousedown",this.af.bind(this)),this.df(),this.Vd.addEventListener("touchmove",(()=>{}),{passive:!1})}df(){void 0===this.Ad.ff&&void 0===this.Ad.pf&&void 0===this.Ad.vf||(this.Vd.addEventListener("touchstart",(t=>this.mf(t.touches)),{passive:!0}),this.Vd.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.md&&void 0!==this.Ad.pf){const i=Vn(t.touches[0],t.touches[1])/this.bd;this.Ad.pf(this.md,i),Fn(t)}}),{passive:!1}),this.Vd.addEventListener("touchend",(t=>{this.mf(t.touches)})))}mf(t){1===t.length&&(this.gd=!1),2!==t.length||this.gd||this.ed?this.bf():this.gf(t)}gf(t){const i=this.Vd.getBoundingClientRect()||{left:0,top:0};this.md={st:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,et:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.bd=Vn(t[0],t[1]),void 0!==this.Ad.ff&&this.Ad.ff(),this.Wd()}bf(){null!==this.md&&(this.md=null,void 0!==this.Ad.vf&&this.Ad.vf())}cf(t){if(this.fd&&this.fd(),this.Pd(t))return;if(!this.yd)return;const i=this.Rd(t);this.zd(i,this.Ad.wf),this.yd=!On()}hf(t){const i=$n(t.touches,h(this.xd));if(null===i)return;const n=this.Rd(t,i);this.Bd(n,this.Ad.Mf),this.od=!0,this.ed=!0}Pd(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:jn(t){"touchstart"!==t.type&&Fn(t)}}}}function Vn(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function Fn(t){t.cancelable&&t.preventDefault()}function Wn(t){return{st:t.pageX,et:t.pageY}}function jn(t){return t.timeStamp||performance.now()}function $n(t,i){for(let n=0;n{this.Of||this.tn.Ef().Ut().Ch()},this.Af=()=>{this.Of||this.tn.Ef().Ut().Ch()},this.tn=t,this.un=i,this.Oa=i.layout,this.Gu=n,this.Lf="left"===s,this.zf=document.createElement("div"),this.zf.style.height="100%",this.zf.style.overflow="hidden",this.zf.style.width="25px",this.zf.style.left="0",this.zf.style.position="relative",this.If=zn(this.zf,Sn({width:16,height:16})),this.If.subscribeSuggestedBitmapSizeChanged(this.Bf);const e=this.If.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Nf=zn(this.zf,Sn({width:16,height:16})),this.Nf.subscribeSuggestedBitmapSizeChanged(this.Af);const r=this.Nf.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={_f:this.Vf.bind(this),lf:this.Vf.bind(this),Qd:this.Ff.bind(this),Gd:this.Ff.bind(this),uf:this.Wf.bind(this),sf:this.jf.bind(this),if:this.jf.bind(this),Id:this.$f.bind(this),Ed:this.$f.bind(this),Hd:this.Hf.bind(this),wf:this.Uf.bind(this)};this.qf=new Nn(this.Nf.canvasElement,h,{Zd:()=>!1,Kd:()=>!0})}M(){this.qf.M(),this.Nf.unsubscribeSuggestedBitmapSizeChanged(this.Af),this.Nf.dispose(),this.If.unsubscribeSuggestedBitmapSizeChanged(this.Bf),this.If.dispose(),null!==this.Ii&&this.Ii.eo().v(this),this.Ii=null}Yf(){return this.zf}T(){return this.Oa.fontSize}Xf(){const t=this.Gu.F();return this.Ir!==t.P&&(this.Rf.Fe(),this.Ir=t.P),t}Zf(){if(null===this.Ii)return 0;let t=0;const i=this.Xf(),n=h(this.If.canvasElement.getContext("2d"));n.save();const s=this.Ii.Jl();n.font=this.Kf(),s.length>0&&(t=Math.max(this.Rf.Si(n,s[0].ua),this.Rf.Si(n,s[s.length-1].ua)));const e=this.Gf();for(let i=e.length;i--;){const s=this.Rf.Si(n,e[i].Gt());s>t&&(t=s)}const r=this.Ii.Tt();if(null!==r&&null!==this.Tf){const i=this.Ii.pn(1,r),s=this.Ii.pn(this.Tf.height-2,r);t=Math.max(t,this.Rf.Si(n,this.Ii.Fi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Rf.Si(n,this.Ii.Fi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const l=t||34;return Bn(Math.ceil(i.k+i.C+i.A+i.L+5+l))}Jf(t){null!==this.Tf&&xn(this.Tf,t)||(this.Tf=t,this.Of=!0,this.If.resizeCanvasElement(t),this.Nf.resizeCanvasElement(t),this.Of=!1,this.zf.style.width=`${t.width}px`,this.zf.style.height=`${t.height}px`)}Qf(){return h(this.Tf).width}Gi(t){this.Ii!==t&&(null!==this.Ii&&this.Ii.eo().v(this),this.Ii=t,t.eo().l(this.Sa.bind(this),this))}Ot(){return this.Ii}Fe(){const t=this.tn.tp();this.tn.Ef().Ut().qo(t,h(this.Ot()))}ip(t){if(null===this.Tf)return;if(1!==t){this.np(),this.If.applySuggestedBitmapSize();const t=Pn(this.If);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.sp(t),this.ye(t)})),this.ep(t),this.rp(t))}this.Nf.applySuggestedBitmapSize();const i=Pn(this.Nf);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.hp(i))}lp(){return this.If.bitmapSize}ap(t,i,n){const s=this.lp();s.width>0&&s.height>0&&t.drawImage(this.If.canvasElement,i,n)}gt(){var t;null===(t=this.Ii)||void 0===t||t.Jl()}Vf(t){if(null===this.Ii||this.Ii.Vi()||!this.un.handleScale.axisPressedMouseMove.price)return;const i=this.tn.Ef().Ut(),n=this.tn.tp();this.Pf=!0,i.Vo(n,this.Ii,t.localY)}Ff(t){if(null===this.Ii||!this.un.handleScale.axisPressedMouseMove.price)return;const i=this.tn.Ef().Ut(),n=this.tn.tp(),s=this.Ii;i.Fo(n,s,t.localY)}Wf(){if(null===this.Ii||!this.un.handleScale.axisPressedMouseMove.price)return;const t=this.tn.Ef().Ut(),i=this.tn.tp(),n=this.Ii;this.Pf&&(this.Pf=!1,t.Wo(i,n))}jf(t){if(null===this.Ii||!this.un.handleScale.axisPressedMouseMove.price)return;const i=this.tn.Ef().Ut(),n=this.tn.tp();this.Pf=!1,i.Wo(n,this.Ii)}$f(t){this.un.handleScale.axisDoubleClickReset.price&&this.Fe()}Hf(t){if(null===this.Ii)return;!this.tn.Ef().Ut().F().handleScale.axisPressedMouseMove.price||this.Ii.th()||this.Ii.Va()||this.op(1)}Uf(t){this.op(0)}Gf(){const t=[],i=null===this.Ii?void 0:this.Ii;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.C*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Yl*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Kf(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.Oa.textColor,t.textAlign=this.Lf?"right":"left",t.textBaseline="middle";const h=this.Lf?Math.round(e-s.A):Math.round(e+s.C+s.A),l=i.map((i=>this.Rf.Mi(t,i.ua)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.ua,h,s.Yl+l[n])}}))}np(){if(null===this.Tf||null===this.Ii)return;let t=this.Tf.height/2;const i=[],n=this.Ii.Ja().slice(),s=this.tn.tp(),e=this.Xf();this.Ii===s.Je()&&this.tn.tp().Ja().forEach((t=>{s.Ge(t)&&n.push(t)}));const r=this.Ii.jl()[0],h=this.Ii;n.forEach((n=>{const e=n.Pn(s,h);e.forEach((t=>{t.Bi(null),t.Ei()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].yi())})),i.forEach((t=>t.Bi(t.yi())));this.Ii.F().alignLabels&&this._p(i,e,t)}_p(t,i,n){if(null===this.Tf)return;const s=t.filter((t=>t.yi()<=n)),e=t.filter((t=>t.yi()>n));s.sort(((t,i)=>i.yi()-t.yi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.yi()-i.yi()));for(const n of t){const t=Math.floor(n.Lt(i)/2),s=n.yi();s>-t&&sthis.Tf.height-t&&sl-r&&n.Bi(l-r)}for(let t=1;t{if(i.Ai()){i.Mt(h(this.Ii)).X(t,n,this.Rf,s)}}))}hp(t){if(null===this.Tf||null===this.Ii)return;const i=this.tn.Ef().Ut(),n=[],s=this.tn.tp(),e=i.dc().Pn(s,this.Ii);e.length&&n.push(e);const r=this.Xf(),l=this.Lf?"right":"left";n.forEach((i=>{i.forEach((i=>{i.Mt(h(this.Ii)).X(t,r,this.Rf,l)}))}))}op(t){this.zf.style.cursor=1===t?"ns-resize":"default"}Sa(){const t=this.Zf();this.Df{this.Of||null===this.Sp||this.Hi().Ch()},this.Af=()=>{this.Of||null===this.Sp||this.Hi().Ch()},this.xp=t,this.Sp=i,this.Sp.Zo().l(this.yp.bind(this),this,!0),this.kp=document.createElement("td"),this.kp.style.padding="0",this.kp.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Cp=document.createElement("td"),this.Cp.style.padding="0",this.Tp=document.createElement("td"),this.Tp.style.padding="0",this.kp.appendChild(n),this.If=zn(n,Sn({width:16,height:16})),this.If.subscribeSuggestedBitmapSizeChanged(this.Bf);const s=this.If.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Nf=zn(n,Sn({width:16,height:16})),this.Nf.subscribeSuggestedBitmapSizeChanged(this.Af);const e=this.Nf.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.Pp=document.createElement("tr"),this.Pp.appendChild(this.Cp),this.Pp.appendChild(this.kp),this.Pp.appendChild(this.Tp),this.Rp(),this.qf=new Nn(this.Nf.canvasElement,this,{Zd:()=>null===this.bp&&!this.xp.F().handleScroll.vertTouchDrag,Kd:()=>null===this.bp&&!this.xp.F().handleScroll.horzTouchDrag})}M(){null!==this.up&&this.up.M(),null!==this.cp&&this.cp.M(),this.Nf.unsubscribeSuggestedBitmapSizeChanged(this.Af),this.Nf.dispose(),this.If.unsubscribeSuggestedBitmapSizeChanged(this.Bf),this.If.dispose(),null!==this.Sp&&this.Sp.Zo().v(this),this.qf.M()}tp(){return h(this.Sp)}Dp(t){null!==this.Sp&&this.Sp.Zo().v(this),this.Sp=t,null!==this.Sp&&this.Sp.Zo().l(Kn.prototype.yp.bind(this),this,!0),this.Rp()}Ef(){return this.xp}Yf(){return this.Pp}Rp(){if(null!==this.Sp&&(this.Op(),0!==this.Hi().wt().length)){if(null!==this.up){const t=this.Sp.Io();this.up.Gi(h(t))}if(null!==this.cp){const t=this.Sp.No();this.cp.Gi(h(t))}}}Bp(){null!==this.up&&this.up.gt(),null!==this.cp&&this.cp.gt()}Ro(){return null!==this.Sp?this.Sp.Ro():0}Do(t){this.Sp&&this.Sp.Do(t)}Hd(t){if(!this.Sp)return;this.Ep();const i=t.localX,n=t.localY;this.Ap(i,n,t)}_f(t){this.Ep(),this.Lp(),this.Ap(t.localX,t.localY,t)}Ud(t){if(!this.Sp)return;this.Ep();const i=t.localX,n=t.localY;this.Ap(i,n,t);const s=this.ir(i,n);this.Hi().lc(s&&{ac:s.ac,zp:s.zp})}ef(t){null!==this.Sp&&(this.Ep(),this.Ip(t))}Qd(t){this.Ep(),this.Np(t),this.Ap(t.localX,t.localY,t)}sf(t){null!==this.Sp&&(this.Ep(),this.mp=!1,this.Vp(t))}nf(t){null!==this.Sp&&this.Ip(t)}Mf(t){if(this.mp=!0,null===this.bp){const i={x:t.localX,y:t.localY};this.Fp(i,i,t)}}wf(t){null!==this.Sp&&(this.Ep(),this.Sp.Ut().lc(null),this.Wp())}jp(){return this.pp}ff(){this.vp=1,this.Hi().Hn()}pf(t,i){if(!this.xp.F().handleScale.pinch)return;const n=5*(i-this.vp);this.vp=i,this.Hi().gc(t.st,n)}lf(t){if(this.mp=!1,this.gp=null!==this.bp,this.Lp(),null!==this.bp){const i=this.Hi().dc();this.wp={x:i.Xt(),y:i.Zt()},this.bp={x:t.localX,y:t.localY}}}Gd(t){if(null===this.Sp)return;const i=t.localX,n=t.localY;if(null===this.bp)this.Np(t);else{this.gp=!1;const s=h(this.wp),e=s.x+(i-this.bp.x),r=s.y+(n-this.bp.y);this.Ap(e,r,t)}}if(t){0===this.Ef().F().trackingMode.exitMode&&(this.gp=!0),this.$p(),this.Vp(t)}ir(t,i){const n=this.Sp;if(null===n)return null;const s=n.Ja();for(const e of s){const s=this.Hp(e.Tn(n),t,i);if(null!==s)return{ac:e,kf:s.kf,zp:s.zp}}return null}Up(t,i){h("left"===i?this.up:this.cp).Jf(Sn({width:t,height:this.Tf.height}))}qp(){return this.Tf}Jf(t){xn(this.Tf,t)||(this.Tf=t,this.Of=!0,this.If.resizeCanvasElement(t),this.Nf.resizeCanvasElement(t),this.Of=!1,this.kp.style.width=t.width+"px",this.kp.style.height=t.height+"px")}Yp(){const t=h(this.Sp);t.zo(t.Io()),t.zo(t.No());for(const i of t.jl())if(t.Ge(i)){const n=i.Ot();null!==n&&t.zo(n),i.Dn()}}lp(){return this.If.bitmapSize}ap(t,i,n){const s=this.lp();s.width>0&&s.height>0&&t.drawImage(this.If.canvasElement,i,n)}ip(t){if(0===t)return;if(null===this.Sp)return;if(t>1&&this.Yp(),null!==this.up&&this.up.ip(t),null!==this.cp&&this.cp.ip(t),1!==t){this.If.applySuggestedBitmapSize();const t=Pn(this.If);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.sp(t)})),this.Sp&&(this.Xp(t),this.Zp(t),this.Kp(t,Yn),this.Kp(t,Xn)))}this.Nf.applySuggestedBitmapSize();const i=Pn(this.Nf);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i,Zn),this.Gp(i))}Jp(){return this.up}Qp(){return this.cp}yp(){null!==this.Sp&&this.Sp.Zo().v(this),this.Sp=null}Ip(t){const i=t.localX,n=t.localY;this.pp.g()&&this.pp.m(this.Hi().yt().ru(i),{x:i,y:n},t)}sp({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Hi(),r=e.U(),h=e.Lc();r===h?V(t,0,0,n,s,h):$(t,0,0,n,s,r,h)}Xp(t){const i=h(this.Sp).Ko().Th().Mt();null!==i&&i.X(t,!1)}Zp(t){const i=this.Hi().cc();this.tv(t,Yn,Un,i),this.tv(t,Yn,qn,i)}Gp(t){this.tv(t,Yn,qn,this.Hi().dc())}Kp(t,i){const n=h(this.Sp).Ja();for(const s of n)this.tv(t,i,Un,s);for(const s of n)this.tv(t,i,qn,s)}tv(t,i,n,s){const e=h(this.Sp),r=i(s,e),l=e.Ut().hc(),a=null!==l&&l.ac===s,o=null!==l&&a&&void 0!==l.zp?l.zp.sr:void 0;for(const i of r){const s=i.Mt();null!==s&&n(s,t,a,o)}}Hp(t,i,n){for(const s of t){const t=s.Mt();if(null!==t&&t.ir){const e=t.ir(i,n);if(null!==e)return{kf:s,zp:e}}}return null}Op(){if(null===this.Sp)return;const t=this.xp,i=this.Sp.Io().F().visible,n=this.Sp.No().F().visible;i||null===this.up||(this.Cp.removeChild(this.up.Yf()),this.up.M(),this.up=null),n||null===this.cp||(this.Tp.removeChild(this.cp.Yf()),this.cp.M(),this.cp=null);const s=t.Ut().Rc();i&&null===this.up&&(this.up=new Hn(this,t.F(),s,"left"),this.Cp.appendChild(this.up.Yf())),n&&null===this.cp&&(this.cp=new Hn(this,t.F(),s,"right"),this.Tp.appendChild(this.cp.Yf()))}iv(t){return t.Sf&&this.mp||null!==this.bp}nv(t){return Math.max(0,Math.min(t,this.Tf.width-1))}sv(t){return Math.max(0,Math.min(t,this.Tf.height-1))}Ap(t,i,n){this.Hi().Cc(this.nv(t),this.sv(i),n,h(this.Sp))}Wp(){this.Hi().Tc()}$p(){this.gp&&(this.bp=null,this.Wp())}Fp(t,i,n){this.bp=t,this.gp=!1,this.Ap(i.x,i.y,n);const s=this.Hi().dc();this.wp={x:s.Xt(),y:s.Zt()}}Hi(){return this.xp.Ut()}Vp(t){if(!this.fp)return;const i=this.Hi(),n=this.tp();if(i.Ho(n,n.fn()),this.dp=null,this.fp=!1,i.xc(),null!==this.Mp){const t=performance.now(),n=i.yt();this.Mp.pr(n.ou(),t),this.Mp.wu(t)||i.Yn(this.Mp)}}Ep(){this.bp=null}Lp(){if(!this.Sp)return;if(this.Hi().Hn(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)h(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.Sp.fn().Vi()&&this.Hi().yt().Vi()}Np(t){if(null===this.Sp)return;const i=this.Hi(),n=i.yt();if(n.Vi())return;const s=this.xp.F(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.Sf)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.Sf))return;const h=this.Sp.fn(),l=performance.now();if(null!==this.dp||this.iv(t)||(this.dp={x:t.clientX,y:t.clientY,u_:l,ev:t.localX,rv:t.localY}),null!==this.dp&&!this.fp&&(this.dp.x!==t.clientX||this.dp.y!==t.clientY)){if(t.Sf&&r.touch||!t.Sf&&r.mouse){const t=n.Ks();this.Mp=new Ln(.2/t,7/t,.997,15/t),this.Mp.Xc(n.ou(),this.dp.u_)}else this.Mp=null;h.Vi()||i.jo(this.Sp,h,t.localY),i.Mc(t.localX),this.fp=!0}this.fp&&(h.Vi()||i.$o(this.Sp,h,t.localY),i.Sc(t.localX),null!==this.Mp&&this.Mp.Xc(n.ou(),l))}}class Gn{constructor(t,i,n,s,e){this.vt=!0,this.Tf=Sn({width:0,height:0}),this.Bf=()=>this.ip(3),this.Lf="left"===t,this.Gu=n.Rc,this.un=i,this.hv=s,this.lv=e,this.zf=document.createElement("div"),this.zf.style.width="25px",this.zf.style.height="100%",this.zf.style.overflow="hidden",this.If=zn(this.zf,Sn({width:16,height:16})),this.If.subscribeSuggestedBitmapSizeChanged(this.Bf)}M(){this.If.unsubscribeSuggestedBitmapSizeChanged(this.Bf),this.If.dispose()}Yf(){return this.zf}qp(){return this.Tf}Jf(t){xn(this.Tf,t)||(this.Tf=t,this.If.resizeCanvasElement(t),this.zf.style.width=`${t.width}px`,this.zf.style.height=`${t.height}px`,this.vt=!0)}ip(t){if(t<3&&!this.vt)return;if(0===this.Tf.width||0===this.Tf.height)return;this.vt=!1,this.If.applySuggestedBitmapSize();const i=Pn(this.If);null!==i&&i.useBitmapCoordinateSpace((t=>{this.sp(t),this.ye(t)}))}lp(){return this.If.bitmapSize}ap(t,i,n){const s=this.lp();s.width>0&&s.height>0&&t.drawImage(this.If.canvasElement,i,n)}ye({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.hv())return;t.fillStyle=this.un.timeScale.borderColor;const e=Math.floor(this.Gu.F().k*n),r=Math.floor(this.Gu.F().k*s),h=this.Lf?i.width-e:0;t.fillRect(h,0,e,r)}sp({context:t,bitmapSize:i}){V(t,0,0,i.width,i.height,this.lv())}}function Jn(t,i){return t.w_>i.w_?t:i}class Qn{constructor(t){this.av=null,this.ov=null,this.S=null,this._v=!1,this.Tf=Sn({width:0,height:0}),this.uv=new m,this.Rf=new Wt(5),this.Of=!1,this.Bf=()=>{this.Of||this.xp.Ut().Ch()},this.Af=()=>{this.Of||this.xp.Ut().Ch()},this.xp=t,this.un=t.F().layout,this.cv=document.createElement("tr"),this.dv=document.createElement("td"),this.dv.style.padding="0",this.fv=document.createElement("td"),this.fv.style.padding="0",this.zf=document.createElement("td"),this.zf.style.height="25px",this.zf.style.padding="0",this.pv=document.createElement("div"),this.pv.style.width="100%",this.pv.style.height="100%",this.pv.style.position="relative",this.pv.style.overflow="hidden",this.zf.appendChild(this.pv),this.If=zn(this.pv,Sn({width:16,height:16})),this.If.subscribeSuggestedBitmapSizeChanged(this.Bf);const i=this.If.canvasElement;i.style.position="absolute",i.style.zIndex="1",i.style.left="0",i.style.top="0",this.Nf=zn(this.pv,Sn({width:16,height:16})),this.Nf.subscribeSuggestedBitmapSizeChanged(this.Af);const n=this.Nf.canvasElement;n.style.position="absolute",n.style.zIndex="2",n.style.left="0",n.style.top="0",this.cv.appendChild(this.dv),this.cv.appendChild(this.zf),this.cv.appendChild(this.fv),this.vv(),this.xp.Ut().Po().l(this.vv.bind(this),this),this.qf=new Nn(this.Nf.canvasElement,this,{Zd:()=>!0,Kd:()=>!1})}M(){this.qf.M(),null!==this.av&&this.av.M(),null!==this.ov&&this.ov.M(),this.Nf.unsubscribeSuggestedBitmapSizeChanged(this.Af),this.Nf.dispose(),this.If.unsubscribeSuggestedBitmapSizeChanged(this.Bf),this.If.dispose()}Yf(){return this.cv}mv(){return this.av}bv(){return this.ov}_f(t){if(this._v)return;this._v=!0;const i=this.xp.Ut();!i.yt().Vi()&&this.xp.F().handleScale.axisPressedMouseMove.time&&i.bc(t.localX)}lf(t){this._f(t)}uf(){const t=this.xp.Ut();!t.yt().Vi()&&this._v&&(this._v=!1,this.xp.F().handleScale.axisPressedMouseMove.time&&t.kc())}Qd(t){const i=this.xp.Ut();!i.yt().Vi()&&this.xp.F().handleScale.axisPressedMouseMove.time&&i.yc(t.localX)}Gd(t){this.Qd(t)}sf(){this._v=!1;const t=this.xp.Ut();t.yt().Vi()&&!this.xp.F().handleScale.axisPressedMouseMove.time||t.kc()}if(){this.sf()}Id(){this.xp.F().handleScale.axisDoubleClickReset.time&&this.xp.Ut().Zn()}Ed(){this.Id()}Hd(){this.xp.Ut().F().handleScale.axisPressedMouseMove.time&&this.op(1)}wf(){this.op(0)}qp(){return this.Tf}gv(){return this.uv}wv(t,i,n){xn(this.Tf,t)||(this.Tf=t,this.Of=!0,this.If.resizeCanvasElement(t),this.Nf.resizeCanvasElement(t),this.Of=!1,this.zf.style.width=`${t.width}px`,this.zf.style.height=`${t.height}px`,this.uv.m(t)),null!==this.av&&this.av.Jf(Sn({width:i,height:t.height})),null!==this.ov&&this.ov.Jf(Sn({width:n,height:t.height}))}Mv(){const t=this.Sv();return Math.ceil(t.k+t.C+t.T+t.I+t.B+t.xv)}gt(){this.xp.Ut().yt().Jl()}lp(){return this.If.bitmapSize}ap(t,i,n){const s=this.lp();s.width>0&&s.height>0&&t.drawImage(this.If.canvasElement,i,n)}ip(t){if(0===t)return;if(1!==t){this.If.applySuggestedBitmapSize();const i=Pn(this.If);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.sp(t),this.ye(t)})),this.ep(i)),null!==this.av&&this.av.ip(t),null!==this.ov&&this.ov.ip(t)}this.Nf.applySuggestedBitmapSize();const i=Pn(this.Nf);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.yv([this.xp.Ut().dc()],i))}sp({context:t,bitmapSize:i}){V(t,0,0,i.width,i.height,this.xp.Ut().Lc())}ye({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.xp.F().timeScale.borderVisible){t.fillStyle=this.kv();const s=Math.max(1,Math.floor(this.Sv().k*n));t.fillRect(0,0,i.width,s)}}ep(t){const i=this.xp.Ut().yt(),n=i.Jl();if(!n||0===n.length)return;let s=n.reduce(Jn,n[0]).w_;s>30&&s<50&&(s=30);const e=this.Sv(),r=i.F();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.kv(),t.fillStyle=this.kv();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.C*s);for(let s=n.length;s--;){const e=Math.round(n[s].Yl*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.k+e.C+e.I+e.T/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Kf();for(const e of n)if(e.w_=s){const n=e.cu?this.Cv(t,e.Yl,e.ua):e.Yl;t.fillText(e.ua,n,i)}}))}Cv(t,i,n){const s=this.Rf.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.Tf.width&&(i-=Math.abs(this.Tf.width-(r+s))),i}yv(t,i){const n=this.Sv();for(const s of t)for(const t of s.Qi())t.Mt().X(i,n)}kv(){return this.xp.F().timeScale.borderColor}$(){return this.un.textColor}W(){return this.un.fontSize}Kf(){return T(this.W(),this.un.fontFamily)}Tv(){return T(this.W(),this.un.fontFamily,"bold")}Sv(){null===this.S&&(this.S={k:1,N:NaN,I:NaN,B:NaN,ji:NaN,C:5,T:NaN,P:"",Wi:new Wt,xv:0});const t=this.S,i=this.Kf();if(t.P!==i){const n=this.W();t.T=n,t.P=i,t.I=3*n/12,t.B=3*n/12,t.ji=9*n/12,t.N=0,t.xv=4*n/12,t.Wi.Fe()}return this.S}op(t){this.zf.style.cursor=1===t?"ew-resize":"default"}vv(){const t=this.xp.Ut(),i=t.F();i.leftPriceScale.visible||null===this.av||(this.dv.removeChild(this.av.Yf()),this.av.M(),this.av=null),i.rightPriceScale.visible||null===this.ov||(this.fv.removeChild(this.ov.Yf()),this.ov.M(),this.ov=null);const n={Rc:this.xp.Ut().Rc()},s=()=>i.leftPriceScale.borderVisible&&t.yt().F().borderVisible,e=()=>t.Lc();i.leftPriceScale.visible&&null===this.av&&(this.av=new Gn("left",i,n,s,e),this.dv.appendChild(this.av.Yf())),i.rightPriceScale.visible&&null===this.ov&&(this.ov=new Gn("right",i,n,s,e),this.fv.appendChild(this.ov.Yf()))}}const ts=!!Rn&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!Rn&&((null===(is=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===is?void 0:is.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var is;class ns{constructor(t,i){var n;this.Pv=[],this.Rv=0,this.fa=0,this.vo=0,this.Dv=0,this.Ov=0,this.Bv=null,this.Ev=!1,this.pp=new m,this.Xu=new m,this.Av=null,this.Lv=t,this.un=i,this.cv=document.createElement("div"),this.cv.classList.add("tv-lightweight-charts"),this.cv.style.overflow="hidden",this.cv.style.width="100%",this.cv.style.height="100%",(n=this.cv).style.userSelect="none",n.style.webkitUserSelect="none",n.style.msUserSelect="none",n.style.MozUserSelect="none",n.style.webkitTapHighlightColor="transparent",this.zv=document.createElement("table"),this.zv.setAttribute("cellspacing","0"),this.cv.appendChild(this.zv),this.Iv=this.Nv.bind(this),ss(this.un)&&this.Vv(!0),this.Hi=new gn(this.Ku.bind(this),this.un),this.Ut().fc().l(this.Fv.bind(this),this),this.Wv=new Qn(this),this.zv.appendChild(this.Wv.Yf());const s=i.autoSize&&this.jv();let e=this.un.width,r=this.un.height;if(s||0===e||0===r){const i=t.getBoundingClientRect();e=e||i.width,r=r||i.height}this.$v(e,r),this.Hv(),t.appendChild(this.cv),this.Uv(),this.Hi.yt().yu().l(this.Hi.dl.bind(this.Hi),this),this.Hi.Po().l(this.Hi.dl.bind(this.Hi),this)}Ut(){return this.Hi}F(){return this.un}qv(){return this.Pv}Yv(){return this.Wv}M(){this.Vv(!1),0!==this.Rv&&window.cancelAnimationFrame(this.Rv),this.Hi.fc().v(this),this.Hi.yt().yu().v(this),this.Hi.Po().v(this),this.Hi.M();for(const t of this.Pv)this.zv.removeChild(t.Yf()),t.jp().v(this),t.M();this.Pv=[],h(this.Wv).M(),null!==this.cv.parentElement&&this.cv.parentElement.removeChild(this.cv),this.Xu.M(),this.pp.M(),this.Xv()}$v(t,i,n=!1){if(this.fa===i&&this.vo===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return Sn({width:i-i%2,height:n-n%2})}(Sn({width:t,height:i}));this.fa=s.height,this.vo=s.width;const e=this.fa+"px",r=this.vo+"px";h(this.cv).style.height=e,h(this.cv).style.width=r,this.zv.style.height=e,this.zv.style.width=r,n?this.Zv(tt.ss(),performance.now()):this.Hi.dl()}ip(t){void 0===t&&(t=tt.ss());for(let i=0;i{let s=0;for(let e=0;e{h("left"===i?this.Wv.mv():this.Wv.bv()).ap(h(t),n,s)};if(this.un.timeScale.visible){const i=this.Wv.lp();if(null!==t){let e=0;this.tm()&&(r("left",e,n),e=h(s.Jp()).lp().width),this.Wv.ap(t,e,n),e+=i.width,this.im()&&r("right",e,n)}n+=i.height}return Sn({width:i,height:n})}sm(){let t=0,i=0,n=0;for(const s of this.Pv)this.tm()&&(i=Math.max(i,h(s.Jp()).Zf())),this.im()&&(n=Math.max(n,h(s.Qp()).Zf())),t+=s.Ro();i=Bn(i),n=Bn(n);const s=this.vo,e=this.fa,r=Math.max(s-i-n,0),l=this.un.timeScale.visible;let a=l?this.Wv.Mv():0;var o;a=(o=a)+o%2;const _=0+a,u=e<_?0:e-_,c=u/t;let d=0;for(let t=0;t{t.Bp()})),3===(null===(n=this.Bv)||void 0===n?void 0:n.Wn())&&(this.Bv.Qn(t),this.hm(),this.lm(this.Bv),this.am(this.Bv,i),t=this.Bv,this.Bv=null)),this.ip(t)}am(t,i){for(const n of t.Jn())this.ts(n,i)}lm(t){const i=this.Hi.uc();for(let n=0;n{if(this.Ev=!1,this.Rv=0,null!==this.Bv){const i=this.Bv;this.Bv=null,this.Zv(i,t);for(const n of i.Jn())if(5===n.Un&&!n.Bt.wu(t)){this.Ut().Yn(n.Bt);break}}})))}hm(){this.Hv()}Hv(){const t=this.Hi.uc(),i=t.length,n=this.Pv.length;for(let t=i;t{const n=i.An().jh(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Hi.yt().Ui(t))||void 0===s?void 0:s.M_;void 0!==i&&(r=i)}const h=this.Ut().hc(),l=null!==h&&h.ac instanceof yi?h.ac:void 0,a=null!==h&&void 0!==h.zp?h.zp.nr:void 0;return{_t:r,Ys:null!=t?t:void 0,um:null!=i?i:void 0,dm:l,fm:e,pm:a,vm:null!=n?n:void 0}}om(t,i,n){this.pp.m((()=>this._m(t,i,n)))}Fv(t,i,n){this.Xu.m((()=>this._m(t,i,n)))}Uv(){const t=this.un.timeScale.visible?"":"none";this.Wv.Yf().style.display=t}tm(){return this.Pv[0].tp().Io().F().visible}im(){return this.Pv[0].tp().No().F().visible}jv(){return"ResizeObserver"in window&&(this.Av=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lv));i&&this.$v(i.contentRect.width,i.contentRect.height)})),this.Av.observe(this.Lv,{box:"border-box"}),!0)}Xv(){null!==this.Av&&this.Av.disconnect()}}function ss(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function es(t,i,n,s){const e=n.value,r={Ys:i,_t:t,Bt:[e,e,e,e],M_:s};return void 0!==n.color&&(r.D=n.color),r}function rs(t){return void 0!==t.Bt}function hs(t){return(i,n,s,e)=>{return void 0===(r=s).open&&void 0===r.value?{_t:i,Ys:n,M_:e}:t(i,n,s,e);var r}}const ls={Candlestick:hs((function(t,i,n,s){const e={Ys:i,_t:t,Bt:[n.open,n.high,n.low,n.close],M_:s};return void 0!==n.color&&(e.D=n.color),void 0!==n.borderColor&&(e.Et=n.borderColor),void 0!==n.wickColor&&(e.Dh=n.wickColor),e})),Bar:hs((function(t,i,n,s){const e={Ys:i,_t:t,Bt:[n.open,n.high,n.low,n.close],M_:s};return void 0!==n.color&&(e.D=n.color),e})),Area:hs((function(t,i,n,s){const e=n.value,r={Ys:i,_t:t,Bt:[e,e,e,e],M_:s};return void 0!==n.lineColor&&(r.ot=n.lineColor),void 0!==n.topColor&&(r.bs=n.topColor),void 0!==n.bottomColor&&(r.gs=n.bottomColor),r})),Baseline:hs((function(t,i,n,s){const e=n.value,r={Ys:i,_t:t,Bt:[e,e,e,e],M_:s};return void 0!==n.topLineColor&&(r.be=n.topLineColor),void 0!==n.bottomLineColor&&(r.ge=n.bottomLineColor),void 0!==n.topFillColor1&&(r.de=n.topFillColor1),void 0!==n.topFillColor2&&(r.fe=n.topFillColor2),void 0!==n.bottomFillColor1&&(r.pe=n.bottomFillColor1),void 0!==n.bottomFillColor2&&(r.ve=n.bottomFillColor2),r})),Histogram:hs(es),Line:hs(es)};function as(t){return ls[t]}function os(t){return 60*t*60*1e3}function _s(t){return 60*t*1e3}const us=[{bm:(cs=1,1e3*cs),w_:10},{bm:_s(1),w_:20},{bm:_s(5),w_:21},{bm:_s(30),w_:22},{bm:os(1),w_:30},{bm:os(3),w_:31},{bm:os(6),w_:32},{bm:os(12),w_:33}];var cs;function ds(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=us.length-1;n>=0;--n)if(Math.floor(i.getTime()/us[n].bm)!==Math.floor(t.getTime()/us[n].bm))return us[n].w_;return 0}function fs(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1]._t.u_,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0]._t.u_-i));t[0].g_=ds(new Date(1e3*t[0]._t.u_),n)}}function ps(t){if(!wn(t))throw new Error("time must be of type BusinessDay");const i=new Date(Date.UTC(t.year,t.month-1,t.day,0,0,0,0));return{u_:Math.round(i.getTime()/1e3),__:t}}function vs(t){if(!Mn(t))throw new Error("time must be of type isUTCTimestamp");return{u_:t}}function ms(t){return 0===t.length?null:wn(t[0].time)?ps:vs}function bs(t){return Mn(t)?vs(t):wn(t)?ps(t):ps(gs(t))}function gs(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function ws(t){M(t.time)&&(t.time=gs(t.time))}function Ms(t){return{Ys:0,gm:new Map,yl:t}}function Ss(t){if(void 0!==t&&0!==t.length)return{wm:t[0]._t.u_,Mm:t[t.length-1]._t.u_}}function xs(t){let i;return t.forEach((t=>{void 0===i&&(i=t.M_)})),r(i)}function ys(t){void 0===t.M_&&(t.M_=t.time)}class ks{constructor(){this.Sm=new Map,this.xm=new Map,this.ym=new Map,this.km=[]}M(){this.Sm.clear(),this.xm.clear(),this.ym.clear(),this.km=[]}Cm(t,i){let n=0!==this.Sm.size,s=!1;const e=this.xm.get(t);if(void 0!==e)if(1===this.xm.size)n=!1,s=!0,this.Sm.clear();else for(const i of this.km)i.pointData.gm.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i;n.forEach((t=>ys(t))),function(t){t.forEach(ws)}(i);const e=h(ms(i)),l=as(t.Ah());r=n.map((i=>{const n=e(i.time);let r=this.Sm.get(n.u_);void 0===r&&(r=Ms(n),this.Sm.set(n.u_,r),s=!0);const h=l(n,r.Ys,i,i.M_);return r.gm.set(t,h),h}))}n&&this.Tm(),this.Pm(t,r);let l=-1;if(s){const t=[];this.Sm.forEach((i=>{t.push({g_:0,_t:i.yl,pointData:i,M_:xs(i.gm)})})),t.sort(((t,i)=>t._t.u_-i._t.u_)),l=this.Rm(t)}return this.Dm(t,l,function(t,i){const n=Ss(t),s=Ss(i);if(void 0!==n&&void 0!==s)return{ml:n.Mm>=s.Mm&&n.wm>=s.wm}}(this.xm.get(t),e))}Bc(t){return this.Cm(t,[])}Om(t,i){const n=i;ys(n),ws(i);const s=h(ms([i]))(i.time),e=this.ym.get(t);if(void 0!==e&&s.u_t._t.u_s._t.u_?rs(i)&&n.push(i):rs(i)?n[n.length-1]=i:n.splice(-1,1),this.ym.set(t,i._t)}Pm(t,i){0!==i.length?(this.xm.set(t,i.filter(rs)),this.ym.set(t,i[i.length-1]._t)):(this.xm.delete(t),this.ym.delete(t))}Tm(){for(const t of this.km)0===t.pointData.gm.size&&this.Sm.delete(t._t.u_)}Rm(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].Ys))})),t}Dm(t,i,n){const s={Am:new Map,yt:{eu:this.Em()}};if(-1!==i)this.xm.forEach(((i,e)=>{s.Am.set(e,{ar:i,Lm:e===t?n:void 0})})),this.xm.has(t)||s.Am.set(t,{ar:[],Lm:n}),s.yt.zm=this.km,s.yt.Im=i;else{const i=this.xm.get(t);s.Am.set(t,{ar:i||[],Lm:n})}return s}}function Cs(t,i){t.Ys=i,t.gm.forEach((t=>{t.Ys=i}))}function Ts(t){return{value:t.Bt[3],time:t.M_}}function Ps(t){const i=Ts(t);return void 0!==t.D&&(i.color=t.D),i}function Rs(t){return{open:t.Bt[0],high:t.Bt[1],low:t.Bt[2],close:t.Bt[3],time:t.M_}}const Ds={Area:function(t){const i=Ts(t);return void 0!==t.ot&&(i.lineColor=t.ot),void 0!==t.bs&&(i.topColor=t.bs),void 0!==t.gs&&(i.bottomColor=t.gs),i},Line:Ps,Baseline:function(t){const i=Ts(t);return void 0!==t.be&&(i.topLineColor=t.be),void 0!==t.ge&&(i.bottomLineColor=t.ge),void 0!==t.de&&(i.topFillColor1=t.de),void 0!==t.fe&&(i.topFillColor2=t.fe),void 0!==t.pe&&(i.bottomFillColor1=t.pe),void 0!==t.ve&&(i.bottomFillColor2=t.ve),i},Histogram:Ps,Bar:function(t){const i=Rs(t);return void 0!==t.D&&(i.color=t.D),i},Candlestick:function(t){const i=Rs(t),{D:n,Et:s,Dh:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}};function Os(t){return Ds[t]}const Bs={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2}},Es={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:C,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"},As={width:0,height:0,autoSize:!1,layout:{background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:C},crosshair:{vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},grid:{vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},overlayPriceScales:Object.assign({},Bs),leftPriceScale:Object.assign(Object.assign({},Bs),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},Bs),{visible:!0}),timeScale:{rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,ticksVisible:!1},watermark:Es,localization:{locale:Rn?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}},Ls={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},zs={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},Is={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0},Ns={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0},Vs={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0},Fs={color:"#26a69a",base:0},Ws={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};class js{constructor(t,i){this.Nm=t,this.Vm=i}applyOptions(t){this.Nm.Ut().oc(this.Vm,t)}options(){return this.Ii().F()}width(){return Q(this.Vm)?this.Nm.Qv(this.Vm):0}Ii(){return h(this.Nm.Ut()._c(this.Vm)).Ot}}const $s={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class Hs{constructor(t){this.wh=t}applyOptions(t){this.wh.kh(t)}options(){return this.wh.F()}Fm(){return this.wh}}class Us{constructor(t,i,n){this.Ts=t,this.Wm=i,this.jm=n}priceFormatter(){return this.Ts.Ol()}priceToCoordinate(t){const i=this.Ts.Tt();return null===i?null:this.Ts.Ot().Dt(t,i.Bt)}coordinateToPrice(t){const i=this.Ts.Tt();return null===i?null:this.Ts.Ot().pn(t,i.Bt)}barsInLogicalRange(t){if(null===t)return null;const i=new on(new hn(t.from,t.to)).C_(),n=this.Ts.An();if(n.Vi())return null;const s=n.jh(i.Ms(),1),e=n.jh(i.ci(),-1),r=h(n.Vh()),l=h(n.En());if(null!==s&&null!==e&&s.Ys>e.Ys)return{barsBefore:t.from-r,barsAfter:l-t.to};const a={barsBefore:null===s||s.Ys===r?t.from-r:s.Ys-r,barsAfter:null===e||e.Ys===l?l-t.to:l-e.Ys};return null!==s&&null!==e&&(a.from=s._t.__||s._t.u_,a.to=e._t.__||e._t.u_),a}setData(t){this.Ts.Ah(),this.Wm.$m(this.Ts,t)}update(t){this.Ts.Ah(),this.Wm.Hm(this.Ts,t)}dataByIndex(t,i){const n=this.Ts.An().jh(t,i);return null===n?null:Os(this.seriesType())(n)}setMarkers(t){const i=t.map((t=>Object.assign(Object.assign({},t),{originalTime:t.time,time:bs(t.time)})));this.Ts.gl(i)}markers(){return this.Ts.wl().map((t=>{const{originalTime:i,time:n}=t,s=function(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);e=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Xs(t){return function(t){if(S(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;S(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),S(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;S(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Zs{constructor(t,i){this.Zm=new ks,this.Km=new Map,this.Gm=new Map,this.Jm=new m,this.Qm=new m;const n=void 0===i?x(As):b(x(As),Xs(i));this.Nm=new ns(t,n),this.Nm.jp().l((t=>{this.Jm.g()&&this.Jm.m(this.tb(t()))}),this),this.Nm.fc().l((t=>{this.Qm.g()&&this.Qm.m(this.tb(t()))}),this);const s=this.Nm.Ut();this.ib=new qs(s,this.Nm.Yv())}remove(){this.Nm.jp().v(this),this.Nm.fc().v(this),this.ib.M(),this.Nm.M(),this.Km.clear(),this.Gm.clear(),this.Jm.M(),this.Qm.M(),this.Zm.M()}resize(t,i,n){this.autoSizeActive()||this.Nm.$v(t,i,n)}addAreaSeries(t){return this.nb("Area",Ns,t)}addBaselineSeries(t){return this.nb("Baseline",Vs,t)}addBarSeries(t){return this.nb("Bar",zs,t)}addCandlestickSeries(t={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(t),this.nb("Candlestick",Ls,t)}addHistogramSeries(t){return this.nb("Histogram",Fs,t)}addLineSeries(t){return this.nb("Line",Is,t)}removeSeries(t){const i=r(this.Km.get(t)),n=this.Zm.Bc(i);this.Nm.Ut().Bc(i),this.sb(n),this.Km.delete(t),this.Gm.delete(i)}$m(t,i){this.sb(this.Zm.Cm(t,i))}Hm(t,i){this.sb(this.Zm.Om(t,i))}subscribeClick(t){this.Jm.l(t)}unsubscribeClick(t){this.Jm.p(t)}subscribeCrosshairMove(t){this.Qm.l(t)}unsubscribeCrosshairMove(t){this.Qm.p(t)}priceScale(t){return new js(this.Nm,t)}timeScale(){return this.ib}applyOptions(t){this.Nm.kh(Xs(t))}options(){return this.Nm.F()}takeScreenshot(){return this.Nm.Gv()}autoSizeActive(){return this.Nm.nm()}nb(t,i,n={}){Ys(n.priceFormat);const s=b(x(Ws),x(i),n),e=this.Nm.Ut().Dc(t,s),r=new Us(e,this,this);return this.Km.set(r,e),this.Gm.set(e,r),r}sb(t){const i=this.Nm.Ut();i.Pc(t.yt.eu,t.yt.zm,t.yt.Im),t.Am.forEach(((t,i)=>i.tt(t.ar,t.Lm))),i.lu()}eb(t){return r(this.Gm.get(t))}tb(t){const i=new Map;t.fm.forEach(((t,n)=>{const s=Os(n.Ah())(t);e(function(t){return void 0!==t.open||void 0!==t.value}(s)),i.set(this.eb(n),s)}));const n=void 0===t.dm?void 0:this.eb(t.dm);return{time:t._t,logical:t.Ys,point:t.um,hoveredSeries:n,hoveredObjectId:t.pm,seriesData:i,sourceEvent:t.vm}}}var Ks=Object.freeze({__proto__:null,get ColorType(){return fn},get CrosshairMode(){return G},get LastPriceAnimationMode(){return cn},get LineStyle(){return i},get LineType(){return t},get MismatchDirection(){return wi},get PriceLineSource(){return dn},get PriceScaleMode(){return ji},get TickMarkType(){return _n},get TrackingModeExitMode(){return un},createChart:function(t,i){let n;if(M(t)){const i=document.getElementById(t);e(null!==i,`Cannot find element in DOM with id=${t}`),n=i}else n=t;return new Zs(n,i)},isBusinessDay:wn,isUTCTimestamp:Mn,version:function(){return"4.0.1"}});window.LightweightCharts=Ks}(); """ \ No newline at end of file diff --git a/lightweight_charts/pywebview.py b/lightweight_charts/pywebview.py deleted file mode 100644 index 18ef19a..0000000 --- a/lightweight_charts/pywebview.py +++ /dev/null @@ -1,82 +0,0 @@ -from typing import Literal, Union -from uuid import UUID -import webview -from multiprocessing import Queue - -from lightweight_charts.js import LWC - -_q = Queue() -_result_q = Queue() - - -class Webview(LWC): - def __init__(self, chart): - super().__init__(chart.volume_enabled, chart.inner_width, chart.inner_height) - self.chart = chart - self.started = False - self._js_api_code = 'pywebview.api.onClick' - - self.webview = webview.create_window('', html=self._html, on_top=chart.on_top, js_api=self._js_api, - width=chart.width, height=chart.height, x=chart.x, y=chart.y) - self.webview.events.loaded += self._on_js_load - - def run_script(self, script): self.webview.evaluate_js(script) - - def _on_js_load(self): - self.loaded = True - while len(self.js_queue) > 0: - func, args, kwargs = self.js_queue[0] - - if 'SUB' in func: - c_id = args[0] - args = args[1:] - getattr(self._subcharts[c_id], func.replace('SUB', ''))(*args) - else: - getattr(self, func)(*args) - del self.js_queue[0] - - _loop(self.chart, controller=self) - - def show(self): - if self.loaded: - self.webview.show() - else: - webview.start(debug=self.chart.debug) - - def hide(self): self.webview.hide() - - def exit(self): - self.webview.destroy() - del self - - def create_line(self, color: str = 'rgba(214, 237, 255, 0.6)', width: int = 2): - return super().create_line(color, width).id - - def create_subchart(self, volume_enabled: bool = True, position: Literal['left', 'right', 'top', 'bottom'] = 'left', - width: float = 0.5, height: float = 0.5, sync: Union[bool, UUID] = False): - return super()._pywebview_subchart(volume_enabled, position, width, height, sync) - - -def _loop(chart, controller=None): - wv = Webview(chart) if not controller else controller - chart._result_q.put(wv.id) - while 1: - obj = wv - func, args = chart._q.get() - - if 'SUB' in func: - obj = obj._subcharts[args[0]] - args = args[1:] - func = func.replace('SUB', '') - - try: - result = getattr(obj, func)(*args) - except KeyError as e: - return - if func == 'show': - chart._exit.set() - elif func == 'exit': - chart._exit.set() - - chart._result_q.put(result) if result is not None else None - diff --git a/lightweight_charts/util.py b/lightweight_charts/util.py index 9b719cf..b649750 100644 --- a/lightweight_charts/util.py +++ b/lightweight_charts/util.py @@ -21,71 +21,56 @@ class ColorError(ValueError): return f'{self.msg}' +class IDGen(list): + def generate(self): + var = ''.join(choices(ascii_lowercase, k=8)) + if var not in self: + self.append(var) + return var + self.generate() + + def _valid_color(string): if string[:3] == 'rgb' or string[:4] == 'rgba' or string[0] == '#': return True raise ColorError('Colors must be in the format of either rgb, rgba or hex.') -LINE_TYPE = Literal['solid', 'dotted', 'dashed', 'large_dashed', 'sparse_dotted'] +def _js_bool(b: bool): return 'true' if b is True else 'false' if b is False else None -POSITION = Literal['above', 'below', 'inside'] -SHAPE = Literal['arrow_up', 'arrow_down', 'circle', 'square'] +LINE_STYLE = Literal['solid', 'dotted', 'dashed', 'large_dashed', 'sparse_dotted'] + +MARKER_POSITION = Literal['above', 'below', 'inside'] + +MARKER_SHAPE = Literal['arrow_up', 'arrow_down', 'circle', 'square'] CROSSHAIR_MODE = Literal['normal', 'magnet'] PRICE_SCALE_MODE = Literal['normal', 'logarithmic', 'percentage', 'index100'] -def _line_type(lt: LINE_TYPE): - return { - 'solid': 'Solid', - 'dotted': 'Dotted', - 'dashed': 'Dashed', - 'large_dashed': 'LargeDashed', - 'sparse_dotted': 'SparseDotted', - None: None, - }[lt] +def _line_style(line: LINE_STYLE): + js = 'LightweightCharts.LineStyle.' + return js+line[:line.index('_')].title() + line[line.index('_') + 1:].title() if '_' in line else js+line.title() -def _position(p: POSITION): +def _crosshair_mode(mode: CROSSHAIR_MODE): + return f'LightweightCharts.CrosshairMode.{mode.title()}' if mode else None + + +def _price_scale_mode(mode: PRICE_SCALE_MODE): + return f"LightweightCharts.PriceScaleMode.{'IndexedTo100' if mode == 'index100' else mode.title() if mode else None}" + + +def _marker_shape(shape: MARKER_SHAPE): + return shape[:shape.index('_')]+shape[shape.index('_')+1:].title() if '_' in shape else shape.title() + + +def _marker_position(p: MARKER_POSITION): return { 'above': 'aboveBar', 'below': 'belowBar', 'inside': 'inBar', None: None, - }[p] - - -def _shape(shape: SHAPE): - return { - 'arrow_up': 'arrowUp', - 'arrow_down': 'arrowDown', - 'circle': 'Circle', - 'square': 'Square', - None: None, - }[shape] - - -def _crosshair_mode(mode: CROSSHAIR_MODE): return mode.title() if mode else None - - -def _js_bool(b: bool): return 'true' if b is True else 'false' if b is False else None - - -def _price_scale_mode(mode: PRICE_SCALE_MODE): - return 'IndexedTo100' if mode == 'index100' else mode.title() if mode else None - - -class IDGen: - def __init__(self): - self.list = [] - - def generate(self): - var = ''.join(choices(ascii_lowercase, k=8)) - if var in self.list: - self.generate() - else: - self.list.append(var) - return var + }[p] \ No newline at end of file diff --git a/lightweight_charts/widgets.py b/lightweight_charts/widgets.py index cd3e7a1..6898693 100644 --- a/lightweight_charts/widgets.py +++ b/lightweight_charts/widgets.py @@ -21,24 +21,16 @@ class WxChart(LWC): super().__init__(volume_enabled, inner_width=inner_width, inner_height=inner_height) - self.webview.AddScriptMessageHandler('wx_msg') + self._script_func = self.webview.RunScript self._js_api_code = 'window.wx_msg.postMessage' - self.webview.Bind(wx.html2.EVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, lambda e: self._js_api.onClick(eval(e.GetString()))) + self.webview.AddScriptMessageHandler('wx_msg') + self.webview.Bind(wx.html2.EVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, lambda e: self._js_api.onClick(eval(e.GetString()))) self.webview.Bind(wx.html2.EVT_WEBVIEW_LOADED, self._on_js_load) self.webview.SetPage(self._html, '') + self._create_chart() - def run_script(self, script): self.webview.RunScript(script) - - def _on_js_load(self, e): - self.loaded = True - for func, args, kwargs in self.js_queue: - if 'SUB' in func: - c_id = args[0] - args = args[1:] - getattr(self._subcharts[c_id], func.replace('SUB', ''))(*args) - else: - getattr(self, func)(*args) + def _on_js_load(self, e): super()._on_js_load() def get_webview(self): return self.webview @@ -49,18 +41,13 @@ class QtChart(LWC): self.webview = QWebEngineView(widget) except NameError: raise ModuleNotFoundError('QWebEngineView was not found, and must be installed to use QtChart.') - super().__init__(volume_enabled, inner_width=inner_width, inner_height=inner_height) + self._script_func = self.webview.page().runJavaScript + self.webview.loadFinished.connect(self._on_js_load) self.webview.page().setHtml(self._html) - - def run_script(self, script): self.webview.page().runJavaScript(script) - - def _on_js_load(self): - self.loaded = True - for func, args, kwargs in self.js_queue: - getattr(super(), func)(*args, **kwargs) + self._create_chart() def get_webview(self): return self.webview diff --git a/setup.py b/setup.py index 6bf7b2b..5411e3d 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open('README.md', 'r', encoding='utf-8') as f: setup( name='lightweight_charts', - version='1.0.6', + version='1.0.7', packages=find_packages(), python_requires='>=3.9', install_requires=[