@tradecanvas/chart 1.83.0 → 1.84.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.
- package/dist/Chart.d.ts +28 -1
- package/dist/Chart.d.ts.map +1 -1
- package/dist/{LayoutSession-BoiToS9y.js → LayoutSession-BQKWbCCS.js} +443 -424
- package/dist/LayoutSession-BQKWbCCS.js.map +1 -0
- package/dist/LayoutSession-DNv5ck-9.cjs +2 -0
- package/dist/LayoutSession-DNv5ck-9.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/model/PaneLayout.d.ts +1 -1
- package/dist/model/PaneLayout.d.ts.map +1 -1
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/WidgetDockArea.d.ts +7 -0
- package/dist/widget/WidgetDockArea.d.ts.map +1 -1
- package/dist/widget/WidgetLegendView.d.ts.map +1 -1
- package/dist/widget/index.cjs +12 -3
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +11 -5
- package/dist/widget/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/LayoutSession-B4qMfaP7.cjs +0 -2
- package/dist/LayoutSession-B4qMfaP7.cjs.map +0 -1
- package/dist/LayoutSession-BoiToS9y.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradecanvas/chart",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.84.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "High-performance canvas trading chart with built-in indicators, drawing tools, and real-time streaming. Zero external dependencies.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"README.md"
|
|
64
64
|
],
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@tradecanvas/
|
|
67
|
-
"@tradecanvas/
|
|
66
|
+
"@tradecanvas/core": "1.84.0",
|
|
67
|
+
"@tradecanvas/commons": "1.84.0"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"jsdom": "^25.0.1",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./indicatorLabel-BQ6Kdry2.cjs`);let t=require(`@tradecanvas/commons`),n=require(`@tradecanvas/core`);var r=864e5,i=10;function a(e,a){let o=(0,t.symbolTimeZone)(e);if(!o||!(0,t.isValidTimeZone)(o)||a.length<2)return null;let s=(e?.sessions??[]).flatMap(e=>{let n=(0,t.sessionMinute)(e.start),r=(0,t.sessionMinute)(e.end);return n===null||r===null?[]:[{startMinute:n,endMinute:r}]});if(s.length===0)return null;let c=(0,t.barTimeUnit)(a),l=1/0;for(let e=Math.max(1,a.length-i);e<a.length;e++){let t=(a[e].time-a[e-1].time)*c;t>0&&t<l&&(l=t)}if(!(l<r))return null;let u={timeZone:o,windows:s,startMinute:s[0].startMinute,endMinute:s[s.length-1].endMinute};return e=>(0,n.isRegularSession)(e*c,u)}var o={role:`chart`,summary:`{what}. Last price {close}.`,empty:`Chart, no data.`,view:`Showing {count} bars, {from} to {to}. High {high}, low {low}.`,bar:`{time}: open {open}, high {high}, low {low}, close {close}, volume {volume}.`,keys:`Arrow keys scroll and zoom, Home and End go to the start and the end. Comma and period read the bars one at a time.`},s=(e,t)=>e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e),c=[`role`,`aria-roledescription`,`aria-label`,`aria-describedby`],l=400,u=1e3,d=class{live;help;labels;cursor=null;viewTimer=null;before=new Map;summaryAt=0;summaryTimer=null;onBlur=()=>{this.cursor=null,this.source.showBar(null)};constructor(e,t,n={}){this.container=e,this.source=t,this.labels={...o,...n};for(let t of c)this.before.set(t,e.getAttribute(t));e.setAttribute(`role`,`application`),this.help=f(`div`,`tc-sr-only`),this.help.id=`tc-chart-keys-${Math.random().toString(36).slice(2,10)}`,e.setAttribute(`aria-describedby`,this.help.id),this.live=f(`div`,`tc-sr-only tc-sr-live`),this.live.setAttribute(`aria-live`,`polite`),this.live.setAttribute(`aria-atomic`,`true`),e.append(this.help,this.live),e.addEventListener(`blur`,this.onBlur),this.applyLabels()}setLabels(e){this.labels={...o,...e},this.applyLabels()}refresh(e=!1){let t=u-(Date.now()-this.summaryAt);if(e||t<=0||this.container.getAttribute(`aria-label`)===this.labels.empty){this.summaryTimer&&clearTimeout(this.summaryTimer),this.summaryTimer=null,this.summaryAt=Date.now(),this.container.setAttribute(`aria-label`,this.summary());return}this.summaryTimer??=setTimeout(()=>{this.summaryTimer=null,this.refresh(!0)},t)}viewMoved(){this.cursor=null,this.viewTimer&&clearTimeout(this.viewTimer),this.viewTimer=setTimeout(()=>{this.viewTimer=null,this.say(this.viewText())},l)}readBar(e){let t=this.source.bars();if(t.length===0){this.say(this.labels.empty);return}let{to:n}=this.source.visibleRange(),r=Math.max(0,Math.min(t.length-1,Math.floor(n)));this.cursor=this.cursor===null?r:Math.max(0,Math.min(t.length-1,this.cursor+e));let i=t[this.cursor];this.source.showBar(i.time);let a=this.source.formatPrice;this.say(s(this.labels.bar,{time:this.source.formatTime(i.time),open:a(i.open),high:a(i.high),low:a(i.low),close:a(i.close),volume:p(i.volume??0)}))}destroy(){this.viewTimer&&clearTimeout(this.viewTimer),this.summaryTimer&&clearTimeout(this.summaryTimer),this.container.removeEventListener(`blur`,this.onBlur);for(let[e,t]of this.before)t===null?this.container.removeAttribute(e):this.container.setAttribute(e,t);this.help.remove(),this.live.remove()}applyLabels(){this.container.setAttribute(`aria-roledescription`,this.labels.role),this.help.textContent=this.labels.keys,this.refresh(!0)}summary(){let e=this.source.bars();if(e.length===0)return this.labels.empty;let t=this.source.chartType(),n=[this.source.symbol(),this.labels.typeName?this.labels.typeName(t):t,this.source.timeframe()].filter(Boolean).join(`, `);return s(this.labels.summary,{what:n,close:this.source.formatPrice(e[e.length-1].close)})}viewText(){let e=this.source.bars();if(e.length===0)return this.labels.empty;let t=this.source.visibleRange(),n=Math.max(0,Math.min(e.length-1,Math.ceil(t.from))),r=Math.max(n,Math.min(e.length-1,Math.floor(t.to))),i=-1/0,a=1/0;for(let t=n;t<=r;t++)i=Math.max(i,e[t].high),a=Math.min(a,e[t].low);return s(this.labels.view,{count:r-n+1,from:this.source.formatTime(e[n].time),to:this.source.formatTime(e[r].time),high:this.source.formatPrice(i),low:this.source.formatPrice(a)})}say(e){this.live.textContent=e}};function f(e,t){let n=document.createElement(e);return n.className=t,Object.assign(n.style,{position:`absolute`,width:`1px`,height:`1px`,margin:`-1px`,padding:`0`,overflow:`hidden`,clip:`rect(0 0 0 0)`,whiteSpace:`nowrap`,border:`0`}),n}function p(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function m(e){switch(e){case`candlestick`:case`heikinAshi`:case`lineBreak`:case`rangeBars`:return new n.CandlestickRenderer;case`line`:return new n.LineRenderer;case`area`:return new n.AreaRenderer;case`bar`:return new n.BarRenderer;case`hollowCandle`:return new n.HollowCandleRenderer;case`baseline`:return new n.BaselineRenderer;case`renko`:return new n.RenkoRenderer;case`kagi`:return new n.KagiRenderer;case`pointAndFigure`:return new n.PointAndFigureRenderer;case`volumeCandles`:return new n.VolumeCandleRenderer;case`equivolume`:return new n.EquivolumeRenderer;case`hlcArea`:return new n.HLCAreaRenderer;case`stepLine`:return new n.StepLineRenderer;case`lineWithMarkers`:return new n.LineWithMarkersRenderer;case`hiLo`:return new n.HiLoRenderer;default:return new n.CandlestickRenderer}}function h(e,t,r={},i,a){if(t.length===0)return t;switch(e){case`heikinAshi`:return(0,n.toHeikinAshi)(t);case`renko`:{let e=r.renko?.boxSize;return typeof e==`number`?(0,n.toRenko)(t,{brickSize:e},a):(0,n.toRenko)(t,{brickSize:0,useATR:!0,atrPeriod:r.renko?.atrPeriod??14},a)}case`lineBreak`:return(0,n.toLineBreak)(t,r.lineBreak?.lines??3);case`kagi`:return(0,n.toKagi)(t,r.kagi?.reversal??4,r.kagi?.reversalType??`percent`,a);case`pointAndFigure`:return v(t,r,a).columns;case`rangeBars`:return(0,n.toRangeBars)(t,{rangeSize:se(t,r,i),includeForming:!0},a);default:return t}}function g(e){switch(e){case`heikinAshi`:case`renko`:case`lineBreak`:case`kagi`:case`pointAndFigure`:case`rangeBars`:return!0;default:return!1}}function _(e){return e!==`heikinAshi`&&g(e)}function v(e,t={},r){return(0,n.pointAndFigureColumns)(e,te(e,t),t.pointAndFigure?.reversal??3,r)}var y=50,ee=.01;function te(e,n={}){let r=n.pointAndFigure?.boxSize;if(typeof r==`number`)return r;let i=ne(e,e.length>1?e.length-1:e.length);return i>0?b((0,t.niceNumber)(i/y,!0)):Math.abs(e[e.length-1]?.close??0)*ee||1}function ne(e,t){let n=-1/0,r=1/0;for(let i=0;i<t;i++)e[i].high>n&&(n=e[i].high),e[i].low<r&&(r=e[i].low);let i=n-r;return Number.isFinite(i)?i:0}var re=100,ie=3,ae=.01,oe=15,b=e=>Number(e.toPrecision(oe));function se(e,n={},r){let i=n.rangeBars?.range;if(typeof i==`number`)return i;let a=e.length>=ie?ce(e):0,o=Math.abs(e[e.length-1]?.close??0);return de(b((0,t.niceNumber)(a>0?a:o*ae||1,!0)),r)}function x(e){let t=e.length-1;return{from:Math.max(0,t-re),end:t}}function ce(e){let{from:t,end:n}=x(e),r=0;for(let i=t;i<n;i++){let{high:t,low:n}=e[i],a=i>0?e[i-1].close:n;r+=Math.max(t-n,Math.abs(t-a),Math.abs(n-a))}return n>t?r/(n-t):0}function le(e,t){let{from:n,end:r}=x(e);if(r<=n)return t(e[e.length-1]?.close??0);let i=-1/0,a=1/0;for(let t=n;t<r;t++)i=Math.max(i,e[t].high),a=Math.min(a,e[t].low);return ue(t(i),t(a))}function ue(e,t){return e===void 0?t:t===void 0?e:Math.max(e,t)}function de(e,t){return t===void 0||!(t>0)?e:b(Math.max(1,Math.round(e/t))*t)}function fe(e,t){let n=t?.(e);return n?n.createRenderer():m(e)}function pe(e,t,n,r,i,a){if(t.length===0)return t;let o=n?.(e);return o?.transform?o.transform(t):h(e,t,r,i,a)}var me=class{timer=null;delayMs=0;key=null;constructor(e){this.save=e}enable(e,t){this.key=e,this.delayMs=t}disable(){this.key=null,this.delayMs=0,this.cancel()}schedule(){this.delayMs<=0||!this.key||(this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=null,this.key&&this.save(this.key)},this.delayMs))}cancel(){this.timer&&=(clearTimeout(this.timer),null)}isEnabled(){return this.delayMs>0&&this.key!==null}hasPending(){return this.timer!==null}};function S(e){if(!e||typeof e.time!=`number`||!Number.isFinite(e.time))return!1;let{open:t,high:n,low:r,close:i}=e;return!(!isFinite(t)||!isFinite(n)||!isFinite(r)||!isFinite(i)||t<0||n<0||r<0||i<0||n<r||e.volume!==void 0&&(!isFinite(e.volume)||e.volume<0))}function he(e){return e.volume!==void 0&&e.high>=e.open&&e.high>=e.close&&e.low<=e.open&&e.low<=e.close}function C(e){return{...e,high:Math.max(e.open,e.high,e.low,e.close),low:Math.min(e.open,e.high,e.low,e.close),volume:e.volume===void 0?0:Math.max(0,e.volume)}}function w(e,t){return e===t||e.time===t.time&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.close===t.close&&e.volume===t.volume}function ge(e,t){for(let n=e.length-1;n>=0;n--){if(e[n].time===t)return n;if(e[n].time<t)return-1}return-1}var _e={index:-1,changed:!1};function ve(e,n){if(e.length===0)return n;let r=(0,t.normalizeBarTime)(n);return(0,t.barTimeUnit)(e)===1?r:r/1e3}function T(e,t){let n=ve(e,t.time);return n===t.time?t:{...t,time:n}}var E=class{data=[];changes=0;withSeriesTime(e){return T(this.data,e)}getData(){return this.data}version(){return this.changes}setData(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];S(r)&&t.push(he(r)?r:C(r))}this.data=t,this.changes++}prependBars(e){let t=this.data.length>0?this.data[0].time:1/0,n=[];for(let r=0;r<e.length;r++){if(!S(e[r]))continue;let i=this.withSeriesTime(e[r]);i.time>=t||n.push(he(i)?i:C(i))}if(n.length===0)return 0;n.sort((e,t)=>e.time-t.time);let r=0;for(let e=0;e<n.length;e++)r>0&&n[r-1].time===n[e].time||(n[r++]=n[e]);return n.length=r,this.data=n.concat(this.data),this.changes++,r}appendBar(e){S(e)&&(this.data.push(C(this.withSeriesTime(e))),this.changes++)}updateLastBar(e){if(!S(e))return;let t=C(this.withSeriesTime(e));if(this.changes++,this.data.length===0){this.data.push(t);return}this.data[this.data.length-1]=t}replaceBar(e){if(!S(e))return _e;let t=this.withSeriesTime(e),n=ge(this.data,t.time);if(n<0)return _e;let r=C(t);return w(this.data[n],r)?{index:n,changed:!1}:(this.data[n]=r,this.changes++,{index:n,changed:!0})}updateLastBarFromTick(e){this.data.length!==0&&(!isFinite(e.price)||e.price<0||e.volume!==void 0&&(!isFinite(e.volume)||e.volume<0)||(this.data[this.data.length-1]=(0,t.mergeBar)(this.data[this.data.length-1],this.withSeriesTime(e)),this.changes++))}getLength(){return this.data.length}clear(){this.data=[],this.changes++}},D={to:`none`,index:-1,changed:!1};function O(e,n){let r=e[e.length-1];if(!r)return`append`;let i=(0,t.normalizeBarTime)(n.time),a=(0,t.normalizeBarTime)(r.time);return i>a?`append`:i===a?`update`:`stale`}function ye(e){return[e.time,e.open,e.high,e.low,e.close].every(Number.isFinite)}var be=class{shown=new E;whole=null;aside=null;shownRevision=0;constructor(e,t=()=>{}){this.hoursFilter=e,this.onLiveChange=t}bars(){return this.shown.getData()}length(){return this.shown.getLength()}revision(){return this.shownRevision}version(){return this.shown.version()}liveBars(){return this.aside?.getData()??this.whole??this.shown.getData()}load(e){if(this.aside){this.aside.setData(e),this.onLiveChange({kind:`series`});return}this.shown.setData(this.regularOnly(e))}prepend(e){if(this.aside){let t=this.aside.prependBars(e);return t>0&&this.onLiveChange({kind:`older`,taken:t}),{added:0,taken:t}}let t=null,n=e;if(this.whole){let r=this.whole[0]?.time,i=new Set,a=e.filter(ye).map(e=>this.inSeriesUnit(e)).filter(e=>(r===void 0||e.time<r)&&!i.has(e.time)&&i.add(e.time)).sort((e,t)=>e.time-t.time);this.whole=[...a,...this.whole];let o=this.hoursFilter(this.whole);t=a.length,n=o?a.filter(e=>o(e.time)):a}let r=this.shown.prependBars(n);return{added:r,taken:t??r}}mergeSnapshot(e){if(this.aside)return this.aside.setData(xe(this.aside.getData(),e)??e),this.onLiveChange({kind:`series`}),!0;let t=xe(this.whole??this.shown.getData(),e);return t?(this.shown.setData(this.regularOnly(t)),!0):!1}refilter(){if(this.aside)return this.onLiveChange({kind:`hours`}),!1;let e=this.whole??this.shown.getData().slice();return!this.whole&&!this.hoursFilter(e)?!1:(this.shown.setData(this.regularOnly(e)),!0)}append(e){if(this.aside)return this.aside.appendBar(e),this.wrote(`aside`,!1);let t=this.inSeriesUnit(e),n=this.startWholeSeries(t,`append`);if(!this.take(t,`append`))return this.wrote(`hidden`,n);let r=this.shown.getLength();return this.shown.appendBar(t),{to:`shown`,before:r,refiltered:n}}appendMany(e){if(this.aside){for(let t of e)this.aside.appendBar(t);return{shown:0,before:this.shown.getLength(),refiltered:!1,aside:!0}}let t=!1,n=[];for(let r of e){let e=this.inSeriesUnit(r);t=this.startWholeSeries(e,`append`)||t,this.take(e,`append`)&&n.push(e)}let r=this.shown.getLength();for(let e of n)this.shown.appendBar(e);return{shown:n.length,before:r,refiltered:t,aside:!1}}updateLast(e){if(this.aside)return this.aside.updateLastBar(e),this.wrote(`aside`,!1);let t=this.inSeriesUnit(e),n=this.startWholeSeries(t,`update`);if(!this.take(t,`update`))return this.wrote(`hidden`,n);let r=this.shown.getLength();return this.shown.updateLastBar(t),{to:`shown`,before:r,refiltered:n}}mergeTick(e){if(this.aside)return this.aside.updateLastBarFromTick(e),this.wrote(`aside`,!1);let t=this.whole?this.hoursFilter(this.whole):null;if(t&&this.whole&&!t(ve(this.whole,e.time)))return this.wrote(`hidden`,!1);let n=this.shown.getLength();this.shown.updateLastBarFromTick(e);let r=this.whole,i=this.shown.getData()[this.shown.getLength()-1];return r&&i&&r.length>0&&r[r.length-1].time===i.time&&(r[r.length-1]=i),{to:`shown`,before:n,refiltered:!1}}placeStreamBar(e){if(this.aside){let t=O(this.aside.getData(),e);return t===`append`?this.aside.appendBar(e):t===`update`&&this.aside.updateLastBar(e),this.wrote(t===`stale`?`none`:`aside`,!1)}let t=this.inSeriesUnit(e),n=O(this.whole??this.shown.getData(),t);if(n===`stale`)return this.wrote(`none`,!1);let r=this.startWholeSeries(t,n);if(!this.take(t,n))return this.wrote(`hidden`,r);let i=this.shown.getLength(),a=O(this.shown.getData(),t);return a===`stale`?{to:`none`,before:i,refiltered:r}:(a===`append`?this.shown.appendBar(t):this.shown.updateLastBar(t),{to:`shown`,before:i,refiltered:r})}replace(e){if(this.aside){let{index:t,changed:n}=this.aside.replaceBar(e);return t<0?D:(n&&this.onLiveChange({kind:`bar`,time:this.aside.getData()[t].time}),{to:`aside`,index:-1,changed:n})}if(!S(e))return D;let t=this.inSeriesUnit(e),n=this.whole,r=n?ge(n,t.time):-1;if(n){if(r<0||!S(n[r]))return D;let e=this.hoursFilter(n);if(e&&!e(t.time))return this.replaceHidden(n,r,t)}let{index:i,changed:a}=this.shown.replaceBar(t);return i<0?D:(a&&(n&&(n[r]=this.shown.getData()[i]),this.shownRevision++),{to:`shown`,index:i,changed:a})}beginReplay(){this.aside||(this.aside=new E,this.aside.setData(this.whole??this.shown.getData()))}endReplay(){let e=this.aside;return this.aside=null,e?e.getData():null}inHoursShown(e){let t=this.hoursFilter(e);return t?e.filter(e=>t(e.time)):e.slice()}showReplayed(e){this.shown.setData(e)}appendReplayed(e){this.shown.appendBar(e)}updateReplayed(e){this.shown.updateLastBar(e)}inSeriesUnit(e){return T(this.whole??this.shown.getData(),e)}replaceHidden(e,t,n){let r=C(n),i=!w(e[t],r);return i&&(e[t]=r),{to:`hidden`,index:-1,changed:i}}wrote(e,t){return{to:e,before:this.shown.getLength(),refiltered:t}}regularOnly(e){let t=this.hoursFilter(e);return this.whole=t?e.slice():null,t?e.filter(e=>t(e.time)):e}startWholeSeries(e,t){if(this.whole)return!1;let n=this.shown.getData(),r=n.slice(-12),i=t===`append`||r.length===0?[...r,e]:[...r.slice(0,-1),e];if(!this.hoursFilter(i))return!1;this.whole=n.slice();let a=this.hoursFilter(this.whole.length>1?this.whole:i);return!a||!n.some(e=>!a(e.time))?!1:(this.shown.setData(n.filter(e=>a(e.time))),!0)}take(e,t){let n=this.whole;if(!n)return!0;t===`append`||n.length===0?n.push(e):n[n.length-1]=e;let r=this.hoursFilter(n);return!r||r(e.time)}};function xe(e,t){let n=t[0]?.time,r=0;for(;n!==void 0&&r<e.length&&e[r].time<n;)r++;return r===0||r===e.length?null:e.slice(0,r).concat(t)}var Se=t.PHI**-7,Ce=class{auto;preferred;pending=!0;arriving=!0;constructor(e){this.auto=e,this.preferred=e}isAuto(){return this.auto}shouldFit(){return this.auto||this.pending}setAuto(e,t){this.auto=e,this.preferred=e,!e&&t&&(this.arriving=!1)}hold(){this.auto=!1,this.pending=!1}resume(){this.auto=!0}newSeries(e){this.auto=this.preferred,this.pending=!0,this.arriving=e}settle(e,t){if(!this.pending||t===0||e.chartRect.width<=0)return;let n=e.offset<=0&&t*(e.barWidth+e.barSpacing)-e.offset<=e.chartRect.width;this.arriving&&n||(this.pending=!1)}fit(e,r,i,a){if(r.length===0)return;let o=Math.max(0,i.visibleRange.from),s=Math.min(i.visibleRange.to,r.length-1),c=Te(Te((0,t.computePriceRange)(r,o,s,0),a.overlayRange(o,s)),a.compareRange(r,i)),l=a.volumeRatio(r,o,s),u=l===null?n.PRICE_SCALE_MARGIN:l+Se;e.setScaleMargins(e.isInvertScale()?{top:u,bottom:n.PRICE_SCALE_MARGIN}:{top:n.PRICE_SCALE_MARGIN,bottom:u}),e.fitToPrices(c.min,c.max)}};function we(e,t,n){for(let r=t;r<=n;r++)if(e[r].volume>0)return!0;return!1}function Te(e,t){return e?t?{min:Math.min(e.min,t.min),max:Math.max(e.max,t.max)}:e:t}var Ee=class{series=null;madeAt=null;epoch=0;memo=new n.ReshapeMemo;constructor(e){this.sources=e}get(){let e=this.sources.bars();if(e.length===0)return e;let t=this.sources.chartType(),n=this.sources.chartTypeOptions(),r=t===`rangeBars`?le(e,e=>this.sources.stepAt(e)):void 0,i=this.sources.version(),a=this.madeAt;return this.series&&a&&a.version===i&&a.type===t&&a.options===n&&a.step===r&&a.epoch===this.epoch?this.series:(this.series=this.make(t,e,n,r),this.madeAt={version:i,type:t,options:n,step:r,epoch:this.epoch},this.series)}invalidate(){this.epoch++}reset(){this.invalidate(),this.memo.clear()}make(e,t,n,r){let{lookup:i}=this.sources;if(e!==`pointAndFigure`||i(e))return pe(e,t,i,n,r,this.memo);let{columns:a,boxSize:o}=v(t,n,this.memo);return this.sources.onBoxSize(o),a}},De={min:0,max:100},Oe=class{layout=null;infos=null;styles=new Map;constructor(e,t,n){this.manager=e,this.sources=t,this.onLayout=n}resolved(){return this.layout||(this.layout=this.manager.resolve(),this.onLayout(ke(this.layout))),this.layout}invalidate(){this.layout=null,this.infos=null}invalidateScales(){this.infos=null}panels(e){if(this.infos)return this.infos;let t=e(),{from:n,to:r}=t.visibleRange;return this.infos=this.resolved().panels.map(e=>{let i=e.config.id,a=e.config.logScale?this.sources.getPaneValueRange(i,n,r,!0):null,o=a??this.sources.getPaneValueRange(i,n,r)??{...De},s=this.styles.get(i);return{instanceId:i,members:this.sources.getPaneMembers(i),...s?{style:s}:{},rect:e.rect,viewport:{...t,chartRect:{x:e.rect.x,y:e.rect.y+20,width:e.rect.width,height:Math.max(0,e.rect.height-20)},priceRange:o,logScale:a!==null,scaleMode:e.config.percentScale?`percentage`:`regular`,scaleBaseline:e.config.percentScale?this.baseline(i,n,r):void 0,formatPrice:void 0,pricePrecision:void 0,priceUnit:void 0,invertScale:!!e.config.invertScale}}}),this.infos}timeAxisTop(){let{mainChartRect:e,panels:t}=this.resolved(),n=t.filter(e=>e.config.position===`bottom`).reduce((e,t)=>e+t.rect.height,0);return e.y+e.height+n}offChartType(){let e=this.sources.getActiveIndicators(),t=new Set(e.filter(e=>e.offChartType).map(e=>e.instanceId)),n=new Set;for(let r of this.manager.getPanels()){let i=e.filter(e=>e.instanceId===r.id||e.pane===r.id);i.length>0&&i.every(e=>t.has(e.instanceId))&&n.add(r.id)}return n}style(e){return this.styles.get(e)}setStyle(e,t){return JSON.stringify(t)===JSON.stringify(this.styles.get(e)??null)?!1:(t?this.styles.set(e,t):this.styles.delete(e),this.infos=null,!0)}passStyle(e,t){let n=this.styles.get(e);this.styles.delete(e),t&&n&&this.styles.set(t,n),this.infos=null}baseline(e,t,n){let r=this.sources.getOutput(e)?.series,i=this.sources.getIndicatorDescriptor(e);if(!r||!i)return;let a=i.plots?.[0]?.key;for(let e=Math.max(0,t);e<=n&&e<r.length;e++){let t=r[e];if(!t)continue;let n=a===void 0?Object.values(t).find(e=>typeof e==`number`&&Number.isFinite(e)):t[a];if(typeof n==`number`&&Number.isFinite(n)&&n!==0)return n}}};function ke(e){let t=e.mainChartRect,n=t.y,r=t.y+t.height;for(let t of e.panels)t.config.position!==`top`&&t.config.position!==`bottom`||(n=Math.min(n,t.rect.y),r=Math.max(r,t.rect.y+t.rect.height));return{top:n,bottom:r}}function Ae(e){return e.length>0?{renames:e}:{}}var k=(e,t)=>JSON.stringify(e)===JSON.stringify(t),je=class{steps;snapshot;enabled;now;depth=0;edit=null;renames=null;constructor(e){this.steps=e.steps,this.snapshot=e.snapshot,this.enabled=e.enabled,this.now=e.now??(()=>performance.now())}record(e,t){if(this.depth>0||!this.enabled())return t();let n=this.snapshot(),r=[],i=this.renames;this.renames=r;let a;try{a=this.quietly(t)}finally{this.renames=i}let o=this.snapshot();return k(n,o)||this.push(e,n,o,r),a}push(e,t,n,r){let i=this.now(),a=this.steps.last(),o=a?.type===`indicators`?a.indicators:void 0,s=e!==void 0&&o?.subject===e&&i-(o.at??0)<800&&k(o.after,t),c={type:`indicators`,before:null,after:null};s&&o?k(o.before,n)?this.steps.dropLast():this.steps.replaceLast({...c,indicators:{...o,after:n,at:i,...Ae([...o.renames??[],...r])}}):this.steps.push({...c,indicators:{before:t,after:n,subject:e,at:i,...Ae(r)}})}quietly(e){this.depth++;try{return e()}finally{this.depth--}}renamed(e,t){this.renames?.push([e,t])}begin(e){this.end(),this.enabled()&&(this.edit={subject:e,before:this.snapshot()},this.depth++)}end(){let e=this.edit;if(!e)return;this.edit=null,this.depth--;let t=this.snapshot();k(t,e.before)||this.steps.push({type:`indicators`,before:null,after:null,indicators:{before:e.before,after:t,subject:e.subject,at:this.now()}})}},Me=class{constructor(e,t,n){this.members=e,this.slots=t,this.handover=n}ownsPane(e){return this.slots.getPanels().some(t=>t.id===e)}paneOf(e){return this.members.getIndicatorConfig(e)?.pane??e}hostOf(e,t){if(e===t)return null;if(this.ownsPane(e))return e;let n=this.members.getIndicatorConfig(e)?.pane;return n&&n!==t?n:null}paneFor(e,r,i,a){if(i)return this.hostOf(i,a);if(e.placement!==`overlay`)return null;let o=(0,n.sourceParam)(e),s=o?(0,t.parseIndicatorSource)(r[o]):null;return s?this.hostOf(s.instanceId,a):null}sourceOf(e){let t=this.members.getIndicatorDescriptor(e),r=t?(0,n.sourceParam)(t):null;return r?this.members.getIndicatorConfig(e)?.params[r]:void 0}followSource(e,r){let i=this.members.getIndicatorDescriptor(e),a=this.members.getIndicatorConfig(e),o=i?(0,n.sourceParam)(i):null;if(i?.placement!==`overlay`||!a||!o||a.params[o]===r)return!1;let s=(0,t.parseIndicatorSource)(a.params[o]),c=s?this.hostOf(s.instanceId,e):(0,t.parseIndicatorSource)(r)?null:a.pane??null;return(c??void 0)===a.pane?!1:(this.members.setPane(e,c),!0)}moveHost(e,r){let i=this.members.getIndicatorConfig(e),a=this.members.getIndicatorDescriptor(e);if(!i||!a)return;let o=(0,n.sourceParam)(a);if(a.placement===`overlay`&&o&&(0,t.parseIndicatorSource)(i.params[o]))return;if(r===`price`)return a.placement===`overlay`&&i.pane?null:void 0;if(r===`new`)return a.placement===`panel`&&!this.ownsPane(e)?null:void 0;let s=this.hostOf(r,e);return s&&s!==i.pane&&s!==e?s:void 0}isPanel(e){return this.members.getIndicatorDescriptor(e)?.placement===`panel`}detach(e,t=()=>void 0){if(!this.members.getIndicatorConfig(e))return null;let n=this.members.getPaneMembers(e),r=this.ownsPane(e)?n.find(e=>this.isPanel(e))??null:null;this.members.removeIndicator(e),this.handover.passStyle(e,r),r?(this.members.setPane(r,null),this.handover.renamePane(e,r)):this.slots.removePanel(e);for(let e of n)e!==r&&this.members.setPane(e,r),t(e);return n}move(e,t){let n=this.moveHost(e,t),r=this.members.getIndicatorConfig(e);if(n===void 0||!r)return null;let i=r.pane,a=new Set([e]);if(this.ownsPane(e))for(let t of this.leavePane(e,n))a.add(t);if(this.members.setPane(e,n),t===`new`){this.slots.addPanel(e,`bottom`);for(let t of this.members.getDependents(e))this.members.getIndicatorConfig(t)?.pane===i&&(this.members.setPane(t,e),a.add(t))}return[...a]}leavePane(e,t){let n=this.members.getPaneMembers(e),r=new Set(this.members.getDependents(e)),i=n.filter(e=>!r.has(e)),a=i.find(e=>this.isPanel(e))??null;if(this.handover.passStyle(e,a),a){this.members.setPane(a,null),this.handover.renamePane(e,a);for(let e of i)e!==a&&this.members.setPane(e,a)}else{this.slots.removePanel(e);for(let e of i)this.members.setPane(e,null)}this.handover.invalidateScales();for(let i of n)r.has(i)&&this.members.setPane(i,t??e);return n}};function Ne(e,t,n){let r=t.getPanels(),i=t.getMaximizedPanel();return e.getActiveIndicators().map(t=>{let a=r.find(e=>e.id===t.instanceId),o=e.getIndicatorConfig(t.instanceId),s=a?n(t.instanceId):null;return{id:t.id,instanceId:t.instanceId,params:{...t.params},position:a?.position,style:e.getIndicatorStyle(t.instanceId)??void 0,visible:t.visible,levels:o?.levels?.slice(),pane:t.pane,scale:o?.scale,...o?.intervals?{intervals:e.getIntervals(t.instanceId)??void 0}:{},...s?{paneStyle:{...s}}:{},...a?{paneSize:a.size,paneOrder:r.indexOf(a),...a.collapsed?{paneCollapsed:!0}:{},...i===t.instanceId?{paneMaximized:!0}:{},...a.logScale?{paneLog:!0}:{},...a.invertScale?{paneInvert:!0}:{},...a.percentScale?{panePercent:!0}:{}}:{}}})}function Pe(e,t){for(let[n,r]of t)n.paneSize!==void 0&&e.setPanelSize(r,n.paneSize),(n.paneSize!==void 0||n.paneCollapsed)&&e.setPanelCollapsed(r,!!n.paneCollapsed),n.paneSize!==void 0&&e.setPanelScale(r,{log:!!n.paneLog,invert:!!n.paneInvert,percent:!!n.panePercent});let n=t.filter(([e])=>e.paneOrder!==void 0).sort(([e],[t])=>(e.paneOrder??0)-(t.paneOrder??0)).map(([,e])=>e);n.length>1&&e.orderPanels(n);let r=t.find(([e])=>e.paneMaximized);e.setMaximizedPanel(r?r[1]:null)}function Fe(e){let n=new Map(e.map(e=>[e.instanceId,e])),r=[],i=new Set,a=new Set,o=e=>{if(i.has(e.instanceId)||a.has(e.instanceId))return;a.add(e.instanceId);let s=[e.pane,...Object.values(e.params).map(e=>(0,t.parseIndicatorSource)(e)?.instanceId)];for(let e of s){let t=e?n.get(e):void 0;t&&o(t)}a.delete(e.instanceId),i.add(e.instanceId),r.push(e)};for(let t of e)o(t);return r}function Ie(e,t){return e.id===t.id&&(e.pane??null)===(t.pane??null)&&(e.scale??null)===(t.scale??null)&&e.position===void 0==(t.position===void 0)}function Le(e,t){let n=new Map(t.map(e=>[e.instanceId,e])),r=new Set;for(let t of e){let e=n.get(t.instanceId);e&&Ie(t,e)&&Re(t,e)&&r.add(t.instanceId)}for(let t of e)t.pane&&!r.has(t.pane)&&r.delete(t.instanceId);return r}function Re(e,t){let n=Object.keys(e.params);return n.length===Object.keys(t.params).length&&n.every(e=>e in t.params)}function ze(e,n){let r={...e};for(let[e,i]of Object.entries(r)){let a=(0,t.parseIndicatorSource)(i),o=a&&n.get(a.instanceId);o&&(r[e]=(0,t.indicatorSource)(o,a.key))}return r}function Be(e,t){let r=t.symbol;return n.SYMBOL_INDICATOR_IDS.has(e)&&typeof r==`string`?r.trim():``}var Ve=class{asked=new Set;constructor(e,t){this.readers=e,this.held=t}required(){let e=new Set;for(let t of this.readers.getActiveIndicators()){let n=Be(t.id,t.params);n&&e.add(n)}return[...e]}readersOf(e){let t=e.trim();return this.readers.getActiveIndicators().filter(e=>n.SYMBOL_INDICATOR_IDS.has(e.id)&&String(e.params.symbol??``).trim()===t).map(e=>e.instanceId)}given(e){this.asked.delete(e.trim())}forgetUnread(){let e=new Set(this.required());for(let t of this.asked)e.has(t)||this.asked.delete(t)}toAsk(e){this.forgetUnread();let t=this.readers.getIndicatorConfig(e),n=t?Be(t.id,t.params):``;return!n||this.held.has(n)||this.asked.has(n)?null:(this.asked.add(n),n)}},He=(e,t)=>e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height;function Ue(e,t,n,r){if(!He(e,t)){for(let t of n){let n=r(t.id);if(n&&He(e,n.chartRect))return t.id}return null}}function We(e,t,n,r){if(!e||e.position!==`top`&&e.position!==`bottom`||t)return null;let i=n();return!i||i.chartRect.height<24?null:{...i,data:r()}}function Ge(e,t,n){return!n&&e.some(e=>e.id===t)}var Ke=5e3,qe=6e4,Je=500,Ye=class{loader=null;pageSize=500;loading=!1;exhausted=!1;failures=0;retryAt=0;seq=0;inFlight=null;constructor(e){this.host=e}setLoader(e,t=500){this.loader=e,this.pageSize=Math.max(1,Math.floor(t)),this.reset()}hasLoader(){return this.loader!==null}reset(){this.seq++;let e=this.loading;this.loading=!1,this.exhausted=!1,this.failures=0,this.retryAt=0,e&&this.emit({state:`loaded`,count:0})}isLoading(){return this.loading}hasMore(){return!this.exhausted}maybeLoad(e,t){e>=t||!this.canLoad()||this.failures>=5||this.now()<this.retryAt||this.loadMore()}loadMore(){if(this.loading&&this.inFlight)return this.inFlight;let e=this.loadPage();return this.inFlight=e,e}async loadPage(){let e=this.loader,t=this.host.oldestTime();if(!e||!this.canLoad()||t===null)return 0;let n=this.seq;this.loading=!0,this.emit({state:`loading`,count:0});let r;try{r=await e(t,this.pageSize)}catch(e){return n===this.seq?(this.loading=!1,e instanceof Error&&e.name===`AbortError`?(this.emit({state:`loaded`,count:0}),0):(this.failures++,this.retryAt=this.now()+Math.min(qe,Ke*2**(this.failures-1)),this.emit({state:`error`,count:0,error:e instanceof Error?e.message:String(e)}),0)):0}if(n!==this.seq)return 0;this.loading=!1,this.failures=0,this.retryAt=0;let i=this.host.prepend(r);return i===0?(this.exhausted=!0,this.emit({state:`end`,count:0})):this.emit({state:`loaded`,count:i}),i}canLoad(){return this.loader!==null&&!this.loading&&!this.exhausted}emit(e){try{this.host.emit(e)}catch(e){console.error(`[TradeCanvas] A historyLoad listener threw:`,e)}}now(){return this.host.now?this.host.now():Date.now()}};function Xe(e,t){return e.family===t.family&&e.sizeSmall===t.sizeSmall&&e.sizeMedium===t.sizeMedium&&e.sizeLarge===t.sizeLarge}var Ze=class e{base;shape=null;font=null;themeFont;chartType=`candlestick`;host={};user=new Map;effective=null;constructor(t){this.base=e.read(t),this.themeFont=this.base.font}static read(e){if(!e||e===`dark`)return{...t.DARK_THEME};if(e===`light`)return{...t.LIGHT_THEME};let{style:n,...r}=e;return r}getTheme(){return this.effective??=(0,t.resolveChartTheme)(this.base,this.chartType,this.merged()),this.effective}getBaseTheme(){return this.base}setTheme(t){let n=e.read(t),r=this.font!==null&&Xe(n.font,this.base.font);this.base=n,r||(this.themeFont=n.font),this.shape&&(this.base={...this.base,shape:{...this.base.shape,...this.shape}}),this.font&&(this.base={...this.base,font:{...this.themeFont,...this.font}}),this.effective=null}setFont(e){this.font=e?{...this.font,...e}:null,this.base={...this.base,font:this.font?{...this.themeFont,...this.font}:this.themeFont},this.effective=null}setShape(e){this.shape=e?{...e}:null,this.base={...this.base,shape:e?{...this.base.shape,...e}:this.base.shape},this.effective=null}setChartType(e){e!==this.chartType&&(this.chartType=e,this.effective=null)}applyOverrides(e,t){let n={...this.layer(t)};for(let[t,r]of Object.entries(e))r==null?delete n[t]:n[t]=r;return this.setLayer(t,n)}setOverrides(e,t){return this.setLayer(t,{...e})}resetOverrides(e,t){if(!t)return this.setLayer(e,{});let n={...this.layer(e)};for(let e of t)delete n[e];return this.setLayer(e,n)}getOverrides(e){return{...this.layer(e)}}getUserOverrides(){let e={};for(let[t,n]of this.user)Object.keys(n).length>0&&(e[t]={...n});return e}setUserOverrides(e){return JSON.stringify(e)===JSON.stringify(this.getUserOverrides())?!1:(this.user=new Map(Object.entries(e).map(([e,t])=>[e,{...t}])),this.effective=null,!0)}getStyleValue(e){return(0,t.chartStyleValue)(this.base,this.merged(),e,this.chartType)}layer(e){return e===`host`?this.host:this.user.get(this.base.name)??{}}setLayer(e,t){return JSON.stringify(t)===JSON.stringify(this.layer(e))?!1:(e===`host`?this.host=t:Object.keys(t).length>0?this.user.set(this.base.name,t):this.user.delete(this.base.name),this.effective=null,!0)}merged(){return{...this.host,...this.user.get(this.base.name)}}};function Qe(e,t){return t?{...t.visible===void 0?{}:{[`crosshair.${e}.visible`]:t.visible},...t.color===void 0?{}:{[`crosshair.${e}.color`]:t.color},...t.style===void 0?{}:{[`crosshair.${e}.style`]:t.style},...t.width===void 0?{}:{[`crosshair.${e}.width`]:t.width}}:{}}function $e(e){let{grid:t,crosshair:n}=e,r=n?.vLine?.labelBackground??n?.hLine?.labelBackground;return{...t?.hLineColor===void 0?{}:{"grid.horizontal.color":t.hLineColor},...t?.hLineStyle===void 0?{}:{"grid.horizontal.style":t.hLineStyle},...t?.vLineColor===void 0?{}:{"grid.vertical.color":t.vLineColor},...t?.vLineStyle===void 0?{}:{"grid.vertical.style":t.vLineStyle},...Qe(`horizontal`,n?.hLine),...Qe(`vertical`,n?.vLine),...r===void 0?{}:{"crosshair.labelBackground":r},...e.overrides}}var et=200,tt=80,A=e=>e.position===`top`||e.position===`bottom`,nt=class{panels=[];containerWidth=0;containerHeight=0;priceAxisWidth=t.PRICE_AXIS_WIDTH;leftAxisWidth=0;maximized=null;aside=new Set;resize(e,t){this.containerWidth=e,this.containerHeight=t}addPanel(e,n=`bottom`,r){this.maximized=null;let i=n===`left`||n===`right`;this.panels.push({id:e,position:n,size:r??(i?et:t.DEFAULT_PANEL_HEIGHT),minSize:i?tt:t.MIN_PANEL_HEIGHT,content:{type:`indicator`,indicatorInstanceId:e}})}renamePanel(e,t){let n=this.panels.find(t=>t.id===e);n&&(n.id=t,n.content={...n.content,indicatorInstanceId:t},this.maximized===e&&(this.maximized=t))}removePanel(e){this.panels=this.panels.filter(t=>t.id!==e),this.maximized===e&&(this.maximized=null)}setPanelCollapsed(e,t){let n=this.panels.find(t=>t.id===e);return!n||!A(n)||this.maximized===null&&!!n.collapsed===t?!1:(this.maximized=null,n.collapsed=t||void 0,!0)}isPanelCollapsed(e){return!!this.panels.find(t=>t.id===e)?.collapsed}isPanelShownCollapsed(e){let t=this.panels.find(t=>t.id===e);return!t||!A(t)?!1:this.maximized===null?!!t.collapsed:this.maximized!==e}setPanelScale(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=!1;return t.log!==void 0&&!!n.logScale!==t.log&&(n.logScale=t.log||void 0,r=!0),t.invert!==void 0&&!!n.invertScale!==t.invert&&(n.invertScale=t.invert||void 0,r=!0),t.percent!==void 0&&!!n.percentScale!==t.percent&&(n.percentScale=t.percent||void 0,r=!0),r}canMovePanel(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=this.panels.filter(e=>e.position===n.position);return r[r.indexOf(n)+t]!==void 0}setMaximizedPanel(e){let t=e===null?null:this.panels.find(t=>t.id===e);return e!==null&&(!t||!A(t))||this.maximized===e?!1:(this.maximized=e,t&&(t.collapsed=void 0),!0)}getMaximizedPanel(){return this.maximized}movePanel(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=this.panels.filter(e=>e.position===n.position),i=r[r.indexOf(n)+t];if(!i)return!1;let a=this.panels.indexOf(n),o=this.panels.indexOf(i),s=[...this.panels];return s[a]=i,s[o]=n,this.panels=s,!0}orderPanels(e){let t=t=>{let n=e.indexOf(t.id);return n<0?e.length+this.panels.indexOf(t):n};this.panels=[...this.panels].sort((e,n)=>t(e)-t(n))}shownSize(e,t){return A(e)?this.maximized?e.id===this.maximized?t:20:e.collapsed?20:e.size:e.size}setPanelPosition(e,n){let r=this.panels.find(t=>t.id===e);if(r){let i=r.position===`left`||r.position===`right`,a=n===`left`||n===`right`;r.position=n,i!==a&&(r.size=a?et:t.DEFAULT_PANEL_HEIGHT,r.minSize=a?tt:t.MIN_PANEL_HEIGHT),a&&(r.collapsed=void 0,this.maximized===e&&(this.maximized=null))}}setPanelSize(e,n){let r=this.panels.find(t=>t.id===e);if(r){let e=A(r)?this.containerHeight-t.TIME_AXIS_HEIGHT-48:this.containerWidth/2,i=e>r.minSize?Math.min(n,e):n;r.size=Math.max(r.minSize,i),r.collapsed=void 0,this.maximized=null}}setPriceAxisWidth(e){this.priceAxisWidth=e}setLeftAxisWidth(e){this.leftAxisWidth=Math.max(0,e)}getPanels(){return this.panels}setPanelsAside(e){let t=e.size!==this.aside.size||[...e].some(e=>!this.aside.has(e));return this.aside=new Set(e),t}resolve(){let e=this.panels.filter(e=>!this.aside.has(e.id)),n=e.filter(e=>e.position===`left`),r=e.filter(e=>e.position===`right`),i=e.filter(e=>e.position===`top`),a=e.filter(e=>e.position===`bottom`),o=(i.length+a.length-1)*20,s=this.maximized?e.find(e=>e.id===this.maximized):void 0,c=Math.max(s?.minSize??0,this.containerHeight-t.TIME_AXIS_HEIGHT-48-o),l=e=>this.shownSize(e,c),u=n.reduce((e,t)=>e+t.size,0),d=r.reduce((e,t)=>e+t.size,0),f=i.reduce((e,t)=>e+l(t),0),p=a.reduce((e,t)=>e+l(t),0),m=u+this.leftAxisWidth,h={x:m,y:f,width:Math.max(0,this.containerWidth-m-d-this.priceAxisWidth),height:Math.max(0,this.containerHeight-f-p-t.TIME_AXIS_HEIGHT)},g=[],_=[],v=0;for(let e of n)g.push({config:e,rect:{x:v,y:0,width:e.size,height:this.containerHeight-t.TIME_AXIS_HEIGHT}}),_.push({panelId:e.id,rect:{x:v+e.size-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),v+=e.size;let y=0;for(let e of i){let t=l(e);g.push({config:e,rect:{x:m,y,width:h.width,height:t}}),_.push({panelId:e.id,rect:{x:m,y:y+t-2,width:h.width,height:4},orientation:`horizontal`}),y+=t}y=h.y+h.height;for(let e of a){let t=l(e);g.push({config:e,rect:{x:m,y,width:h.width,height:t}}),_.push({panelId:e.id,rect:{x:m,y:y-2,width:h.width,height:4},orientation:`horizontal`}),y+=t}v=m+h.width+this.priceAxisWidth;for(let e of r)g.push({config:e,rect:{x:v,y:0,width:e.size,height:this.containerHeight-t.TIME_AXIS_HEIGHT}}),_.push({panelId:e.id,rect:{x:v-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),v+=e.size;return{mainChartRect:h,panels:g,dividers:_}}getMainChartRect(){return this.resolve().mainChartRect}},rt=14,it=14,at=22,j=4;function M(e){let{min:n,max:r,lastPrice:i,locale:a,fontFamily:o,fontSizeSmall:s,measure:c}=e,l=e.tagPrecision??(0,t.autoPricePrecision)(n,r),u=l,d=i===null?[n,r]:[n,r,i],f=t.PRICE_AXIS_WIDTH;for(let n of d){if(!Number.isFinite(n))continue;let r=e.scaleLabel?e.scaleLabel(n):e.format?e.format(n):(0,t.formatPrice)(n,l,a),i=e.format?r:(0,t.formatPrice)(n,u,a);f=Math.max(f,c(r,`500 ${s}px ${o}`)+rt,c(i,`bold 11px ${o}`)+it,c(i,`600 ${s}px ${o}`)+at)}return f<=t.PRICE_AXIS_WIDTH?t.PRICE_AXIS_WIDTH:Math.ceil(f/j)*j}function N(e,t){return t>e||t<=e-12?t:e}var ot=512,st=class{widths=new Map;fonts;forget=()=>this.widths.clear();constructor(){this.fonts=typeof document<`u`?document.fonts??null:null,this.fonts?.addEventListener(`loadingdone`,this.forget)}get(e,t,n){let r=`${t}\n${e}`,i=this.widths.get(r);if(i!==void 0)return i;let a=n();return this.widths.size>=ot&&this.widths.clear(),this.widths.set(r,a),a}destroy(){this.fonts?.removeEventListener(`loadingdone`,this.forget),this.widths.clear()}},ct=class{netY=0;travelX=0;engaged=!1;reset(){this.netY=0,this.travelX=0,this.engaged=!1}step(e,t,n){if(this.engaged)return!0;if(this.netY+=t,this.travelX+=Math.abs(e),!n)this.engaged=!0;else{let e=Math.abs(this.netY);this.engaged=e>24&&e>=this.travelX*.5}return this.engaged}},lt=1;function P(e,t){return e.filter(e=>e.enabled!==!1&&(e.descriptor.layer??`overlay`)===t)}function F(e){switch(e.kind){case`indicator`:return`indicator:${e.plugin.descriptor.id}`;case`drawing`:return`drawing:${e.plugin.descriptor.type}`;case`chartType`:return`chartType:${e.plugin.descriptor.type}`;case`overlay`:return`overlay:${e.plugin.descriptor.id}`}}var I=new Map;function ut(e){I.set(F(e),e)}function dt(e){return I.delete(e)}function L(){return[...I.values()]}function ft(){I.clear()}var R=class{plugins=new Map;constructor(e,t={}){if(this.indicatorEngine=e,t.inheritGlobal!==!1)for(let e of L())this.add(e);for(let e of t.plugins??[])this.add(e)}register(e){this.add(e)}unregister(e){return this.plugins.delete(e)}list(){return[...this.plugins.values()]}registerIndicator(e){this.add({kind:`indicator`,plugin:e})}getChartType(e){let t=this.plugins.get(`chartType:${e}`);return t?.kind===`chartType`?t.plugin:void 0}getOverlays(){let e=[];for(let t of this.plugins.values())t.kind===`overlay`&&e.push(t.plugin);return e}add(e){this.plugins.set(F(e),e),e.kind===`indicator`&&this.indicatorEngine.register(e.plugin)}},z={orderPlace:(e,t)=>e.placeOrder(t),orderModify:(e,t)=>e.modifyOrder(t),orderCancel:(e,t)=>e.cancelOrder(t),positionModify:(e,t)=>e.modifyPosition(t),positionClose:(e,t)=>e.closePosition(t),positionReverse:(e,t,n)=>pt(e,t,n)};async function pt(e,t,n){let{reversing:r}=n;if(!r.has(t.positionId)){r.add(t.positionId);try{if(e.reversePosition){await e.reversePosition(t);return}let r=n.positions().find(e=>e.id===t.positionId);if(!r)throw Error(`No position ${t.positionId} to reverse`);let i=r.quantity-(r.closedQuantity??0);if(!(i>0))throw Error(`Position ${t.positionId} has nothing open to reverse`);await e.closePosition({positionId:r.id});try{await e.placeOrder({side:r.side===`buy`?`sell`:`buy`,type:`market`,price:r.entryPrice,quantity:i})}catch(e){throw Error(`Position ${t.positionId} was closed, but the order the other way failed`,{cause:e})}}finally{r.delete(t.positionId)}}}function mt(e,t){let n=[],r=null,i={positions:()=>r??t.getPositions?.()??[],reversing:new Set},a=e=>t.setOrders(e.data??[]),o=e=>{r=e.data??[],t.setPositions([...r])},s=e=>t.onError(e.data??{message:`Execution error`}),c=e=>{e.data&&t.onFill?.(e.data)};e.on(`orders`,a),e.on(`positions`,o),e.on(`error`,s),e.on(`fill`,c),n.push(()=>e.off(`orders`,a),()=>e.off(`positions`,o),()=>e.off(`error`,s),()=>e.off(`fill`,c));for(let r of Object.keys(z)){let a=z[r],o=t.onIntent(r,n=>{Promise.resolve(a(e,n,i)).catch(e=>t.onError({message:`Execution command failed: ${r}`,cause:e}))});n.push(o)}return()=>{for(let e of n)e()}}var ht=1e3,gt=class{pieces=new Map;asked=new Set;inFlight=!1;lastAsk=-1/0;done=!1;now;constructor(e){this.options=e,this.now=e.now??(()=>Date.now())}piecesOf(e){return this.pieces.get(e)}ensure(e,t,n){if(this.done||this.inFlight)return;if(!this.options.source){this.finish(`end`,0);return}let r=Math.min(e.length,t+Math.max(1,n)),i=t;for(;i<r&&this.asked.has(e[i].time);)i++;if(i>=r)return;let a=this.now();a-this.lastAsk<500||(this.lastAsk=a,this.ask(e,i))}evictBefore(e){for(let t of this.pieces.keys())t<e&&this.pieces.delete(t);for(let t of this.asked)t<e&&this.asked.delete(t)}dispose(){this.done=!0}ask(e,t){let{ratio:n,barMs:r,step:i,report:a}=this.options,o=Math.max(1,Math.floor(ht/n)),s=Math.min(e.length,t+o),c=s<e.length?e[s].time:e[e.length-1].time+r,l=e.slice(t,s);for(let e of l)this.asked.add(e.time);this.inFlight=!0,a({state:`loading`,step:i,count:0}),this.options.source(c,l.length*n).then(e=>this.take(l,c,e),e=>{this.done||(this.inFlight=!1,this.finish(`error`,0,e instanceof Error?e.message:String(e)))})}take(e,t,n){if(this.done)return;if(this.inFlight=!1,n.length===0){this.options.report({state:`end`,step:this.options.step,count:0});return}let r=n.reduce((e,t)=>Math.min(e,t.time),1/0),i=this.options.keep([...n].sort((e,t)=>e.time-t.time)),a=0,o=0;e.forEach((n,s)=>{let c=s+1<e.length?e[s+1].time:t;for(;o<i.length&&i[o].time<n.time;)o++;let l=o;for(;o<i.length&&i[o].time<c;)o++;o>l&&r<=n.time&&(this.pieces.set(n.time,i.slice(l,o)),a+=o-l)}),this.options.report({state:`loaded`,step:this.options.step,count:a})}finish(e,t,n){this.done=!0,this.options.report({state:e,step:this.options.step,count:t,...n===void 0?{}:{error:n}})}},_t=1/3,vt=.25,yt=.5;function bt(e,t){let n=(e.high-e.low)*vt;return t.filter(t=>t.close>e.high+n||t.close<e.low-n).length<=t.length*yt}function xt(e){return e.close>=e.open?[e.open,e.low,e.high,e.close]:[e.open,e.high,e.low,e.close]}function St(e,t,n){let r=xt(e),i=[1,2,3].map(e=>Math.abs(r[e]-r[e-1])),a=i[0]+i[1]+i[2],o=[],s=0;return r.forEach((r,c)=>{c>0&&(s+=a>0?i[c-1]/a:_t),!(c===0&&t>0)&&o.push({price:r,time:e.time,at:(t+s)/n})}),o}function Ct(e,t=[]){let n=t.length>0&&bt(e,t)?t:[e],r=n.length,i=wt(n.flatMap((e,t)=>St(e,t,r)),e),a=n.reduce((e,t)=>e+(t.volume??0),0),o=0;return{bar:e,points:i,volumeAt:n.map((t,n)=>(o+=a>0?(t.volume??0)/a*(e.volume??0):(e.volume??0)/r,{at:(n+1)/r,volume:o}))}}function wt(e,t){let n=e.length-1,r=e.map((e,r)=>({...e,price:r===0?t.open:r===n?t.close:Math.min(t.high,Math.max(t.low,e.price))})),i=(e,t)=>{if(r[0].price===e||r[n].price===e||n<2)return;let i=1;for(let e=2;e<n;e++)t(r[e].price,r[i].price)&&(i=e);r[i]={...r[i],price:e}};return i(t.high,(e,t)=>e>t),i(t.low,(e,t)=>e<t),r}function Tt(e,t){let n=e.points;if(t<=n[0].at)return n[0].price;for(let e=1;e<n.length;e++)if(t<=n[e].at){let r=n[e].at-n[e-1].at;return r>0?n[e-1].price+(n[e].price-n[e-1].price)*(t-n[e-1].at)/r:n[e].price}return n[n.length-1].price}var Et=e=>Number.isFinite(e)?Math.min(1,Math.max(0,e)):0;function Dt(e,t){let n=0,r=0;for(let i of e.volumeAt){if(t>=i.at){n=i.volume,r=i.at;continue}return n+(i.volume-n)*(t-r)/(i.at-r)}return n}function Ot(e,t){let n=Et(t);if(n>=1)return{...e.bar};let r=Tt(e,n),i=Math.max(e.points[0].price,r),a=Math.min(e.points[0].price,r);for(let t of e.points){if(t.at>n)break;i=Math.max(i,t.price),a=Math.min(a,t.price)}return{time:e.bar.time,open:e.points[0].price,high:i,low:a,close:r,volume:Dt(e,n)}}function kt(e,t){let n=Et(t),r=0;for(let t of e.points){if(t.at>n)break;r=t.at}return r}function B(e,t,n){let r=[],i=e.bar.time;for(let a of e.points){if(a.at>n)break;i=a.time,a.at>t&&r.push([a.price,a.time])}let a=Tt(e,n);return(r.length===0||r[r.length-1][0]!==a)&&r.push([a,i]),r}var At=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`];function jt(e,n){let r=(0,t.timeframeToMs)(e);return r>0?At.filter(e=>{let i=(0,t.timeframeToMs)(e);return i<r&&r%i===0&&n(e)}):[]}function Mt(e,n,r){let i=jt(n,r);if(e!==`auto`)return i.includes(e)?e:null;let a=(0,t.timeframeToMs)(n);return i.find(e=>a/(0,t.timeframeToMs)(e)<=60)??null}function Nt(e,t){e.setBarTime(t.barTime);let n=new Map([[`price`,t.price]]);t.lines&&Pt(e.getAlerts(),t.lines,n),e.checkChannels(n,{together:!0}),e.checkDrawings(t.price)}function Pt(e,t,n){let r=e.flatMap(e=>e.target?[e.channel,e.target]:[e.channel]);for(let e of r){if(n.has(e))continue;let r=e.indexOf(`:`);if(r<0)continue;let i=t(e.slice(0,r)),a=i?.[i.length-1]?.[e.slice(r+1)];typeof a==`number`&&Number.isFinite(a)&&n.set(e,a)}}function Ft(e,t,n,r){let i=e=>{let i=e.indexOf(`:`);if(i<=0)return null;let a=e.slice(0,i),o=t.get(a);if(!o||r(a)!==void 0)return null;let s=n.filter(e=>r(e)===o);return s.length===1?s[0]+e.slice(i):null};for(let t of e.getAlerts()){let n=i(t.channel),r=t.target?i(t.target):null;if(!n&&!r)continue;let{percent:a,bars:o,onBarClose:s,expiresAt:c}=t;e.removeAlert(t.id),e.addAlert(t.price,t.condition,t.message,t.repeating,n??t.channel,t.label,{...t.target?{target:r??t.target}:{},...a===void 0?{}:{percent:a},...o===void 0?{}:{bars:o},...s?{onBarClose:s}:{},...c===void 0?{}:{expiresAt:c}})}}function It(e,t){let n=e.indexOf(`:`),r=n>0?t.get(e.slice(0,n)):void 0;return r?r+e.slice(n):e}var Lt=[`crossing`,`crossingUp`,`crossingDown`];function Rt(e,t,r,i,a){e.clearAlerts();for(let o of t){if(o.triggered&&!o.repeating||o.expired)continue;if(o.drawingId){i(o.drawingId)&&Lt.includes(o.condition)&&e.addDrawingAlert(o.drawingId,o.condition,o.message,o.repeating,o.label);continue}let t={...(0,n.readAlertOptions)(o),...o.target?{target:It(o.target,r)}:{}};try{e.addAlert(o.price,o.condition,o.message,o.repeating,It(o.channel,r),o.label,t)}catch(e){a(e)}}}var zt=class{kept=new Map;constructor(e){this.alerts=e}removed(e){let t=this.alerts.takeDrawingAlerts(e);t.length>0&&this.kept.set(e,t)}created(e){let t=this.kept.get(e);t&&(this.kept.delete(e),this.alerts.restoreAlerts(t))}prune(e){return this.kept.clear(),this.alerts.pruneDrawingAlerts(e)}};function V(e,t){let n=0,r=e.length;for(;n<r;){let i=n+r>>1;e[i].time<t?n=i+1:r=i}return n}function H(e,t){let n=0,r=e.length;for(;n<r;){let i=n+r>>1;e[i].time<=t?n=i+1:r=i}return n}function Bt(e){let t=0,n=0;for(let r=1;r<e.length;r++)e[r].low<e[t].low&&(t=r),e[r].high>e[n].high&&(n=r);let r=[e[t].low,e[t].time],i=[e[n].high,e[n].time],a=t===n?e[t].close>=e[t].open:t<n,o=e[e.length-1];return[...a?[r,i]:[i,r],[o.close,o.time]]}function Vt(e){let t=[],n=Math.ceil(e.length/500);for(let r=0;r<e.length;r+=n)t.push(...Bt(e.slice(r,r+n)));return t}function Ht(e,t,n){let r=e[t];return r?n.time===null?{marks:[[r.close,r.time]],fed:{time:r.time,fraction:n.fraction}}:r.time<=n.time?null:{marks:Vt(e.slice(H(e,n.time),t+1)),fed:{time:r.time,fraction:n.fraction}}:null}function Ut(e,t,n,r,i,a){let o=e[t];if(!o)return null;let s={time:o.time,fraction:r};if(i.time===null)return{marks:[[Ot(n,r).close,o.time]],fed:s};if(o.time<i.time||o.time===i.time&&r<=i.fraction)return null;if(o.time===i.time)return{marks:B(n,i.fraction,r),fed:s};let c=[],l=V(e,i.time);return e[l]?.time===i.time&&i.fraction<1&&c.push(...B(a(e,l),i.fraction,1)),c.push(...Vt(e.slice(H(e,i.time),t))),c.push(...B(n,-1,r)),{marks:c,fed:s}}var Wt=`exchange`,Gt=Wt;function Kt(e){if(typeof e==`string`&&e!==`exchange`&&!(0,t.isValidTimeZone)(e))throw RangeError(`Unknown time zone: ${e}`);if(typeof e==`number`&&!Number.isFinite(e))throw RangeError(`Invalid UTC offset: ${e}`)}function qt(e,n){let{timeZone:r,timezone:i}=e,a=r!==void 0&&i!==void 0&&r!==i&&r===n?i:(0,t.symbolTimeZone)(e);return a===void 0?e:{...e,timeZone:a,timezone:a}}var Jt=.08,Yt=20,Xt=8,Zt=10,Qt={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]},$t=new Set([`horizontalLine`,`crossLine`]),en=new Set([`verticalLine`,`crossLine`]),tn=class{static version=`1.83.0`;engine;viewport;series=new be(e=>this.sessionKeep(e),e=>this.followLiveChange(e));themeManager;layoutManager;pluginManager;indicatorEngine;drawingManager;drawingRenderer;tradingManager;tradingRenderer;eventBus;streamManager=null;executionAdapter=null;execTeardown=null;autoScrollOnNewBar=!0;indicatorsOnDrawn=null;display;indicatorUpdateFrom=null;panes;indicatorPanes;indicatorHistory;lastBackground=null;renderScheduled=!1;renderDeferred=!1;priceAxisWidth=t.PRICE_AXIS_WIDTH;measureCtx;labelWidths=new st;containerSizeCache=null;containerSizeCacheTime=0;lastEmittedRange=null;lastEmittedPriceRange=null;lastEmittedBarWidth=null;chartLegend;legendStack=null;watermark;barCountdown;unrestoredIndicators=[];drawingAlerts=null;zoomAreaMode=!1;priceAxisAddButton=new n.PriceAxisAddButton;displayTz=null;timeZoneSetting=null;symbolInfo=null;symbolInfoSeq=0;studyZoneHeld=!1;studyZone=null;studyZoneTimer=null;studyZoneReleaseQueued=!1;sessionBreaks;sessionShading;hostSessionHours={...n.DEFAULT_SESSION_HOURS};compareRenderer;countdownInterval=null;pausedFor={host:!1,page:!1,offscreen:!1};stopWatchingVisibility=null;volumeRenderer;volumeProfile;marketProfile;depthHeatmap;periodLevels;pivotMarkers;alertManager;signalMarkerManager;tradeZoneManager;measureOverlay;selectionBoxOverlay=new n.SelectionBoxOverlay;replayManager;replayBarUnsub=null;replaySeeking=!1;replaySession=null;replayCause=null;replayStepsSeries=null;replayCoarse=null;replayRevealMarks=!0;replayOffset=0;replayPieces=null;replayLoader=null;replayForming=null;replayPhaseUnsub=null;undoRedoManager;autoSaveScheduler=new me(e=>this.saveState(e));animator;crosshairTooltip;pinnedTooltip;interactionManager;crosshairHandler;chartRenderer;rendererToken=0;stopWaitingForGpu=null;disposed=!1;chartTypeOptions={};mainSeriesVisible=!0;priceLines=new n.PriceLines;symbolSeries=new n.SymbolSeriesStore;extendedHours=!0;replayRestarting=!1;symbolRequests;gridRenderer;priceAxis;leftPriceAxis=new n.PriceAxis;leftScaleRequested=!1;leftAxisWidth=t.PRICE_AXIS_WIDTH;leftViewport=null;timeAxis;options;features;marketConfig=null;container;currentPriceLine;numberLocale;marketPricePrecision=null;priceFormatter=null;priceUnit=null;paneTitles=!0;priceFit;keyboardHandler=null;a11y=null;onWindowKeyDown=null;currentSymbol=``;streamTimeframe=null;tickStream=!1;announcedSymbol=null;announcedTimeframe=null;streamAdapter=null;history;historyFromStream=!1;hostHistoryLoader=!1;snapshotKey=null;historyCheckQueued=!1;constructor(e,r){r.timeZone!=null&&Kt(r.timeZone),this.container=e,this.options={...r,chartType:r.chartType??`candlestick`},this.numberLocale=r.numberLocale??`en-US`,this.priceFit=new Ce(r.autoScale!==!1),this.display=new Ee({bars:()=>this.series.bars(),version:()=>this.series.version(),chartType:()=>this.options.chartType,chartTypeOptions:()=>this.chartTypeOptions,lookup:e=>this.pluginManager.getChartType(e),stepAt:e=>this.stepAt(e),onBoxSize:e=>{this.chartRenderer instanceof n.PointAndFigureRenderer&&this.chartRenderer.setBoxSize(e)}});let i=r.features??{};this.features={drawings:i.drawings??!0,drawingTools:i.drawingTools??[],drawingMagnet:i.drawingMagnet??!0,drawingUndoRedo:i.drawingUndoRedo??!0,trading:i.trading??!0,tradingContextMenu:i.tradingContextMenu??!1,priceAxisAddButton:i.priceAxisAddButton??!1,indicators:i.indicators??!0,indicatorIds:i.indicatorIds??[],panning:i.panning??!0,zooming:i.zooming??!0,crosshair:i.crosshair??!0,crosshairTooltip:i.crosshairTooltip??!0,keyboard:i.keyboard??!0,priceAxis:i.priceAxis??!0,timeAxis:i.timeAxis??!0,grid:i.grid??r.grid?.visible??!0,legend:i.legend??!0,indicatorValueLabels:i.indicatorValueLabels??!1,alignAxisLabels:i.alignAxisLabels??!0,drawingAxisSpans:i.drawingAxisSpans??!0,volume:i.volume??!0,watermark:i.watermark??!0,saveLoad:i.saveLoad??!0,screenshot:i.screenshot??!0,alerts:i.alerts??!0,replay:i.replay??!0,sessionBreaks:i.sessionBreaks??!0,barCountdown:i.barCountdown??!0,compareSymbols:i.compareSymbols??!0,dataExport:i.dataExport??!0,logScale:i.logScale??!0,timeframes:i.timeframes??[],defaultTimeframeFavorites:i.defaultTimeframeFavorites??[]},e.style.position=`relative`,e.style.overflow=`hidden`,e.tabIndex=0,e.style.outline=`none`,e.style.userSelect=`none`,e.style.webkitUserSelect=`none`,this.history=new Ye({oldestTime:()=>(this.replaySession?this.series.liveBars():this.series.bars())[0]?.time??null,prepend:e=>this.prependBars(e),emit:e=>this.eventBus.emit(`historyLoad`,e)}),this.themeManager=new Ze(r.theme),this.themeManager.setChartType(this.options.chartType??`candlestick`),this.applyStyle($e(r),`host`,!1),this.container.style.backgroundColor||(this.container.style.backgroundColor=this.themeManager.getTheme().background,this.lastBackground=this.themeManager.getTheme().background),this.layoutManager=new nt,this.indicatorEngine=new n.IndicatorEngine,this.panes=new Oe(this.layoutManager,this.indicatorEngine,e=>this.crosshairHandler.setReportBounds(e)),this.indicatorPanes=new Me(this.indicatorEngine,this.layoutManager,{passStyle:(e,t)=>this.panes.passStyle(e,t),renamePane:(e,t)=>this.renamePane(e,t),invalidateScales:()=>this.panes.invalidateScales()}),this.symbolRequests=new Ve(this.indicatorEngine,this.symbolSeries),this.pluginManager=new R(this.indicatorEngine,{plugins:r.plugins}),this.eventBus=new n.EventBus,(0,n.registerBuiltInIndicators)(this.indicatorEngine),this.indicatorEngine.register(new n.CompareSymbolIndicator(this.symbolSeries)),this.indicatorEngine.register(new n.CompareSymbolPaneIndicator(this.symbolSeries)),this.indicatorEngine.register(new n.SpreadIndicator(this.symbolSeries)),this.indicatorEngine.register(new n.CorrelationCoefficientIndicator(this.symbolSeries)),this.indicatorEngine.register(new n.CorrelationLogIndicator(this.symbolSeries)),this.drawingManager=new n.DrawingManager,(0,n.registerBuiltInDrawingTools)(this.drawingManager),this.drawingRenderer=new n.DrawingRenderer(this.drawingManager),this.drawingRenderer.setKeepOut(()=>this.legendKeepOut()),this.drawingRenderer.setTimeFormat(e=>this.crosshairHandler.formatTime(e,this.getDisplayData())),this.drawingManager.setRequestRender(()=>{this.syncRenderContext(),this.engine.requestRender(t.LayerType.Overlay),this.scheduleAutoSave()}),this.drawingManager.setEventCallback((e,t)=>{this.followDrawingAlerts(e,t?.id),this.eventBus.emit(e,t),(e===`drawingCreate`||e===`drawingUpdate`||e===`drawingRemove`)&&this.announceStateChange()}),this.drawingManager.setToolFilter(e=>this.features.drawings&&(this.features.drawingTools.length===0||this.features.drawingTools.includes(e))),this.undoRedoManager=new n.UndoRedoManager,this.indicatorHistory=new je({steps:this.undoRedoManager,snapshot:()=>this.getIndicatorSetup(),enabled:()=>this.features.drawingUndoRedo});let a=``;this.undoRedoManager.setOnChange(()=>{let{canUndo:e,canRedo:t}=this.undoRedoManager.getState(),n=`${e}|${t}`;n!==a&&(a=n,this.eventBus.emit(`historyChange`,{canUndo:e,canRedo:t}))}),this.drawingManager.setUndoRedoManager(this.undoRedoManager),this.drawingManager.setSelectionListener(e=>this.eventBus.emit(`drawingSelect`,{ids:e,primary:e[0]??null})),this.drawingManager.setForeignHistory((e,t)=>{e.type===`custom`?e.custom?.[t]():this.applyIndicatorStep(e,t)}),this.drawingManager.setDataGetter(()=>this.series.bars(),()=>this.series.revision()),this.drawingManager.setDisplayDataGetter(()=>this.getDisplayData()),r.crosshair?.mode===`magnet`&&this.features.drawingMagnet&&this.drawingManager.setMagnetMode(`magnet`),this.tradingManager=new n.TradingManager({enabled:this.features.trading,contextMenu:{enabled:this.features.tradingContextMenu}}),this.tradingRenderer=new n.TradingRenderer(this.tradingManager),this.tradingManager.setContainer(e),this.tradingManager.setRequestRender(()=>this.engine.requestRender(t.LayerType.Overlay)),this.tradingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.engine=new n.RenderEngine(e,r.maxPixelRatio);let o=this.engine.dprManager.getContainerSize();if(this.viewport=new n.Viewport(o.width,o.height,r.minBarSpacing??2,r.maxBarSpacing??30,r.rightMargin??5),r.barLayout&&this.viewport.setBarLayout(r.barLayout),this.viewport.setPanLimits({freePan:r.freePan??!0,minVisibleBars:r.panLimits?.minVisibleBars??3}),r.minBarUnit!==void 0&&this.viewport.setMinBarUnit(r.minBarUnit),this.layoutManager.resize(o.width,o.height),this.engine.onContainerResize=e=>{if(e.width<=0||e.height<=0)return;let t=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(t),this.eventBus.emit(`resize`,e)},this.chartRenderer=this.createChartRenderer(this.options.chartType),this.gridRenderer=new n.GridRenderer,r.grid?.visible===!1&&this.gridRenderer.setVisible(!1),this.priceAxis=new n.PriceAxis,this.priceAxis.setLocale(this.numberLocale),this.leftPriceAxis.setLocale(this.numberLocale),this.viewport.setNumberLocale(this.numberLocale),this.timeAxis=new n.TimeAxis,this.timeAxis.setLocale(this.numberLocale),this.crosshairHandler=new n.CrosshairHandler,this.crosshairHandler.setLocale(this.numberLocale),this.applyTimeSpacing(),r.crosshair?.mode&&this.crosshairHandler.setMode(r.crosshair.mode),(0,n.isCrosshairCursor)(r.crosshair?.cursor)&&this.crosshairHandler.setCursor(r.crosshair.cursor),this.crosshairHandler.setDataSource(()=>this.crosshairSeries()),this.crosshairHandler.setCallback((e,r)=>{if(e!==null&&r){let i=this.crosshairSeries(),a=e>=0&&e<i.length?i[e]:void 0,o=e>0?i[e-1]?.close:void 0,s=(0,n.axisTimes)(i),c=a?s[e]?.time??a.time:void 0;this.chartLegend.setHoverBar(a??null,e>0?i[e-1]??null:null),this.features.legend&&this.engine.requestRender(t.LayerType.Hover);let l=this.viewport.getState(),u=r.y>=l.chartRect.y&&r.y<=l.chartRect.y+l.chartRect.height;if(a&&u&&this.features.crosshairTooltip){let e=c===a.time?a:{...a,time:c??a.time};this.crosshairTooltip.show(r,e,this.themeManager.getTheme(),this.cachedContainerSize(),{prevClose:o,priceRange:l.priceRange,plot:l.chartRect,barStepMs:(0,n.barTimeStepMs)(s),timeUnit:(0,t.barTimeUnit)(s)})}else this.crosshairTooltip.hide();this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),a??null,e,this.themeManager.getTheme()),this.eventBus.emit(`crosshairMove`,{point:r,bar:a,barIndex:e,...c===void 0?{}:{time:c},...o===void 0?{}:{prevClose:o}})}else{this.crosshairTooltip.hide(),this.chartLegend.setHoverBar(null),this.features.legend&&this.engine.requestRender(t.LayerType.Hover),this.eventBus.emit(`crosshairLeave`,{});let e=this.crosshairHandler.getSyncedSlot();e!==null&&this.showSyncedBar(e)}}),this.chartLegend=new n.ChartLegend,this.chartLegend.setChartType(this.options.chartType),this.chartLegend.setLocale(this.numberLocale),this.chartLegend.setResizeListener(()=>{this.eventBus.emit(`legendResize`,{bottom:this.getLegendBottom()}),this.engine.requestRender()}),this.watermark=new n.Watermark,r.watermark&&this.watermark.setConfig(r.watermark),this.volumeRenderer=new n.VolumeRenderer,this.volumeProfile=new n.VolumeProfileRenderer,this.marketProfile=new n.MarketProfileRenderer,this.depthHeatmap=new n.DepthHeatmapRenderer,this.periodLevels=new n.PeriodLevelsRenderer,this.pivotMarkers=new n.PivotMarkersRenderer,this.barCountdown=new n.BarCountdown,this.barCountdown.setVisible(this.features.barCountdown),this.sessionBreaks=new n.SessionBreaks,this.sessionShading=new n.SessionShading,this.compareRenderer=new n.CompareRenderer,r.sessionBreaks?this.sessionBreaks.setConfig({visible:r.sessionBreaks.visible??!0,color:r.sessionBreaks.color,lineStyle:r.sessionBreaks.lineStyle,lineWidth:r.sessionBreaks.lineWidth}):r.features?.sessionBreaks!==!1&&this.sessionBreaks.setVisible(!0),r.logScale&&this.features.logScale&&this.viewport.setLogScale(!0),this.animator=new n.Animator,this.crosshairTooltip=new n.CrosshairTooltip,this.crosshairTooltip.create(e),this.crosshairTooltip.setLocale(this.numberLocale),this.pinnedTooltip=new n.PinnedTooltip,this.pinnedTooltip.create(e),this.pinnedTooltip.setLocale(this.numberLocale),r.priceFormat&&this.applyPriceFormat(r.priceFormat),r.chartTypeOptions&&(this.chartTypeOptions=(0,t.readChartTypeOptions)(r.chartTypeOptions)),r.highLowLines&&this.priceLines.setHighLow(!0),r.shapes&&this.themeManager.setShape(on(r.shapes)),r.font&&this.themeManager.setFont(an(r.font)),this.priceLines.setPriceText(e=>this.formatPrice(e)),r.extendedHours===!1&&(this.extendedHours=!1),r.timeFormatter&&this.applyTimeFormatter(r.timeFormatter),this.keyboardHandler=new n.KeyboardHandler({scrollBars:e=>{let t=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(e*t),this.updateViewportAndRender()},zoom:e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(e,t/2),this.updateViewportAndRender()},goToStart:()=>{this.viewport.scrollBy(-1/0),this.updateViewportAndRender()},goToEnd:()=>{this.viewport.scrollToEnd(),this.updateViewportAndRender()},fitContent:()=>this.fitContent()}),this.keyboardHandler.setEnabled(this.features.keyboard),r.a11y!==!1){this.a11y=new d(e,{symbol:()=>this.currentSymbol||this.symbolInfo?.symbol||``,timeframe:()=>this.streamTimeframe??``,chartType:()=>this.options.chartType??`candlestick`,bars:()=>this.getDisplayData(),visibleRange:()=>this.viewport.getState().visibleRange,formatPrice:e=>this.formatPrice(e),formatTime:e=>this.spokenBarTime(e),showBar:e=>this.setCrosshairTime(e)},r.a11y?.labels);for(let e of[`dataUpdate`,`chartTypeChange`,`symbolChange`,`timeframeChange`])this.eventBus.on(e,()=>this.a11y?.refresh(e!==`dataUpdate`))}if(this.onWindowKeyDown=e=>{if(!this.keyboardHandler)return;let t=document.activeElement;if(!(t&&t!==this.container&&!this.container.contains(t))&&!(t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable))&&!(t&&t!==this.container&&t.matches(`button, a[href], select, [role="button"], [role="menuitem"]`))){if(this.a11y&&this.features.keyboard&&(e.key===`,`||e.key===`.`)&&!e.ctrlKey&&!e.metaKey&&!e.altKey){e.preventDefault(),this.a11y.readBar(e.key===`.`?1:-1);return}if(this.nudgeSelectedDrawings(e)){e.preventDefault();return}this.keyboardHandler.handleKey(e)&&(e.preventDefault(),this.a11y?.viewMoved())}},window.addEventListener(`keydown`,this.onWindowKeyDown),this.currentPriceLine=new n.CurrentPriceLine,this.currentPriceLine.setLocale(this.numberLocale),this.priceAxis.setReservedPriceProvider(()=>this.currentPriceLine.isVisible()?this.currentPriceLine.getPrice():null),this.alertManager=new n.AlertManager,this.alertManager.setDrawingLevels(e=>this.drawingLevelsNow(e)),this.alertManager.setRequestRender(()=>this.engine.requestRender(t.LayerType.Overlay)),this.drawingAlerts=new zt(this.alertManager),this.compareRenderer.setReservedLevels(()=>this.alertManager.getAlerts().filter(n.isPriceLevelAlert).map(e=>e.price)),this.alertManager.on(`triggered`,e=>{this.eventBus.emit(`alertTriggered`,U(e)),this.eventBus.emit(`dataUpdate`,{kind:`alert`,alert:`triggered`,alertId:e.id,price:e.price,message:e.message})}),this.alertManager.on(`added`,e=>{this.eventBus.emit(`alertAdd`,U(e))}),this.alertManager.on(`removed`,e=>{this.eventBus.emit(`alertRemove`,{id:e})}),this.alertManager.on(`expired`,e=>{this.eventBus.emit(`alertExpired`,U(e))}),this.alertManager.on(`updated`,e=>{this.eventBus.emit(`alertUpdate`,U(e))}),this.signalMarkerManager=new n.SignalMarkerManager,this.signalMarkerManager.setRequestRender(()=>this.engine.requestRender(t.LayerType.Overlay)),this.signalMarkerManager.setDataGetter(()=>this.series.bars()),this.signalMarkerManager.on(`added`,e=>{this.eventBus.emit(`signalMarkerAdd`,{id:e.id,source:e.source,direction:e.direction})}),this.signalMarkerManager.on(`removed`,e=>{this.eventBus.emit(`signalMarkerRemove`,{id:e})}),this.tradeZoneManager=new n.TradeZoneManager,this.tradeZoneManager.setRequestRender(()=>this.engine.requestRender(t.LayerType.Overlay)),this.tradeZoneManager.setDataGetter(()=>this.series.bars()),this.tradeZoneManager.on(`added`,e=>{this.eventBus.emit(`tradeZoneAdd`,{id:e.id,direction:e.direction})}),this.tradeZoneManager.on(`removed`,e=>{this.eventBus.emit(`tradeZoneRemove`,{id:e})}),this.replayManager=new n.ReplayManager,this.replayManager.on(`complete`,()=>{let e=this.getReplayBarIndex(),t=this.replayCoarse?.[e];t&&this.eventBus.emit(`replayComplete`,{barIndex:e,time:t.time})}),this.replayManager.on(`stateChange`,e=>{this.replayRestarting||this.eventBus.emit(`replayState`,{state:e})}),this.measureOverlay=new n.MeasureOverlay,this.interactionManager=new n.InteractionManager(e),this.features.panning){let e=new ct;this.interactionManager.setPanHandler(new n.PanHandler((t,n)=>{t&&this.viewport.scrollBy(t),e.step(t,n,this.priceFit.isAuto())&&n&&(this.holdPriceScale(),this.viewport.panPriceRange(n)),this.updateViewportAndRender()},()=>e.reset()))}if(this.interactionManager.setAxisStrips(()=>({plot:this.viewport.getState().chartRect,timeAxisTop:this.panes.timeAxisTop(),left:{width:this.isLeftPriceScaleShown()?this.leftAxisWidth:0,scales:!this.indicatorEngine.hasLeftScaleOverlays()}})),this.features.zooming){this.interactionManager.setZoomHandler(new n.ZoomHandler((e,t)=>{this.viewport.zoom(e,t-this.viewport.getState().chartRect.x),this.updateViewportAndRender()}));let e=new n.AxisDragHandler(e=>{this.holdPriceScale(),this.viewport.scalePriceRange(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()},e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(1/e-1,t/2),this.updateViewportAndRender()});this.interactionManager.setAxisDragHandler(e,()=>this.viewport.getState(),e=>{e===`price`?(this.priceFit.resume(),this.updateViewportAndRender()):this.fitContent()})}if(this.features.crosshair&&(this.interactionManager.setCrosshairHandler(this.crosshairHandler),this.applyIdleCursor()),this.features.drawings&&(this.interactionManager.setDrawingManager(this.drawingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.drawingManager.setPanes({paneAt:e=>this.drawingPaneAt(e),viewportOf:e=>this.drawingPaneViewport(e),hasPane:e=>this.layoutManager.getPanels().some(t=>t.id===e),valuesAt:(e,t)=>this.indicatorEngine.getPaneValuesAt(e,t)}),this.interactionManager.setDrawingDoubleClick(e=>this.eventBus.emit(`drawingDoubleClick`,{id:e})),this.interactionManager.setDrawingContextMenu((e,t)=>{this.drawingManager.select(e)&&this.eventBus.emit(`drawingContextMenu`,{id:e,x:t.x,y:t.y})})),this.interactionManager.setChartContextMenu((e,t)=>this.eventBus.hasListeners(`chartContextMenu`)?(this.eventBus.emit(`chartContextMenu`,this.contextAt(e,t)),!0):!1),this.applyPriceAxisAdd(),this.interactionManager.setPriceAxisAddButton(this.priceAxisAddButton,e=>{let t=(0,n.yToPrice)(e.y,this.viewport.getState());Number.isFinite(t)&&this.eventBus.emit(`priceAxisAdd`,{price:t,x:e.x,y:e.y})}),this.features.trading&&this.interactionManager.setTradingManager(this.tradingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.alerts){let e=new n.AlertDragHandler(this.alertManager,()=>this.viewport.getState());this.interactionManager.setAlertDragHandler(e)}let s=new n.PaneResizeHandler;s.configure(()=>this.getResolvedLayout(),(e,t)=>this.setPanelSize(e,t)),this.interactionManager.setPaneResizeHandler(s),this.interactionManager.setAltClickHandler(e=>{let n=this.getDisplayData();if(n.length===0)return;let r=this.viewport.getState(),i=r.barWidth+r.barSpacing,a=Math.round((r.offset+e.x)/i);a<0||a>=n.length||(this.pinnedTooltip.isPinned()&&this.pinnedTooltip.getPinnedIndex()===a?this.pinnedTooltip.unpin():this.pinnedTooltip.pin(n[a],a,this.themeManager.getTheme(),(0,t.barTimeUnit)(n),(0,t.barsAreDaily)(n)===!0),this.pinnedTooltip.reposition(this.viewport.getState(),this.series.bars()[a]??null,a,this.themeManager.getTheme()),this.engine.requestRender(t.LayerType.Overlay))}),this.interactionManager.setSignalMarkerHitTest(e=>this.eventBus.hasListeners(`signalMarkerHover`)||this.eventBus.hasListeners(`signalMarkerClick`)?this.signalMarkerManager.markerAt(e,this.viewport.getState()):null,(e,t)=>this.eventBus.emit(`signalMarkerHover`,{marker:e,x:t.x,y:t.y}),()=>this.eventBus.hasListeners(`signalMarkerClick`)),this.interactionManager.setClickHandler(e=>{let t=this.getDisplayData(),r=this.eventBus.hasListeners(`signalMarkerClick`)?this.signalMarkerManager.markerAt(e,this.viewport.getState()):null;if(r){this.eventBus.emit(`signalMarkerClick`,{marker:r,x:e.x,y:e.y});return}if(this.eventBus.emit(`click`,{x:e.x,y:e.y}),t.length===0)return;let i=(0,n.xToBarIndex)(e.x,this.viewport.getState());i<0||i>=t.length||this.eventBus.emit(`barClick`,{bar:t[i],barIndex:i,point:e})}),this.interactionManager.setEscapeHandler(()=>{if(this.zoomAreaMode){this.setZoomAreaMode(!1);return}if(this.features.trading&&this.tradingManager.isBracketActive()){this.tradingManager.cancelBracket(),this.eventBus.emit(`dataUpdate`,{kind:`bracket`,bracket:`cancelled`});return}this.pinnedTooltip.isPinned()&&(this.pinnedTooltip.unpin(),this.engine.requestRender(t.LayerType.Overlay))}),this.interactionManager.setConfirmHandler(()=>this.features.trading&&this.tradingManager.isBracketActive()?(this.tradingManager.confirmBracket(),!0):!1),this.interactionManager.setMeasureHandlers({begin:e=>{this.measureOverlay.begin(e,this.viewport.getState(),this.getDisplayData())},move:e=>{this.measureOverlay.update(e,this.viewport.getState(),this.getDisplayData())},end:()=>{this.measureOverlay.end()}});let c,l=e=>{let t=c?this.drawingPaneViewport(c):null,n=t?t.chartRect:this.viewport.getState().chartRect;return{x:Math.max(n.x,Math.min(n.x+n.width,e.x)),y:Math.max(n.y,Math.min(n.y+n.height,e.y))}};this.interactionManager.setBoxSelectHandlers({begin:e=>{c=this.zoomAreaMode?void 0:this.drawingPaneAt(e),this.selectionBoxOverlay.begin(l(e))},move:e=>this.selectionBoxOverlay.update(l(e)),end:()=>{let e=this.selectionBoxOverlay.end();if(e&&this.zoomAreaMode){if(e.x1-e.x0<Xt)return;this.zoomToBox(e),this.setZoomAreaMode(!1);return}if(!e||!this.features.drawings)return;let n={...this.viewport.getState(),data:this.getDisplayData()};c!==null&&(e.isClick?this.drawingManager.toggleSelectionAt({x:e.x1,y:e.y1},n):this.drawingManager.selectInRect(e,n,c),this.engine.requestRender(t.LayerType.Overlay))},cancel:()=>{this.selectionBoxOverlay.cancel(),this.setZoomAreaMode(!1)}}),this.interactionManager.setOverlayDirtyCallback(e=>{this.engine.requestRender(e?t.LayerType.Hover:t.LayerType.Overlay)}),this.interactionManager.setPageScroll(r.pageScroll??!1),this.interactionManager.attach(),r.timeZone!==void 0&&r.timeZone!==null&&this.setTimeZone(r.timeZone),r.leftPriceScale&&(this.leftScaleRequested=!0),this.syncRenderContext(),this.engine.start(),this.watchVisibility(e,r.pauseWhenHidden!==!1),this.engine.onGpuLost=()=>this.eventBus.emit(`rendererChange`,{renderer:`canvas`,reason:`contextLost`}),this.engine.onGpuRestored=()=>this.eventBus.emit(`rendererChange`,{renderer:`webgl`,reason:`contextRestored`}),this.options.renderer&&this.options.renderer!==`canvas`&&this.setRenderer(this.options.renderer)}setData(e){this.loadSeries(e,!1)}loadSeries(e,t){if(this.replaySession&&!t&&e.length>0&&!this.replayEndsFor(this.currentSymbol)){this.loadDuringReplay(e);return}this.snapshotKey=null,this.endReplaySession(),this.history.reset(),this.series.load(e),this.crosshairHandler.setData(this.series.bars()),this.display.reset(),this.sessionBreaks.invalidateCache(),this.priceFit.newSeries(this.series.length()===0);let n=this.series.bars(),r=n[n.length-1];t||(this.alertManager.clearLastValues(),r&&this.alertManager.seedLastValue(`price`,r.close)),this.recalcIndicators(n),r&&this.currentPriceLine.setPrice(r.close),this.updateViewportAndRender(!0),this.fitFewColumns(),this.emitBars(n.length)}loadDuringReplay(e){this.snapshotKey=null,this.history.reset(),this.alertManager.clearLastValues();let t=e[e.length-1];t&&S(t)&&this.alertManager.seedLastValue(`price`,t.close),this.replaySession&&(this.replaySession.price=null),this.series.load(e)}prependBars(e){if(this.replaySession)return this.series.prepend(e).taken;let t=this.getDisplayData(),r=Math.max(0,Math.min(t.length-1,Math.floor(this.viewport.getState().visibleRange.from))),i=t[r]?.time,{added:a,taken:o}=this.series.prepend(e);if(a===0)return o;let s=this.series.bars();if(this.crosshairHandler.setData(s),this.display.reset(),this.sessionBreaks.invalidateCache(),this.pinnedTooltip.isPinned()&&this.pinnedTooltip.unpin(),this.measureOverlay.end(),this.recalcIndicators(s),i!==void 0){let e=Math.round((0,n.timestampToBarIndex)(i,this.getDisplayData()));this.viewport.prependBars(e-r)}return this.updateViewportAndRender(),o}mergeSnapshot(e){let t=this.viewport.isAtEnd();if(!this.series.mergeSnapshot(e)){this.setData(e);return}let n=this.series.bars();this.crosshairHandler.setData(n),this.display.reset(),this.sessionBreaks.invalidateCache(),this.recalcIndicators(n),n.length>0&&this.currentPriceLine.setPrice(n[n.length-1].close),this.updateViewportAndRender(t),this.emitBars(n.length)}setHistoryLoader(e,t){this.historyFromStream=!1,this.hostHistoryLoader=e!==null,this.history.setLoader(e,t?.pageSize),this.checkHistory()}loadMoreHistory(){return this.replayPages()?this.history.loadMore():Promise.resolve(0)}hasMoreHistory(){return this.history.hasLoader()&&this.history.hasMore()}isLoadingHistory(){return this.history.isLoading()}checkHistory(){this.historyCheckQueued||!this.history.hasLoader()||(this.historyCheckQueued=!0,queueMicrotask(()=>{if(this.historyCheckQueued=!1,!this.replayPages()||!this.history.hasLoader()||_(this.options.chartType))return;let{visibleRange:e,chartRect:t}=this.viewport.getState();if(t.width<=0)return;let{from:n,to:r}=e;this.history.maybeLoad(Math.max(0,Math.floor(n)),Math.max(Yt,r-n))}))}useStreamHistory(e,r,i=!0){if(this.hostHistoryLoader)return;let a=(0,n.withResampling)(e),o=a.fetchHistoryBefore,s=this.streamTimeframe;if(!o||s===null||(0,t.tickBarCount)(s)!==null){this.historyFromStream&&this.history.setLoader(null),this.historyFromStream=!1;return}let c=this.currentSymbol;this.history.setLoader((e,t)=>o.call(a,c,s,e,t),r),this.historyFromStream=!0,i&&this.checkHistory()}appendBar(e){if(!S(e))return;let t=this.series.append(e);if(t.to!==`shown`){this.takeLivePrice(e.close),t.to===`hidden`&&this.scheduleRender();return}let n=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),r=t.before,i=this.series.bars();this.crosshairHandler.setData(i),this.recalcIndicatorsFrom(i,i.length-2),this.currentPriceLine.setPrice(e.close,i[i.length-2]?.close),this.updateViewportAndRender(n),i.length!==r&&this.emitBars(i.length),this.followLivePrice(e.close)}appendBars(e){if(e=e.filter(S),e.length===0)return;let t=e[e.length-1].close,n=this.series.appendMany(e);if(n.shown===0){this.takeLivePrice(t),n.aside||this.scheduleRender();return}let r=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),i=n.before,a=this.series.bars();this.recalcIndicatorsFrom(a,i-1),this.crosshairHandler.setData(a),this.currentPriceLine.setPrice(t,a[a.length-2]?.close),this.updateViewportAndRender(r),a.length!==i&&this.emitBars(a.length),this.followLivePrice(t)}updateLastBar(e){if(!S(e))return;let t=this.series.updateLast(e);if(t.to!==`shown`){this.takeLivePrice(e.close),t.to===`hidden`&&this.scheduleRender();return}this.currentPriceLine.setPrice(e.close);let n=this.series.bars();this.recalcIndicatorsFrom(n,n.length-1),this.followLivePrice(e.close),this.scheduleRender()}updateLastBarFromTick(e){if(!Number.isFinite(e.price)||e.price<0||e.volume!==void 0&&!(Number.isFinite(e.volume)&&e.volume>=0))return;let t=this.series.mergeTick(e);if(t.to!==`shown`){this.takeLivePrice(e.price),t.to===`hidden`&&this.scheduleRender();return}this.currentPriceLine.setPrice(e.price);let n=this.series.bars();this.recalcIndicatorsFrom(n,n.length-1),this.followLivePrice(e.price),this.scheduleRender()}updateBar(e){if(!S(e))return!1;let t=this.series.replace(e);return t.to===`none`?!1:(t.to===`shown`&&t.changed&&this.showCorrection(t.index),!0)}showCorrection(e){let t=this.series.bars(),n=t[e];this.display.reset(),this.indicatorEngine.deferRecalculateFrom(t,e),this.announceIndicatorUpdate(e),e===t.length-1&&(this.currentPriceLine.setPrice(n.close,t[e-1]?.close),this.alertManager.seedLastValue(`price`,n.close)),this.refreshShownBar(e),this.eventBus.emit(`dataUpdate`,{kind:`correction`,time:n.time,index:e}),this.scheduleRender()}refreshShownBar(e){let n=this.pinnedTooltip.isPinned()?this.pinnedTooltip.getPinnedIndex():-1,r=this.crosshairHandler.getReportedBarIndex();if(n<e&&r===null)return;let i=this.isTimeAligned();if(i&&n>=e){let e=this.getDisplayData();e[n]&&this.pinnedTooltip.pin(e[n],n,this.themeManager.getTheme(),(0,t.barTimeUnit)(e),(0,t.barsAreDaily)(e)===!0)}r!==null&&(!i||r===e||r===e+1)&&this.crosshairHandler.refresh()}getChartType(){return this.options.chartType??`candlestick`}setChartType(e){let t=this.options.chartType??`candlestick`;this.options.chartType=e,this.themeManager.setChartType(e),this.chartRenderer=this.createChartRenderer(e),this.display.invalidate(),this.chartLegend.setChartType(e),this.applyTimeSpacing(),this.updateViewportAndRender(!0),this.fitFewColumns(),this.markStateChanged(),e!==t&&this.eventBus.emit(`chartTypeChange`,{type:e,previous:t})}fitFewColumns(){let e=this.options.chartType;if(!_(e)||this.pluginManager.getChartType(e))return;let t=this.getDisplayData().length,{chartRect:n,barWidth:r,barSpacing:i}=this.viewport.getState(),a=n.width/(r+i);t>0&&a>t+this.viewport.getRightMargin()&&this.fitContent()}applyTimeSpacing(){let e=!this.tickStream&&!_(this.options.chartType);this.timeAxis.setTimesPastData(e),this.crosshairHandler.setTimesPastData(e)}setChartTypeOptions(e){this.chartTypeOptions={...this.chartTypeOptions,...(0,t.readChartTypeOptions)(e)},this.updateViewportAndRender(!0),this.fitFewColumns(),this.a11y?.refresh(!0),this.markStateChanged()}getChartTypeOptions(){return(0,t.readChartTypeOptions)(this.chartTypeOptions)}setExtendedHours(e){e!==this.extendedHours&&(this.extendedHours=e,this.reapplyExtendedHours(),this.markStateChanged())}isExtendedHoursVisible(){return this.extendedHours}sessionKeep(e){return this.extendedHours?null:a(this.symbolInfo,e)}reapplyExtendedHours(){if(!this.series.refilter())return;let e=this.series.bars();this.crosshairHandler.setData(e),this.display.reset(),this.sessionBreaks.invalidateCache(),this.recalcIndicators(e),this.updateViewportAndRender(!0),this.emitBars(e.length)}quoteLines(){return this.priceLines.setQuoteShown(this.replaySession===null),this.priceLines}setShapes(e){let t=on(e);t.tagRadius!==void 0&&(this.themeManager.setShape({...this.themeManager.getTheme().shape,...t}),this.syncRenderContext(),this.engine.requestRender())}getShapes(){return{...this.themeManager.getTheme().shape}}setFont(e){if(e===null)this.themeManager.setFont(null);else{let t=an(e);if(Object.keys(t).length===0)return;this.themeManager.setFont(t)}this.updateViewportAndRender()}getFont(){return{...this.themeManager.getTheme().font}}setBarLayout(e){e!==`golden`&&e!==`classic`||e===this.viewport.getBarLayout()||(this.viewport.setBarLayout(e),this.updateViewportAndRender())}getBarLayout(){return this.viewport.getBarLayout()}setMainSeriesVisible(e){this.mainSeriesVisible=e,this.syncRenderContext(),this.engine.requestRender()}isMainSeriesVisible(){return this.mainSeriesVisible}setHighLowLines(e){this.priceLines.setHighLow(e),this.engine.requestRender()}isHighLowLinesVisible(){return this.priceLines.isHighLowVisible()}setBidAsk(e){this.priceLines.setBidAsk(e),this.engine.requestRender(t.LayerType.Overlay)}getBidAsk(){return this.priceLines.getBidAsk()}addIndicator(e,t,n=`bottom`,r={}){return this.indicatorHistory.record(void 0,()=>this.addIndicatorNow(e,t??{},n,r))}addIndicatorNow(e,t,n,r){if(!this.isIndicatorAllowed(e))return null;let i=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e),a=i?this.indicatorPanes.paneFor(i,t,r.pane):null,o=this.indicatorEngine.addIndicator(e,t,this.indicatorBars(),{...a?{pane:a}:{},...r.scale===`left`?{scale:`left`}:{},...r.instanceId?{instanceId:r.instanceId}:{}});return i?.placement===`panel`&&!a&&this.layoutManager.addPanel(o,n),this.updateViewportAndRender(),this.eventBus.emit(`indicatorAdd`,{instanceId:o,id:e}),this.markStateChanged(),this.requestMissingSymbols(o),o}setSymbolSeries(e,t){e=e.trim(),this.symbolSeries.set(e,t),this.symbolRequests.given(e);let n=this.symbolRequests.readersOf(e);if(n.length===0)return;let r=this.indicatorBars();for(let e of n)this.indicatorEngine.updateIndicator(e,{},r);this.announceIndicatorUpdate(0),this.updateViewportAndRender()}getSymbolSeries(e){return this.symbolSeries.get(e)??null}getRequiredSymbols(){return this.symbolRequests.required()}requestMissingSymbols(e){let t=this.symbolRequests.toAsk(e);t&&this.eventBus.emit(`symbolSeriesRequest`,{symbol:t})}updateIndicator(e,t){this.indicatorHistory.record(e,()=>this.updateIndicatorNow(e,t))}updateIndicatorNow(e,t){let n=this.indicatorPanes.sourceOf(e);this.indicatorEngine.updateIndicator(e,t,this.indicatorBars()),this.announceIndicatorUpdate(0),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`params`}),this.requestMissingSymbols(e),this.indicatorPanes.followSource(e,n)&&this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`}),this.updateViewportAndRender()}getIndicatorLevels(e){return this.indicatorEngine.getLevels(e)}setIndicatorScale(e,t){return this.indicatorHistory.record(e,()=>this.setIndicatorScaleNow(e,t))}setIndicatorScaleNow(e,t){return this.indicatorEngine.setScale(e,t)?(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`scale`}),!0):!1}getIndicatorScale(e){return this.indicatorEngine.getIndicatorConfig(e)?.scale===`left`?`left`:`right`}setLeftPriceScaleVisible(e){this.leftScaleRequested=e,this.updateViewportAndRender()}isLeftPriceScaleVisible(){return this.leftScaleRequested}isLeftPriceScaleShown(){return this.features.priceAxis!==!1&&(this.leftScaleRequested||this.indicatorEngine.hasLeftScaleOverlays())}getLeftPriceRange(){return this.leftViewport?{...this.leftViewport.priceRange}:null}computeLeftViewport(){if(!this.isLeftPriceScaleShown())return null;let e=this.viewport.getState();if(!this.indicatorEngine.hasLeftScaleOverlays())return e;let t=this.indicatorEngine.getOverlayPriceRange(e.visibleRange.from,e.visibleRange.to,`left`);if(!t)return e;let n=t.max-t.min||Math.abs(t.max)||1;return{...e,priceRange:{min:t.min-n*Jt,max:t.max+n*Jt},logScale:!1,scaleMode:`regular`,invertScale:!1,formatPrice:void 0,pricePrecision:void 0,priceUnit:void 0}}setIndicatorLevels(e,t){this.indicatorHistory.record(e,()=>this.setIndicatorLevelsNow(e,t))}setIndicatorLevelsNow(e,t){this.indicatorEngine.setLevels(e,t)&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`levels`}))}removeIndicator(e){this.indicatorHistory.record(void 0,()=>this.removeIndicatorNow(e))}removeIndicators(e){this.indicatorHistory.record(void 0,()=>{for(let t of e)this.removeIndicatorNow(t)})}removeIndicatorNow(e){if(!this.indicatorEngine.getIndicatorConfig(e))return;let t=[e,...this.indicatorEngine.getDependents(e)];for(let e of t.reverse())this.detachIndicator(e);this.markStateChanged(),this.updateViewportAndRender()}detachIndicator(e){this.indicatorPanes.detach(e,e=>this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`}))&&(this.eventBus.emit(`indicatorRemove`,{instanceId:e}),this.symbolRequests.forgetUnread())}getIndicatorStyle(e){return this.indicatorEngine.getIndicatorStyle(e)}setIndicatorDefaults(e,n){if(!n){this.indicatorEngine.setStyleDefaults(e,null);return}let{plots:r,...i}=n,a=r===void 0?void 0:(0,t.readIndicatorPlotStyles)(r);this.indicatorEngine.setStyleDefaults(e,{...i,...a?{plots:a}:{}})}setPaneStyle(e,n){let r=this.indicatorPanes.paneOf(e);this.layoutManager.getPanels().some(e=>e.id===r)&&this.indicatorHistory.record(r,()=>this.setPaneStyleNow(r,n?(0,t.readPaneStyle)(n):null))}setPaneStyleNow(e,t){this.panes.setStyle(e,t)&&(this.syncRenderContext(),this.engine.requestRender(),this.markStateChanged())}getPaneStyle(e){let t=this.panes.style(this.indicatorPanes.paneOf(e));return t?{...t}:null}getIndicatorOutput(e){return this.indicatorEngine.getOutput(e)}registerIndicator(e){this.pluginManager.registerIndicator(e)}get plugins(){return this.pluginManager}static indicators(){let e=new n.IndicatorEngine;return(0,n.registerBuiltInIndicators)(e),e.getAvailableIndicators()}setPanelPosition(e,t){this.layoutManager.setPanelPosition(e,t),this.updateViewportAndRender(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`})}setPanelSize(e,t){this.layoutManager.setPanelSize(e,t),this.updateViewportAndRender(),this.eventBus.emit(`paneResize`,{instanceId:e,size:t}),this.markStateChanged()}moveIndicatorToPane(e,t){return this.indicatorHistory.record(e,()=>this.moveIndicatorToPaneNow(e,t))}canMoveIndicatorToPane(e,t){return this.indicatorPanes.moveHost(e,t)!==void 0}moveIndicatorToPaneNow(e,t){let n=this.indicatorPanes.move(e,t);if(!n)return!1;for(let e of n)this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`});return this.updateViewportAndRender(),this.markStateChanged(),!0}setPaneCollapsed(e,t){let n=this.indicatorPanes.paneOf(e);return this.indicatorHistory.record(n,()=>this.paneChange(n,`collapsed`,()=>this.layoutManager.setPanelCollapsed(n,t)))}isPaneCollapsed(e){return this.layoutManager.isPanelShownCollapsed(this.indicatorPanes.paneOf(e))}setMaximizedPane(e){let t=e===null?null:this.indicatorPanes.paneOf(e),n=t??this.layoutManager.getMaximizedPanel()??``;return this.indicatorHistory.record(n,()=>this.paneChange(n,`maximized`,()=>this.layoutManager.setMaximizedPanel(t)))}getMaximizedPane(){return this.layoutManager.getMaximizedPanel()}setPaneScale(e,t){let n=this.indicatorPanes.paneOf(e);return this.indicatorHistory.record(n,()=>this.paneChange(n,`scale`,()=>this.layoutManager.setPanelScale(n,t)))}getPaneScale(e){let t=this.layoutManager.getPanels().find(t=>t.id===this.indicatorPanes.paneOf(e));return{log:!!t?.logScale,invert:!!t?.invertScale,percent:!!t?.percentScale}}movePane(e,t){let n=this.indicatorPanes.paneOf(e);return this.indicatorHistory.record(n,()=>this.paneChange(n,`order`,()=>this.layoutManager.movePanel(n,t)))}canMovePane(e,t){return this.layoutManager.canMovePanel(this.indicatorPanes.paneOf(e),t)}paneChange(e,t,n){return n()?(this.updateViewportAndRender(),this.eventBus.emit(`paneChange`,{instanceId:e,change:t}),this.markStateChanged(),!0):!1}getIndicatorPanes(){return this.buildPanelRenderInfos().map(e=>({instanceId:e.instanceId,instanceIds:[e.instanceId,...e.members??[]],rect:{...e.rect}}))}setIndicatorValueLabelsVisible(e){this.features.indicatorValueLabels=e,this.syncRenderContext(),this.engine.requestRender()}isIndicatorValueLabelsVisible(){return this.features.indicatorValueLabels}setAxisLabelsAligned(e){this.features.alignAxisLabels=e,this.syncRenderContext(),this.engine.requestRender()}isAxisLabelsAligned(){return this.features.alignAxisLabels}setDrawingAxisSpansVisible(e){this.features.drawingAxisSpans=e,this.syncRenderContext(),this.engine.requestRender()}isDrawingAxisSpansVisible(){return this.features.drawingAxisSpans}setPaneTitlesVisible(e){this.paneTitles=e,this.engine.requestRender()}getLegendBottom(){let e=this.viewport.getState().chartRect.y;return this.features.legend?e+this.chartLegend.getHeight():e}setLegendStack(e){let t=e&&e.width>0&&e.height>0?{width:e.width,height:e.height}:null;t===this.legendStack||t!==null&&this.legendStack!==null&&t.width===this.legendStack.width&&t.height===this.legendStack.height||(this.legendStack=t,this.engine.requestRender())}legendKeepOut(){let e=this.viewport.getState().chartRect,t=this.getLegendBottom(),n=[],r=this.features.legend?this.chartLegend.getWidth():0;return r>0&&t>e.y&&n.push({x:e.x,y:e.y,width:r,height:t-e.y}),this.legendStack&&n.push({x:e.x,y:t,...this.legendStack}),n}isTimeAligned(){return _(this.options.chartType)?!1:this.getDisplayData().length===this.series.length()}roundPrice(e){if(!Number.isFinite(e))return e;let n=this.stepAt(e);if(n!==void 0)return Number((Math.round(e/n)*n).toFixed((0,t.stepDecimals)(n)));let{min:r,max:i}=this.viewport.getState().priceRange;return Number(e.toFixed(this.marketPricePrecision??(0,t.autoPricePrecision)(r,i)))}lastClose(){let e=this.series.bars();return e[e.length-1]?.close??0}stepAt(e){let n=this.symbolInfo?.minTick??this.priceUnit??void 0;return n!==void 0&&n>0?n:this.marketConfig?(0,t.priceStepAt)(e,this.marketConfig):void 0}getPriceStep(e){let n=this.stepAt(e??this.lastClose());if(n!==void 0)return n;let{min:r,max:i}=this.viewport.getState().priceRange,a=this.marketPricePrecision??(0,t.autoPricePrecision)(r,i);return Number((10**-a).toFixed(a))}setPriceFormat(e){this.applyPriceFormat(e),this.updateViewportAndRender()}getPriceFormatter(){return this.priceFormatter}applyPriceFormat(e){this.priceFormatter=(0,t.priceFormatterFor)(e),this.priceUnit=e&&typeof e!=`function`?(0,t.fractionTick)(e):null,this.viewport.setPriceFormat(this.priceFormatter,this.priceUnit),this.crosshairTooltip.setPriceFormatter(this.priceFormatter),this.pinnedTooltip.setPriceFormatter(this.priceFormatter)}setTimeFormatter(e){this.applyTimeFormatter(e),this.engine.requestRender()}applyTimeFormatter(e){this.timeAxis.setTimeFormatter(e),this.crosshairHandler.setTimeFormatter(e),this.crosshairTooltip.setTimeFormatter(e)}formatPrice(e){if(this.priceFormatter)return this.priceFormatter(e);let{min:n,max:r}=this.viewport.getState().priceRange;return(0,t.formatPrice)(e,this.marketPricePrecision??(0,t.autoPricePrecision)(n,r),this.numberLocale)}setDrawingTool(e){this.features.drawings&&(e&&this.features.drawingTools.length>0&&!this.features.drawingTools.includes(e)||(e&&this.setZoomAreaMode(!1),this.drawingManager.setActiveTool(e)))}getDrawingTool(){return this.drawingManager.getActiveTool()}setStayInDrawingMode(e){this.drawingManager.setStayInDrawingMode(e)}isStayInDrawingMode(){return this.drawingManager.isStayInDrawingMode()}copyDrawings(){return this.drawingManager.copySelection()}pasteDrawings(){return this.features.drawings?this.drawingManager.paste():[]}canPasteDrawings(){return this.features.drawings!==!1&&this.drawingManager.canPaste()}setDrawingStyle(e){this.drawingManager.setStyle(e)}getDrawingStyle(){return this.drawingManager.getActiveStyle()}getSelectedDrawingId(){return this.drawingManager.getSelectedDrawingId()}setSelectedDrawingStyle(e,t){return this.drawingManager.setSelectedDrawingStyle(e,t)}getDrawings(){return this.drawingManager.getDrawings()}setDrawings(e){this.drawingManager.setDrawings(e),this.dropOrphanDrawingAlerts(),this.announceStateChange()}addDrawing(e){if(!this.features.drawings||e.paneId!==void 0&&!this.takesDrawing(e.paneId,e.type))return null;let t=this.drawingManager.addDrawing(e);return this.markStateChanged(),t}autoFib(){if(!this.features.drawings)return null;let e=this.getDisplayData(),t=this.viewport.getState(),r=(0,n.findDominantSwing)(e,t.visibleRange.from,t.visibleRange.to);return r?this.addDrawing({type:`fibRetracement`,anchors:[r[0],r[1]]}):null}removeDrawing(e){this.drawingManager.removeDrawing(e)}removeDrawings(e){return this.drawingManager.removeDrawings(e)}nudgeSelectedDrawings(e){let t=Qt[e.key];if(!t||!this.features.drawings||e.ctrlKey||e.metaKey||e.altKey)return!1;let n=e.shiftKey?Zt:1,r={...this.viewport.getState(),data:this.getDisplayData()};return this.drawingManager.nudge(t[0]*n,t[1]*n,r)}getDrawingTextRect(e){return this.drawingManager.isShown(e)?this.drawingManager.textBoxOf(e,{...this.viewport.getState(),data:this.getDisplayData()}):null}amendNewDrawing(e,t){let n=this.drawingManager.amendNew(e,t);return n&&this.markStateChanged(),n}takeBackDrawing(e){this.features.drawings&&(this.drawingManager.takeBack(e),this.markStateChanged())}removeAll(e=`all`){return this.undoRedoManager.group(()=>{let t=e===`indicators`?0:this.removeDrawings(this.getDrawings().map(e=>e.id)),n=e===`drawings`?[]:this.getActiveIndicators().map(e=>e.instanceId);return n.length>0&&this.removeIndicators(n),{drawings:t,indicators:n.length}})}getDrawingToolDescriptor(e){let t=this.drawingManager.getDescriptor(e);return t?structuredClone(t):null}getDrawingOptionDefs(e){return this.drawingManager.getOptionDefs(e)}getDrawingOptions(e){return this.drawingManager.getDrawingOptions(e)}setDrawingOptions(e,t){return this.updateDrawing(e,{options:t})}updateDrawing(e,t){let n=this.drawingManager.updateDrawing(e,t);return n&&this.markStateChanged(),n}isDrawingShown(e){return this.drawingManager.isShown(e)}beginDrawingEdit(e){return this.drawingManager.beginEdit(e)}endDrawingEdit(e,t={}){this.drawingManager.endEdit(e,t),this.markStateChanged()}setDrawingToolDefaults(e,t){this.drawingManager.setToolDefaults(e,t)}getDrawingToolDefaults(e){return this.drawingManager.getToolDefaults(e)}setDrawingVisible(e,t){this.drawingManager.setDrawingVisible(e,t)}setDrawingLocked(e,t){this.drawingManager.setDrawingLocked(e,t)}setDrawingsVisible(e,t){this.drawingManager.setDrawingsVisible(e,t)}setDrawingsLocked(e,t){this.drawingManager.setDrawingsLocked(e,t)}clearDrawings(){this.drawingManager.clearDrawings(),this.dropOrphanDrawingAlerts()}registerDrawingTool(e){this.drawingManager.register(e)}undo(){return this.features.drawingUndoRedo?this.drawingManager.undo():!1}redo(){return this.features.drawingUndoRedo?this.drawingManager.redo():!1}selectDrawing(e){let t=this.drawingManager.select(e);return t&&this.engine.requestRender(),t}getUndoRedoState(){return this.undoRedoManager.getState()}recordUndo(e){if(!this.features.drawingUndoRedo||typeof e?.undo!=`function`||typeof e.redo!=`function`)return;let t=performance.now(),n=this.undoRedoManager.last();if(e.subject!==void 0&&n?.type===`custom`&&n.custom?.subject===e.subject&&t-n.custom.at<800){this.undoRedoManager.replaceLast({...n,custom:{undo:n.custom.undo,redo:e.redo,subject:e.subject,at:t}});return}this.undoRedoManager.push({type:`custom`,before:null,after:null,custom:{undo:e.undo,redo:e.redo,subject:e.subject,at:t}})}setDrawingMagnet(e){this.setDrawingMagnetMode(e?`weak`:`off`)}getDrawingMagnet(){return this.drawingManager.getMagnetMode()!==`none`}setDrawingMagnetMode(e){let t=this.features.drawingMagnet&&e!==`off`;this.drawingManager.setMagnetMode(t?e===`strong`?`strong`:`magnet`:`none`)}getDrawingMagnetMode(){let e=this.drawingManager.getMagnetMode();return e===`none`?`off`:e===`strong`?`strong`:`weak`}contextAt(e,t){let r={...this.viewport.getState(),data:this.getDisplayData()},i={area:e,x:t.x,y:t.y};if((e===`plot`||e===`priceAxis`)&&(i.price=(0,n.yToPrice)(t.y,r)),(e===`plot`||e===`timeAxis`)&&r.data.length>0&&(i.time=(0,n.xToTime)(t.x,r)),e===`pane`){let e=this.getIndicatorPanes().find(e=>t.y>=e.rect.y&&t.y<=e.rect.y+e.rect.height);e&&(i.pane=e.instanceId)}return i}applyPriceAxisAdd(){let e=this.features.priceAxisAddButton&&this.features.crosshair;this.priceAxisAddButton.setEnabled(e),this.tradingManager.setTagInset(e?n.PRICE_AXIS_ADD_STRIP:0)}setPriceAxisAddButton(e){this.features.priceAxisAddButton=e,this.applyPriceAxisAdd(),this.engine.requestRender(t.LayerType.Overlay)}setEraserMode(e){e&&this.setZoomAreaMode(!1),this.drawingManager.setEraser(e&&this.features.drawings)}isEraserMode(){return this.drawingManager.isEraser()}setZoomAreaMode(e){e!==this.zoomAreaMode&&(this.zoomAreaMode=e,e&&(this.drawingManager.setEraser(!1),this.drawingManager.setActiveTool(null)),this.interactionManager?.setZoomAreaMode(e),this.eventBus.emit(`toolModeChange`,{zoomArea:e}))}isZoomAreaMode(){return this.zoomAreaMode}zoomToBox(e){let t={...this.viewport.getState(),data:this.getDisplayData()};this.setVisibleRange((0,n.xToTime)(e.x0,t),(0,n.xToTime)(e.x1,t))}lockAllDrawings(){this.drawingManager.lockAllDrawings()}unlockAllDrawings(){this.drawingManager.unlockAllDrawings()}hideAllDrawings(){this.drawingManager.hideAllDrawings()}showAllDrawings(){this.drawingManager.showAllDrawings()}duplicateDrawing(e){let t=e??this.drawingManager.getSelectedDrawingId();return t?this.drawingManager.duplicateDrawing(t):null}exportVisibleData(e=`csv`,t,n={}){this.features.dataExport&&this.download(e,t,{...n,range:`visible`})}exportAllData(e=`csv`,t,n={}){this.features.dataExport&&this.download(e,t,{...n,range:`all`})}getExportData(t={}){let n=this.exportBars(),r=0,i=n.length-1;if(t.range===`visible`){let{visibleRange:e}=this.viewport.getState();r=Math.max(0,e.from),i=Math.min(n.length-1,e.to)}let a=n.slice(r,i+1);if(t.indicators===!1)return{bars:a,columns:[]};let o=[];for(let t of this.indicatorEngine.getActiveIndicators()){let n=this.indicatorEngine.getOutput(t.instanceId)?.series;if(!n)continue;let i=e.t(t.id,t.params,t.descriptor.defaultConfig,t.descriptor.shortName),s=t.descriptor.plots??Object.keys(n.find(e=>e)??{}).map(e=>({key:e,title:e}));for(let e of s){let t=s.length>1?` ${e.title??e.key}`:``;o.push({name:`${i}${t}`,values:a.map((t,i)=>n[r+i]?.[e.key]??null)})}}let s=new Map;for(let e of o){let t=(s.get(e.name)??0)+1;s.set(e.name,t),t>1&&(e.name=`${e.name} (${t})`)}return{bars:a,columns:o}}getExportText(e=`csv`,t={}){let{bars:r,columns:i}=this.getExportData(t);return e===`json`?n.DataExporter.toJSON(r,i):n.DataExporter.toCSV(r,i)}download(e,t,r){let i=this.getExportText(e,r);e===`json`?n.DataExporter.download(i,t??`chart-data.json`,`application/json`):n.DataExporter.download(i,t??`chart-data.csv`,`text/csv`)}setAutoSave(e,t=5e3){this.autoSaveScheduler.enable(e,t)}disableAutoSave(){this.autoSaveScheduler.disable()}scheduleAutoSave(){this.autoSaveScheduler.schedule()}markStateChanged(){this.scheduleAutoSave(),this.announceStateChange()}announceStateChange(){this.eventBus.hasListeners(`stateChange`)&&this.eventBus.emit(`stateChange`,{})}getAvailableIndicators(){return this.indicatorEngine.getAvailableIndicators()}getIndicatorInputs(e){let t=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e);return t?{id:t.id,params:t.defaultConfig}:null}getActiveIndicators(){return this.indicatorEngine.getActiveIndicators()}setIndicatorVisible(e,t){this.indicatorHistory.record(e,()=>this.setIndicatorVisibleNow(e,t))}setIndicatorVisibleNow(e,t){this.indicatorEngine.setVisible(e,t)!==null&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`visible`}))}setIndicatorIntervals(e,t){this.indicatorHistory.record(e,()=>this.setIndicatorIntervalsNow(e,t))}setIndicatorIntervalsNow(e,t){this.indicatorEngine.setIntervals(e,t)&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`intervals`}))}getIndicatorIntervals(e){return this.indicatorEngine.getIntervals(e)}getIndicatorConfig(e){let t=this.indicatorEngine.getIndicatorConfig(e);return t?{id:t.id,params:{...t.params}}:null}updateIndicatorStyle(e,t){this.indicatorHistory.record(e,()=>this.updateIndicatorStyleNow(e,t))}updateIndicatorStyleNow(e,n){let{plots:r,...i}=n,a=r===void 0?void 0:(0,t.readIndicatorPlotStyles)(r);this.indicatorEngine.updateIndicatorStyle(e,{...i,...a?{plots:a}:{}}),this.engine.requestRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`style`})}setOrders(e){this.features.trading&&(this.tradingManager.setOrders(e),this.eventBus.emit(`ordersChange`,{orders:e}))}startBracket(e,t){if(!this.features.trading)return!1;let n=this.series.bars(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startBracket(e,r),!0)}cancelBracket(){this.features.trading&&this.tradingManager.cancelBracket()}confirmBracket(){return this.features.trading?this.tradingManager.confirmBracket():!1}isBracketActive(){return this.features.trading&&this.tradingManager.isBracketActive()}startOrderDraft(e,t){if(!this.features.trading)return!1;let n=this.series.bars(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startOrderDraft(e,r),!0)}cancelOrderDraft(){this.features.trading&&this.tradingManager.cancelOrderDraft()}confirmOrderDraft(){return this.features.trading?this.tradingManager.confirmOrderDraft():!1}isOrderDraftActive(){return this.features.trading&&this.tradingManager.isOrderDraftActive()}placeOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderPlace`,e)}setPositions(e){this.features.trading&&(this.tradingManager.setPositions(e),this.eventBus.emit(`positionsChange`,{positions:e}))}getOrders(){return this.tradingManager.getOrders()}getPositions(){return this.tradingManager.getPositions()}getFills(){return this.tradingManager.getFills()}getRealisedPnl(){return this.tradingManager.getRealisedPnl()}addFill(e){this.features.trading&&(this.tradingManager.addFill(e),this.eventBus.emit(`executionFill`,e))}clearFills(){this.tradingManager.setFills([])}cancelOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderCancel`,{orderId:e})}closePositionIntent(e){this.features.trading&&this.eventBus.emit(`positionClose`,{positionId:e})}reversePositionIntent(e){this.features.trading&&this.eventBus.emit(`positionReverse`,{positionId:e})}modifyPositionIntent(e){this.features.trading&&this.eventBus.emit(`positionModify`,e)}setDepthData(e){this.features.trading&&this.tradingManager.setDepthData(e)}setCurrentPrice(e,t){this.followLivePrice(e),this.replaySession?this.replaySession.price={price:e}:(this.currentPriceLine.setPrice(e),this.scheduleRender())}replayTrades(){return this.replaySession!==null&&this.executionAdapter?.setMarkPrice!==void 0}takeLivePrice(e){this.followLivePrice(e),this.replaySession?this.replaySession.price={price:e}:this.currentPriceLine.setPrice(e)}emitBars(e){this.eventBus.emit(`dataUpdate`,{kind:`bars`,length:e});let t=this.crosshairHandler.getSyncedSlot();t!==null&&this.showSyncedBar(t)}followLivePrice(e){this.replayTrades()||this.tradingManager.setCurrentPrice(e),this.features.alerts&&this.checkAlerts(e)}checkAlerts(e){let t=this.replaySession?this.series.liveBars():this.series.bars(),n=this.replaySession||this.series.length()===0?null:e=>this.indicatorEngine.getOutput(e)?.series;Nt(this.alertManager,{price:e,barTime:t.length>0?t[t.length-1].time:null,lines:n})}setTradingConfig(e){this.features.trading&&this.tradingManager.setConfig(e)}async connect(e){let r={...e,adapter:(0,n.streamAdapterOf)(e),feed:void 0};if(!(0,n.servesTimeframe)(r.adapter,r.timeframe))throw RangeError(`${r.adapter.name} cannot serve the ${r.timeframe} timeframe`);this.snapshotKey=null,this.holdReplayFor(r.symbol),this.disconnectStream(),this.streamManager=new n.StreamManager,this.streamManager.setTimeZone(this.studyZoneHeld?this.studyZone:this.getExchangeTimeZone()),this.streamManager.on(`snapshot`,e=>{let t=this.streamSeriesKey(r.adapter);t===this.snapshotKey&&this.replaySession?this.series.mergeSnapshot(e):t===this.snapshotKey&&this.series.length()>0?this.mergeSnapshot(e):(this.replaySession&&this.useStreamHistory(r.adapter,r.historyPageSize,!1),this.setData(e)),this.snapshotKey=t,this.useStreamHistory(r.adapter,r.historyPageSize)}),this.streamManager.on(`barClose`,e=>{if(!S(e))return;let t=this.series.placeStreamBar(e);if(t.to===`none`){this.updateBar(e);return}if(t.to===`aside`&&this.followLivePrice(e.close),t.to!==`shown`)return;let n=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),r=t.before,i=this.series.bars();this.crosshairHandler.setData(i),this.recalcIndicatorsFrom(i,i.length-2),this.updateViewportAndRender(n),i.length!==r&&this.emitBars(i.length),this.followLivePrice(e.close)}),this.streamManager.on(`barCorrection`,e=>{this.updateBar(e)}),this.streamManager.on(`barUpdate`,e=>{if(!S(e))return;let t=this.series.placeStreamBar(e);if(t.to===`none`||(this.replaySession||this.currentPriceLine.setPrice(e.close),this.replaySession))return;let n=t.before;if(t.to!==`shown`){this.scheduleRender();return}let r=this.series.bars();this.indicatorEngine.deferRecalculateFrom(r,r.length-1),this.announceIndicatorUpdate(r.length-1),r.length!==n&&this.emitBars(r.length),this.scheduleRender()}),this.setBidAsk(null),this.streamManager.on(`quote`,e=>{let t=this.priceLines.getBidAsk();this.setBidAsk({bid:e.bid??t?.bid,ask:e.ask??t?.ask})}),this.streamManager.on(`priceChange`,({price:e,previousClose:n})=>{if(!(!Number.isFinite(e)||e<0)){if(this.followLivePrice(e),this.replaySession){this.replaySession.price={price:e,previousClose:n??void 0};return}this.currentPriceLine.setPrice(e,n??void 0),this.engine.requestRender(t.LayerType.Overlay)}}),this.streamManager.on(`connectionChange`,e=>{this.eventBus.emit(`dataUpdate`,{kind:`connection`,connection:e})}),this.streamManager.on(`error`,e=>{this.eventBus.emit(`dataUpdate`,{kind:`error`,error:e.message})}),this.streamManager.on(`symbolInfo`,e=>this.applyFeedSymbolInfo(e)),this.autoScrollOnNewBar=r.autoScroll!==!1,this.setStreamTarget(r.symbol,r.timeframe),this.streamAdapter=r.adapter;let i=this.streamManager;if(this.resolveStreamSymbol(r.adapter,r.symbol),await i.connect(r),this.streamManager!==i)return;let a=(0,t.timeframeToMs)(r.timeframe);this.barCountdown.setTimeframeMs(a),this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(()=>{this.barCountdown.isVisible()&&this.engine.requestRender(t.LayerType.Hover)},1e3)}streamSeriesKey(e){let t=(0,n.withResampling)(e),r=this.streamTimeframe,i=t instanceof n.ResamplingAdapter&&r!==null?t.bucketFor(this.currentSymbol,r):null;return`${this.currentSymbol}|${r}|${i?.timeZone??``}`}setStreamTarget(e,n){let r=this.announcedSymbol;this.currentSymbol=e,this.streamTimeframe=n,this.tickStream=(0,t.tickBarCount)(n)!==null,this.applyTimeSpacing(),e!==r&&this.chartLegend.setSymbol(e),e!==r&&(this.announcedSymbol=e,this.eventBus.emit(`symbolChange`,{symbol:e,previous:r})),this.useTimeframe(n)}setDataTimeframe(e){this.streamManager||(this.useTimeframe(e),this.engine.requestRender(t.LayerType.Hover))}useTimeframe(e){let t=this.announcedTimeframe;this.chartLegend.setTimeframe(e??``),this.indicatorEngine.setTimeframe(e)&&this.updateViewportAndRender(),this.drawingManager.setTimeframe(e),e!==t&&(this.announcedTimeframe=e,e&&this.eventBus.emit(`timeframeChange`,{timeframe:e,previous:t}))}async switchStream(e,r){if(!this.streamManager)return;let i=this.streamAdapter;if(i&&!(0,n.servesTimeframe)(i,r))throw RangeError(`${i.name} cannot serve the ${r} timeframe`);this.holdReplayFor(e),this.setStreamTarget(e,r),this.historyFromStream&&this.history.setLoader(null),this.barCountdown.setTimeframeMs((0,t.timeframeToMs)(r)),i&&this.resolveStreamSymbol(i,e),await this.streamManager.switchTo(e,r)}isIndicatorAllowed(e){let t=this.features.indicatorIds;return this.features.indicators&&(t.length===0||t.includes(e))}isTimeframeAllowed(e){let t=this.features.timeframes;return t.length===0||t.includes(e)}async setTimeframe(e){if(!this.streamManager)throw Error(`No active stream. Call connect() first.`);this.isTimeframeAllowed(e)&&await this.switchStream(this.currentSymbol,e)}disconnectStream(){this.symbolInfoSeq++,this.releaseStudyZoneAfterCaller(),this.priceLines.setBidAsk(null),this.streamManager&&=(this.streamManager.dispose(),null),this.historyFromStream&&=(this.history.setLoader(null),!1),this.replayLoader?.loader.dispose(),this.replayLoader=null,this.streamAdapter=null,this.tickStream=!1,this.applyTimeSpacing()}connectExecution(e,t={}){if(!this.features.trading)throw Error(`connectExecution requires features.trading to be enabled`);this.disconnectExecution(),this.executionAdapter=e,this.execTeardown=mt(e,{onIntent:(e,t)=>{let n=e=>t(e.payload);return this.eventBus.on(e,n),()=>this.eventBus.off(e,n)},setOrders:e=>this.setOrders(e),setPositions:e=>this.setPositions(e),onError:e=>this.eventBus.emit(`executionError`,e),onFill:e=>{this.tradingManager.addFill(e),this.eventBus.emit(`executionFill`,e)},getPositions:()=>this.tradingManager.getPositions()}),Promise.resolve(e.connect(t)).catch(e=>this.eventBus.emit(`executionError`,{message:`Execution connect failed`,cause:e}))}disconnectExecution(){this.returnMarkToLive(),this.execTeardown&&=(this.execTeardown(),null),this.executionAdapter&&=(this.executionAdapter.disconnect(),null)}getExecutionAdapter(){return this.executionAdapter}setBarCountdownVisible(e){this.barCountdown.setVisible(e&&this.features.barCountdown),this.engine.requestRender(t.LayerType.Hover)}isBarCountdownVisible(){return this.barCountdown.isVisible()}setSessionBreaksVisible(e){this.sessionBreaks.setVisible(e),this.engine.requestRender(t.LayerType.Background)}addCompareSymbol(e,t,n,r){this.features.compareSymbols&&(this.compareRenderer.addSymbol({id:e,label:t,data:n,color:r,visible:!0}),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`add`}))}removeCompareSymbol(e){this.compareRenderer.removeSymbol(e),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`remove`})}updateCompareData(e,t){this.compareRenderer.setSymbolData(e,t),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`data`})}setCompareMode(e){this.compareRenderer.setMode(e),this.updateViewportAndRender()}setCompareVisible(e,t){this.compareRenderer.setSymbolVisible(e,t),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`visible`})}getCompareValues(e){if(!this.comparesDrawn()){let e=this.series.bars();return this.compareRenderer.valuesAt(e,null,e.length-1)}let t=this.getDisplayData();return this.compareRenderer.valuesAt(t,this.viewport.getState(),e??t.length-1)}comparesDrawn(){return this.isTimeAligned()}clearCompareSymbols(){let e=this.compareRenderer.getSymbols().map(e=>e.id);this.compareRenderer.clear(),this.updateViewportAndRender();for(let t of e)this.eventBus.emit(`compareChange`,{id:t,change:`remove`})}setLogScale(e){e&&!this.features.logScale||(this.viewport.setLogScale(e),this.updateViewportAndRender())}isLogScale(){return this.viewport.isLogScale()}setInvertScale(e){this.viewport.setInvertScale(e),this.updateViewportAndRender()}isInvertScale(){return this.viewport.isInvertScale()}setScaleMode(e){e===`logarithmic`&&!this.features.logScale||(this.viewport.setScaleMode(e),this.updateViewportAndRender())}getScaleMode(){return this.viewport.getScaleMode()}setSessionBreaksConfig(e){this.sessionBreaks.setConfig(e),this.engine.requestRender(t.LayerType.Background)}getConnectionState(){return this.streamManager?.getConnectionState()??`disconnected`}getConnectionInfo(){return this.streamManager?.getConnectionInfo()??{state:`disconnected`}}setAutoScroll(e){this.autoScrollOnNewBar=e}scrollTo(e){let t=this.series.bars();for(let n=0;n<t.length;n++)if(t[n].time>=e){let e=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(n*e-this.viewport.getState().offset),this.updateViewportAndRender();return}}goToTime(e){let t=this.getDisplayData();if(t.length===0||!Number.isFinite(e))return-1;let r=Math.max(0,Math.min(t.length-1,Math.floor((0,n.timestampToBarIndex)(e,t)))),i=this.viewport.getState(),a=r*(i.barWidth+i.barSpacing)+i.barWidth/2-i.chartRect.width/2;return this.viewport.scrollBy(a-i.offset),this.updateViewportAndRender(),r}setVisibleRangePreset(e){let r=this.getDisplayData();if(r.length===0)return;let i=r.length-1,a=(0,t.barTimeUnit)(r),o=(0,n.rangePresetStart)(e,r[i].time*a,this.displayTz),s=o===null?null:o/a;if(s===null||s<r[0].time){this.fitContent();return}let c=(0,n.timestampToBarIndex)(s,r),l=Math.min(i,e===`YTD`?Math.ceil(c):Math.floor(c)+1);this.viewport.zoomToBarRange(l,i+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender()}scrollToEnd(){this.viewport.scrollToEnd(),this.updateViewportAndRender()}scrollBars(e){if(!Number.isFinite(e)||e===0)return;let{barWidth:t,barSpacing:n}=this.viewport.getState();this.viewport.scrollBy(e*(t+n)),this.updateViewportAndRender()}getVisibleTimeRange(){let e=this.getDisplayData();if(e.length===0)return null;let{offset:t,barWidth:n,barSpacing:r,chartRect:i}=this.viewport.getState(),a=n+r;if(a<=0)return null;let o=Math.ceil((t-n/2)/a),s=Math.floor((t+i.width-n/2)/a),c=t=>e[Math.max(0,Math.min(e.length-1,t))].time;return{from:c(o),to:c(Math.max(o,s))}}setVisibleRange(e,t){let r=this.getDisplayData();if(r.length===0)return;let i=(0,n.timestampToBarIndex)(Math.min(e,t),r),a=(0,n.timestampToBarIndex)(Math.max(e,t),r);this.viewport.zoomToBarRange(i,a),this.updateViewportAndRender()}suspend(){this.setPaused(`host`,!0)}resume(){this.setPaused(`host`,!1)}isSuspended(){return this.pausedFor.host||this.pausedFor.page||this.pausedFor.offscreen}setPaused(e,t){let n=this.isSuspended();this.pausedFor={...this.pausedFor,[e]:t};let r=this.isSuspended();if(!(n===r||this.disposed)){if(r){this.engine.renderLoop.pause();return}this.renderDeferred&&(this.renderDeferred=!1,this.scheduleRender()),this.engine.renderLoop.resume()}}watchVisibility(e,t){let n=[];if(t&&typeof IntersectionObserver<`u`){let t=new IntersectionObserver(e=>{let t=e[e.length-1];t&&this.setPaused(`offscreen`,!t.isIntersecting)});t.observe(e),n.push(()=>t.disconnect())}if(typeof document<`u`){let e=()=>{t&&this.setPaused(`page`,document.hidden),document.hidden||this.streamManager?.wake(`visible`)};document.addEventListener(`visibilitychange`,e),n.push(()=>document.removeEventListener(`visibilitychange`,e)),t&&document.hidden&&this.setPaused(`page`,!0)}if(typeof window<`u`){let e=()=>this.streamManager?.wake(`online`);window.addEventListener(`online`,e),n.push(()=>window.removeEventListener(`online`,e))}this.stopWatchingVisibility=()=>n.forEach(e=>e())}setPageScroll(e){this.options.pageScroll=e,this.interactionManager.setPageScroll(e)}getPageScroll(){return this.options.pageScroll??!1}setMaxPixelRatio(e){this.engine.dprManager.setMaxPixelRatio(e)}getMaxPixelRatio(){return this.engine.dprManager.getMaxPixelRatio()}setMinBarUnit(e){this.viewport.setMinBarUnit(e),this.updateViewportAndRender()}getMinBarUnit(){return this.viewport.getMinBarUnit()}setPanLimits(e){this.viewport.setPanLimits(e),this.updateViewportAndRender()}zoomIn(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(.2,e/2),this.updateViewportAndRender()}zoomOut(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(-.2,e/2),this.updateViewportAndRender()}fitContent(){let e=this.getDisplayData().length;e!==0&&(this.viewport.zoomToBarRange(0,e-1+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender())}on(e,t){this.eventBus.on(e,t)}off(e,t){this.eventBus.off(e,t)}enableTauriBridge(e){this.eventBus.enableTauriBridge({enabled:!0,...e})}disableTauriBridge(){this.eventBus.disableTauriBridge()}setTheme(e){this.themeManager.setTheme(e),this.syncRenderContext(),this.applyIdleCursor(),this.container.style.backgroundColor=this.themeManager.getTheme().background,this.lastBackground=this.themeManager.getTheme().background,this.engine.requestRender(),this.eventBus.emit(`themeChange`,{theme:e}),this.markStateChanged()}getTheme(){return this.themeManager.getBaseTheme()}applyOverrides(e,t={}){this.applyStyle(e,t.layer??`host`,!0)}setOverrides(e,n={}){let r=n.layer??`host`,{overrides:i,rejected:a}=(0,t.readChartStyleOverrides)(e);a.length>0&&console.warn(`Style overrides left out (unknown key or value): ${a.join(`, `)}`);let o=Object.fromEntries(Object.entries(i).filter(([,e])=>e!==null));this.themeManager.setOverrides(o,r)&&this.styleChanged(r)}resetOverrides(e,t={}){let n=t.layer??`host`;this.themeManager.resetOverrides(n,e)&&this.styleChanged(n)}getOverrides(e={}){return this.themeManager.getOverrides(e.layer??`host`)}getStyle(){return this.themeManager.getTheme().style}getStyleValue(e){return this.themeManager.getStyleValue(e)}applyStyle(e,n,r){let{overrides:i,rejected:a}=(0,t.readChartStyleOverrides)(e);a.length>0&&console.warn(`Style overrides left out (unknown key or value): ${a.join(`, `)}`),this.themeManager.applyOverrides(i,n)&&r&&this.styleChanged(n)}styleChanged(e){this.syncRenderContext(),this.applyIdleCursor();let t=this.themeManager.getTheme().background;t!==this.lastBackground&&(this.container.style.backgroundColor=t,this.lastBackground=t),this.engine.requestRender(),this.eventBus.emit(`styleChange`,{layer:e}),e===`user`&&this.markStateChanged()}setWatermark(e,n){this.watermark.setConfig({text:e,...n}),this.engine.requestRender(t.LayerType.Background)}setAutoScale(e){this.priceFit.setAuto(e,this.series.length()>0),this.updateViewportAndRender()}holdPriceScale(){this.priceFit.hold()}isAutoScale(){return this.priceFit.isAuto()}setCrosshairMode(e){this.crosshairHandler.setMode(e),this.engine.requestRender(t.LayerType.Hover)}getCrosshairMode(){return this.crosshairHandler.getMode()}setCrosshairCursor(e){!(0,n.isCrosshairCursor)(e)||e===this.crosshairHandler.getCursor()||(this.crosshairHandler.setCursor(e),this.applyIdleCursor(),this.engine.requestRender(t.LayerType.Hover),this.eventBus.emit(`crosshairCursorChange`,{cursor:e}))}getCrosshairCursor(){return this.crosshairHandler.getCursor()}applyIdleCursor(){let e=this.themeManager.getTheme(),t=e.style?.crosshair.vertical.color??e.crosshair;this.interactionManager.setIdleCursor((0,n.idleCssCursor)(this.crosshairHandler.getCursor(),t,e.background))}setCrosshairPosition(e){e?this.crosshairHandler.onPointerMove(e):this.crosshairHandler.onPointerLeave(),this.engine.requestRender(t.LayerType.Hover)}setCrosshairTime(e){let r=this.getDisplayData(),i=e===null||r.length===0?null:Math.floor((0,n.timestampToBarIndex)(e,r));i!==this.crosshairHandler.getSyncedSlot()&&(this.crosshairHandler.setSyncedSlot(i),this.showSyncedBar(i),this.engine.requestRender(t.LayerType.Hover))}showSyncedBar(e){if(e===null){this.crosshairHandler.getPosition()||this.chartLegend.setHoverBar(null),this.eventBus.emit(`crosshairSync`,{barIndex:null});return}let t=this.crosshairSeries(),r=e>=0&&e<t.length?t[e]:void 0,i=r&&e>0?t[e-1]:void 0;this.crosshairHandler.getPosition()||this.chartLegend.setHoverBar(r??null,i??null);let a=r?(0,n.axisTimes)(t)[e]?.time??r.time:void 0;this.eventBus.emit(`crosshairSync`,{barIndex:e,...r?{bar:r}:{},...a===void 0?{}:{time:a},...i?{prevClose:i.close}:{}})}getData(){return this.series.bars()}setGridVisible(e){this.gridRenderer.setVisible(e),this.engine.requestRender(t.LayerType.Background)}isGridVisible(){return this.gridRenderer.isVisible()}setVolumeVisible(e){this.volumeRenderer.setVisible(e),this.updateViewportAndRender()}isVolumeVisible(){return this.features.volume&&this.volumeRenderer.isVisible()}setVolumeProfileVisible(e){this.volumeProfile.setVisible(e),this.engine.requestRender(t.LayerType.Main)}isVolumeProfileVisible(){return this.volumeProfile.isVisible()}setVolumeProfileConfig(e){e.buckets!==void 0&&this.volumeProfile.setBuckets(e.buckets),e.widthRatio!==void 0&&this.volumeProfile.setWidthRatio(e.widthRatio),e.opacity!==void 0&&this.volumeProfile.setOpacity(e.opacity),e.highlightPoC!==void 0&&this.volumeProfile.setHighlightPoC(e.highlightPoC),this.engine.requestRender(t.LayerType.Main)}setMarketProfileVisible(e){this.marketProfile.setVisible(e),this.engine.requestRender(t.LayerType.Main)}isMarketProfileVisible(){return this.marketProfile.isVisible()}setMarketProfileConfig(e){e.buckets!==void 0&&this.marketProfile.setBuckets(e.buckets),e.widthRatio!==void 0&&this.marketProfile.setWidthRatio(e.widthRatio),e.opacity!==void 0&&this.marketProfile.setOpacity(e.opacity),e.valueAreaPct!==void 0&&this.marketProfile.setValueAreaPct(e.valueAreaPct),e.highlightPoC!==void 0&&this.marketProfile.setHighlightPoC(e.highlightPoC),e.showStats!==void 0&&this.marketProfile.setShowStats(e.showStats),e.splitBySession!==void 0&&this.marketProfile.setSplitBySession(e.splitBySession),e.letters!==void 0&&this.marketProfile.setLetters(e.letters),this.engine.requestRender(t.LayerType.Main)}getMarketProfileConfig(){return this.marketProfile.getConfig()}getMarketProfileStats(){return this.marketProfile.getStats()}setDepthHeatmapVisible(e){this.depthHeatmap.setVisible(e),this.engine.requestRender(t.LayerType.Main)}isDepthHeatmapVisible(){return this.depthHeatmap.isVisible()}setDepthHeatmapConfig(e){e.opacity!==void 0&&this.depthHeatmap.setOpacity(e.opacity),e.capacity!==void 0&&this.depthHeatmap.setCapacity(e.capacity),this.engine.requestRender(t.LayerType.Main)}getDepthHeatmapConfig(){return this.depthHeatmap.getConfig()}pushDepthSnapshot(e,n){let r=this.series.bars(),i=n??r[r.length-1]?.time;i===void 0||!Number.isFinite(i)||(this.depthHeatmap.push(i,e),this.depthHeatmap.isVisible()&&this.engine.requestRender(t.LayerType.Main))}clearDepthHeatmap(){this.depthHeatmap.clear(),this.engine.requestRender(t.LayerType.Main)}setPeriodLevelsVisible(e){this.periodLevels.setVisible(e),this.engine.requestRender(t.LayerType.Main)}isPeriodLevelsVisible(){return this.periodLevels.isVisible()}setPeriodLevelsPeriod(e){this.periodLevels.setPeriod(e),this.engine.requestRender(t.LayerType.Main)}getPeriodLevelsPeriod(){return this.periodLevels.getPeriod()}setTimeZone(e){Kt(e),this.timeZoneSetting=e,this.applyTimeZone()}getTimeZone(){return this.timeZoneSetting}getEffectiveTimeZone(){return this.displayTz}getExchangeTimeZone(){return[(0,t.symbolTimeZone)(this.symbolInfo),this.marketConfig?.timeZone].find(e=>e&&(0,t.isValidTimeZone)(e))??null}setTimezone(e){this.setTimeZone(e)}getTimezone(){return this.getTimeZone()}getEffectiveTimezone(){return this.getEffectiveTimeZone()}getExchangeTimezone(){return this.getExchangeTimeZone()}setTimezoneOffset(e){this.setTimeZone(e)}applyExchangeZone(){let e=this.getExchangeTimeZone();this.timeAxis.setExchangeTimeZone(e),this.crosshairHandler.setExchangeTimeZone(e),this.crosshairTooltip.setExchangeTimeZone(e),this.pinnedTooltip.setExchangeTimeZone(e),this.studyZoneHeld||this.applyStudyZone(e)}applyStudyZone(e){this.studyZone=e,this.streamManager?.setTimeZone(e),this.periodLevels.setExchangeTimeZone(e),this.marketProfile.setExchangeTimeZone(e);let t=this.series.bars();this.indicatorEngine.setExchangeTimeZone(e,t.length>0?t:void 0)&&t.length>0&&this.announceIndicatorUpdate(0)}holdStudyZone(){this.endStudyZoneWait(),this.studyZoneHeld=!0,this.studyZoneTimer=setTimeout(()=>this.releaseStudyZone(),n.SYMBOL_ZONE_WAIT_MS)}endStudyZoneWait(){this.studyZoneReleaseQueued=!1,this.studyZoneTimer!==null&&(clearTimeout(this.studyZoneTimer),this.studyZoneTimer=null)}releaseStudyZone(){this.endStudyZoneWait(),this.studyZoneHeld&&(this.studyZoneHeld=!1,this.applyStudyZone(this.getExchangeTimeZone()),this.disposed||this.updateViewportAndRender())}releaseStudyZoneAfterCaller(){this.studyZoneHeld&&(this.endStudyZoneWait(),this.studyZoneReleaseQueued=!0,queueMicrotask(()=>{!this.studyZoneReleaseQueued||this.disposed||this.releaseStudyZone()}))}spokenBarTime(e){let n=this.getDisplayData(),r=e*(0,t.barTimeUnit)(n),i=this.numberLocale||`en-US`;return(0,t.barsAreDaily)(n)===!0?(0,t.zonedDateFormatter)(i,{dateStyle:`medium`},(0,t.barDateZone)(r,this.displayTz,this.getExchangeTimeZone()))(r):(0,t.zonedDateFormatter)(i,{dateStyle:`medium`,timeStyle:`short`},this.displayTz)(r)}applyTimeZone(){let e=this.timeZoneSetting===`exchange`?this.getExchangeTimeZone()??`UTC`:this.timeZoneSetting;this.displayTz=e,this.timeAxis.setTimezoneOffset(e),this.crosshairHandler.setTimezoneOffset(e),this.crosshairTooltip.setTimezoneOffset(e),this.pinnedTooltip.setTimezone(e),this.sessionBreaks.setTimezone(e),this.engine.requestRender()}setSymbolInfo(e){this.studyZoneHeld=!1,this.endStudyZoneWait(),this.useSymbolInfo(e)}useSymbolInfo(e){let n=e&&this.symbolInfo?.symbol===e.symbol?(0,t.symbolTimeZone)(this.symbolInfo):void 0;this.symbolInfo=e?qt({...e,sessions:e.sessions?.map(e=>({...e}))},n):null,this.chartLegend.setExchange(this.symbolInfo?.exchange??``),this.engine.requestRender(t.LayerType.Hover),this.priceAxis.setPriceTick(this.symbolInfo?.minTick??null),this.marketConfig?.pricePrecision===void 0&&this.applyPricePrecision(this.symbolInfo?.pricePrecision??null);let r=(this.symbolInfo?.sessions??[]).flatMap(e=>{let n=(0,t.sessionMinute)(e.start),r=(0,t.sessionMinute)(e.end);return n===null||r===null?[]:[{startMinute:n,endMinute:r}]}),i=(0,t.symbolTimeZone)(this.symbolInfo);this.sessionShading.replaceConfig(r.length>0&&i&&(0,t.isValidTimeZone)(i)?{timeZone:i,windows:r,startMinute:r[0].startMinute,endMinute:r[r.length-1].endMinute}:this.hostSessionHours),this.timeZoneSetting===`exchange`&&this.applyTimeZone(),this.applyExchangeZone(),this.reapplyExtendedHours(),this.updateViewportAndRender(),this.eventBus.emit(`symbolInfoChange`,{info:this.symbolInfo})}getSymbolInfo(){return this.symbolInfo}applyFeedSymbolInfo(e){if(!e||typeof e!=`object`)return;let n=this.currentSymbol,r=e=>!e||e.toUpperCase()===n.toUpperCase();if(!r(e.symbol))return;let i=this.symbolInfo&&r(this.symbolInfo.symbol)?this.symbolInfo:null,a=qt({...i,...e,symbol:e.symbol||i?.symbol||n},(0,t.symbolTimeZone)(i));i&&JSON.stringify(a)===JSON.stringify(i)||(this.symbolInfoSeq++,this.setSymbolInfo(a))}resolveStreamSymbol(e,t){let r=(0,n.withResampling)(e),i=r.resolveSymbol?.bind(r);if(this.symbolInfo&&this.symbolInfo.symbol!==t?(i?this.holdStudyZone():this.studyZoneHeld=!1,this.useSymbolInfo(null)):i&&this.studyZoneHeld&&this.holdStudyZone(),!i){this.releaseStudyZone();return}let a=++this.symbolInfoSeq;Promise.resolve().then(()=>i(t)).then(e=>{a===this.symbolInfoSeq&&(e&&this.currentSymbol===t?this.setSymbolInfo(e):this.releaseStudyZone())},e=>{a===this.symbolInfoSeq&&(this.releaseStudyZone(),console.warn(`No symbol info for "${t}":`,e))})}setPivotMarkersVisible(e){this.pivotMarkers.setVisible(e),this.engine.requestRender(t.LayerType.Overlay)}isPivotMarkersVisible(){return this.pivotMarkers.isVisible()}setPivotMarkersConfig(e){(e.left!==void 0||e.right!==void 0)&&this.pivotMarkers.setStrength(e.left??5,e.right??e.left??5),e.showLabels!==void 0&&this.pivotMarkers.setShowLabels(e.showLabels),e.structureLabels!==void 0&&this.pivotMarkers.setStructureLabels(e.structureLabels),this.engine.requestRender(t.LayerType.Overlay)}getPivotMarkersConfig(){return this.pivotMarkers.getConfig()}setSessionShadingVisible(e){this.sessionShading.setVisible(e),this.engine.requestRender(t.LayerType.Background)}isSessionShadingVisible(){return this.sessionShading.isVisible()}setSessionShadingConfig(e){this.hostSessionHours=(0,n.mergeSessionHours)(this.hostSessionHours,e),this.sessionShading.replaceConfig(this.hostSessionHours),this.engine.requestRender(t.LayerType.Background)}setTooltipVisible(e){e||this.crosshairTooltip.hide()}setLegend(e){this.chartLegend.setConfig(e),this.engine.requestRender(t.LayerType.Hover)}isLegendVisible(){return this.features.legend&&this.chartLegend.getConfig().visible}setSymbolName(e){this.chartLegend.setSymbol(e),this.engine.requestRender(t.LayerType.Hover)}setStatusText(e){this.chartLegend.setStatusText(e),this.engine.requestRender(t.LayerType.Hover)}async setRenderer(e){let t=++this.rendererToken;return this.waitForGpu(null),e===`canvas`?(this.applyRenderer(null),`canvas`):this.engine.getGpu()?`webgl`:this.takeGpu(e,t,!0)}async takeGpu(e,t,r){let{gpu:i,reason:a}=await(0,n.loadWebGL)(e);return t!==this.rendererToken||this.disposed?(i?.destroy(),this.getRenderer()):a===`limit`?(0,n.gpuContextsLeft)()>0?this.takeGpu(e,t,r):(this.waitForGpu(()=>void this.takeGpu(e,t,!1)),r&&this.applyRenderer(null,`limit`),this.getRenderer()):((i||r)&&this.applyRenderer(i,a),this.getRenderer())}waitForGpu(e){this.stopWaitingForGpu?.(),this.stopWaitingForGpu=e?(0,n.whenGpuContextFree)(e):null}getRenderer(){return this.engine.getGpu()?`webgl`:`canvas`}applyRenderer(e,t){let n=this.getRenderer();e?this.engine.attachGpu(e):this.engine.detachGpu();let r=this.getRenderer();(r!==n||t)&&this.eventBus.emit(`rendererChange`,t?{renderer:r,reason:t}:{renderer:r})}freshFrame(){if(this.isSuspended()){this.renderDeferred&&(this.renderDeferred=!1,this.refitForTick()),this.engine.renderNow();return}this.engine.getGpu()&&this.engine.renderNow()}screenshot(e){this.features.screenshot&&(this.freshFrame(),n.Screenshot.download(this.container,e,this.themeManager.getTheme().background))}async copyScreenshot(){if(!this.features.screenshot)return!1;let e=globalThis.ClipboardItem,t=typeof navigator>`u`?void 0:navigator.clipboard;if(!t?.write||!e)return!1;try{this.freshFrame();let r=n.Screenshot.toBlob(this.container,this.themeManager.getTheme().background).then(e=>{if(!e)throw Error(`No chart image to copy`);return e});r.catch(()=>{});let i;try{i=new e({"image/png":r})}catch(t){if(!(t instanceof TypeError))throw t;i=new e({"image/png":await r})}return await t.write([i]),!0}catch{return!1}}screenshotDataURL(){return this.features.screenshot?(this.freshFrame(),n.Screenshot.toDataURL(this.container,this.themeManager.getTheme().background)):null}async screenshotBlob(){return this.features.screenshot?(this.freshFrame(),n.Screenshot.toBlob(this.container,this.themeManager.getTheme().background)):null}addAlert(e,t=`crossing`,n,r=`price`,i,a={}){if(!this.features.alerts)return null;let o=this.alertManager.addAlert(e,t,n,!1,r,i,a);return this.markStateChanged(),o}removeAlert(e){this.alertManager.removeAlert(e),this.markStateChanged()}getSelectedDrawingIds(){return this.drawingManager.getSelectedDrawingIds()}moveDrawing(e,t){let n=this.drawingManager.moveDrawing(e,t);return n&&this.markStateChanged(),n}groupDrawings(e,t){let n=this.drawingManager.groupDrawings(e,t);return n&&this.markStateChanged(),n}ungroupDrawings(e){return this.afterDrawingChange(this.drawingManager.ungroup(e))}renameDrawingGroup(e,t){return this.afterDrawingChange(this.drawingManager.renameGroup(e,t))}setDrawingGroupVisible(e,t){return this.afterDrawingChange(this.drawingManager.setGroupVisible(e,t))}setDrawingGroupLocked(e,t){return this.afterDrawingChange(this.drawingManager.setGroupLocked(e,t))}getDrawingGroups(){return this.drawingManager.getGroups()}afterDrawingChange(e){return e&&this.markStateChanged(),e}canAddDrawingAlert(e){return this.features.alerts&&this.drawingLevelsNow(e)!==null}drawingLevelsNow(e){if(this.drawingManager.getDrawings().find(t=>t.id===e)?.paneId!==void 0)return null;let t=this.replaySession?this.series.liveBars():this.getDisplayData();if(t.length===0)return null;let n={...this.viewport.getState(),data:t};return this.drawingManager.priceAt(e,t[t.length-1].time,n)}followDrawingAlerts(e,t){!t||!this.drawingAlerts||(e===`drawingRemove`?this.drawingAlerts.removed(t):e===`drawingCreate`&&this.drawingAlerts.created(t))}dropOrphanDrawingAlerts(){this.drawingAlerts&&this.drawingAlerts.prune(new Set(this.drawingManager.getDrawings().map(e=>e.id)))>0&&this.markStateChanged()}addDrawingAlert(e,t={}){if(!this.canAddDrawingAlert(e))return null;let n=this.alertManager.addDrawingAlert(e,t.condition??`crossing`,t.message,t.repeating??!1,t.label);return this.markStateChanged(),n}getAlerts(){return this.alertManager.getAlerts()}clearAlerts(){this.alertManager.clearAlerts(),this.markStateChanged()}saveAlerts(e){this.alertManager.saveToStorage(e)}loadAlerts(e){this.alertManager.loadFromStorage(e),this.alertManager.pruneDrawingAlerts(new Set(this.drawingManager.getDrawings().map(e=>e.id))),this.engine.requestRender(t.LayerType.Overlay)}addSignalMarker(e){return this.signalMarkerManager.addMarker(e)}removeSignalMarker(e){this.signalMarkerManager.removeMarker(e)}getSignalMarkers(){return this.signalMarkerManager.getMarkers()}setSignalMarkers(e){this.signalMarkerManager.setMarkers(e)}clearSignalMarkers(){this.signalMarkerManager.clearMarkers()}setSignalMarkerStyle(e){this.signalMarkerManager.setStyle(e)}addTradeZone(e){return this.tradeZoneManager.addZone(e)}updateTradeZone(e,t){this.tradeZoneManager.updateZone(e,t)}removeTradeZone(e){this.tradeZoneManager.removeZone(e)}getTradeZones(){return this.tradeZoneManager.getZones()}setTradeZones(e){this.tradeZoneManager.setZones(e)}clearTradeZones(){this.tradeZoneManager.clearZones()}setTradeZoneStyle(e){this.tradeZoneManager.setStyle(e)}replayStart(e){if(!this.features.replay)return;let t=this.replaySession?this.replayOffset:0;if(!this.replaySession){if(this.series.length()===0)return;this.series.beginReplay(),this.replaySession=dn(this.currentSymbol)}let n=this.replaySession,{steps:r,startTime:i,hideHistory:a,revealMarks:o,step:s,...c}=e??{};c.animate=c.animate===!0;let l=this.series.inHoursShown(this.series.liveBars()),u=t>0&&i===void 0&&a!==!1,d=c.startIndex;i!==void 0&&d===void 0?d=V(l,i):u&&d!==void 0&&(d+=t);let f=u?t:a&&d!==void 0&&d>0?Math.min(Math.floor(d),l.length-1):0,p=f>0?l.slice(f):l;d!==void 0&&(c.startIndex=d-f),n.windowTime=f>0?p[0]?.time??null:null,n.steps=r??null,n.stepsSymbol=this.currentSymbol,n.until=null,n.animate=c.animate,n.step=c.animate?s??null:null,this.replayRevealMarks=o!==!1,this.useReplayLoader(n,!0);let m=r?this.replayStepsOver(n,p,!0):null;this.priceFit.resume(),this.buildReplay(p,m,f);let h=this.replayStepsSeries;h&&c.startIndex!==void 0&&(c.startIndex=vn(h,p,c.startIndex));let g=h??p,_=g[Math.max(0,Math.min(Math.floor(Number(c.startIndex??0))||0,g.length-1))];this.revealReplayMarks(this.replayRevealMarks?_?.time??null:null),n.held&&(n.held.state=c.paused?`paused`:`playing`,c.paused=!0),!c.paused&&c.startIndex!==void 0&&c.startIndex>=1&&this.replaySeek(c.startIndex-1),this.replayManager.play(c)}buildReplay(e,t,n){let r=this.replaySession?.animate===!0,i=r?null:t;this.replayPieces=r&&t?xn(t,e):null,this.replayForming=null,this.replayOffset=n,this.replayStepsSeries=i,this.replayCoarse=e;let a=this.replayRestarting;this.replayRestarting=!0;try{this.replayManager.load(i??e)}finally{this.replayRestarting=a}this.replayBarUnsub?.(),this.replayPhaseUnsub?.();let o=-1,s=-1,c=null,l=i??e;this.replayBarUnsub=this.replayManager.on(`bar`,({index:t})=>{let n=t,a=e[t];if(i){let r=i[t];n=G(e,r.time),c=c!==null&&s===t-1&&n===o-1&&c?Cn(c,r):yn(e[n],i,t),a=bn(i,e,t,n)?e[n]:c}let u=this.replayForming;this.replayForming=null,s=t;let d=n+1,f=o>0&&d>=o&&this.series.length()===o,p=f&&!this.replaySeeking,m=!p||this.autoScrollOnNewBar&&this.viewport.isAtEnd(),h=this.series.length();if(f){d>o&&this.series.updateReplayed(e[o-1]);for(let t=o;t<d-1;t++)this.series.appendReplayed(e[t]);d>o?this.series.appendReplayed(a):this.series.updateReplayed(a),this.recalcIndicatorsFrom(this.series.bars(),Math.max(0,o-1))}else this.series.showReplayed([...e.slice(0,n),a]),this.recalcIndicators(this.series.bars());o=d,this.replayCause===`older`&&(this.viewport.prependBars(d-h),m=!1),this.currentPriceLine.setPrice(a.close,n>0?e[n-1].close:void 0),this.crosshairHandler.setData(this.series.bars());let g=l[t+1]?.time??l[t].time+(t>0?l[t].time-l[t-1].time:1);this.replaySession&&(this.replaySession.until=g),this.replayRevealMarks&&this.revealReplayMarks(g),this.display.reset(),this.updateViewportAndRender(m),r?this.feedReplayForming(e,t,u?.index===t?u.path:this.replayPathOf(e,t),1):this.feedReplaySteps(l,t);let _=this.replayCause===null?p?`play`:`seek`:`series`;this.eventBus.emit(`replayStep`,{barIndex:n,time:e[n].time,stepTime:l[t].time,until:g,total:e.length,cause:_})}),r&&(this.replayPhaseUnsub=this.replayManager.on(`phase`,({index:t,fraction:n})=>{if(!e[t]||this.series.length()!==o||o!==t&&o!==t+1)return;let r=this.replayForming?.index===t?this.replayForming.path:this.replayPathOf(e,t),i=Sn()?kt(r,n):n,a=o===t,s=a&&this.autoScrollOnNewBar&&this.viewport.isAtEnd(),c=Ot(r,i);a?this.series.appendReplayed(c):this.series.updateReplayed(c),o=t+1,this.replayForming={index:t,path:r},this.drawFormingBar(c,t>0?e[t-1].close:void 0,a,s),this.feedReplayForming(e,t,r,i),this.loadReplaySteps(e,t)}))}drawFormingBar(e,t,n,r){this.currentPriceLine.setPrice(e.close,t);let i=this.series.bars();if(this.recalcIndicatorsFrom(i,i.length-1),!n){this.scheduleRender();return}this.crosshairHandler.setData(i),this.display.reset(),this.updateViewportAndRender(r)}replayPathOf(e,t){let n=e[t];return Ct(n,this.replayPieces?.get(n.time)??this.replayLoader?.loader.piecesOf(n.time)??[])}loadReplaySteps(e,t){let n=this.replayLoader?.loader;if(!n)return;n.evictBefore(e[t].time);let r=this.replayManager.getStepMs();n.ensure(e,t,Number.isFinite(r)&&r>0?Math.ceil(sn/r):1)}useReplayLoader(e,r){let i=this.streamAdapter,a=this.streamTimeframe,o=e.step&&i&&a!==null?Mt(e.step,a,e=>(0,n.servesTimeframe)(i,e)):null,s=`${this.currentSymbol}|${a}|${o}`;if(!r&&this.replayLoader?.key===s||(this.replayLoader?.loader.dispose(),this.replayLoader=null,!o||!i||a===null))return;let c=(0,n.withResampling)(i),l=c.fetchHistoryBefore,u=this.currentSymbol,d=(0,t.timeframeToMs)(a),f=new gt({source:l?(e,t)=>l.call(c,u,o,e,t):null,step:o,ratio:Math.max(1,Math.round(d/(0,t.timeframeToMs)(o))),barMs:d,keep:e=>this.series.inHoursShown(e),report:e=>this.eventBus.emit(`replayStepsLoad`,e)});this.replayLoader={key:s,loader:f}}feedReplayForming(e,t,n,r){let i=this.replaySession;if(!i||!this.executionAdapter?.setMarkPrice)return;let a=Ut(e,t,n,r,{time:i.fedTime,fraction:i.fedFraction},(e,t)=>this.replayPathOf(e,t));a&&(i.fedTime=a.fed.time,i.fedFraction=a.fed.fraction,this.feedReplayMarks(a.marks))}feedReplayMarks(e){let t=this.executionAdapter;if(!t?.setMarkPrice)return;for(let[n,r]of e)t.setMarkPrice(n,r);let n=e[e.length-1]?.[0];n!==void 0&&this.tradingManager.setCurrentPrice(n)}followLiveChange(e){let t=this.replaySession;t&&(e.kind===`bar`&&!(t.until!==null&&e.time<t.until)||this.rebaseReplay(e.kind))}rebaseReplay(e){let t=this.replaySession;if(!t)return;let n=this.series.inHoursShown(this.series.liveBars());if(n.length===0)return;let r=t.windowTime===null?0:Math.min(V(n,t.windowTime),n.length-1),i=r>0?n.slice(r):n;this.useReplayLoader(t,!1);let a=this.replayStepsOver(t,i),o=t.animate?null:a,s=t.until===null?0:mn(o??i,t.until);if(s<0&&this.canPageBackForReplay(t)){this.holdReplay(),t.held&&t.held.pagesBack++,queueMicrotask(()=>void this.pageBackForReplay(t));return}let c=this.getReplayState(),l=t.held!==null&&(e===`hours`||e===`bar`),u=t.held?.state??c;l||(t.held=null),t.symbol=this.currentSymbol;let d=this.replayManager.remainingMs();this.clearBarHolders(),t.animate&&pn(t,this.replayCoarse,i);let f=this.replayRestarting;this.replayRestarting=!0,this.replayCause=e===`older`?`older`:`series`;try{this.buildReplay(i,a,r),this.restartReplayAt(Math.max(0,s),d,!l&&u===`playing`)}finally{this.replayRestarting=f,this.replayCause=null}let p=this.getReplayState();p!==c&&!f&&this.eventBus.emit(`replayState`,{state:p}),this.emitBars(this.series.length())}restartReplayAt(e,t,n){this.replayManager.play({paused:!0,startIndex:e,...t===null?{}:{duration:t}}),n&&this.replayManager.resume()}clearBarHolders(){this.pinnedTooltip.isPinned()&&this.pinnedTooltip.unpin(),this.measureOverlay.end(),this.sessionBreaks.invalidateCache()}replayStepsOver(e,t,n=!1){if(!e.steps||e.stepsSymbol!==this.currentSymbol)return null;let r=_n(this.series.inHoursShown(e.steps),t);return r&&(n||gn(r,t))?r:null}canPageBackForReplay(e){return this.history.hasLoader()&&this.history.hasMore()&&(e.held?.pagesBack??0)<cn}async pageBackForReplay(e){this.replaySession!==e||!e.held||await this.history.loadMore()>0||this.replaySession!==e||!e.held||(e.held.pagesBack=cn,this.rebaseReplay(`older`))}holdReplay(){let e=this.replaySession;if(!e||e.held)return;let t=this.replayManager.getState()===`playing`?`playing`:`paused`,n=this.replayRestarting;this.replayRestarting=!0;try{this.replayManager.pause()}finally{this.replayRestarting=n}e.held={state:t,pagesBack:0}}holdReplayFor(e){this.replaySession&&(this.replayEndsFor(e)?this.replayStop():this.holdReplay())}replayEndsFor(e){let t=this.replaySession;return t!==null&&this.replayTrades()&&e!==t.symbol}replayPages(){let e=this.replaySession;return e===null||e.windowTime===null&&e.held===null}revealReplayMarks(e){let t=e!==null&&this.replayOffset>0?this.replayCoarse?.[0]?.time??-1/0:-1/0;this.signalMarkerManager.setRevealUntil(e,t),this.tradeZoneManager.setRevealUntil(e,t)}replaySeekToTime(e){!this.replaySession||!this.replayCoarse||this.replaySeek(Math.max(0,mn(this.replayStepsSeries??this.replayCoarse,e)))}feedReplayPrice(e,t){let n=this.executionAdapter;n?.setMarkPrice&&(n.setMarkPrice(e,t),this.tradingManager.setCurrentPrice(e))}returnMarkToLive(){let e=this.replaySession;if(!e||!this.replayTrades())return;let t=this.series.liveBars(),n=e.price?.price??t[t.length-1]?.close;n!==void 0&&this.feedReplayPrice(n)}feedReplaySteps(e,t){let n=this.replaySession;if(!n||!this.executionAdapter?.setMarkPrice)return;let r=Ht(e,t,{time:n.fedTime,fraction:n.fedFraction});r&&(n.fedTime=r.fed.time,this.feedReplayMarks(r.marks))}getReplayBarIndex(){if(!this.replaySession)return-1;if(this.replayForming)return this.replayForming.index;let{current:e}=this.replayManager.getProgress(),t=this.replayStepsSeries;return t&&this.replayCoarse?G(this.replayCoarse,t[e]?.time??-1/0):e}replaySeekToBar(e){let t=this.replayStepsSeries;this.replaySeek(t&&this.replayCoarse?vn(t,this.replayCoarse,e):e)}replayPause(){this.setHeldState(`paused`)||this.replayManager.pause()}replayResume(){this.setHeldState(`playing`)||this.replayManager.resume()}setHeldState(e){let t=this.replaySession?.held;return t?(t.state!==e&&(t.state=e,this.eventBus.emit(`replayState`,{state:e})),!0):!1}replayStop(){let e=this.replaySession,t=this.endReplaySession();!e||!t||(this.loadSeries(t,!0),e.price&&this.currentPriceLine.setPrice(e.price.price,e.price.previousClose))}isReplayActive(){return this.replaySession!==null}getPlotRect(){let{x:e,y:t,width:n,height:r}=this.viewport.getState().chartRect;return{x:e,y:t,width:n,height:r}}getDrawingRect(e){let t=this.drawingManager.getDrawings().find(t=>t.id===e);if(!t||!this.drawingManager.isShown(e)||t.anchors.length===0)return null;let n=t.paneId===void 0?{...this.viewport.getState(),data:this.getDisplayData()}:this.drawingPaneViewport(t.paneId);if(!n)return null;let r=n.chartRect,i=1/0,a=-1/0,o=1/0,s=-1/0;for(let e of t.anchors){let{x:r,y:c}=this.drawingManager.anchorPoint(t.type,e,n);i=Math.min(i,r),a=Math.max(a,r),o=Math.min(o,c),s=Math.max(s,c)}if($t.has(t.type)?[i,a]=[r.x,r.x+r.width]:t.type===`horizontalRay`&&(a=r.x+r.width),en.has(t.type)&&([o,s]=[r.y,r.y+r.height]),a<r.x||i>r.x+r.width||s<r.y||o>r.y+r.height)return null;let c=this.drawingManager.drawnExtent(e);return c&&(i=Math.min(i,c.x),a=Math.max(a,c.x+c.width),o=Math.min(o,c.y),s=Math.max(s,c.y+c.height)),i=Math.max(i,r.x),a=Math.min(a,r.x+r.width),o=Math.max(o,r.y),s=Math.min(s,r.y+r.height),i<=a&&o<=s?{x:i,y:o,width:a-i,height:s-o}:null}endReplaySession(){if(!this.replaySession)return null;this.returnMarkToLive();let e=this.series.endReplay();return this.replaySession=null,this.replayStepsSeries=null,this.replayCoarse=null,this.replayBarUnsub?.(),this.replayBarUnsub=null,this.replayPhaseUnsub?.(),this.replayPhaseUnsub=null,this.replayLoader?.loader.dispose(),this.replayLoader=null,this.replayPieces=null,this.replayForming=null,this.replayManager.stop(),this.replayOffset=0,this.revealReplayMarks(null),e}replaySeek(e){this.replaySeeking=!0;try{this.replayManager.seekTo(e)}finally{this.replaySeeking=!1}}setReplaySpeed(e){this.replayManager.setSpeed(e)}getReplayState(){return this.replaySession?.held?.state??this.replayManager.getState()}getReplayProgress(){let e=this.replaySession,t=e?this.replayCoarse?.[this.getReplayBarIndex()]:void 0;return{...this.replayManager.getProgress(),time:e?.until!=null&&t?t.time:null,until:e?.until??null}}captureSnapshot(){return n.ChartStateManager.capture({getDrawings:()=>[...this.getDrawings().filter(e=>e.paneId===void 0||this.layoutManager.getPanels().some(t=>t.id===e.paneId)),...this.keptPaneDrawings],getTheme:()=>this.themeManager.getBaseTheme(),getAlerts:()=>this.getAlerts(),getIndicators:()=>this.getIndicatorSetup(),getOverrides:()=>this.themeManager.getUserOverrides()},{chartType:this.options.chartType,chartTypeOptions:this.getChartTypeOptions(),symbol:this.currentSymbol||void 0})}restoreIndicators(e,t){let n=Fe(e),r=new Map;this.unrestoredIndicators=[];let i=new Set(this.indicatorEngine.getAvailableIndicators().map(e=>e.id)),a=[],o=new Set;if(t){let e=this.getIndicatorSetup();for(let t of Le(e,n))o.add(t);for(let t of e)o.has(t.instanceId)||this.removeIndicator(t.instanceId);let t=new Map(e.map(e=>[e.instanceId,e.pane]));for(let e=!0;e;){e=!1;for(let n of[...o]){let r=t.get(n);this.indicatorEngine.getIndicatorConfig(n)&&!(r&&!o.has(r))||(this.indicatorEngine.getIndicatorConfig(n)&&this.removeIndicator(n),o.delete(n),e=!0)}}}else for(let e of this.indicatorEngine.getActiveIndicators())this.removeIndicator(e.instanceId);let s=e=>ze(e,r);for(let e of n){let n=null;if(o.has(e.instanceId)){n=e.instanceId;let t=this.indicatorEngine.getIndicatorConfig(n)?.params??{},r={};for(let[n,i]of Object.entries(s(e.params)))t[n]!==i&&(r[n]=i);Object.keys(r).length>0&&this.updateIndicator(n,r)}else{let a=[`top`,`bottom`,`left`,`right`].find(t=>t===e.position)??`bottom`;try{if(!i.has(e.id))throw Error(`no such indicator is registered`);let o=e.pane?r.get(e.pane):void 0;n=this.addIndicatorNow(e.id,s(e.params),a,{...o?{pane:o}:{},...e.scale===`left`?{scale:`left`}:{},...t?{instanceId:e.instanceId}:{}})}catch(t){console.warn(`Layout indicator "${e.id}" kept but not shown:`,t)}}if(!n){this.unrestoredIndicators.push(e);continue}r.set(e.instanceId,n),a.push([e,n]),this.restoreLooks(n,e)}return this.indicatorEngine.orderIndicators(e.flatMap(e=>r.get(e.instanceId)??[])),Pe(this.layoutManager,a),this.updateViewportAndRender(),r}restoreLooks(e,n){let{plots:r,...i}=this.indicatorEngine.getIndicatorStyle(e)??{colors:[],lineWidths:[],opacity:1},{plots:a,...o}=n.style??{};n.style&&JSON.stringify({...i,...o})!==JSON.stringify(i)&&this.updateIndicatorStyle(e,o),JSON.stringify(a??{})!==JSON.stringify(r??{})&&(this.indicatorEngine.setPlotStyles(e,a??null),this.engine.requestRender());let s=this.indicatorEngine.getIndicatorConfig(e);(n.visible??!0)!==(s?.visible??!0)&&this.setIndicatorVisible(e,n.visible??!0);let c=n.levels??null;JSON.stringify(c)!==JSON.stringify(s?.levels??null)&&this.setIndicatorLevels(e,c);let l=n.intervals??null;JSON.stringify(l)!==JSON.stringify(s?.intervals??null)&&this.setIndicatorIntervalsNow(e,l),this.setPaneStyleNow(e,n.paneStyle?(0,t.readPaneStyle)(n.paneStyle):null)}getIndicatorSetup(){return[...Ne(this.indicatorEngine,this.layoutManager,e=>this.panes.style(e)??null),...this.unrestoredIndicators]}applyIndicatorSetup(e){this.features.indicators&&this.indicatorHistory.record(void 0,()=>{let t=new Map(this.indicatorEngine.getActiveIndicators().map(e=>[e.instanceId,e.id])),n=this.indicatorHistory.quietly(()=>this.restoreIndicators(e,!1));this.followIndicatorAlerts(t,[...n.values()]),this.markStateChanged()})}followIndicatorAlerts(e,t){this.features.alerts&&Ft(this.alertManager,e,t,e=>this.indicatorEngine.getIndicatorConfig(e)?.id)}beginIndicatorEdit(e){this.indicatorHistory.begin(e)}endIndicatorEdit(){this.indicatorHistory.end()}applyIndicatorStep(e,t){let n=e.indicators;if(!n)return;this.replayingIndicatorStep=!0;try{this.indicatorHistory.quietly(()=>this.restoreIndicators(t===`undo`?n.before:n.after,!0))}finally{this.replayingIndicatorStep=!1}let r=n.renames??[],i=t===`undo`?[...r].reverse().map(([e,t])=>[t,e]):r;for(let[e,t]of i)this.drawingManager.renamePanes(new Map([[e,t]]));this.markStateChanged()}keptPaneDrawings=[];replayingIndicatorStep=!1;takesDrawing(e,t){return Ge(this.layoutManager.getPanels(),e,!!this.drawingManager.getDescriptor(t)?.priceOnly)}renamePane(e,t){this.layoutManager.renamePanel(e,t),this.replayingIndicatorStep||this.drawingManager.renamePanes(new Map([[e,t]])),this.indicatorHistory.renamed(e,t)}drawingPaneAt(e){return Ue(e,this.viewport.getState().chartRect,this.layoutManager.getPanels(),e=>this.drawingPaneViewport(e))}drawingPaneViewport(e){let t=this.layoutManager.getPanels().find(t=>t.id===e);return We(t,!!t&&this.layoutManager.isPanelShownCollapsed(e),()=>this.buildPanelRenderInfos().find(t=>t.instanceId===e)?.viewport,()=>this.getDisplayData())}saveState(e){if(!this.features.saveLoad)return null;let t=this.captureSnapshot(),r=n.ChartStateManager.serialize(t);return e&&n.ChartStateManager.saveToStorage(e,t),r}loadState(e){if(!this.features.saveLoad)return;let t=n.ChartStateManager.deserialize(e);this.chartTypeOptions=t.chartTypeOptions??{},this.display.reset(),t.chartType&&this.setChartType(t.chartType),t.drawings&&this.setDrawings(t.drawings),(t.theme===`dark`||t.theme===`light`)&&this.setTheme(t.theme),t.version>=3&&this.themeManager.setUserOverrides(t.overrides??{})&&this.styleChanged(`user`);let r=t.version>=2&&this.features.indicators?this.indicatorHistory.quietly(()=>this.restoreIndicators(t.indicators,!1)):new Map;this.drawingManager.renamePanes(r);let i=new Set(this.unrestoredIndicators.map(e=>e.instanceId)),a=this.drawingManager.getDrawings(),o=a.filter(e=>e.paneId===void 0||this.takesDrawing(e.paneId,e.type));this.keptPaneDrawings=a.filter(e=>e.paneId!==void 0&&i.has(e.paneId)),o.length!==a.length&&this.drawingManager.setDrawings(o),this.undoRedoManager.clear(),t.alerts&&this.features.alerts&&Rt(this.alertManager,t.alerts,r,e=>this.drawingManager.hasPriceLevels(e),e=>{console.warn(`Layout alert left out:`,e)}),this.markStateChanged()}loadStateFromStorage(e){if(!this.features.saveLoad)return!1;let t=n.ChartStateManager.loadFromStorage(e);return t?(this.loadState(n.ChartStateManager.serialize(t)),!0):!1}downloadState(e){this.features.saveLoad&&n.ChartStateManager.downloadFile(this.captureSnapshot(),e)}async loadStateFromFile(){if(!this.features.saveLoad)return;let e=await n.ChartStateManager.loadFromFile();this.loadState(n.ChartStateManager.serialize(e))}setLocale(e){(0,t.setLocale)(e),this.engine.requestRender()}setNumberLocale(e){this.numberLocale=e,this.viewport.setNumberLocale(e),this.priceAxis.setLocale(e),this.leftPriceAxis.setLocale(e),this.crosshairHandler.setLocale(e),this.timeAxis.setLocale(e),this.chartLegend.setLocale(e),this.crosshairTooltip.setLocale(e),this.pinnedTooltip.setLocale(e),this.currentPriceLine.setLocale(e),this.updateViewportAndRender()}getNumberLocale(){return this.numberLocale}setMarket(e){this.marketConfig=e,this.studyZoneHeld=!1,this.endStudyZoneWait(),this.timeZoneSetting===`exchange`&&this.applyTimeZone(),this.applyExchangeZone(),e.colorScheme&&this.themeManager.setTheme((0,t.createMarketTheme)(this.themeManager.getBaseTheme(),e.colorScheme)),e.pricePrecision!==void 0&&this.applyPricePrecision(e.pricePrecision),this.updateViewportAndRender(),this.eventBus.emit(`marketChange`,{market:e})}applyPricePrecision(e){this.marketPricePrecision=e,this.viewport.setPricePrecision(e),this.pinnedTooltip.setPricePrecision(e),this.priceAxis.setPricePrecision(e),this.tradingManager.setConfig({pricePrecision:e??void 0}),this.alertManager.setPricePrecision(e),this.tradeZoneManager.setPricePrecision(e),this.streamManager?.priceLine.setPricePrecision(e),this.currentPriceLine.setPricePrecision(e),this.crosshairHandler.setPricePrecision(e),this.chartLegend.setPricePrecision(e),this.crosshairTooltip.setPricePrecision(e)}getMarket(){return this.marketConfig}getPriceLimits(){let e=this.marketConfig;return!e?.priceLimits?.enabled||!e.priceLimits.referencePrice?null:(0,t.computePriceLimits)(e.priceLimits.referencePrice,e)}setPriceLimits(e){this.marketConfig?.priceLimits&&(this.marketConfig={...this.marketConfig,priceLimits:{...this.marketConfig.priceLimits,referencePrice:e}},this.syncRenderContext(),this.engine.requestRender())}getFeatures(){return this.features}setFeatures(e){let n=this.getLegendBottom();Object.assign(this.features,e),e.legend!==void 0&&this.getLegendBottom()!==n&&this.eventBus.emit(`legendResize`,{bottom:this.getLegendBottom()}),(e.crosshair===!1||e.crosshairTooltip===!1)&&this.crosshairTooltip.hide(),(e.priceAxisAddButton!==void 0||e.crosshair!==void 0)&&(this.applyPriceAxisAdd(),this.engine.requestRender(t.LayerType.Overlay)),e.grid!==void 0&&this.engine.requestRender(t.LayerType.Background),e.volume!==void 0&&(this.volumeRenderer.setVisible(e.volume),this.updateViewportAndRender()),e.drawings===!1&&this.drawingManager.setActiveTool(null),e.trading===!1&&(this.tradingManager.setOrders([]),this.tradingManager.setPositions([])),e.keyboard!==void 0&&this.keyboardHandler?.setEnabled(e.keyboard),this.engine.requestRender()}resize(){let e=this.engine.dprManager.readContainerSize();if(e.width<=0||e.height<=0)return;this.containerSizeCache=e,this.containerSizeCacheTime=Date.now();let t=this.engine.dprManager.getDpr();this.engine.layerManager.resize(e,t);let n=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(n),this.eventBus.emit(`resize`,e)}destroy(){this.disposed=!0,this.stopWatchingVisibility?.(),this.stopWatchingVisibility=null,this.waitForGpu(null),this.countdownInterval&&clearInterval(this.countdownInterval),this.history.setLoader(null),this.disableAutoSave(),this.disconnectStream(),this.disconnectExecution(),this.onWindowKeyDown&&=(window.removeEventListener(`keydown`,this.onWindowKeyDown),null),this.keyboardHandler=null,this.a11y?.destroy(),this.a11y=null,this.interactionManager.detach(),this.tradingManager.destroy(),this.animator.dispose(),this.crosshairTooltip.destroy(),this.pinnedTooltip.destroy(),this.replayRestarting=!0,this.replayManager.dispose(),this.alertManager.dispose(),this.undoRedoManager.clear(),this.engine.destroy(),this.eventBus.destroy(),this.labelWidths.destroy(),this.container.innerHTML=``}createChartRenderer(e){let t=fe(e,e=>this.pluginManager.getChartType(e));return t instanceof n.HiLoRenderer&&t.setPriceText(e=>this.formatPrice(e)),t}crosshairSeries(){return this.isTimeAligned()?this.series.bars():this.getDisplayData()}getDisplayData(){return this.display.get()}recalcIndicatorsFrom(e,t){if(!this.isTimeAligned())return this.recalcIndicators(e);this.indicatorEngine.recalculateFrom(e,t),this.indicatorsOnDrawn=null,this.announceIndicatorUpdate(t)}recalcIndicators(e){let t=this.indicatorBars(e);this.indicatorEngine.recalculateAll(t),this.indicatorsOnDrawn=t===e?null:t,this.announceIndicatorUpdate(0)}exportBars(){if(this.isTimeAligned())return this.series.bars();let e=this.getDisplayData(),t=(0,n.axisTimes)(e);return e.map((e,n)=>({...e,time:t[n]?.time??e.time}))}indicatorBars(e=this.series.bars()){return this.isTimeAligned()?e:this.getDisplayData()}syncIndicatorBars(e){(this.isTimeAligned()?this.indicatorsOnDrawn===null:this.indicatorsOnDrawn===e)||this.recalcIndicators(this.series.bars())}announceIndicatorUpdate(e){if(this.indicatorUpdateFrom!==null){this.indicatorUpdateFrom=Math.min(this.indicatorUpdateFrom,e);return}this.indicatorUpdateFrom=e,queueMicrotask(()=>{let e=this.indicatorUpdateFrom;this.indicatorUpdateFrom=null,e!==null&&this.eventBus.emit(`indicatorUpdate`,{from:e})})}requestRender(){this.scheduleRender()}scheduleRender(){if(!(this.renderScheduled||this.disposed)){if(this.isSuspended()){this.renderDeferred=!0;return}this.renderScheduled=!0,requestAnimationFrame(()=>{if(this.renderScheduled=!1,!this.disposed){if(this.isSuspended()){this.renderDeferred=!0;return}this.refitForTick()}})}}refitForTick(){this.panes.invalidateScales(),this.fitDataAndAxes(),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}applyDataToViewport(e=!1){let t=this.getDisplayData();this.syncIndicatorBars(t),this.viewport.updateData(t,!1),e&&(this.viewport.scrollToEnd(),this.viewport.updateData(t,!1));let n=this.viewport.getState();if(t.length>0){let e=Math.max(0,Math.min(n.visibleRange.from,t.length-1));this.viewport.setScaleBaseline(t[e]?.close)}return this.priceFit.shouldFit()&&this.fitPriceScale(t,this.viewport.getState()),t}fitPriceScale(e,t){this.priceFit.fit(this.viewport,e,t,{overlayRange:(e,t)=>this.indicatorEngine.getOverlayPriceRange(e,t),compareRange:(e,t)=>this.features.compareSymbols&&this.comparesDrawn()?this.compareRenderer.getPriceRange(e,t):null,volumeRatio:(e,t,n)=>this.features.volume&&this.volumeRenderer.isVisible()&&we(e,t,n)?this.volumeRenderer.getHeightRatio():null})}updateViewportAndRender(e=!1){this.indicatorEngine.setBarsTimed(this.comparesDrawn()),this.layoutManager.setPanelsAside(this.panes.offChartType()),this.panes.invalidate(),this.layoutManager.setLeftAxisWidth(this.isLeftPriceScaleShown()?this.leftAxisWidth:0);let t=this.getResolvedLayout();this.viewport.setChartRect(t.mainChartRect),this.fitDataAndAxes(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}fitDataAndAxes(e=!1){let t=this.applyDataToViewport(e),n=this.fitPriceAxisWidth();this.leftViewport=this.computeLeftViewport(),(this.fitLeftAxisWidth()||n)&&this.applyDataToViewport(e),this.priceFit.settle(this.viewport.getState(),t.length)}fitLeftAxisWidth(){let e=this.leftViewport;if(!e)return!1;let t=this.themeManager.getTheme(),n=M({min:e.priceRange.min,max:e.priceRange.max,lastPrice:null,tagPrecision:null,locale:this.numberLocale,fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=N(this.leftAxisWidth,n);return r===this.leftAxisWidth?!1:(this.leftAxisWidth=r,this.layoutManager.setLeftAxisWidth(r),this.panes.invalidate(),this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}fitPriceAxisWidth(){if(!this.features.priceAxis)return!1;let{priceRange:e}=this.viewport.getState(),t=this.themeManager.getTheme(),n=M({min:e.min,max:e.max,lastPrice:this.currentPriceLine.getPrice(),tagPrecision:this.marketPricePrecision,locale:this.numberLocale,format:this.priceFormatter,scaleLabel:e=>this.priceAxis.labelText(e,this.viewport.getState()),fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=N(this.priceAxisWidth,n);return r===this.priceAxisWidth?!1:(this.priceAxisWidth=r,this.layoutManager.setPriceAxisWidth(r),this.viewport.setPriceAxisWidth(r),this.panes.invalidate(),this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}measureText(e,n){let r=this.engine.layerManager.getLayer(t.LayerType.Main)?.ctx;if(r?.canvas.isConnected)return this.labelWidths.get(e,n,()=>nn(r,e,n));let i=r??this.detachedMeasureContext();return i?nn(i,e,n):e.length*7}detachedMeasureContext(){return this.measureCtx===void 0&&(this.measureCtx=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null),this.measureCtx}emitViewportEvents(){let e=this.viewport.getState(),t=Math.max(0,Math.floor(e.visibleRange.from)),n=Math.max(t,Math.ceil(e.visibleRange.to));(!this.lastEmittedRange||this.lastEmittedRange.from!==t||this.lastEmittedRange.to!==n)&&(this.lastEmittedRange={from:t,to:n},this.eventBus.emit(`visibleRangeChange`,{from:t,to:n}));let{min:r,max:i}=e.priceRange;(!this.lastEmittedPriceRange||this.lastEmittedPriceRange.min!==r||this.lastEmittedPriceRange.max!==i)&&(this.lastEmittedPriceRange={min:r,max:i},this.eventBus.emit(`priceRangeChange`,{min:r,max:i})),this.lastEmittedBarWidth!==e.barWidth&&(this.lastEmittedBarWidth=e.barWidth,this.eventBus.emit(`zoomChange`,{barWidth:e.barWidth})),this.checkHistory()}getResolvedLayout(){return this.panes.resolved()}cachedContainerSize(){let e=Date.now();return(!this.containerSizeCache||e-this.containerSizeCacheTime>500)&&(this.containerSizeCache=this.engine.dprManager.getContainerSize(),this.containerSizeCacheTime=e),this.containerSizeCache}buildPanelRenderInfos(){return this.panes.panels(()=>this.viewport.getState())}syncRenderContext(){this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),null,null,this.themeManager.getTheme());let e=this.features.indicators?this.buildPanelRenderInfos():[],t=this.panes.timeAxisTop(),n=this.getDisplayData();this.leftViewport=this.computeLeftViewport(),this.engine.setRenderContext({leftViewport:this.leftViewport,leftPriceAxis:this.leftPriceAxis,leftAxisWidth:this.leftAxisWidth,chartRenderer:this.mainSeriesVisible?this.chartRenderer:null,priceLines:this.quoteLines(),gridRenderer:this.features.grid?this.gridRenderer:null,priceAxis:this.features.priceAxis?this.priceAxis:null,timeAxis:this.features.timeAxis?this.timeAxis:null,crosshairHandler:this.features.crosshair?this.crosshairHandler:null,indicatorEngine:this.features.indicators?this.indicatorEngine:null,drawingRenderer:this.features.drawings?this.drawingRenderer:null,tradingRenderer:this.features.trading?this.tradingRenderer:null,currentPriceLine:this.currentPriceLine,chartLegend:this.features.legend?this.chartLegend:null,volumeRenderer:this.features.volume?this.volumeRenderer:null,volumeProfile:this.volumeProfile,marketProfile:this.marketProfile,depthHeatmap:this.depthHeatmap,periodLevels:this.periodLevels,pivotMarkers:this.pivotMarkers,watermark:this.features.watermark?this.watermark:null,barCountdown:this.barCountdown,sessionBreaks:this.sessionBreaks,sessionShading:this.sessionShading,compareRenderer:this.comparesDrawn()?this.compareRenderer:null,alertManager:this.features.alerts?this.alertManager:null,measureOverlay:this.measureOverlay,selectionBoxOverlay:this.selectionBoxOverlay,priceAxisAddButton:this.priceAxisAddButton,signalMarkerManager:this.signalMarkerManager,tradeZoneManager:this.tradeZoneManager,panels:e,priceLimits:this.buildPriceLimits(),timeAxisY:t,viewport:{...this.viewport.getState(),data:n},theme:this.themeManager.getTheme(),data:n,seriesRevision:this.series.revision(),numberLocale:this.numberLocale,paneTitles:this.paneTitles,indicatorValueLabels:this.features.indicatorValueLabels,alignAxisLabels:this.features.alignAxisLabels,drawingAxisSpans:this.features.drawingAxisSpans,formatPrice:e=>this.formatPrice(e),renderOverlayPlugins:(e,t)=>this.drawOverlayPlugins(e,t)})}drawOverlayPlugins(e,t){let n=P(this.pluginManager.getOverlays(),t);if(n.length===0)return;let r={viewport:this.viewport.getState(),data:this.getDisplayData(),theme:this.themeManager.getTheme()};for(let t of n)t.render(e,r)}buildPriceLimits(){let e=this.getPriceLimits();return!e||!this.marketConfig?null:{...e,colors:this.marketConfig.colorScheme?{ceiling:this.marketConfig.colorScheme.ceiling,floor:this.marketConfig.colorScheme.floor,reference:this.marketConfig.colorScheme.reference}:void 0}}};function nn(e,t,n){let r=e.font;e.font=n;let i=e.measureText(t).width;return e.font=r,i}var rn=300;function an(e){let t={},n=e=>typeof e==`string`&&e.trim()!==``&&e.length<=rn&&!/[;{}<>\\]|\/\*/.test(e);n(e.family)&&(t.family=e.family),n(e.textFamily)&&(t.textFamily=e.textFamily);for(let n of[`sizeSmall`,`sizeMedium`,`sizeLarge`]){let r=e[n];typeof r==`number`&&Number.isFinite(r)&&r>0&&(t[n]=r)}return t}function on(e){let t=e.tagRadius;return typeof t==`number`&&Number.isFinite(t)&&t>=0?{tagRadius:Math.min(t,999)}:{}}function U(e){return{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,channel:e.channel,label:e.label,target:e.target,drawingId:e.drawingId,percent:e.percent,bars:e.bars}}var sn=8e3,cn=10,ln=50,un=.001;function dn(e){return{price:null,fedTime:null,fedFraction:1,animate:!1,step:null,until:null,windowTime:null,steps:null,stepsSymbol:e,symbol:e,held:null}}function fn(e,t){let n=e[t+1];return n?n.time-e[t].time:W(e)}function pn(e,t,n){let r=e.fedTime;if(r===null||!t||t.length===0||n.length===0)return;let i=fn(t,G(t,r)),a=r+(Number.isFinite(i)?e.fedFraction*i:0),o=G(n,a),s=n[o].time;if(s>a)return;let c=fn(n,o);if(a===s&&o>0){e.fedTime=n[o-1].time,e.fedFraction=1;return}e.fedTime=s,e.fedFraction=Number.isFinite(c)&&c>0?Math.min(1,(a-s)/c):0}function mn(e,t){let n=H(e,t),r=e.length-1;return n>r&&r>=0&&e[r].time+W(e)<=t?r:Math.max(-1,n-2)}function hn(e){let t=1/0;for(let n=Math.max(1,e.length-10);n<e.length;n++)t=Math.min(t,e[n].time-e[n-1].time);return t}function gn(e,t){if(!(hn(e)<hn(t)))return!1;let n=Math.max(0,e.length-ln);for(let r=n;r<e.length;r++){let n=t[G(t,e[r].time)],i=(n.high-n.low)*un+2**-52;if(e[r].close>n.high+i||e[r].close<n.low-i)return!1}return!0}function W(e){let t=0;for(let n=Math.max(1,e.length-10);n<e.length;n++)t=Math.max(t,e[n].time-e[n-1].time);return t>0?t:1/0}function _n(e,t){if(t.length===0)return null;let n=t[t.length-1].time+W(t),r=e.filter(e=>ye(e)&&e.time>=t[0].time&&e.time<n).sort((e,t)=>e.time-t.time),i=[];for(let e of r)(i.length===0||i[i.length-1].time!==e.time)&&i.push(e);if(i.length===0)return null;let a=t.findIndex(e=>e.time>=i[0].time);if(a<0)return null;let o=t.slice(0,a),s=i.filter(e=>e.time>=t[a].time);return[...o,...s]}function G(e,t){let n=0,r=e.length-1;for(;n<r;){let i=n+r+1>>1;e[i].time<=t?n=i:r=i-1}return n}function vn(e,t,n){let r=Math.max(0,Math.min(Math.floor(Number.isFinite(n)?n:0),t.length-1)),i=r+1<t.length?t[r+1].time:1/0,a=-1;for(let t=0;t<e.length&&e[t].time<i;t++)a=t;return Math.max(0,a)}function yn(e,t,n){let r=n;for(;r>0&&t[r-1].time>=e.time;)r--;let i={...t[r],time:e.time};for(let e=r+1;e<=n;e++)i=Cn(i,t[e]);return i}function bn(e,t,n,r){let i=e[n+1],a=t[r+1];return i!==void 0&&a!==void 0&&i.time>=a.time}function xn(e,t){let n=new Map;for(let r of e){let e=t[G(t,r.time)].time,i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function Sn(){return typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches}function Cn(e,t){return{time:e.time,open:e.open,high:Math.max(e.high,t.high),low:Math.min(e.low,t.low),close:t.close,volume:(e.volume??0)+(t.volume??0)}}var wn=[`time`,`timestamp`,`date`,`datetime`,`t`],Tn=[`open`,`o`],En=[`high`,`h`],Dn=[`low`,`l`],On=[`close`,`c`],kn=[`volume`,`vol`,`v`];function An(e){let t=e.trim();return t?t[0]===`[`||t[0]===`{`?jn(t):Mn(t):{data:[],rowCount:0,skipped:0}}function jn(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Invalid JSON: ${e.message}`)}if(!Array.isArray(t))throw Error(`Expected a JSON array of OHLCV rows`);let n=[],r=0;for(let e of t){let t=Array.isArray(e)?In(e):Fn(e);t?n.push(t):r++}return Ln(n,t.length,r)}function Mn(e){let t=e.split(/\r?\n/).filter(e=>e.trim().length>0);if(t.length===0)return{data:[],rowCount:0,skipped:0};let n=Nn(t[0]),r=K(t[0],n).map(e=>e.trim().toLowerCase()),i=r.some(e=>isNaN(Number(e))&&e.length>0),a=i?Pn(r):{time:0,open:1,high:2,low:3,close:4,volume:5};if(a.time<0||a.open<0||a.high<0||a.low<0||a.close<0)throw Error(`CSV is missing required column(s): time, open, high, low, close`);let o=[],s=0;for(let e=+!!i;e<t.length;e++){let r=K(t[e],n),i=J(r[a.time]),c=q(r[a.open]),l=q(r[a.high]),u=q(r[a.low]),d=q(r[a.close]),f=a.volume>=0?Number(r[a.volume]):0;if(i===null||![c,l,u,d].every(Number.isFinite)){s++;continue}o.push({time:i,open:c,high:l,low:u,close:d,volume:Number.isFinite(f)?f:0})}return Ln(o,t.length-+!!i,s)}function Nn(e){let t={",":0,";":0," ":0,"|":0};for(let n of e)n in t&&t[n]++;let n=`,`,r=0;for(let[e,i]of Object.entries(t))i>r&&(n=e,r=i);return n}function K(e,t){let n=[],r=``,i=!1;for(let a=0;a<e.length;a++){let o=e[a];o===`"`?i&&e[a+1]===`"`?(r+=`"`,a++):i=!i:o===t&&!i?(n.push(r),r=``):r+=o}return n.push(r),n}function Pn(e){let t=t=>e.findIndex(e=>t.includes(e));return{time:t(wn),open:t(Tn),high:t(En),low:t(Dn),close:t(On),volume:t(kn)}}function Fn(e){let t=t=>{for(let n of t){if(e[n]!==void 0)return e[n];let t=n.toUpperCase();if(e[t]!==void 0)return e[t]}},n=J(String(t(wn)??``)),r=Number(t(Tn)),i=Number(t(En)),a=Number(t(Dn)),o=Number(t(On)),s=Number(t(kn)??0);return n===null||![r,i,a,o].every(Number.isFinite)?null:{time:n,open:r,high:i,low:a,close:o,volume:Number.isFinite(s)?s:0}}function In(e){if(e.length<5)return null;let t=J(String(e[0])),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=e.length>=6?Number(e[5]):0;return t===null||![n,r,i,a].every(Number.isFinite)?null:{time:t,open:n,high:r,low:i,close:a,volume:Number.isFinite(o)?o:0}}function q(e){return e===void 0||e.trim()===``?NaN:Number(e)}function J(e){let n=e.trim();if(!n)return null;let r=Number(n);if(Number.isFinite(r)&&r>0)return(0,t.normalizeBarTime)(r);let i=Date.parse(n);return Number.isFinite(i)?i:null}function Ln(e,t,n){e.sort((e,t)=>e.time-t.time);let r=[];for(let t of e)r.length>0&&r[r.length-1].time===t.time?r[r.length-1]=t:r.push(t);return{data:r,rowCount:t,skipped:n}}var Rn=class{host;overlay=null;callbacks;bound;depth=0;constructor(e,t){this.host=e,this.callbacks=t,this.bound={dragenter:e=>this.onDragEnter(e),dragover:e=>this.onDragOver(e),dragleave:e=>this.onDragLeave(e),drop:e=>this.onDrop(e)}}attach(){this.host.addEventListener(`dragenter`,this.bound.dragenter),this.host.addEventListener(`dragover`,this.bound.dragover),this.host.addEventListener(`dragleave`,this.bound.dragleave),this.host.addEventListener(`drop`,this.bound.drop)}detach(){this.host.removeEventListener(`dragenter`,this.bound.dragenter),this.host.removeEventListener(`dragover`,this.bound.dragover),this.host.removeEventListener(`dragleave`,this.bound.dragleave),this.host.removeEventListener(`drop`,this.bound.drop),this.hideOverlay()}onDragEnter(e){Y(e)&&(e.preventDefault(),this.depth++,this.showOverlay())}onDragOver(e){Y(e)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`))}onDragLeave(e){Y(e)&&(this.depth=Math.max(0,this.depth-1),this.depth===0&&this.hideOverlay())}async onDrop(e){e.preventDefault(),this.depth=0,this.hideOverlay();let t=e.dataTransfer?.files?.[0];if(t)try{let e=An(await t.text());if(e.data.length===0)throw Error(`No valid OHLCV rows found in "${t.name}"`);this.callbacks.onData(e.data,e,t)}catch(e){this.callbacks.onError?.(e,t)}}showOverlay(){this.overlay||(this.overlay=document.createElement(`div`),Object.assign(this.overlay.style,{position:`absolute`,inset:`8px`,zIndex:`90`,pointerEvents:`none`,borderRadius:`10px`,border:`2px dashed var(--tcw-accent, #f2a93b)`,background:`rgba(79, 136, 255, 0.06)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--tcw-accent, #f2a93b)`,fontSize:`14px`,fontWeight:`600`,letterSpacing:`-0.005em`,fontFamily:`inherit`,backdropFilter:`blur(2px)`}),this.overlay.textContent=`Drop CSV or JSON to load chart data`,getComputedStyle(this.host).position===`static`&&(this.host.style.position=`relative`),this.host.appendChild(this.overlay))}hideOverlay(){this.overlay?.remove(),this.overlay=null}};function Y(e){return e.dataTransfer?.types?.includes(`Files`)??!1}var X={"1x1":{cols:1,rows:1},"1x2":{cols:2,rows:1},"2x1":{cols:1,rows:2},"1x3":{cols:3,rows:1},"3x1":{cols:1,rows:3},"1+2":{cols:2,rows:2,areas:[[0,0,1,2],[1,0,1,1],[1,1,1,1]]},"2+1":{cols:2,rows:2,areas:[[0,0,1,1],[0,1,1,1],[1,0,1,2]]},"1/2":{cols:2,rows:2,areas:[[0,0,2,1],[0,1,1,1],[1,1,1,1]]},"2/1":{cols:2,rows:2,areas:[[0,0,1,1],[1,0,1,1],[0,1,2,1]]},"2x2":{cols:2,rows:2},"1x4":{cols:4,rows:1},"4x1":{cols:1,rows:4},"1+3":{cols:2,rows:3,areas:[[0,0,1,3],[1,0,1,1],[1,1,1,1],[1,2,1,1]]},"1/3":{cols:3,rows:2,areas:[[0,0,3,1],[0,1,1,1],[1,1,1,1],[2,1,1,1]]},"2x3":{cols:3,rows:2},"3x2":{cols:2,rows:3},"2x4":{cols:4,rows:2},"3x3":{cols:3,rows:3}},zn=Object.keys(X);function Bn(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(X,e)}function Vn(e){if(e.areas)return e.areas;let t=[];for(let n=0;n<e.rows;n++)for(let r=0;r<e.cols;r++)t.push([r,n,1,1]);return t}function Hn(e){return e.areas?.length??e.cols*e.rows}function Un([e,t,n,r]){return`${t+1} / ${e+1} / span ${r} / span ${n}`}function Wn(e,t){e.style.gridArea=t?Un(t):``}function Gn(e){if(!e.areas)return null;let t=e.areas.find(([,,e,t])=>e*t>1);if(!t)return null;let[n,r,i,a]=t;return a===e.rows&&i<e.cols?n===0?`left`:`right`:r===0?`top`:`bottom`}function Z(e){let t={id:e.id,name:e.name,updatedAt:e.updatedAt};return e.symbol!==void 0&&(t.symbol=e.symbol),e.timeframe!==void 0&&(t.timeframe=e.timeframe),e.kind!==void 0&&(t.kind=e.kind),t}var Kn=(e,t)=>t.updatedAt-e.updatedAt;function Q(e){if(typeof e!=`object`||!e)return null;let t=e;return typeof t.id!=`string`||!t.id||typeof t.name!=`string`||typeof t.updatedAt!=`number`||!Number.isFinite(t.updatedAt)?null:Z({id:t.id,name:t.name,updatedAt:t.updatedAt,symbol:typeof t.symbol==`string`?t.symbol:void 0,timeframe:typeof t.timeframe==`string`?t.timeframe:void 0,kind:typeof t.kind==`string`?t.kind:void 0})}function qn(e){let t=Q(e),n=t?e.content:void 0;return t&&typeof n==`string`?{...t,content:n}:null}function Jn(e=[]){let t=new Map(e.map(e=>[e.id,{...e}]));return{list:()=>[...t.values()].map(Z).sort(Kn),load:e=>{let n=t.get(e);return n?{...n}:null},save:e=>{t.set(e.id,{...e})},remove:e=>{t.delete(e)}}}function Yn(e=`tcw:layouts:`){let t=`${e}index`,n=t=>`${e}item:${t}`,r=()=>{let e;try{e=JSON.parse(localStorage.getItem(t)??`[]`)}catch{return[]}return Array.isArray(e)?e.map(Q).filter(e=>e!==null):[]},i=e=>localStorage.setItem(t,JSON.stringify(e));return{list:()=>r().sort(Kn),load:e=>{let t=r().find(t=>t.id===e),i=t?localStorage.getItem(n(e)):null;return t&&i!==null?{...t,content:i}:null},save:e=>{localStorage.setItem(n(e.id),e.content),i([...r().filter(t=>t.id!==e.id),Z(e)])},remove:e=>{i(r().filter(t=>t.id!==e)),localStorage.removeItem(n(e))}}}var Xn=80;function $(e){return e.replace(/\s+/g,` `).trim().slice(0,80).trim()||null}function Zn(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function Qn(e){let{id:t,name:n,symbol:r,timeframe:i,updatedAt:a,kind:o}=e;return{id:t,name:n,...r===void 0?{}:{symbol:r},...i===void 0?{}:{timeframe:i},updatedAt:a,...o===void 0?{}:{kind:o}}}var $n=class{currentLayout=null;savedContent=null;dirty=!1;autoSave;debounceMs;kind;timer=null;applying=0;busy=0;changedWhileBusy=!1;tail=Promise.resolve();destroyed=!1;now;newId;constructor(e,t,n={}){this.storage=e,this.host=t,this.options=n,this.autoSave=n.autoSave??!0,this.debounceMs=n.debounceMs??1500,this.kind=n.kind??`chart`,this.now=n.now??Date.now,this.newId=n.newId??Zn}current(){return this.currentLayout}isDirty(){return this.dirty}isAutoSave(){return this.autoSave}setAutoSave(e){this.autoSave!==e&&(this.autoSave=e,this.notify(),e&&this.dirty&&this.changed())}async list(){let e=await this.storage.list();return Array.isArray(e)?e.map(Q).filter(e=>e!==null&&(e.kind??`chart`)===this.kind).sort((e,t)=>t.updatedAt-e.updatedAt):[]}save(){return this.queue(()=>{let e=this.currentLayout;return e?this.write(e.id,e.name):null})}saveAs(e){let t=$(e);return t?this.queue(()=>this.write(this.newId(),t)):Promise.reject(Error(`A layout needs a name`))}open(e){return this.queue(async()=>{let t=qn(await this.storage.load(e));if(!t||t.id!==e||(t.kind??`chart`)!==this.kind||this.destroyed)return!1;this.cancelTimer(),this.applying++;try{await this.host.apply(t)}catch(e){throw this.forget(),e}finally{this.applying--}return this.cancelTimer(),this.currentLayout=Qn(t),this.savedContent=this.host.capture().content,this.dirty=!1,this.notify(),!0})}rename(e,t){let n=$(t);return n?this.queue(async()=>{let t=qn(await this.storage.load(e));!t||t.id!==e||(await this.storage.save({...t,name:n}),this.currentLayout?.id===e&&(this.currentLayout={...this.currentLayout,name:n}),this.notify())}):Promise.reject(Error(`A layout needs a name`))}remove(e){return this.queue(async()=>{await this.storage.remove(e),this.currentLayout?.id===e&&this.forget()})}changed(){if(!(this.destroyed||this.applying>0)){if(!this.currentLayout){this.busy>0&&(this.changedWhileBusy=!0);return}this.cancelTimer(),this.timer=setTimeout(()=>{this.timer=null,this.queue(()=>this.settle())},this.debounceMs)}}destroy(){if(this.destroyed)return;let e=this.timer!==null;this.cancelTimer();let t=this.currentLayout;if(e&&t&&this.autoSave){let e=null;try{e=this.host.capture()}catch(e){this.options.onError?.(e)}if(e&&e.content!==this.savedContent){let n=e;this.queue(()=>this.write(t.id,t.name,n)).catch(e=>this.options.onError?.(e))}}this.destroyed=!0}async settle(){let e=this.currentLayout;if(this.destroyed||!e)return;let t;try{t=this.host.capture()}catch(e){this.options.onError?.(e);return}let n=t.content!==this.savedContent;if(n&&this.autoSave){try{await this.write(e.id,e.name,t)}catch(e){this.dirty=!0,this.notify(),this.options.onError?.(e)}return}n!==this.dirty&&(this.dirty=n,this.notify())}async write(e,t,n=this.host.capture()){this.cancelTimer();let r={id:e,name:t,...n.symbol===void 0?{}:{symbol:n.symbol},...n.timeframe===void 0?{}:{timeframe:n.timeframe},updatedAt:this.now(),kind:this.kind,content:n.content};await this.storage.save(r);let i=Qn(r);return this.currentLayout=i,this.savedContent=n.content,this.dirty=!1,this.notify(),i}forget(){this.cancelTimer(),this.currentLayout=null,this.savedContent=null,this.dirty=!1,this.notify()}queue(e){this.busy++;let t=this.tail.then(e).finally(()=>{this.busy--,this.busy===0&&this.changedWhileBusy&&(this.changedWhileBusy=!1,this.changed())});return this.tail=t.catch(()=>void 0),t}cancelTimer(){this.timer&&=(clearTimeout(this.timer),null)}notify(){this.destroyed||this.options.onChange?.()}};Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return Je}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return ut}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return nt}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return lt}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Wt}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Jn}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return Vn}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Bn}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Wn}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Gt}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return tn}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Yn}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return Ke}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return Ze}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Hn}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return An}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Xn}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return zn}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Rn}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return $n}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Gn}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return dt}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ft}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return Mt}});
|
|
2
|
-
//# sourceMappingURL=LayoutSession-B4qMfaP7.cjs.map
|