@tradecanvas/chart 1.79.1 → 1.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/{LayoutSession-BJxMu1Df.js → LayoutSession-CX3eWUA1.js} +3 -3
  2. package/dist/{LayoutSession-BJxMu1Df.js.map → LayoutSession-CX3eWUA1.js.map} +1 -1
  3. package/dist/{LayoutSession-2o_-ji7A.cjs → LayoutSession-DFvb5ekw.cjs} +2 -2
  4. package/dist/{LayoutSession-2o_-ji7A.cjs.map → LayoutSession-DFvb5ekw.cjs.map} +1 -1
  5. package/dist/{WidgetIndicatorSettings-C4S0QgW-.js → WidgetIndicatorSettings-BiX1ZOhS.js} +2 -2
  6. package/dist/{WidgetIndicatorSettings-C4S0QgW-.js.map → WidgetIndicatorSettings-BiX1ZOhS.js.map} +1 -1
  7. package/dist/{WidgetIndicatorSettings-C9fM5_KF.cjs → WidgetIndicatorSettings-DhFQasHT.cjs} +2 -2
  8. package/dist/{WidgetIndicatorSettings-C9fM5_KF.cjs.map → WidgetIndicatorSettings-DhFQasHT.cjs.map} +1 -1
  9. package/dist/WidgetSymbolSearch-BW7HxOMk.cjs +2 -0
  10. package/dist/WidgetSymbolSearch-BW7HxOMk.cjs.map +1 -0
  11. package/dist/{WidgetSymbolSearch-BWI3iNJM.js → WidgetSymbolSearch-CYYd9zoA.js} +3 -3
  12. package/dist/WidgetSymbolSearch-CYYd9zoA.js.map +1 -0
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +78 -78
  17. package/dist/{indicatorInputWords-fiLxkWio.cjs → indicatorInputWords-BfWHWL0K.cjs} +2 -2
  18. package/dist/{indicatorInputWords-fiLxkWio.cjs.map → indicatorInputWords-BfWHWL0K.cjs.map} +1 -1
  19. package/dist/{indicatorInputWords-yN99aPYU.js → indicatorInputWords-DpkxBon4.js} +2 -2
  20. package/dist/{indicatorInputWords-yN99aPYU.js.map → indicatorInputWords-DpkxBon4.js.map} +1 -1
  21. package/dist/indicatorLabel-BQ6Kdry2.cjs +2 -0
  22. package/dist/indicatorLabel-BQ6Kdry2.cjs.map +1 -0
  23. package/dist/indicatorLabel-BsidWCv1.js +18 -0
  24. package/dist/indicatorLabel-BsidWCv1.js.map +1 -0
  25. package/dist/indicatorLabel.d.ts.map +1 -1
  26. package/dist/symbolCatalog-CSbI2R5e.cjs +2 -0
  27. package/dist/symbolCatalog-CSbI2R5e.cjs.map +1 -0
  28. package/dist/{symbolCatalog-CA1fpz3s.js → symbolCatalog-DffhUQSJ.js} +2 -2
  29. package/dist/symbolCatalog-DffhUQSJ.js.map +1 -0
  30. package/dist/widget/ChartWidgetGrid.d.ts.map +1 -1
  31. package/dist/widget/WidgetCompares.d.ts.map +1 -1
  32. package/dist/widget/WidgetDockArea.d.ts.map +1 -1
  33. package/dist/widget/WidgetLayoutsDialog.d.ts.map +1 -1
  34. package/dist/widget/index.cjs +3 -3
  35. package/dist/widget/index.cjs.map +1 -1
  36. package/dist/widget/index.js +852 -851
  37. package/dist/widget/index.js.map +1 -1
  38. package/dist/widget/symbolCatalog.d.ts +6 -2
  39. package/dist/widget/symbolCatalog.d.ts.map +1 -1
  40. package/dist/widget/symbolSearchFilters.d.ts.map +1 -1
  41. package/package.json +3 -3
  42. package/dist/WidgetSymbolSearch-BWI3iNJM.js.map +0 -1
  43. package/dist/WidgetSymbolSearch-CJeMSKtO.cjs +0 -2
  44. package/dist/WidgetSymbolSearch-CJeMSKtO.cjs.map +0 -1
  45. package/dist/indicatorLabel-BNZvaOcl.cjs +0 -2
  46. package/dist/indicatorLabel-BNZvaOcl.cjs.map +0 -1
  47. package/dist/indicatorLabel-Sbegyhp2.js +0 -17
  48. package/dist/indicatorLabel-Sbegyhp2.js.map +0 -1
  49. package/dist/symbolCatalog-CA1fpz3s.js.map +0 -1
  50. package/dist/symbolCatalog-Dx1YnZgm.cjs +0 -2
  51. package/dist/symbolCatalog-Dx1YnZgm.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, g as l, h as u, i as ee, l as te, m as ne, n as re, o as ie, p as ae, r as oe, s as se, t as ce, u as le, v as ue, w as de, x as fe, y as pe } from "./LayoutSession-BJxMu1Df.js";
2
- import { CHART_STYLE_KEYS as me, DARK_PRICE_LIMITS as he, DARK_TERMINAL as ge, DARK_THEME as _e, DARK_THEME as ve, DEFAULT_DRAWING_STYLE as ye, DEFAULT_FONT_FAMILY as be, DEFAULT_RECONNECT as xe, DEFAULT_SIGNAL_STYLE as Se, DEFAULT_STREAM_CONFIG as Ce, DEFAULT_TIMEFRAME_FAVORITES as we, DEFAULT_TRADE_ZONE_STYLE as Te, DEFAULT_TRADING_CONFIG as Ee, HNX_SESSIONS as De, HOSE_SESSIONS as Oe, KRX_SESSIONS as ke, KR_COLORS as Ae, LIGHT_PRICE_LIMITS as je, LIGHT_THEME as Me, LIGHT_THEME as Ne, MARKET_CRYPTO as Pe, MARKET_HNX as Fe, MARKET_HOSE as Ie, MARKET_HOSE_ETF as Le, MARKET_KRX as Re, MARKET_NXT as d, MARKET_NYSE as f, MARKET_UPBIT_KRW as p, MARKET_UPCOM as m, MARKET_VN30F as h, MS_TIME_THRESHOLD as ze, NXT_SESSIONS as Be, PRICE_SOURCES as Ve, SANS_FONT_FAMILY as He, TC_PALETTE as Ue, TC_SERIES_COLORS as We, TIMEFRAMES_CRYPTO as Ge, TIMEFRAMES_FOREX as Ke, TIMEFRAMES_STOCK as qe, UPCOM_SESSIONS as Je, VN30F_SESSIONS as Ye, VN_COLORS as Xe, VOLUME_ALPHA as Ze, barTimeUnit as Qe, barsAreDaily as $e, computePriceLimits as et, contrastRatio as tt, createMarketTheme as nt, createVNTheme as rt, formatFraction as it, formatNumber as at, formatVND as ot, formatVolumeLoc as st, fractionTick as ct, getCurrentSession as lt, getLocale as ut, indicatorSource as dt, inkOn as ft, isPriceSource as pt, isTimeFrame as mt, isValidTimeZone as ht, marketStatus as gt, normalizeBar as _t, normalizeBarTime as vt, offsetAt as yt, parseIndicatorSource as bt, parseTimeframe as xt, pickBaseTimeframe as St, priceFormatterFor as Ct, priceStepAt as wt, rankSymbols as Tt, readNews as Et, readQuote as Dt, readableOn as Ot, registerLocale as kt, resampleBars as At, roundToPriceStep as jt, scaleMarketPrices as Mt, setLocale as Nt, sourcePrice as Pt, stepDecimals as Ft, symbolTimeZone as It, t as Lt, tickBarCount as Rt, timeframeBucketStart as zt, timeframeBucketStart as Bt, timeframeToMs as Vt, usesKoreanUnits as Ht, vn30fContracts as Ut, vn30fLastTradingDay as Wt, volumeColor as Gt, wallToUtc as Kt, zoneOffsetMinutes as qt } from "@tradecanvas/commons";
3
- import { AlertManager as Jt, Animator as Yt, BarCountdown as Xt, BaseFinanceChart as g, BinanceAdapter as Zt, BybitAdapter as Qt, CANDLE_PATTERNS as $t, ChartLegend as en, ChartStateManager as tn, CoinbaseAdapter as nn, CompareRenderer as rn, CrosshairTooltip as an, CurrentPriceLine as on, DEFAULT_LEGEND_CONFIG as sn, DEFAULT_MAX_WEBGL_CHARTS as cn, DEFAULT_SESSION_HOURS as ln, DataExporter as un, DrawingBase as dn, Easing as fn, FinanceCrosshair as _, GROUP_HEADER as pn, INDICATOR_CATEGORIES as mn, IndicatorBase as hn, IndicatorValueMap as gn, KEPT_BUCKETS as _n, KeyboardHandler as vn, KrakenAdapter as yn, MAX_ALERT_BARS as bn, MIN_ALERT_BARS as xn, ManualFeed as Sn, MockAdapter as Cn, PaperExecutionAdapter as wn, PollingAdapter as Tn, RANGE_PRESETS as En, ReconnectManager as Dn, ReplayController as On, ReplayManager as kn, ResamplingAdapter as An, ReshapeMemo as jn, Screenshot as Mn, SessionBreaks as Nn, SessionShading as Pn, SignalMarkerManager as Fn, StreamManager as In, TickAggregator as Ln, TickBarAdapter as Rn, TickBarBuilder as zn, TradeZoneManager as Bn, UndoRedoManager as Vn, UpbitAdapter as Hn, VolumeRenderer as v, Watermark as Un, WebSocketAdapter as Wn, adapterFromFeed as Gn, axisTimes as Kn, barIndexToTime as qn, barIndexToX as Jn, barIndexToX as y, canvasMeasure as Yn, computeBarLayout as Xn, computeCalendarLayout as Zn, computeCounterClockLayout as Qn, computeDonutLayout as $n, computeHistogramLayout as er, computeMatrixLayout as tr, computeScatterLayout as nr, correlationMatrix as rr, counterClockPhase as ir, counterClockPhase as ar, counterClockPoints as or, counterClockPoints as sr, describeInputs as cr, detectCandlePatterns as lr, feedFromAdapter as ur, formatTooltipTime as dr, histogramBins as fr, hitBar as b, hitDay as x, hitMatrixCell as S, hitSlice as C, indicatorCategory as pr, isDataFeed as mr, isDataFeed as hr, isPriceLevelAlert as gr, layoutGroupedTreemap as _r, layoutSquarifiedTreemap as vr, layoutUniformGrid as yr, lttbDownsample as br, lttbVisibleIndices as xr, nearestCounterClockPoint as w, nearestPoint as T, niceScale as Sr, priceToY as Cr, priceToYMapper as wr, priceToYMapper as Tr, rangePresetStart as Er, renderBarChart as Dr, renderCalendar as Or, renderCounterClock as kr, renderDepthChart as Ar, renderDonut as jr, renderEquityCurve as Mr, renderGauge as Nr, renderHeatmap as Pr, renderHistogram as Fr, renderMatrix as Ir, renderScatter as Lr, renderSparkline as Rr, renderWaterfall as zr, servesTimeframe as Br, setMaxWebGLCharts as Vr, shownCount as Hr, timeToX as Ur, timestampToBarIndex as Wr, timestampToBarIndex as Gr, toHeikinAshi as Kr, toKagi as qr, toLineBreak as Jr, toPointAndFigure as Yr, toRangeBars as Xr, toRenko as Zr, withResampling as Qr, withTickBars as $r, xToBarIndex as ei, xToBarIndex as E, xToTime as ti, yToPrice as ni, yToPrice as ri } from "@tradecanvas/core";
1
+ import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, g as l, h as u, i as ee, l as te, m as ne, n as re, o as ie, p as ae, r as oe, s as se, t as ce, u as le, v as ue, w as de, x as fe, y as pe } from "./LayoutSession-CX3eWUA1.js";
2
+ import { CHART_STYLE_KEYS as me, DARK_PRICE_LIMITS as he, DARK_TERMINAL as ge, DARK_THEME as _e, DARK_THEME as ve, DEFAULT_DRAWING_STYLE as ye, DEFAULT_FONT_FAMILY as be, DEFAULT_RECONNECT as xe, DEFAULT_SIGNAL_STYLE as Se, DEFAULT_STREAM_CONFIG as Ce, DEFAULT_TIMEFRAME_FAVORITES as we, DEFAULT_TRADE_ZONE_STYLE as Te, DEFAULT_TRADING_CONFIG as Ee, HNX_SESSIONS as De, HOSE_SESSIONS as Oe, KRX_SESSIONS as ke, KR_COLORS as Ae, LIGHT_PRICE_LIMITS as je, LIGHT_THEME as Me, LIGHT_THEME as Ne, MARKET_CRYPTO as Pe, MARKET_HNX as Fe, MARKET_HOSE as Ie, MARKET_HOSE_ETF as Le, MARKET_KRX as Re, MARKET_NXT as d, MARKET_NYSE as f, MARKET_UPBIT_KRW as p, MARKET_UPCOM as m, MARKET_VN30F as h, MS_TIME_THRESHOLD as ze, NXT_SESSIONS as Be, PRICE_SOURCES as Ve, SANS_FONT_FAMILY as He, TC_PALETTE as Ue, TC_SERIES_COLORS as We, TIMEFRAMES_CRYPTO as Ge, TIMEFRAMES_FOREX as Ke, TIMEFRAMES_STOCK as qe, UPCOM_SESSIONS as Je, VN30F_SESSIONS as Ye, VN_COLORS as Xe, VOLUME_ALPHA as Ze, barTimeUnit as Qe, barsAreDaily as $e, computePriceLimits as et, contrastRatio as tt, createMarketTheme as nt, createVNTheme as rt, formatFraction as it, formatNumber as at, formatVND as ot, formatVolumeLoc as st, fractionTick as ct, getCurrentSession as lt, getLocale as ut, indicatorSource as dt, inkOn as ft, isPriceSource as pt, isTimeFrame as mt, isValidTimeZone as ht, marketStatus as gt, normalizeBar as _t, normalizeBarTime as vt, offsetAt as yt, parseIndicatorSource as bt, parseTimeframe as xt, pickBaseTimeframe as St, priceFormatterFor as Ct, priceStepAt as wt, rankSymbols as Tt, readNews as Et, readQuote as Dt, readableOn as Ot, registerLocale as kt, resampleBars as At, roundToPriceStep as jt, scaleMarketPrices as Mt, setLocale as Nt, sourcePrice as Pt, stepDecimals as Ft, symbolTimeZone as It, t as Lt, tickBarCount as Rt, tickerOf as zt, timeframeBucketStart as Bt, timeframeBucketStart as Vt, timeframeToMs as Ht, usesKoreanUnits as Ut, vn30fContracts as Wt, vn30fLastTradingDay as Gt, volumeColor as Kt, wallToUtc as qt, zoneOffsetMinutes as Jt } from "@tradecanvas/commons";
3
+ import { AlertManager as Yt, Animator as Xt, BarCountdown as Zt, BaseFinanceChart as g, BinanceAdapter as Qt, BybitAdapter as $t, CANDLE_PATTERNS as en, ChartLegend as tn, ChartStateManager as nn, CoinbaseAdapter as rn, CompareRenderer as an, CrosshairTooltip as on, CurrentPriceLine as sn, DEFAULT_LEGEND_CONFIG as cn, DEFAULT_MAX_WEBGL_CHARTS as ln, DEFAULT_SESSION_HOURS as un, DataExporter as dn, DrawingBase as fn, Easing as pn, FinanceCrosshair as _, GROUP_HEADER as mn, INDICATOR_CATEGORIES as hn, IndicatorBase as gn, IndicatorValueMap as _n, KEPT_BUCKETS as vn, KeyboardHandler as yn, KrakenAdapter as bn, MAX_ALERT_BARS as xn, MIN_ALERT_BARS as Sn, ManualFeed as Cn, MockAdapter as wn, PaperExecutionAdapter as Tn, PollingAdapter as En, RANGE_PRESETS as Dn, ReconnectManager as On, ReplayController as kn, ReplayManager as An, ResamplingAdapter as jn, ReshapeMemo as Mn, Screenshot as Nn, SessionBreaks as Pn, SessionShading as Fn, SignalMarkerManager as In, StreamManager as Ln, TickAggregator as Rn, TickBarAdapter as zn, TickBarBuilder as Bn, TradeZoneManager as Vn, UndoRedoManager as Hn, UpbitAdapter as v, VolumeRenderer as Un, Watermark as Wn, WebSocketAdapter as Gn, adapterFromFeed as Kn, axisTimes as qn, barIndexToTime as Jn, barIndexToX as Yn, barIndexToX as y, canvasMeasure as Xn, computeBarLayout as Zn, computeCalendarLayout as Qn, computeCounterClockLayout as $n, computeDonutLayout as er, computeHistogramLayout as tr, computeMatrixLayout as nr, computeScatterLayout as rr, correlationMatrix as ir, counterClockPhase as ar, counterClockPhase as or, counterClockPoints as sr, counterClockPoints as cr, describeInputs as lr, detectCandlePatterns as ur, feedFromAdapter as dr, formatTooltipTime as fr, histogramBins as pr, hitBar as b, hitDay as x, hitMatrixCell as S, hitSlice as C, indicatorCategory as mr, isDataFeed as hr, isDataFeed as gr, isPriceLevelAlert as _r, layoutGroupedTreemap as vr, layoutSquarifiedTreemap as yr, layoutUniformGrid as br, lttbDownsample as xr, lttbVisibleIndices as Sr, nearestCounterClockPoint as w, nearestPoint as T, niceScale as Cr, priceToY as wr, priceToYMapper as Tr, priceToYMapper as Er, rangePresetStart as Dr, renderBarChart as Or, renderCalendar as kr, renderCounterClock as Ar, renderDepthChart as jr, renderDonut as Mr, renderEquityCurve as Nr, renderGauge as Pr, renderHeatmap as Fr, renderHistogram as Ir, renderMatrix as Lr, renderScatter as Rr, renderSparkline as zr, renderWaterfall as Br, servesTimeframe as Vr, setMaxWebGLCharts as Hr, shownCount as Ur, timeToX as Wr, timestampToBarIndex as Gr, timestampToBarIndex as Kr, toHeikinAshi as qr, toKagi as Jr, toLineBreak as Yr, toPointAndFigure as Xr, toRangeBars as Zr, toRenko as Qr, withResampling as $r, withTickBars as ei, xToBarIndex as ti, xToBarIndex as E, xToTime as ni, yToPrice as ri, yToPrice as ii } from "@tradecanvas/core";
4
4
  //#region src/frameworks/syncIndicators.ts
5
- function ii(e) {
5
+ function ai(e) {
6
6
  let { id: t, params: n = {}, position: r = null } = typeof e == "string" ? { id: e } : e;
7
7
  return JSON.stringify([
8
8
  t,
@@ -10,9 +10,9 @@ function ii(e) {
10
10
  r
11
11
  ]);
12
12
  }
13
- function ai(e, t, n) {
13
+ function oi(e, t, n) {
14
14
  let r = /* @__PURE__ */ new Map(), i = t.map((e) => {
15
- let t = ii(e), n = r.get(t) ?? 0;
15
+ let t = ai(e), n = r.get(t) ?? 0;
16
16
  return r.set(t, n + 1), {
17
17
  spec: e,
18
18
  key: `${t}#${n}`
@@ -27,7 +27,7 @@ function ai(e, t, n) {
27
27
  }
28
28
  //#endregion
29
29
  //#region src/frameworks/feedBars.ts
30
- var oi = 3, D = (e) => ({
30
+ var si = 3, D = (e) => ({
31
31
  time: e.time,
32
32
  open: e.open,
33
33
  high: e.high,
@@ -35,16 +35,16 @@ var oi = 3, D = (e) => ({
35
35
  close: e.close,
36
36
  volume: e.volume
37
37
  }), O = (e) => e.length > 0 ? e[e.length - 1] : null;
38
- function si(e, n, r) {
38
+ function ci(e, n, r) {
39
39
  for (let i = 0; i < r; i++) if (!t(e[i], n[i])) return !1;
40
40
  return !0;
41
41
  }
42
- function ci(e, t) {
42
+ function li(e, t) {
43
43
  if (e.isReplayActive()) return !0;
44
44
  let n = O(e.getData());
45
45
  return t.inReplay ? n?.time === t.last?.time : n === t.shownBar ? n?.time === t.last?.time || !e.isExtendedHoursVisible() : !1;
46
46
  }
47
- function li(e, r, i) {
47
+ function ui(e, r, i) {
48
48
  let a = [];
49
49
  for (let o = 0; o < r.length; o++) {
50
50
  let s = e[i + o];
@@ -55,16 +55,16 @@ function li(e, r, i) {
55
55
  }
56
56
  return a;
57
57
  }
58
- function ui(e, t) {
58
+ function di(e, t) {
59
59
  if (t.length === 0) return !0;
60
60
  if (!e.updateBar) return !1;
61
61
  for (let n of t) if (!e.updateBar(n)) return !1;
62
62
  return !0;
63
63
  }
64
- function di(e) {
64
+ function fi(e) {
65
65
  return e.slice(Math.max(1, e.length - 1 - 3), -1).map(D);
66
66
  }
67
- function fi(e, t) {
67
+ function pi(e, t) {
68
68
  let r = [];
69
69
  for (let i = t; i < e.length; i++) {
70
70
  if (!n(e[i]) || !(e[i].time > e[i - 1].time)) return null;
@@ -72,38 +72,38 @@ function fi(e, t) {
72
72
  }
73
73
  return r;
74
74
  }
75
- function pi(e, r, i) {
75
+ function mi(e, r, i) {
76
76
  let a = i.length;
77
- if (a === 0 || !i.last || !n(i.last) || r.length < a || !ci(e, i)) return !1;
77
+ if (a === 0 || !i.last || !n(i.last) || r.length < a || !li(e, i)) return !1;
78
78
  let o = i.recent ?? [], s = a - 1 - o.length;
79
- if (r !== i.source && (i.source.length !== a || !si(i.source, r, s))) return !1;
79
+ if (r !== i.source && (i.source.length !== a || !ci(i.source, r, s))) return !1;
80
80
  let c = r[a - 1];
81
81
  if (c.time !== i.last.time || !n(c)) return !1;
82
- let l = li(r, o, s), u = fi(r, a);
83
- return !l || !u || !ui(e, l) ? !1 : (t(c, i.last) || e.updateLastBar(D(c)), u.length === 1 ? e.appendBar(u[0]) : u.length > 1 && e.appendBars(u), !0);
82
+ let l = ui(r, o, s), u = pi(r, a);
83
+ return !l || !u || !di(e, l) ? !1 : (t(c, i.last) || e.updateLastBar(D(c)), u.length === 1 ? e.appendBar(u[0]) : u.length > 1 && e.appendBars(u), !0);
84
84
  }
85
- function mi(e, t, n) {
86
- (!n || !pi(e, t, n)) && e.setData(t.map(D));
85
+ function hi(e, t, n) {
86
+ (!n || !mi(e, t, n)) && e.setData(t.map(D));
87
87
  let r = t.length > 0 ? D(t[t.length - 1]) : null, i = e.isReplayActive();
88
88
  return {
89
89
  source: t,
90
90
  length: t.length,
91
91
  last: r,
92
- recent: di(t),
92
+ recent: fi(t),
93
93
  shownBar: i ? null : O(e.getData()),
94
94
  inReplay: i
95
95
  };
96
96
  }
97
97
  //#endregion
98
98
  //#region src/brand/poweredBy.ts
99
- var k = "https://tradecanvas.dev", A = "Powered by TradeCanvas", j = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M186 70A82 82 0 1 0 186 186\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"22\" stroke-linecap=\"round\"/><rect x=\"92\" y=\"74\" width=\"72\" height=\"20\" rx=\"10\" fill=\"currentColor\"/><path fill=\"#E8961E\" d=\"M119 94H137V108H144a10 10 0 0 1 10 10V164a10 10 0 0 1-10 10H137V190H119V174H112a10 10 0 0 1-10-10V118a10 10 0 0 1 10-10H119Z\"/></svg>", M = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 16 686 88\" aria-hidden=\"true\" focusable=\"false\"><path fill=\"currentColor\" transform=\"translate(0 101.64)\" d=\"M27.24 0.00L27.24 -69.72L1.32 -69.72L1.32 -83.64L68.76 -83.64L68.76 -69.72L42.96 -69.72L42.96 0.00ZM70.90 0.00L70.90 -59.16L85.90 -59.16L85.90 -50.64Q86.26 -51.36 86.74 -51.96Q89.50 -55.92 93.52 -58.14Q97.54 -60.36 101.74 -60.36Q104.74 -60.36 107.44 -59.58Q110.14 -58.80 113.02 -57.00L105.82 -43.56Q104.50 -44.28 102.46 -44.88Q100.42 -45.48 98.38 -45.48Q95.98 -45.48 93.76 -44.64Q91.54 -43.80 89.80 -42.00Q88.06 -40.20 86.98 -37.20Q86.50 -35.52 86.20 -32.94Q85.90 -30.36 85.90 -25.44L85.90 0.00ZM156.44 0.00L155.36 -7.56Q155.00 -6.96 154.52 -6.36Q151.28 -2.40 147.20 -0.60Q143.12 1.20 138.56 1.20Q132.08 1.20 126.98 -1.20Q121.88 -3.60 118.94 -8.04Q116.00 -12.48 116.00 -18.24Q116.00 -23.40 118.10 -27.06Q120.20 -30.72 123.68 -32.64Q126.68 -34.44 130.34 -35.16Q134.00 -35.88 138.20 -35.88L155.24 -35.88L155.24 -37.32Q155.24 -42.60 151.94 -45.18Q148.64 -47.76 143.00 -47.76Q138.32 -47.76 133.46 -45.90Q128.60 -44.04 124.88 -40.68L117.32 -50.88Q123.56 -55.92 130.10 -58.14Q136.64 -60.36 144.20 -60.36Q156.44 -60.36 163.28 -54.24Q170.12 -48.12 170.12 -37.32L170.12 0.00ZM155.24 -24.84L140.36 -24.84Q138.44 -24.84 136.58 -24.54Q134.72 -24.24 133.40 -23.16Q132.20 -22.32 131.60 -21.06Q131.00 -19.80 131.00 -18.24Q131.00 -14.88 133.64 -12.84Q136.28 -10.80 140.72 -10.80Q144.68 -10.80 147.98 -12.54Q151.28 -14.28 153.26 -17.34Q155.24 -20.40 155.24 -24.36ZM202.98 1.20Q195.18 1.20 189.54 -2.82Q183.90 -6.84 180.84 -13.86Q177.78 -20.88 177.78 -29.64Q177.78 -39.36 181.20 -46.20Q184.62 -53.04 190.38 -56.70Q196.14 -60.36 202.98 -60.36Q207.78 -60.36 211.92 -58.38Q216.06 -56.40 219.06 -52.44Q219.54 -51.72 220.02 -51.00L220.02 -83.64L234.78 -83.64L234.78 0.00L220.02 0.00L220.02 -8.04Q219.54 -7.20 218.94 -6.48Q215.70 -2.28 211.56 -0.54Q207.42 1.20 202.98 1.20ZM207.06 -12.48Q211.50 -12.48 214.68 -14.64Q217.86 -16.80 219.60 -20.64Q221.34 -24.48 221.34 -29.64Q221.34 -34.80 219.60 -38.64Q217.86 -42.48 214.68 -44.58Q211.50 -46.68 207.06 -46.68Q202.74 -46.68 199.50 -44.58Q196.26 -42.48 194.52 -38.70Q192.78 -34.92 192.78 -29.64Q192.78 -24.36 194.52 -20.52Q196.26 -16.68 199.50 -14.58Q202.74 -12.48 207.06 -12.48ZM272.32 1.20Q264.64 1.20 259.12 -1.32Q253.60 -3.84 250.06 -8.10Q246.52 -12.36 244.84 -17.82Q243.16 -23.28 243.16 -29.28Q243.16 -35.04 244.84 -40.56Q246.52 -46.08 249.88 -50.52Q253.24 -54.96 258.58 -57.66Q263.92 -60.36 271.36 -60.36Q278.32 -60.36 283.48 -58.02Q288.64 -55.68 292.00 -51.54Q295.36 -47.40 297.10 -41.88Q298.84 -36.36 298.84 -30.12Q298.84 -29.28 298.78 -27.78Q298.72 -26.28 298.48 -24.60L258.04 -24.60Q258.64 -18.24 262.78 -15.00Q266.92 -11.76 273.16 -11.76Q277.72 -11.76 282.04 -13.38Q286.36 -15.00 289.72 -18.00L297.16 -7.92Q292.96 -4.68 289.24 -2.64Q285.52 -0.60 281.50 0.30Q277.48 1.20 272.32 1.20ZM284.68 -35.64Q284.68 -35.76 284.68 -35.76Q284.68 -38.28 283.72 -40.50Q282.76 -42.72 281.08 -44.40Q279.40 -46.08 277.06 -46.98Q274.72 -47.88 271.72 -47.88Q267.28 -47.88 264.28 -46.08Q261.28 -44.28 259.78 -41.46Q258.28 -38.64 257.92 -35.64ZM346.66 1.56Q335.02 1.56 326.20 -3.84Q317.38 -9.24 312.46 -19.08Q307.54 -28.92 307.54 -41.88Q307.54 -54.84 312.46 -64.62Q317.38 -74.40 326.20 -79.80Q335.02 -85.20 346.66 -85.20Q359.50 -85.20 368.92 -78.84Q378.34 -72.48 382.42 -61.20L371.02 -57.00Q368.02 -64.80 361.78 -69.18Q355.54 -73.56 346.66 -73.56Q338.50 -73.56 332.44 -69.66Q326.38 -65.76 323.08 -58.74Q319.78 -51.72 319.78 -41.88Q319.78 -32.04 323.08 -24.96Q326.38 -17.88 332.44 -13.98Q338.50 -10.08 346.66 -10.08Q355.54 -10.08 361.78 -14.46Q368.02 -18.84 371.02 -26.64L382.42 -22.56Q378.34 -11.40 368.92 -4.92Q359.50 1.56 346.66 1.56ZM429.04 0.00L428.32 -8.64Q428.20 -8.52 428.08 -8.40Q424.96 -3.72 420.34 -1.32Q415.72 1.08 409.96 1.08Q403.36 1.08 398.32 -1.32Q393.28 -3.72 390.52 -7.98Q387.76 -12.24 387.76 -17.88Q387.76 -22.80 389.80 -26.34Q391.84 -29.88 395.08 -31.80Q398.08 -33.72 401.98 -34.50Q405.88 -35.28 410.32 -35.28L428.08 -35.28L428.08 -37.20Q428.08 -43.44 424.48 -46.80Q420.88 -50.16 414.04 -50.16Q409.24 -50.16 404.86 -48.24Q400.48 -46.32 396.52 -42.00L389.20 -49.56Q394.48 -55.08 400.90 -57.66Q407.32 -60.24 414.88 -60.24Q426.76 -60.24 433.30 -54.18Q439.84 -48.12 439.84 -37.20L439.84 0.00ZM428.08 -26.40L412.00 -26.40Q409.60 -26.40 407.02 -25.98Q404.44 -25.56 402.64 -24.24Q401.20 -23.16 400.36 -21.54Q399.52 -19.92 399.52 -17.76Q399.52 -13.56 402.76 -11.04Q406.00 -8.52 411.40 -8.52Q415.96 -8.52 419.74 -10.62Q423.52 -12.72 425.80 -16.38Q428.08 -20.04 428.08 -24.72ZM451.94 0.00L451.94 -59.16L463.82 -59.16L463.82 -50.88Q464.78 -52.44 465.98 -53.76Q468.86 -56.88 472.88 -58.56Q476.90 -60.24 481.58 -60.24Q491.42 -60.24 497.00 -54.54Q502.58 -48.84 502.58 -37.92L502.58 0.00L490.82 0.00L490.82 -33.60Q490.82 -42.12 487.76 -46.08Q484.70 -50.04 478.34 -50.04Q473.54 -50.04 470.36 -47.88Q467.18 -45.72 465.50 -41.04Q463.82 -36.36 463.82 -29.16L463.82 0.00ZM533.28 0.00L509.04 -59.16L522.00 -59.16L538.08 -15.24L554.40 -59.16L567.12 -59.16L543.12 0.00ZM610.56 0.00L609.84 -8.64Q609.72 -8.52 609.60 -8.40Q606.48 -3.72 601.86 -1.32Q597.24 1.08 591.48 1.08Q584.88 1.08 579.84 -1.32Q574.80 -3.72 572.04 -7.98Q569.28 -12.24 569.28 -17.88Q569.28 -22.80 571.32 -26.34Q573.36 -29.88 576.60 -31.80Q579.60 -33.72 583.50 -34.50Q587.40 -35.28 591.84 -35.28L609.60 -35.28L609.60 -37.20Q609.60 -43.44 606.00 -46.80Q602.40 -50.16 595.56 -50.16Q590.76 -50.16 586.38 -48.24Q582.00 -46.32 578.04 -42.00L570.72 -49.56Q576.00 -55.08 582.42 -57.66Q588.84 -60.24 596.40 -60.24Q608.28 -60.24 614.82 -54.18Q621.36 -48.12 621.36 -37.20L621.36 0.00ZM609.60 -26.40L593.52 -26.40Q591.12 -26.40 588.54 -25.98Q585.96 -25.56 584.16 -24.24Q582.72 -23.16 581.88 -21.54Q581.04 -19.92 581.04 -17.76Q581.04 -13.56 584.28 -11.04Q587.52 -8.52 592.92 -8.52Q597.48 -8.52 601.26 -10.62Q605.04 -12.72 607.32 -16.38Q609.60 -20.04 609.60 -24.72ZM653.38 1.08Q647.14 1.08 642.34 -0.78Q637.54 -2.64 634.12 -5.58Q630.70 -8.52 628.66 -11.64L636.70 -18.60Q638.98 -14.52 643.24 -11.58Q647.50 -8.64 653.50 -8.64Q658.78 -8.64 661.84 -10.86Q664.90 -13.08 664.90 -16.68Q664.90 -19.56 662.98 -21.30Q661.06 -23.04 657.94 -24.18Q654.82 -25.32 651.10 -26.16Q647.74 -27.12 644.26 -28.32Q640.78 -29.52 637.96 -31.38Q635.14 -33.24 633.40 -36.18Q631.66 -39.12 631.66 -43.44Q631.66 -51.00 637.48 -55.62Q643.30 -60.24 652.90 -60.24Q659.74 -60.24 665.38 -57.42Q671.02 -54.60 674.14 -49.08L666.82 -43.44Q664.42 -47.40 660.64 -49.20Q656.86 -51.00 652.42 -51.00Q648.22 -51.00 645.40 -49.26Q642.58 -47.52 642.58 -44.52Q642.58 -42.36 643.84 -40.98Q645.10 -39.60 647.80 -38.58Q650.50 -37.56 654.46 -36.60Q658.18 -35.76 662.02 -34.56Q665.86 -33.36 669.10 -31.44Q672.34 -29.52 674.38 -26.28Q676.42 -23.04 676.42 -17.88Q676.42 -12.24 673.54 -7.98Q670.66 -3.72 665.50 -1.32Q660.34 1.08 653.38 1.08Z\"/></svg>", hi = 12, N = 16, gi = .58, _i = 10, vi = .56, yi = 686 / 88, bi = 83.64 / 88, xi = .25;
99
+ var k = "https://tradecanvas.dev", A = "Powered by TradeCanvas", j = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M186 70A82 82 0 1 0 186 186\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"22\" stroke-linecap=\"round\"/><rect x=\"92\" y=\"74\" width=\"72\" height=\"20\" rx=\"10\" fill=\"currentColor\"/><path fill=\"#E8961E\" d=\"M119 94H137V108H144a10 10 0 0 1 10 10V164a10 10 0 0 1-10 10H137V190H119V174H112a10 10 0 0 1-10-10V118a10 10 0 0 1 10-10H119Z\"/></svg>", M = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 16 686 88\" aria-hidden=\"true\" focusable=\"false\"><path fill=\"currentColor\" transform=\"translate(0 101.64)\" d=\"M27.24 0.00L27.24 -69.72L1.32 -69.72L1.32 -83.64L68.76 -83.64L68.76 -69.72L42.96 -69.72L42.96 0.00ZM70.90 0.00L70.90 -59.16L85.90 -59.16L85.90 -50.64Q86.26 -51.36 86.74 -51.96Q89.50 -55.92 93.52 -58.14Q97.54 -60.36 101.74 -60.36Q104.74 -60.36 107.44 -59.58Q110.14 -58.80 113.02 -57.00L105.82 -43.56Q104.50 -44.28 102.46 -44.88Q100.42 -45.48 98.38 -45.48Q95.98 -45.48 93.76 -44.64Q91.54 -43.80 89.80 -42.00Q88.06 -40.20 86.98 -37.20Q86.50 -35.52 86.20 -32.94Q85.90 -30.36 85.90 -25.44L85.90 0.00ZM156.44 0.00L155.36 -7.56Q155.00 -6.96 154.52 -6.36Q151.28 -2.40 147.20 -0.60Q143.12 1.20 138.56 1.20Q132.08 1.20 126.98 -1.20Q121.88 -3.60 118.94 -8.04Q116.00 -12.48 116.00 -18.24Q116.00 -23.40 118.10 -27.06Q120.20 -30.72 123.68 -32.64Q126.68 -34.44 130.34 -35.16Q134.00 -35.88 138.20 -35.88L155.24 -35.88L155.24 -37.32Q155.24 -42.60 151.94 -45.18Q148.64 -47.76 143.00 -47.76Q138.32 -47.76 133.46 -45.90Q128.60 -44.04 124.88 -40.68L117.32 -50.88Q123.56 -55.92 130.10 -58.14Q136.64 -60.36 144.20 -60.36Q156.44 -60.36 163.28 -54.24Q170.12 -48.12 170.12 -37.32L170.12 0.00ZM155.24 -24.84L140.36 -24.84Q138.44 -24.84 136.58 -24.54Q134.72 -24.24 133.40 -23.16Q132.20 -22.32 131.60 -21.06Q131.00 -19.80 131.00 -18.24Q131.00 -14.88 133.64 -12.84Q136.28 -10.80 140.72 -10.80Q144.68 -10.80 147.98 -12.54Q151.28 -14.28 153.26 -17.34Q155.24 -20.40 155.24 -24.36ZM202.98 1.20Q195.18 1.20 189.54 -2.82Q183.90 -6.84 180.84 -13.86Q177.78 -20.88 177.78 -29.64Q177.78 -39.36 181.20 -46.20Q184.62 -53.04 190.38 -56.70Q196.14 -60.36 202.98 -60.36Q207.78 -60.36 211.92 -58.38Q216.06 -56.40 219.06 -52.44Q219.54 -51.72 220.02 -51.00L220.02 -83.64L234.78 -83.64L234.78 0.00L220.02 0.00L220.02 -8.04Q219.54 -7.20 218.94 -6.48Q215.70 -2.28 211.56 -0.54Q207.42 1.20 202.98 1.20ZM207.06 -12.48Q211.50 -12.48 214.68 -14.64Q217.86 -16.80 219.60 -20.64Q221.34 -24.48 221.34 -29.64Q221.34 -34.80 219.60 -38.64Q217.86 -42.48 214.68 -44.58Q211.50 -46.68 207.06 -46.68Q202.74 -46.68 199.50 -44.58Q196.26 -42.48 194.52 -38.70Q192.78 -34.92 192.78 -29.64Q192.78 -24.36 194.52 -20.52Q196.26 -16.68 199.50 -14.58Q202.74 -12.48 207.06 -12.48ZM272.32 1.20Q264.64 1.20 259.12 -1.32Q253.60 -3.84 250.06 -8.10Q246.52 -12.36 244.84 -17.82Q243.16 -23.28 243.16 -29.28Q243.16 -35.04 244.84 -40.56Q246.52 -46.08 249.88 -50.52Q253.24 -54.96 258.58 -57.66Q263.92 -60.36 271.36 -60.36Q278.32 -60.36 283.48 -58.02Q288.64 -55.68 292.00 -51.54Q295.36 -47.40 297.10 -41.88Q298.84 -36.36 298.84 -30.12Q298.84 -29.28 298.78 -27.78Q298.72 -26.28 298.48 -24.60L258.04 -24.60Q258.64 -18.24 262.78 -15.00Q266.92 -11.76 273.16 -11.76Q277.72 -11.76 282.04 -13.38Q286.36 -15.00 289.72 -18.00L297.16 -7.92Q292.96 -4.68 289.24 -2.64Q285.52 -0.60 281.50 0.30Q277.48 1.20 272.32 1.20ZM284.68 -35.64Q284.68 -35.76 284.68 -35.76Q284.68 -38.28 283.72 -40.50Q282.76 -42.72 281.08 -44.40Q279.40 -46.08 277.06 -46.98Q274.72 -47.88 271.72 -47.88Q267.28 -47.88 264.28 -46.08Q261.28 -44.28 259.78 -41.46Q258.28 -38.64 257.92 -35.64ZM346.66 1.56Q335.02 1.56 326.20 -3.84Q317.38 -9.24 312.46 -19.08Q307.54 -28.92 307.54 -41.88Q307.54 -54.84 312.46 -64.62Q317.38 -74.40 326.20 -79.80Q335.02 -85.20 346.66 -85.20Q359.50 -85.20 368.92 -78.84Q378.34 -72.48 382.42 -61.20L371.02 -57.00Q368.02 -64.80 361.78 -69.18Q355.54 -73.56 346.66 -73.56Q338.50 -73.56 332.44 -69.66Q326.38 -65.76 323.08 -58.74Q319.78 -51.72 319.78 -41.88Q319.78 -32.04 323.08 -24.96Q326.38 -17.88 332.44 -13.98Q338.50 -10.08 346.66 -10.08Q355.54 -10.08 361.78 -14.46Q368.02 -18.84 371.02 -26.64L382.42 -22.56Q378.34 -11.40 368.92 -4.92Q359.50 1.56 346.66 1.56ZM429.04 0.00L428.32 -8.64Q428.20 -8.52 428.08 -8.40Q424.96 -3.72 420.34 -1.32Q415.72 1.08 409.96 1.08Q403.36 1.08 398.32 -1.32Q393.28 -3.72 390.52 -7.98Q387.76 -12.24 387.76 -17.88Q387.76 -22.80 389.80 -26.34Q391.84 -29.88 395.08 -31.80Q398.08 -33.72 401.98 -34.50Q405.88 -35.28 410.32 -35.28L428.08 -35.28L428.08 -37.20Q428.08 -43.44 424.48 -46.80Q420.88 -50.16 414.04 -50.16Q409.24 -50.16 404.86 -48.24Q400.48 -46.32 396.52 -42.00L389.20 -49.56Q394.48 -55.08 400.90 -57.66Q407.32 -60.24 414.88 -60.24Q426.76 -60.24 433.30 -54.18Q439.84 -48.12 439.84 -37.20L439.84 0.00ZM428.08 -26.40L412.00 -26.40Q409.60 -26.40 407.02 -25.98Q404.44 -25.56 402.64 -24.24Q401.20 -23.16 400.36 -21.54Q399.52 -19.92 399.52 -17.76Q399.52 -13.56 402.76 -11.04Q406.00 -8.52 411.40 -8.52Q415.96 -8.52 419.74 -10.62Q423.52 -12.72 425.80 -16.38Q428.08 -20.04 428.08 -24.72ZM451.94 0.00L451.94 -59.16L463.82 -59.16L463.82 -50.88Q464.78 -52.44 465.98 -53.76Q468.86 -56.88 472.88 -58.56Q476.90 -60.24 481.58 -60.24Q491.42 -60.24 497.00 -54.54Q502.58 -48.84 502.58 -37.92L502.58 0.00L490.82 0.00L490.82 -33.60Q490.82 -42.12 487.76 -46.08Q484.70 -50.04 478.34 -50.04Q473.54 -50.04 470.36 -47.88Q467.18 -45.72 465.50 -41.04Q463.82 -36.36 463.82 -29.16L463.82 0.00ZM533.28 0.00L509.04 -59.16L522.00 -59.16L538.08 -15.24L554.40 -59.16L567.12 -59.16L543.12 0.00ZM610.56 0.00L609.84 -8.64Q609.72 -8.52 609.60 -8.40Q606.48 -3.72 601.86 -1.32Q597.24 1.08 591.48 1.08Q584.88 1.08 579.84 -1.32Q574.80 -3.72 572.04 -7.98Q569.28 -12.24 569.28 -17.88Q569.28 -22.80 571.32 -26.34Q573.36 -29.88 576.60 -31.80Q579.60 -33.72 583.50 -34.50Q587.40 -35.28 591.84 -35.28L609.60 -35.28L609.60 -37.20Q609.60 -43.44 606.00 -46.80Q602.40 -50.16 595.56 -50.16Q590.76 -50.16 586.38 -48.24Q582.00 -46.32 578.04 -42.00L570.72 -49.56Q576.00 -55.08 582.42 -57.66Q588.84 -60.24 596.40 -60.24Q608.28 -60.24 614.82 -54.18Q621.36 -48.12 621.36 -37.20L621.36 0.00ZM609.60 -26.40L593.52 -26.40Q591.12 -26.40 588.54 -25.98Q585.96 -25.56 584.16 -24.24Q582.72 -23.16 581.88 -21.54Q581.04 -19.92 581.04 -17.76Q581.04 -13.56 584.28 -11.04Q587.52 -8.52 592.92 -8.52Q597.48 -8.52 601.26 -10.62Q605.04 -12.72 607.32 -16.38Q609.60 -20.04 609.60 -24.72ZM653.38 1.08Q647.14 1.08 642.34 -0.78Q637.54 -2.64 634.12 -5.58Q630.70 -8.52 628.66 -11.64L636.70 -18.60Q638.98 -14.52 643.24 -11.58Q647.50 -8.64 653.50 -8.64Q658.78 -8.64 661.84 -10.86Q664.90 -13.08 664.90 -16.68Q664.90 -19.56 662.98 -21.30Q661.06 -23.04 657.94 -24.18Q654.82 -25.32 651.10 -26.16Q647.74 -27.12 644.26 -28.32Q640.78 -29.52 637.96 -31.38Q635.14 -33.24 633.40 -36.18Q631.66 -39.12 631.66 -43.44Q631.66 -51.00 637.48 -55.62Q643.30 -60.24 652.90 -60.24Q659.74 -60.24 665.38 -57.42Q671.02 -54.60 674.14 -49.08L666.82 -43.44Q664.42 -47.40 660.64 -49.20Q656.86 -51.00 652.42 -51.00Q648.22 -51.00 645.40 -49.26Q642.58 -47.52 642.58 -44.52Q642.58 -42.36 643.84 -40.98Q645.10 -39.60 647.80 -38.58Q650.50 -37.56 654.46 -36.60Q658.18 -35.76 662.02 -34.56Q665.86 -33.36 669.10 -31.44Q672.34 -29.52 674.38 -26.28Q676.42 -23.04 676.42 -17.88Q676.42 -12.24 673.54 -7.98Q670.66 -3.72 665.50 -1.32Q660.34 1.08 653.38 1.08Z\"/></svg>", gi = 12, N = 16, _i = .58, vi = 10, yi = .56, bi = 686 / 88, xi = 83.64 / 88, Si = .25;
100
100
  function P(e = N) {
101
- let t = Number.isFinite(e) ? Math.max(hi, e) : N, n = F(t * vi / bi);
101
+ let t = Number.isFinite(e) ? Math.max(gi, e) : N, n = F(t * yi / xi);
102
102
  return {
103
103
  height: t,
104
- fontSize: F(Math.max(_i, t * gi)),
105
- gap: F(t * xi),
106
- wordmarkWidth: F(n * yi),
104
+ fontSize: F(Math.max(vi, t * _i)),
105
+ gap: F(t * Si),
106
+ wordmarkWidth: F(n * bi),
107
107
  wordmarkHeight: n
108
108
  };
109
109
  }
@@ -126,24 +126,24 @@ function B(e = {}) {
126
126
  let t = P(e.height), n = I(L(e.href)), r = e.target ?? "_blank";
127
127
  return `<a class="tc-powered-by" href="${n}"${r ? ` target="${I(r)}"${R(r) ? " rel=\"noopener noreferrer\"" : ""}` : ""} aria-label="${A}" style="${`display:inline-flex;align-items:center;gap:${t.gap}px;height:${t.height}px;color:inherit;text-decoration:none;font-size:${t.fontSize}px;line-height:1;white-space:nowrap`}"><span aria-hidden="true">Powered by</span>` + z(j, t.height, t.height) + z(M, t.wordmarkWidth, t.wordmarkHeight) + "</a>";
128
128
  }
129
- function Si(e = {}, t = document) {
129
+ function Ci(e = {}, t = document) {
130
130
  let n = t.createElement("div");
131
131
  return n.innerHTML = B(e), n.firstElementChild;
132
132
  }
133
133
  //#endregion
134
134
  //#region src/plugins/overlayScale.ts
135
- function Ci(e) {
136
- let { viewport: t, data: n } = e, r = Tr(t), i = n.length - 1, a = Math.max(0, Math.floor(t.visibleRange.from)), o = Math.min(i, Math.ceil(t.visibleRange.to)), s = (e) => n.length > 0 ? Gr(e, n) : e;
135
+ function wi(e) {
136
+ let { viewport: t, data: n } = e, r = Er(t), i = n.length - 1, a = Math.max(0, Math.floor(t.visibleRange.from)), o = Math.min(i, Math.ceil(t.visibleRange.to)), s = (e) => n.length > 0 ? Kr(e, n) : e;
137
137
  return {
138
138
  timeToX: (e) => y(s(e), t),
139
139
  xToTime: (e) => {
140
140
  let r = E(e, t);
141
- return n.length > 0 ? qn(r, n) : r;
141
+ return n.length > 0 ? Jn(r, n) : r;
142
142
  },
143
143
  indexToX: (e) => y(e, t),
144
144
  xToIndex: (e) => E(e, t),
145
145
  priceToY: r,
146
- yToPrice: (e) => ri(e, t),
146
+ yToPrice: (e) => ii(e, t),
147
147
  barWidth: t.barWidth,
148
148
  visible: o < a ? {
149
149
  from: 0,
@@ -189,7 +189,7 @@ var V = {
189
189
  cols: 2,
190
190
  rows: 3
191
191
  }
192
- }, wi = class {
192
+ }, Ti = class {
193
193
  root;
194
194
  cells = [];
195
195
  layout;
@@ -279,7 +279,7 @@ var V = {
279
279
  async connectAll(e, t, n, r = 500) {
280
280
  let i = [];
281
281
  for (let a = 0; a < this.cells.length && a < t.length; a++) i.push(this.connectCell(a, {
282
- ...typeof e == "function" ? { adapter: e(t[a], a) } : hr(e) ? { feed: e } : { adapter: e },
282
+ ...typeof e == "function" ? { adapter: e(t[a], a) } : gr(e) ? { feed: e } : { adapter: e },
283
283
  symbol: t[a],
284
284
  timeframe: n,
285
285
  historyLimit: r
@@ -296,13 +296,13 @@ var V = {
296
296
  this.cells = [], this.root.remove();
297
297
  }
298
298
  }
299
- }, Ti = class extends g {
299
+ }, Ei = class extends g {
300
300
  options;
301
301
  constructor(e, t) {
302
302
  super(e, t.theme), this.options = t, this.requestRender();
303
303
  }
304
304
  renderChart(e, t, n, r) {
305
- Rr(e, t, n, this.options, r);
305
+ zr(e, t, n, this.options, r);
306
306
  }
307
307
  update(e) {
308
308
  this.options = {
@@ -316,7 +316,7 @@ var V = {
316
316
  ...e
317
317
  }, this.requestRender();
318
318
  }
319
- }, Ei = class extends g {
319
+ }, Di = class extends g {
320
320
  options;
321
321
  crosshair = null;
322
322
  constructor(e, t) {
@@ -324,7 +324,7 @@ var V = {
324
324
  }
325
325
  renderChart(e, t, n, r) {
326
326
  let i = this.crosshair?.getPosition() ?? null;
327
- Ar(e, t, n, this.options, r, i);
327
+ jr(e, t, n, this.options, r, i);
328
328
  }
329
329
  update(e) {
330
330
  this.options = {
@@ -349,7 +349,7 @@ var V = {
349
349
  }
350
350
  renderChart(e, t, n, r) {
351
351
  let i = this.crosshair?.getPosition() ?? null;
352
- Mr(e, t, n, this.options, r, i);
352
+ Nr(e, t, n, this.options, r, i);
353
353
  }
354
354
  update(e, t) {
355
355
  this.options = {
@@ -396,20 +396,20 @@ var V = {
396
396
  height: this.height
397
397
  }, t = this.options.cellPadding ?? 2;
398
398
  if (this.lastLayoutWidth = this.width, this.lastLayoutHeight = this.height, this.cachedGroups = [], this.options.grouped) {
399
- let { groups: n, cells: r } = _r(this.currentData.map((e) => ({
399
+ let { groups: n, cells: r } = vr(this.currentData.map((e) => ({
400
400
  id: e.id,
401
401
  weight: e.weight ?? (Math.abs(e.value) || 1),
402
402
  group: e.group,
403
403
  value: e.value
404
- })), e, t, pn);
404
+ })), e, t, mn);
405
405
  this.cachedRects = r, this.cachedGroups = n;
406
406
  } else if (this.options.weighted) {
407
407
  let n = this.currentData.map((e) => ({
408
408
  id: e.id,
409
409
  weight: e.weight ?? (Math.abs(e.value) || 1)
410
410
  }));
411
- this.cachedRects = vr(n, e, t);
412
- } else this.cachedRects = yr(this.currentData.map((e) => ({ id: e.id })), e, t);
411
+ this.cachedRects = yr(n, e, t);
412
+ } else this.cachedRects = br(this.currentData.map((e) => ({ id: e.id })), e, t);
413
413
  }
414
414
  onCanvasClick(e, t) {
415
415
  if (this.options.onCellClick) for (let n of this.cachedRects) {
@@ -424,7 +424,7 @@ var V = {
424
424
  renderChart(e, t, n, r) {
425
425
  (t !== this.lastLayoutWidth || n !== this.lastLayoutHeight) && this.recomputeLayout();
426
426
  let i = this.crosshair?.getPosition() ?? null;
427
- Pr(e, t, n, this.currentData, this.cachedRects, this.options, r, i, this.cachedGroups);
427
+ Fr(e, t, n, this.currentData, this.cachedRects, this.options, r, i, this.cachedGroups);
428
428
  }
429
429
  update(e) {
430
430
  this.currentData = e, this.options = {
@@ -441,7 +441,7 @@ var V = {
441
441
  destroy() {
442
442
  this.crosshair?.destroy(), this.handleClick && this.canvas.removeEventListener("click", this.handleClick), super.destroy();
443
443
  }
444
- }, Di = class extends g {
444
+ }, Oi = class extends g {
445
445
  options;
446
446
  crosshair = null;
447
447
  constructor(e, t) {
@@ -449,7 +449,7 @@ var V = {
449
449
  }
450
450
  renderChart(e, t, n, r) {
451
451
  let i = this.crosshair?.getPosition() ?? null;
452
- zr(e, t, n, this.options, r, i);
452
+ Br(e, t, n, this.options, r, i);
453
453
  }
454
454
  update(e) {
455
455
  this.options = {
@@ -466,12 +466,12 @@ var V = {
466
466
  destroy() {
467
467
  this.crosshair?.destroy(), super.destroy();
468
468
  }
469
- }, Oi = 500;
470
- function ki(e) {
469
+ }, ki = 500;
470
+ function Ai(e) {
471
471
  let t = 1 - e;
472
472
  return 1 - t * t * t;
473
473
  }
474
- var Ai = class extends g {
474
+ var ji = class extends g {
475
475
  options;
476
476
  currentValue;
477
477
  targetValue;
@@ -482,7 +482,7 @@ var Ai = class extends g {
482
482
  super(e, t.theme), this.options = t, this.currentValue = t.value, this.targetValue = t.value, this.requestRender();
483
483
  }
484
484
  renderChart(e, t, n, r) {
485
- Nr(e, t, n, this.options, r, this.currentValue);
485
+ Pr(e, t, n, this.options, r, this.currentValue);
486
486
  }
487
487
  setValue(e) {
488
488
  if (this.options.animate === !1) {
@@ -512,7 +512,7 @@ var Ai = class extends g {
512
512
  if (this.animationFrameId !== null) return;
513
513
  let e = () => {
514
514
  if (this.animationFrameId = null, this.animationStart === null) return;
515
- let t = this.options.animationDuration ?? Oi, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = ki(r);
515
+ let t = this.options.animationDuration ?? ki, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = Ai(r);
516
516
  this.currentValue = this.animationFrom + (this.targetValue - this.animationFrom) * i, this.requestRender(), r < 1 ? this.animationFrameId = requestAnimationFrame(e) : (this.currentValue = this.targetValue, this.animationStart = null);
517
517
  };
518
518
  this.animationFrameId = requestAnimationFrame(e);
@@ -542,7 +542,7 @@ var Ai = class extends g {
542
542
  }
543
543
  renderChart(e, t, n, r) {
544
544
  let i = this.options.crosshair === !1 ? null : this.crosshair.getPosition(), a = this.layoutFor;
545
- (!this.layout || !a || a.options !== this.options || a.width !== t || a.height !== n || a.theme !== r) && (this.layout = this.compute(t, n, r, Yn(e, r)), this.layoutFor = {
545
+ (!this.layout || !a || a.options !== this.options || a.width !== t || a.height !== n || a.theme !== r) && (this.layout = this.compute(t, n, r, Xn(e, r)), this.layoutFor = {
546
546
  options: this.options,
547
547
  width: t,
548
548
  height: n,
@@ -561,12 +561,12 @@ var Ai = class extends g {
561
561
  destroy() {
562
562
  this.crosshair.destroy(), this.canvas.removeEventListener("click", this.onClick), this.canvas.removeEventListener("pointermove", this.onMove), super.destroy();
563
563
  }
564
- }, ji = class extends W {
564
+ }, Mi = class extends W {
565
565
  compute(e, t, n, r) {
566
- return Xn(this.options, e, t, n, r);
566
+ return Zn(this.options, e, t, n, r);
567
567
  }
568
568
  draw(e, t, n, r, i, a) {
569
- Dr(e, t, n, this.options, r, i, a);
569
+ Or(e, t, n, this.options, r, i, a);
570
570
  }
571
571
  describe() {
572
572
  return `Bar chart of ${this.options.series.map((e) => e.name).join(", ")}, ${this.options.categories.length} categories`;
@@ -592,12 +592,12 @@ var Ai = class extends g {
592
592
  series: t
593
593
  });
594
594
  }
595
- }, Mi = class extends W {
595
+ }, Ni = class extends W {
596
596
  compute(e, t, n, r) {
597
- return $n(this.options, e, t, n, r);
597
+ return er(this.options, e, t, n, r);
598
598
  }
599
599
  draw(e, t, n, r, i, a) {
600
- jr(e, t, n, this.options, r, i, a);
600
+ Mr(e, t, n, this.options, r, i, a);
601
601
  }
602
602
  describe() {
603
603
  let e = this.options.data.filter((e) => Number.isFinite(e.value) && e.value > 0).map((e) => e.label).join(", ");
@@ -616,12 +616,12 @@ var Ai = class extends g {
616
616
  update(e) {
617
617
  this.setOptions({ data: e });
618
618
  }
619
- }, Ni = class extends W {
619
+ }, Pi = class extends W {
620
620
  compute(e, t, n, r) {
621
- return nr(this.options, e, t, n, r);
621
+ return rr(this.options, e, t, n, r);
622
622
  }
623
623
  draw(e, t, n, r, i, a) {
624
- Lr(e, t, n, this.options, r, i, a);
624
+ Rr(e, t, n, this.options, r, i, a);
625
625
  }
626
626
  describe() {
627
627
  let e = this.options.series.reduce((e, t) => e + t.points.length, 0);
@@ -640,12 +640,12 @@ var Ai = class extends g {
640
640
  update(e) {
641
641
  this.setOptions({ series: e });
642
642
  }
643
- }, Pi = class extends W {
643
+ }, Fi = class extends W {
644
644
  compute(e, t, n, r) {
645
- return er(this.options, e, t, n, r);
645
+ return tr(this.options, e, t, n, r);
646
646
  }
647
647
  draw(e, t, n, r, i, a) {
648
- Fr(e, t, n, this.options, r, i, a);
648
+ Ir(e, t, n, this.options, r, i, a);
649
649
  }
650
650
  describe() {
651
651
  return `Histogram of ${this.options.values.length} values`;
@@ -660,12 +660,12 @@ var Ai = class extends g {
660
660
  update(e) {
661
661
  this.setOptions({ values: e });
662
662
  }
663
- }, Fi = class extends W {
663
+ }, Ii = class extends W {
664
664
  compute(e, t, n, r) {
665
- return Zn(this.options, e, t, n, r);
665
+ return Qn(this.options, e, t, n, r);
666
666
  }
667
667
  draw(e, t, n, r, i, a) {
668
- Or(e, t, n, this.options, r, i, a);
668
+ kr(e, t, n, this.options, r, i, a);
669
669
  }
670
670
  describe() {
671
671
  let e = this.options.data.map((e) => e.date).filter((e) => /^\d{4}-\d{2}-\d{2}$/.test(e)).sort(), t = this.options.from ?? e[0], n = this.options.to ?? e[e.length - 1];
@@ -684,12 +684,12 @@ var Ai = class extends g {
684
684
  update(e) {
685
685
  this.setOptions({ data: e });
686
686
  }
687
- }, G = 12, Ii = class extends W {
687
+ }, G = 12, Li = class extends W {
688
688
  compute(e, t, n, r) {
689
- return tr(this.options, e, t, n, r);
689
+ return nr(this.options, e, t, n, r);
690
690
  }
691
691
  draw(e, t, n, r, i, a) {
692
- Ir(e, t, n, this.options, r, i, a);
692
+ Lr(e, t, n, this.options, r, i, a);
693
693
  }
694
694
  describe() {
695
695
  let { rows: e, columns: t } = this.options;
@@ -708,12 +708,12 @@ var Ai = class extends g {
708
708
  update(e) {
709
709
  this.setOptions({ values: e });
710
710
  }
711
- }, Li = class extends W {
711
+ }, Ri = class extends W {
712
712
  compute(e, t, n, r) {
713
- return Qn(this.options, e, t, n, r);
713
+ return $n(this.options, e, t, n, r);
714
714
  }
715
715
  draw(e, t, n, r, i, a) {
716
- kr(e, t, n, this.options, r, i, a);
716
+ Ar(e, t, n, this.options, r, i, a);
717
717
  }
718
718
  describe() {
719
719
  return `Counter-clock chart of price against volume, ${this.options.period ?? 25}-bar averages`;
@@ -729,12 +729,12 @@ var Ai = class extends g {
729
729
  r && this.options.onPointClick?.(r.point);
730
730
  }
731
731
  getPhase() {
732
- return ar(sr(this.options.data, this.options.period ?? 25, Hr(this.options)));
732
+ return or(cr(this.options.data, this.options.period ?? 25, Ur(this.options)));
733
733
  }
734
734
  update(e) {
735
735
  this.setOptions({ data: e });
736
736
  }
737
- }, Ri = [
737
+ }, zi = [
738
738
  "Jan",
739
739
  "Feb",
740
740
  "Mar",
@@ -769,7 +769,7 @@ function J(e) {
769
769
  if (e.length === 0) return [];
770
770
  let t = [];
771
771
  for (let n of e) {
772
- let e = Bt(n.time, "1M"), r = t[t.length - 1];
772
+ let e = Vt(n.time, "1M"), r = t[t.length - 1];
773
773
  r && r.key === e ? r.close = n.equity : t.push({
774
774
  key: e,
775
775
  close: n.equity
@@ -782,7 +782,7 @@ function J(e) {
782
782
  let a = new Date(e.key), o = a.getUTCFullYear(), s = a.getUTCMonth();
783
783
  r.push({
784
784
  id: `${o}-${String(s + 1).padStart(2, "0")}`,
785
- label: Ri[s],
785
+ label: zi[s],
786
786
  group: String(o),
787
787
  value: i
788
788
  });
@@ -845,7 +845,7 @@ function Q(e) {
845
845
  function $(e) {
846
846
  return !e || e === "dark" ? ve : e === "light" ? Ne : e;
847
847
  }
848
- var zi = class {
848
+ var Bi = class {
849
849
  options;
850
850
  theme;
851
851
  root;
@@ -994,6 +994,6 @@ var zi = class {
994
994
  }
995
995
  };
996
996
  //#endregion
997
- export { Jt as AlertManager, Yt as Animator, ji as BarChart, Xt as BarCountdown, Zt as BinanceAdapter, Qt as BybitAdapter, $t as CANDLE_PATTERNS, me as CHART_STYLE_KEYS, oi as CORRECTABLE_BARS, Fi as CalendarChart, c as Chart, wi as ChartGrid, en as ChartLegend, tn as ChartStateManager, nn as CoinbaseAdapter, rn as CompareRenderer, Li as CounterClockChart, an as CrosshairTooltip, on as CurrentPriceLine, he as DARK_PRICE_LIMITS, ge as DARK_TERMINAL, _e as DARK_THEME, ye as DEFAULT_DRAWING_STYLE, be as DEFAULT_FONT_FAMILY, e as DEFAULT_HISTORY_PAGE_SIZE, sn as DEFAULT_LEGEND_CONFIG, cn as DEFAULT_MAX_WEBGL_CHARTS, xe as DEFAULT_RECONNECT, ln as DEFAULT_SESSION_HOURS, Se as DEFAULT_SIGNAL_STYLE, Ce as DEFAULT_STREAM_CONFIG, we as DEFAULT_TIMEFRAME_FAVORITES, Te as DEFAULT_TRADE_ZONE_STYLE, Ee as DEFAULT_TRADING_CONFIG, un as DataExporter, i as DataManager, Ei as DepthChart, Mi as DonutChart, ie as DragDropImporter, dn as DrawingBase, te as EXCHANGE_TIMEZONE, le as EXCHANGE_TIME_ZONE, fn as Easing, H as EquityCurveChart, Ai as GaugeChart, de as HISTORY_RETRY_MS, De as HNX_SESSIONS, Oe as HOSE_SESSIONS, U as HeatmapChart, Pi as HistogramChart, mn as INDICATOR_CATEGORIES, hn as IndicatorBase, gn as IndicatorValueMap, _n as KEPT_BUCKETS, ke as KRX_SESSIONS, Ae as KR_COLORS, vn as KeyboardHandler, yn as KrakenAdapter, je as LIGHT_PRICE_LIMITS, Me as LIGHT_THEME, fe as LayoutManager, ce as LayoutSession, Pe as MARKET_CRYPTO, Fe as MARKET_HNX, Ie as MARKET_HOSE, Le as MARKET_HOSE_ETF, Re as MARKET_KRX, d as MARKET_NXT, f as MARKET_NYSE, p as MARKET_UPBIT_KRW, m as MARKET_UPCOM, h as MARKET_VN30F, bn as MAX_ALERT_BARS, re as MAX_LAYOUT_NAME, xn as MIN_ALERT_BARS, ze as MS_TIME_THRESHOLD, Sn as ManualFeed, Ii as MatrixChart, Cn as MockAdapter, Be as NXT_SESSIONS, ue as PLUGIN_API_VERSION, A as POWERED_BY_LABEL, Ve as PRICE_SOURCES, wn as PaperExecutionAdapter, zi as PerformanceDashboard, ae as PluginManager, Tn as PollingAdapter, En as RANGE_PRESETS, Dn as ReconnectManager, On as ReplayController, kn as ReplayManager, An as ResamplingAdapter, jn as ReshapeMemo, He as SANS_FONT_FAMILY, Ni as ScatterChart, Mn as Screenshot, Nn as SessionBreaks, Pn as SessionShading, Fn as SignalMarkerManager, Ti as SparklineChart, In as StreamManager, Ue as TC_PALETTE, We as TC_SERIES_COLORS, Ge as TIMEFRAMES_CRYPTO, Ke as TIMEFRAMES_FOREX, qe as TIMEFRAMES_STOCK, j as TRADECANVAS_MARK_SVG, k as TRADECANVAS_URL, M as TRADECANVAS_WORDMARK_SVG, r as ThemeManager, Ln as TickAggregator, Rn as TickBarAdapter, zn as TickBarBuilder, Bn as TradeZoneManager, Je as UPCOM_SESSIONS, Vn as UndoRedoManager, Hn as UpbitAdapter, Ye as VN30F_SESSIONS, Xe as VN_COLORS, Ze as VOLUME_ALPHA, v as VolumeRenderer, Di as WaterfallChart, Un as Watermark, Wn as WebSocketAdapter, Gn as adapterFromFeed, Kn as axisTimes, Jn as barIndexToX, Qe as barTimeUnit, $e as barsAreDaily, oe as cleanLayoutName, ne as clearGlobalPlugins, q as computeDrawdownCurve, J as computeMonthlyReturns, et as computePriceLimits, tt as contrastRatio, rr as correlationMatrix, ir as counterClockPhase, or as counterClockPoints, nt as createMarketTheme, Si as createPoweredBy, rt as createVNTheme, cr as describeInputs, lr as detectCandlePatterns, mi as feedBars, ur as feedFromAdapter, it as formatFraction, at as formatNumber, dr as formatTooltipTime, ot as formatVND, st as formatVolumeLoc, ct as fractionTick, lt as getCurrentSession, u as getGlobalPlugins, ut as getLocale, fr as histogramBins, pr as indicatorCategory, dt as indicatorSource, ft as inkOn, mr as isDataFeed, gr as isPriceLevelAlert, pt as isPriceSource, mt as isTimeFrame, ht as isValidTimeZone, ee as localStorageLayouts, br as lttbDownsample, xr as lttbVisibleIndices, gt as marketStatus, o as memoryLayouts, Sr as niceScale, _t as normalizeBar, vt as normalizeBarTime, yt as offsetAt, R as opensElsewhere, Ci as overlayScale, pe as overlaysForLayer, bt as parseIndicatorSource, se as parseOHLCV, xt as parseTimeframe, St as pickBaseTimeframe, s as pluginKey, B as poweredByHtml, P as poweredByLayout, Ct as priceFormatterFor, wt as priceStepAt, Cr as priceToY, wr as priceToYMapper, Er as rangePresetStart, Tt as rankSymbols, Et as readNews, Dt as readQuote, Ot as readableOn, kt as registerLocale, l as registerPlugin, At as resampleBars, jt as roundToPriceStep, L as safeBadgeHref, Mt as scaleMarketPrices, Q as selectKeyStats, Br as servesTimeframe, Nt as setLocale, Vr as setMaxWebGLCharts, Pt as sourcePrice, Ft as stepDecimals, It as symbolTimeZone, ai as syncIndicators, Lt as t, Rt as tickBarCount, Ur as timeToX, zt as timeframeBucketStart, Vt as timeframeToMs, Wr as timestampToBarIndex, K as toEquityPoints, Kr as toHeikinAshi, qr as toKagi, Jr as toLineBreak, Yr as toPointAndFigure, Xr as toRangeBars, Zr as toRenko, a as unregisterPlugin, Ht as usesKoreanUnits, Ut as vn30fContracts, Wt as vn30fLastTradingDay, Gt as volumeColor, Kt as wallToUtc, Qr as withResampling, $r as withTickBars, ei as xToBarIndex, ti as xToTime, ni as yToPrice, qt as zoneOffsetMinutes };
997
+ export { Yt as AlertManager, Xt as Animator, Mi as BarChart, Zt as BarCountdown, Qt as BinanceAdapter, $t as BybitAdapter, en as CANDLE_PATTERNS, me as CHART_STYLE_KEYS, si as CORRECTABLE_BARS, Ii as CalendarChart, c as Chart, Ti as ChartGrid, tn as ChartLegend, nn as ChartStateManager, rn as CoinbaseAdapter, an as CompareRenderer, Ri as CounterClockChart, on as CrosshairTooltip, sn as CurrentPriceLine, he as DARK_PRICE_LIMITS, ge as DARK_TERMINAL, _e as DARK_THEME, ye as DEFAULT_DRAWING_STYLE, be as DEFAULT_FONT_FAMILY, e as DEFAULT_HISTORY_PAGE_SIZE, cn as DEFAULT_LEGEND_CONFIG, ln as DEFAULT_MAX_WEBGL_CHARTS, xe as DEFAULT_RECONNECT, un as DEFAULT_SESSION_HOURS, Se as DEFAULT_SIGNAL_STYLE, Ce as DEFAULT_STREAM_CONFIG, we as DEFAULT_TIMEFRAME_FAVORITES, Te as DEFAULT_TRADE_ZONE_STYLE, Ee as DEFAULT_TRADING_CONFIG, dn as DataExporter, i as DataManager, Di as DepthChart, Ni as DonutChart, ie as DragDropImporter, fn as DrawingBase, te as EXCHANGE_TIMEZONE, le as EXCHANGE_TIME_ZONE, pn as Easing, H as EquityCurveChart, ji as GaugeChart, de as HISTORY_RETRY_MS, De as HNX_SESSIONS, Oe as HOSE_SESSIONS, U as HeatmapChart, Fi as HistogramChart, hn as INDICATOR_CATEGORIES, gn as IndicatorBase, _n as IndicatorValueMap, vn as KEPT_BUCKETS, ke as KRX_SESSIONS, Ae as KR_COLORS, yn as KeyboardHandler, bn as KrakenAdapter, je as LIGHT_PRICE_LIMITS, Me as LIGHT_THEME, fe as LayoutManager, ce as LayoutSession, Pe as MARKET_CRYPTO, Fe as MARKET_HNX, Ie as MARKET_HOSE, Le as MARKET_HOSE_ETF, Re as MARKET_KRX, d as MARKET_NXT, f as MARKET_NYSE, p as MARKET_UPBIT_KRW, m as MARKET_UPCOM, h as MARKET_VN30F, xn as MAX_ALERT_BARS, re as MAX_LAYOUT_NAME, Sn as MIN_ALERT_BARS, ze as MS_TIME_THRESHOLD, Cn as ManualFeed, Li as MatrixChart, wn as MockAdapter, Be as NXT_SESSIONS, ue as PLUGIN_API_VERSION, A as POWERED_BY_LABEL, Ve as PRICE_SOURCES, Tn as PaperExecutionAdapter, Bi as PerformanceDashboard, ae as PluginManager, En as PollingAdapter, Dn as RANGE_PRESETS, On as ReconnectManager, kn as ReplayController, An as ReplayManager, jn as ResamplingAdapter, Mn as ReshapeMemo, He as SANS_FONT_FAMILY, Pi as ScatterChart, Nn as Screenshot, Pn as SessionBreaks, Fn as SessionShading, In as SignalMarkerManager, Ei as SparklineChart, Ln as StreamManager, Ue as TC_PALETTE, We as TC_SERIES_COLORS, Ge as TIMEFRAMES_CRYPTO, Ke as TIMEFRAMES_FOREX, qe as TIMEFRAMES_STOCK, j as TRADECANVAS_MARK_SVG, k as TRADECANVAS_URL, M as TRADECANVAS_WORDMARK_SVG, r as ThemeManager, Rn as TickAggregator, zn as TickBarAdapter, Bn as TickBarBuilder, Vn as TradeZoneManager, Je as UPCOM_SESSIONS, Hn as UndoRedoManager, v as UpbitAdapter, Ye as VN30F_SESSIONS, Xe as VN_COLORS, Ze as VOLUME_ALPHA, Un as VolumeRenderer, Oi as WaterfallChart, Wn as Watermark, Gn as WebSocketAdapter, Kn as adapterFromFeed, qn as axisTimes, Yn as barIndexToX, Qe as barTimeUnit, $e as barsAreDaily, oe as cleanLayoutName, ne as clearGlobalPlugins, q as computeDrawdownCurve, J as computeMonthlyReturns, et as computePriceLimits, tt as contrastRatio, ir as correlationMatrix, ar as counterClockPhase, sr as counterClockPoints, nt as createMarketTheme, Ci as createPoweredBy, rt as createVNTheme, lr as describeInputs, ur as detectCandlePatterns, hi as feedBars, dr as feedFromAdapter, it as formatFraction, at as formatNumber, fr as formatTooltipTime, ot as formatVND, st as formatVolumeLoc, ct as fractionTick, lt as getCurrentSession, u as getGlobalPlugins, ut as getLocale, pr as histogramBins, mr as indicatorCategory, dt as indicatorSource, ft as inkOn, hr as isDataFeed, _r as isPriceLevelAlert, pt as isPriceSource, mt as isTimeFrame, ht as isValidTimeZone, ee as localStorageLayouts, xr as lttbDownsample, Sr as lttbVisibleIndices, gt as marketStatus, o as memoryLayouts, Cr as niceScale, _t as normalizeBar, vt as normalizeBarTime, yt as offsetAt, R as opensElsewhere, wi as overlayScale, pe as overlaysForLayer, bt as parseIndicatorSource, se as parseOHLCV, xt as parseTimeframe, St as pickBaseTimeframe, s as pluginKey, B as poweredByHtml, P as poweredByLayout, Ct as priceFormatterFor, wt as priceStepAt, wr as priceToY, Tr as priceToYMapper, Dr as rangePresetStart, Tt as rankSymbols, Et as readNews, Dt as readQuote, Ot as readableOn, kt as registerLocale, l as registerPlugin, At as resampleBars, jt as roundToPriceStep, L as safeBadgeHref, Mt as scaleMarketPrices, Q as selectKeyStats, Vr as servesTimeframe, Nt as setLocale, Hr as setMaxWebGLCharts, Pt as sourcePrice, Ft as stepDecimals, It as symbolTimeZone, oi as syncIndicators, Lt as t, Rt as tickBarCount, zt as tickerOf, Wr as timeToX, Bt as timeframeBucketStart, Ht as timeframeToMs, Gr as timestampToBarIndex, K as toEquityPoints, qr as toHeikinAshi, Jr as toKagi, Yr as toLineBreak, Xr as toPointAndFigure, Zr as toRangeBars, Qr as toRenko, a as unregisterPlugin, Ut as usesKoreanUnits, Wt as vn30fContracts, Gt as vn30fLastTradingDay, Kt as volumeColor, qt as wallToUtc, $r as withResampling, ei as withTickBars, ti as xToBarIndex, ni as xToTime, ri as yToPrice, Jt as zoneOffsetMinutes };
998
998
 
999
999
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`./indicatorLabel-BNZvaOcl.cjs`),t=require(`./i18n-hMXCt55K.cjs`);function n(e){return Object.prototype.hasOwnProperty.call(t.c,e)}function r(e,t){let r=`indicatorInput.${e}`;return n(r)?t(r):null}function i(e,t,r){let i=`indicatorInput.${e}.${t}`;return n(i)?r(i):null}function a(t,n){let{defaultConfig:r,shortName:a,inputs:o}=t.descriptor,s=Object.entries(o??{}).flatMap(([e,a])=>{let o=t.params[e];return!a.options||typeof o!=`string`&&typeof o!=`number`||o===r[e]?[]:i(e,o,n)??[]});return[e.t(t.id,t.params,r,a),...s].join(` `)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
2
- //# sourceMappingURL=indicatorInputWords-fiLxkWio.cjs.map
1
+ const e=require(`./indicatorLabel-BQ6Kdry2.cjs`),t=require(`./i18n-hMXCt55K.cjs`);function n(e){return Object.prototype.hasOwnProperty.call(t.c,e)}function r(e,t){let r=`indicatorInput.${e}`;return n(r)?t(r):null}function i(e,t,r){let i=`indicatorInput.${e}.${t}`;return n(i)?r(i):null}function a(t,n){let{defaultConfig:r,shortName:a,inputs:o}=t.descriptor,s=Object.entries(o??{}).flatMap(([e,a])=>{let o=t.params[e];return!a.options||typeof o!=`string`&&typeof o!=`number`||o===r[e]?[]:i(e,o,n)??[]});return[e.t(t.id,t.params,r,a),...s].join(` `)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
2
+ //# sourceMappingURL=indicatorInputWords-BfWHWL0K.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"indicatorInputWords-fiLxkWio.cjs","names":[],"sources":["../src/widget/indicatorInputWords.ts"],"sourcesContent":["import type { IndicatorDescriptor } from '@tradecanvas/commons';\nimport { indicatorChipLabel } from '../indicatorLabel.js';\nimport { EN_MESSAGES, type MessageKey, type Translator } from './i18n.js';\n\n/**\n * Words for an indicator's inputs in the widget's language: an input named\n * `anchor` is `indicatorInput.anchor`, its choice `'week'` is\n * `indicatorInput.anchor.week`. Only inputs the widget has words for; any\n * other keeps its own label and its values as they are.\n */\n\n/** Whether the widget has a message under `key`, one built from an input's name. */\nfunction isMessageKey(key: string): key is MessageKey {\n return Object.prototype.hasOwnProperty.call(EN_MESSAGES, key);\n}\n\n/** An input's label in the widget's language, or null for one it has no word for. */\nexport function inputLabel(name: string, t: Translator): string | null {\n const key = `indicatorInput.${name}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** A choice of an input in the widget's language, or null for one it has no word for. */\nexport function choiceLabel(name: string, choice: string | number, t: Translator): string | null {\n const key = `indicatorInput.${name}.${choice}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** An indicator on the chart, as the widget names it. */\nexport interface NamedIndicator {\n id: string;\n params: Record<string, unknown>;\n descriptor: Pick<IndicatorDescriptor, 'defaultConfig' | 'shortName' | 'inputs'>;\n}\n\n/**\n * The indicator's name in the legend, the chips and the Objects panel: its\n * chip label ('EMA 21'), then the word for each choice off its default, so\n * two read apart ('VWAP', 'VWAP Week'). The CSV column keeps the chip label.\n */\nexport function widgetIndicatorLabel(ind: NamedIndicator, t: Translator): string {\n const { defaultConfig, shortName, inputs } = ind.descriptor;\n const words = Object.entries(inputs ?? {}).flatMap(([name, spec]) => {\n const value = ind.params[name];\n if (!spec.options || (typeof value !== 'string' && typeof value !== 'number') || value === defaultConfig[name]) return [];\n return choiceLabel(name, value, t) ?? [];\n });\n return [indicatorChipLabel(ind.id, ind.params, defaultConfig, shortName), ...words].join(' ');\n}\n"],"mappings":"kFAYA,SAAS,EAAa,EAAgC,CACpD,OAAO,OAAO,UAAU,eAAe,KAAK,EAAA,EAAa,EAAI,CAI/D,SAAgB,EAAW,EAAc,EAA8B,CACrE,IAAM,EAAM,kBAAkB,IAC9B,OAAO,EAAa,EAAI,CAAG,EAAE,EAAI,CAAG,KAItC,SAAgB,EAAY,EAAc,EAAyB,EAA8B,CAC/F,IAAM,EAAM,kBAAkB,EAAK,GAAG,IACtC,OAAO,EAAa,EAAI,CAAG,EAAE,EAAI,CAAG,KAetC,SAAgB,EAAqB,EAAqB,EAAuB,CAC/E,GAAM,CAAE,gBAAe,YAAW,UAAW,EAAI,WAC3C,EAAQ,OAAO,QAAQ,GAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAM,KAAU,CACnE,IAAM,EAAQ,EAAI,OAAO,GAEzB,MADI,CAAC,EAAK,SAAY,OAAO,GAAU,UAAY,OAAO,GAAU,UAAa,IAAU,EAAc,GAAc,EAAE,CAClH,EAAY,EAAM,EAAO,EAAE,EAAI,EAAE,EACxC,CACF,MAAO,CAAC,EAAA,EAAmB,EAAI,GAAI,EAAI,OAAQ,EAAe,EAAU,CAAE,GAAG,EAAM,CAAC,KAAK,IAAI"}
1
+ {"version":3,"file":"indicatorInputWords-BfWHWL0K.cjs","names":[],"sources":["../src/widget/indicatorInputWords.ts"],"sourcesContent":["import type { IndicatorDescriptor } from '@tradecanvas/commons';\nimport { indicatorChipLabel } from '../indicatorLabel.js';\nimport { EN_MESSAGES, type MessageKey, type Translator } from './i18n.js';\n\n/**\n * Words for an indicator's inputs in the widget's language: an input named\n * `anchor` is `indicatorInput.anchor`, its choice `'week'` is\n * `indicatorInput.anchor.week`. Only inputs the widget has words for; any\n * other keeps its own label and its values as they are.\n */\n\n/** Whether the widget has a message under `key`, one built from an input's name. */\nfunction isMessageKey(key: string): key is MessageKey {\n return Object.prototype.hasOwnProperty.call(EN_MESSAGES, key);\n}\n\n/** An input's label in the widget's language, or null for one it has no word for. */\nexport function inputLabel(name: string, t: Translator): string | null {\n const key = `indicatorInput.${name}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** A choice of an input in the widget's language, or null for one it has no word for. */\nexport function choiceLabel(name: string, choice: string | number, t: Translator): string | null {\n const key = `indicatorInput.${name}.${choice}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** An indicator on the chart, as the widget names it. */\nexport interface NamedIndicator {\n id: string;\n params: Record<string, unknown>;\n descriptor: Pick<IndicatorDescriptor, 'defaultConfig' | 'shortName' | 'inputs'>;\n}\n\n/**\n * The indicator's name in the legend, the chips and the Objects panel: its\n * chip label ('EMA 21'), then the word for each choice off its default, so\n * two read apart ('VWAP', 'VWAP Week'). The CSV column keeps the chip label.\n */\nexport function widgetIndicatorLabel(ind: NamedIndicator, t: Translator): string {\n const { defaultConfig, shortName, inputs } = ind.descriptor;\n const words = Object.entries(inputs ?? {}).flatMap(([name, spec]) => {\n const value = ind.params[name];\n if (!spec.options || (typeof value !== 'string' && typeof value !== 'number') || value === defaultConfig[name]) return [];\n return choiceLabel(name, value, t) ?? [];\n });\n return [indicatorChipLabel(ind.id, ind.params, defaultConfig, shortName), ...words].join(' ');\n}\n"],"mappings":"kFAYA,SAAS,EAAa,EAAgC,CACpD,OAAO,OAAO,UAAU,eAAe,KAAK,EAAA,EAAa,EAAI,CAI/D,SAAgB,EAAW,EAAc,EAA8B,CACrE,IAAM,EAAM,kBAAkB,IAC9B,OAAO,EAAa,EAAI,CAAG,EAAE,EAAI,CAAG,KAItC,SAAgB,EAAY,EAAc,EAAyB,EAA8B,CAC/F,IAAM,EAAM,kBAAkB,EAAK,GAAG,IACtC,OAAO,EAAa,EAAI,CAAG,EAAE,EAAI,CAAG,KAetC,SAAgB,EAAqB,EAAqB,EAAuB,CAC/E,GAAM,CAAE,gBAAe,YAAW,UAAW,EAAI,WAC3C,EAAQ,OAAO,QAAQ,GAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAM,KAAU,CACnE,IAAM,EAAQ,EAAI,OAAO,GAEzB,MADI,CAAC,EAAK,SAAY,OAAO,GAAU,UAAY,OAAO,GAAU,UAAa,IAAU,EAAc,GAAc,EAAE,CAClH,EAAY,EAAM,EAAO,EAAE,EAAI,EAAE,EACxC,CACF,MAAO,CAAC,EAAA,EAAmB,EAAI,GAAI,EAAI,OAAQ,EAAe,EAAU,CAAE,GAAG,EAAM,CAAC,KAAK,IAAI"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./indicatorLabel-Sbegyhp2.js";
1
+ import { t as e } from "./indicatorLabel-BsidWCv1.js";
2
2
  import { c as t } from "./i18n-Ci4pfuXw.js";
3
3
  //#region src/widget/indicatorInputWords.ts
4
4
  function n(e) {
@@ -22,4 +22,4 @@ function a(t, n) {
22
22
  //#endregion
23
23
  export { r as n, a as r, i as t };
24
24
 
25
- //# sourceMappingURL=indicatorInputWords-yN99aPYU.js.map
25
+ //# sourceMappingURL=indicatorInputWords-DpkxBon4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indicatorInputWords-yN99aPYU.js","names":[],"sources":["../src/widget/indicatorInputWords.ts"],"sourcesContent":["import type { IndicatorDescriptor } from '@tradecanvas/commons';\nimport { indicatorChipLabel } from '../indicatorLabel.js';\nimport { EN_MESSAGES, type MessageKey, type Translator } from './i18n.js';\n\n/**\n * Words for an indicator's inputs in the widget's language: an input named\n * `anchor` is `indicatorInput.anchor`, its choice `'week'` is\n * `indicatorInput.anchor.week`. Only inputs the widget has words for; any\n * other keeps its own label and its values as they are.\n */\n\n/** Whether the widget has a message under `key`, one built from an input's name. */\nfunction isMessageKey(key: string): key is MessageKey {\n return Object.prototype.hasOwnProperty.call(EN_MESSAGES, key);\n}\n\n/** An input's label in the widget's language, or null for one it has no word for. */\nexport function inputLabel(name: string, t: Translator): string | null {\n const key = `indicatorInput.${name}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** A choice of an input in the widget's language, or null for one it has no word for. */\nexport function choiceLabel(name: string, choice: string | number, t: Translator): string | null {\n const key = `indicatorInput.${name}.${choice}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** An indicator on the chart, as the widget names it. */\nexport interface NamedIndicator {\n id: string;\n params: Record<string, unknown>;\n descriptor: Pick<IndicatorDescriptor, 'defaultConfig' | 'shortName' | 'inputs'>;\n}\n\n/**\n * The indicator's name in the legend, the chips and the Objects panel: its\n * chip label ('EMA 21'), then the word for each choice off its default, so\n * two read apart ('VWAP', 'VWAP Week'). The CSV column keeps the chip label.\n */\nexport function widgetIndicatorLabel(ind: NamedIndicator, t: Translator): string {\n const { defaultConfig, shortName, inputs } = ind.descriptor;\n const words = Object.entries(inputs ?? {}).flatMap(([name, spec]) => {\n const value = ind.params[name];\n if (!spec.options || (typeof value !== 'string' && typeof value !== 'number') || value === defaultConfig[name]) return [];\n return choiceLabel(name, value, t) ?? [];\n });\n return [indicatorChipLabel(ind.id, ind.params, defaultConfig, shortName), ...words].join(' ');\n}\n"],"mappings":";;;AAYA,SAAS,EAAa,GAAgC;AACpD,QAAO,OAAO,UAAU,eAAe,KAAK,GAAa,EAAI;;AAI/D,SAAgB,EAAW,GAAc,GAA8B;CACrE,IAAM,IAAM,kBAAkB;AAC9B,QAAO,EAAa,EAAI,GAAG,EAAE,EAAI,GAAG;;AAItC,SAAgB,EAAY,GAAc,GAAyB,GAA8B;CAC/F,IAAM,IAAM,kBAAkB,EAAK,GAAG;AACtC,QAAO,EAAa,EAAI,GAAG,EAAE,EAAI,GAAG;;AAetC,SAAgB,EAAqB,GAAqB,GAAuB;CAC/E,IAAM,EAAE,kBAAe,cAAW,cAAW,EAAI,YAC3C,IAAQ,OAAO,QAAQ,KAAU,EAAE,CAAC,CAAC,SAAS,CAAC,GAAM,OAAU;EACnE,IAAM,IAAQ,EAAI,OAAO;AAEzB,SADI,CAAC,EAAK,WAAY,OAAO,KAAU,YAAY,OAAO,KAAU,YAAa,MAAU,EAAc,KAAc,EAAE,GAClH,EAAY,GAAM,GAAO,EAAE,IAAI,EAAE;GACxC;AACF,QAAO,CAAC,EAAmB,EAAI,IAAI,EAAI,QAAQ,GAAe,EAAU,EAAE,GAAG,EAAM,CAAC,KAAK,IAAI"}
1
+ {"version":3,"file":"indicatorInputWords-DpkxBon4.js","names":[],"sources":["../src/widget/indicatorInputWords.ts"],"sourcesContent":["import type { IndicatorDescriptor } from '@tradecanvas/commons';\nimport { indicatorChipLabel } from '../indicatorLabel.js';\nimport { EN_MESSAGES, type MessageKey, type Translator } from './i18n.js';\n\n/**\n * Words for an indicator's inputs in the widget's language: an input named\n * `anchor` is `indicatorInput.anchor`, its choice `'week'` is\n * `indicatorInput.anchor.week`. Only inputs the widget has words for; any\n * other keeps its own label and its values as they are.\n */\n\n/** Whether the widget has a message under `key`, one built from an input's name. */\nfunction isMessageKey(key: string): key is MessageKey {\n return Object.prototype.hasOwnProperty.call(EN_MESSAGES, key);\n}\n\n/** An input's label in the widget's language, or null for one it has no word for. */\nexport function inputLabel(name: string, t: Translator): string | null {\n const key = `indicatorInput.${name}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** A choice of an input in the widget's language, or null for one it has no word for. */\nexport function choiceLabel(name: string, choice: string | number, t: Translator): string | null {\n const key = `indicatorInput.${name}.${choice}`;\n return isMessageKey(key) ? t(key) : null;\n}\n\n/** An indicator on the chart, as the widget names it. */\nexport interface NamedIndicator {\n id: string;\n params: Record<string, unknown>;\n descriptor: Pick<IndicatorDescriptor, 'defaultConfig' | 'shortName' | 'inputs'>;\n}\n\n/**\n * The indicator's name in the legend, the chips and the Objects panel: its\n * chip label ('EMA 21'), then the word for each choice off its default, so\n * two read apart ('VWAP', 'VWAP Week'). The CSV column keeps the chip label.\n */\nexport function widgetIndicatorLabel(ind: NamedIndicator, t: Translator): string {\n const { defaultConfig, shortName, inputs } = ind.descriptor;\n const words = Object.entries(inputs ?? {}).flatMap(([name, spec]) => {\n const value = ind.params[name];\n if (!spec.options || (typeof value !== 'string' && typeof value !== 'number') || value === defaultConfig[name]) return [];\n return choiceLabel(name, value, t) ?? [];\n });\n return [indicatorChipLabel(ind.id, ind.params, defaultConfig, shortName), ...words].join(' ');\n}\n"],"mappings":";;;AAYA,SAAS,EAAa,GAAgC;AACpD,QAAO,OAAO,UAAU,eAAe,KAAK,GAAa,EAAI;;AAI/D,SAAgB,EAAW,GAAc,GAA8B;CACrE,IAAM,IAAM,kBAAkB;AAC9B,QAAO,EAAa,EAAI,GAAG,EAAE,EAAI,GAAG;;AAItC,SAAgB,EAAY,GAAc,GAAyB,GAA8B;CAC/F,IAAM,IAAM,kBAAkB,EAAK,GAAG;AACtC,QAAO,EAAa,EAAI,GAAG,EAAE,EAAI,GAAG;;AAetC,SAAgB,EAAqB,GAAqB,GAAuB;CAC/E,IAAM,EAAE,kBAAe,cAAW,cAAW,EAAI,YAC3C,IAAQ,OAAO,QAAQ,KAAU,EAAE,CAAC,CAAC,SAAS,CAAC,GAAM,OAAU;EACnE,IAAM,IAAQ,EAAI,OAAO;AAEzB,SADI,CAAC,EAAK,WAAY,OAAO,KAAU,YAAY,OAAO,KAAU,YAAa,MAAU,EAAc,KAAc,EAAE,GAClH,EAAY,GAAM,GAAO,EAAE,IAAI,EAAE;GACxC;AACF,QAAO,CAAC,EAAmB,EAAI,IAAI,EAAI,QAAQ,GAAe,EAAU,EAAE,GAAG,EAAM,CAAC,KAAK,IAAI"}
@@ -0,0 +1,2 @@
1
+ let e=require(`@tradecanvas/commons`);var t=3,n={stochrsi:4,ichimoku:4};function r(r,i,a,o){let s=Object.keys(a||i).map(e=>i[e]).filter(e=>typeof e==`number`&&Number.isFinite(e)).slice(0,n[r]??t).map(e=>String(Number(e.toFixed(4)))),c=typeof i.symbol==`string`&&i.symbol?[(0,e.tickerOf)(i.symbol)]:[];return[r===`spread`&&i.mode===`ratio`?`Ratio`:o??r.toUpperCase(),...c,...s].join(` `)}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
2
+ //# sourceMappingURL=indicatorLabel-BQ6Kdry2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicatorLabel-BQ6Kdry2.cjs","names":[],"sources":["../src/indicatorLabel.ts"],"sourcesContent":["import { tickerOf } from '@tradecanvas/commons';\n\n/** How many numeric parameters a label shows, so a long list stays short. */\nconst LABEL_NUMBERS = 3;\n\n/**\n * Indicators whose label shows more than that, because every one of the\n * lengths named tells two instances apart: Stochastic RSI's %D smoothing is\n * its fourth, and without it a 3/3 and a 3/5 read the same; Ichimoku's\n * displacement is its fourth.\n */\nconst LABEL_NUMBERS_BY_ID: Readonly<Record<string, number>> = { stochrsi: 4, ichimoku: 4 };\n\n/**\n * \"EMA 20\", \"BB 20 2\", \"MACD 12 26 9\": the short name (`shortName`, else the\n * id in capitals) plus up to three numeric parameters (four for Stochastic\n * RSI and Ichimoku), in the indicator's own order, so two instances of the same indicator\n * can be told apart.\n */\nexport function indicatorChipLabel(\n id: string,\n params: Record<string, unknown>,\n defaults?: Record<string, unknown>,\n shortName?: string,\n): string {\n const order = defaults ? Object.keys(defaults) : Object.keys(params);\n const numbers = order\n .map((k) => params[k])\n .filter((v): v is number => typeof v === 'number' && Number.isFinite(v))\n .slice(0, LABEL_NUMBERS_BY_ID[id] ?? LABEL_NUMBERS)\n .map((v) => String(Number(v.toFixed(4))));\n // An indicator on another symbol is named after its ticker (\"Compare ETHUSDT\", \"Ratio NVDA\"), as the toolbar shows it.\n const symbol = typeof params.symbol === 'string' && params.symbol ? [tickerOf(params.symbol)] : [];\n const name = id === 'spread' && params.mode === 'ratio' ? 'Ratio' : shortName ?? id.toUpperCase();\n return [name, ...symbol, ...numbers].join(' ');\n}\n"],"mappings":"sCAGA,IAAM,EAAgB,EAQhB,EAAwD,CAAE,SAAU,EAAG,SAAU,EAAG,CAQ1F,SAAgB,EACd,EACA,EACA,EACA,EACQ,CAER,IAAM,EADmB,OAAO,KAAlB,GAA+C,EAAO,CAEjE,IAAK,GAAM,EAAO,GAAG,CACrB,OAAQ,GAAmB,OAAO,GAAM,UAAY,OAAO,SAAS,EAAE,CAAC,CACvE,MAAM,EAAG,EAAoB,IAAO,EAAc,CAClD,IAAK,GAAM,OAAO,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAErC,EAAS,OAAO,EAAO,QAAW,UAAY,EAAO,OAAS,EAAA,EAAA,EAAA,UAAU,EAAO,OAAO,CAAC,CAAG,EAAE,CAElG,MAAO,CADM,IAAO,UAAY,EAAO,OAAS,QAAU,QAAU,GAAa,EAAG,aAAa,CACnF,GAAG,EAAQ,GAAG,EAAQ,CAAC,KAAK,IAAI"}
@@ -0,0 +1,18 @@
1
+ import { tickerOf as e } from "@tradecanvas/commons";
2
+ //#region src/indicatorLabel.ts
3
+ var t = 3, n = {
4
+ stochrsi: 4,
5
+ ichimoku: 4
6
+ };
7
+ function r(r, i, a, o) {
8
+ let s = Object.keys(a || i).map((e) => i[e]).filter((e) => typeof e == "number" && Number.isFinite(e)).slice(0, n[r] ?? t).map((e) => String(Number(e.toFixed(4)))), c = typeof i.symbol == "string" && i.symbol ? [e(i.symbol)] : [];
9
+ return [
10
+ r === "spread" && i.mode === "ratio" ? "Ratio" : o ?? r.toUpperCase(),
11
+ ...c,
12
+ ...s
13
+ ].join(" ");
14
+ }
15
+ //#endregion
16
+ export { r as t };
17
+
18
+ //# sourceMappingURL=indicatorLabel-BsidWCv1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicatorLabel-BsidWCv1.js","names":[],"sources":["../src/indicatorLabel.ts"],"sourcesContent":["import { tickerOf } from '@tradecanvas/commons';\n\n/** How many numeric parameters a label shows, so a long list stays short. */\nconst LABEL_NUMBERS = 3;\n\n/**\n * Indicators whose label shows more than that, because every one of the\n * lengths named tells two instances apart: Stochastic RSI's %D smoothing is\n * its fourth, and without it a 3/3 and a 3/5 read the same; Ichimoku's\n * displacement is its fourth.\n */\nconst LABEL_NUMBERS_BY_ID: Readonly<Record<string, number>> = { stochrsi: 4, ichimoku: 4 };\n\n/**\n * \"EMA 20\", \"BB 20 2\", \"MACD 12 26 9\": the short name (`shortName`, else the\n * id in capitals) plus up to three numeric parameters (four for Stochastic\n * RSI and Ichimoku), in the indicator's own order, so two instances of the same indicator\n * can be told apart.\n */\nexport function indicatorChipLabel(\n id: string,\n params: Record<string, unknown>,\n defaults?: Record<string, unknown>,\n shortName?: string,\n): string {\n const order = defaults ? Object.keys(defaults) : Object.keys(params);\n const numbers = order\n .map((k) => params[k])\n .filter((v): v is number => typeof v === 'number' && Number.isFinite(v))\n .slice(0, LABEL_NUMBERS_BY_ID[id] ?? LABEL_NUMBERS)\n .map((v) => String(Number(v.toFixed(4))));\n // An indicator on another symbol is named after its ticker (\"Compare ETHUSDT\", \"Ratio NVDA\"), as the toolbar shows it.\n const symbol = typeof params.symbol === 'string' && params.symbol ? [tickerOf(params.symbol)] : [];\n const name = id === 'spread' && params.mode === 'ratio' ? 'Ratio' : shortName ?? id.toUpperCase();\n return [name, ...symbol, ...numbers].join(' ');\n}\n"],"mappings":";;AAGA,IAAM,IAAgB,GAQhB,IAAwD;CAAE,UAAU;CAAG,UAAU;CAAG;AAQ1F,SAAgB,EACd,GACA,GACA,GACA,GACQ;CAER,IAAM,IADmB,OAAO,KAAlB,KAA+C,EAAO,CAEjE,KAAK,MAAM,EAAO,GAAG,CACrB,QAAQ,MAAmB,OAAO,KAAM,YAAY,OAAO,SAAS,EAAE,CAAC,CACvE,MAAM,GAAG,EAAoB,MAAO,EAAc,CAClD,KAAK,MAAM,OAAO,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAErC,IAAS,OAAO,EAAO,UAAW,YAAY,EAAO,SAAS,CAAC,EAAS,EAAO,OAAO,CAAC,GAAG,EAAE;AAElG,QAAO;EADM,MAAO,YAAY,EAAO,SAAS,UAAU,UAAU,KAAa,EAAG,aAAa;EACnF,GAAG;EAAQ,GAAG;EAAQ,CAAC,KAAK,IAAI"}