@tradecanvas/core 1.13.0 → 1.14.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/index.cjs CHANGED
@@ -18,6 +18,6 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
18
18
  cursor: pointer;
19
19
  color: ${n?`#1fa874`:`#e8505b`};
20
20
  transition: background 0.1s;
21
- `,t.addEventListener(`mouseenter`,()=>{t.style.background=`#1f2630`}),t.addEventListener(`mouseleave`,()=>{t.style.background=`transparent`}),t.addEventListener(`click`,()=>{this.onItemSelect?.(e.intent),this.hide()}),s.appendChild(t)}n.appendChild(s),this.menuElement=s;let l=e=>{(e instanceof KeyboardEvent&&e.key===`Escape`||e instanceof MouseEvent&&!s.contains(e.target))&&this.hide()};document.addEventListener(`mousedown`,l),document.addEventListener(`keydown`,l),this.removeHandler=()=>{document.removeEventListener(`mousedown`,l),document.removeEventListener(`keydown`,l)}}hide(){this.menuElement?.remove(),this.menuElement=null,this.removeHandler?.(),this.removeHandler=null}destroy(){this.hide(),this.onItemSelect=null}};function Du(e,t,n={}){let r=Math.max(Math.abs(t)*(n.riskFraction??.01),1e-8),i=r*(n.riskReward??2);return e===`buy`?{side:e,entry:t,stopLoss:t-r,takeProfit:t+i}:{side:e,entry:t,stopLoss:t+r,takeProfit:t-i}}function Ou(e){let t=Math.abs(e.entry-e.stopLoss);return t===0?0:Math.abs(e.takeProfit-e.entry)/t}var ku=6,Au=class{draft=null;dragging=null;defaults;constructor(e={}){this.defaults=e}start(e,t){this.draft=Du(e,t,this.defaults),this.dragging=null}cancel(){this.draft=null,this.dragging=null}isActive(){return this.draft!==null}getDraft(){return this.draft?{...this.draft}:null}hitTest(t,n){if(!this.draft)return null;let r=[`entry`,`sl`,`tp`],i=null,a=ku;for(let o of r){let r=e.w(this.priceOf(o),n),s=Math.abs(r-t.y);s<=a&&(a=s,i=o)}return i}beginDrag(e,t){let n=this.hitTest(e,t);return n?(this.dragging=n,!0):!1}drag(t,n){if(!this.draft||!this.dragging)return!1;let r=e.j(t.y,n);return this.draft=ju(this.draft,this.dragging,r),!0}endDrag(){this.dragging=null}isDragging(){return this.dragging!==null}priceOf(e){let t=this.draft;return e===`entry`?t.entry:e===`sl`?t.stopLoss:t.takeProfit}render(t,n,r,i=2){let a=this.draft;if(!a)return;let{chartRect:o}=n,s=o.x,c=o.x+o.width,l=e.w(a.entry,n),u=e.w(a.stopLoss,n),d=e.w(a.takeProfit,n),f=r.candleUp,p=r.candleDown;t.save(),t.globalAlpha=.12,t.fillStyle=f,t.fillRect(s,Math.min(l,d),o.width,Math.abs(d-l)),t.fillStyle=p,t.fillRect(s,Math.min(l,u),o.width,Math.abs(u-l)),t.globalAlpha=1,Mu(t,s,c,l,r.text,[6,3]),Mu(t,s,c,d,f,[]),Mu(t,s,c,u,p,[]);let m=Ou(a),h=a.side===`buy`?`LONG`:`SHORT`,g=e=>n.formatPrice?.(e)??e.toFixed(i);Nu(t,s+6,l,`${h} entry ${g(a.entry)}`,r.text,r),Nu(t,s+6,d,`TP ${g(a.takeProfit)} · ${m.toFixed(2)}R`,f,r),Nu(t,s+6,u,`SL ${g(a.stopLoss)}`,p,r);for(let[i,o]of[[a.entry,r.text],[a.takeProfit,f],[a.stopLoss,p]]){let r=e.w(i,n);t.fillStyle=o,t.beginPath(),t.arc(c-6,r,3.5,0,Math.PI*2),t.fill()}t.restore()}};function ju(e,t,n){let r=e.side===`buy`;if(t===`entry`){let t=n-e.entry;return{side:e.side,entry:n,stopLoss:e.stopLoss+t,takeProfit:e.takeProfit+t}}if(t===`sl`){let t=r?Math.min(n,e.entry):Math.max(n,e.entry);return{...e,stopLoss:t}}let i=r?Math.max(n,e.entry):Math.min(n,e.entry);return{...e,takeProfit:i}}function Mu(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Nu(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a.background,d(e,t-3,n-8,o+6,16,a),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}function Pu(e,t,n){return n==null?`limit`:e===`buy`?t<=n?`limit`:`stop`:t>=n?`limit`:`stop`}var Fu=6,Iu=class{draft=null;dragging=!1;start(e,t,n=1){this.draft={side:e,price:t,quantity:n},this.dragging=!1}cancel(){this.draft=null,this.dragging=!1}isActive(){return this.draft!==null}isDragging(){return this.dragging}getDraft(){return this.draft?{...this.draft}:null}setPrice(e){return this.draft?(this.draft={...this.draft,price:e},!0):!1}toIntent(e){return this.draft?{side:this.draft.side,type:Pu(this.draft.side,this.draft.price,e),price:this.draft.price,quantity:this.draft.quantity}:null}hitTest(t,n){return this.draft?Math.abs(e.w(this.draft.price,n)-t.y)<=Fu:!1}beginDrag(e,t){return this.hitTest(e,t)?(this.dragging=!0,!0):!1}drag(t,n){return!this.draft||!this.dragging?!1:this.setPrice(e.j(t.y,n))}endDrag(){this.dragging=!1}render(t,n,r,i,a=2){let o=this.draft;if(!o)return;let{chartRect:s}=n,c=s.x,l=s.x+s.width,u=e.w(o.price,n),d=Pu(o.side,o.price,i),f=o.side===`buy`?r.candleUp:r.candleDown;t.save(),Lu(t,c,l,u,f,[6,3]);let p=o.side===`buy`?`BUY`:`SELL`;Ru(t,c+6,u,`${p} ${d.toUpperCase()} ${n.formatPrice?.(o.price)??o.price.toFixed(a)}`,f,r),t.fillStyle=f,t.beginPath(),t.arc(l-6,u,3.5,0,Math.PI*2),t.fill(),t.restore()}};function Lu(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Ru(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a.background,d(e,t-3,n-8,o+6,16,a),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}var zu=5,Bu=7,Vu=2;function Hu(e,t){let n=t.data,r=n&&n.length>0?n[n.length-1].time:0;return r>0&&r<0xe8d4a51000?e/1e3:e}function Uu(t,n,r,i){if(n.length===0)return;let{chartRect:a}=r,o=i.orderColors?.buy??`#1fa874`,s=i.orderColors?.sell??`#e8505b`;t.lineWidth=1.5;for(let i of n){let n=e.D(Hu(i.time,r),r),c=e.w(i.price,r);if(n<a.x||n>a.x+a.width||c<a.y||c>a.y+a.height)continue;let l=i.side===`buy`,u=l?c+Vu:c-Vu,d=l?u+Bu:u-Bu;t.beginPath(),t.moveTo(n,u),t.lineTo(n-zu,d),t.lineTo(n+zu,d),t.closePath();let f=l?o:s;!i.reason||i.reason===`order`?(t.fillStyle=f,t.fill()):(t.strokeStyle=f,t.stroke())}}var Wu=1e3,Gu=class{orders=[];positions=[];depthData=null;currentPrice=null;config;orderRenderer=new mu;positionRenderer=new Cu;depthOverlay=new wu;dragHandler;contextMenu=new Eu;bracket=new Au;orderDraft=new Iu;buttons=[];fills=[];realisedPnl=0;requestRender=null;eventCallback=null;container=null;constructor(e){this.config={...t.DEFAULT_TRADING_CONFIG,...e},this.dragHandler=new Tu(this.config.dragThreshold),this.contextMenu.onItemSelect=e=>{this.eventCallback?.(`orderPlace`,e)}}setContainer(e){this.container=e}setRequestRender(e){this.requestRender=e}setEventCallback(e){this.eventCallback=e}setOrders(e){this.orders=e,this.requestRender?.()}setPositions(e){this.positions=e,this.requestRender?.()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}getCurrentPrice(){return this.currentPrice}setDepthData(e){this.depthData=e,this.requestRender?.()}setCurrentPrice(e){this.currentPrice=e,this.requestRender?.()}setConfig(e){Object.assign(this.config,e),this.requestRender?.()}addFill(e){this.fills=[...this.fills.slice(-(Wu-1)),e],this.realisedPnl+=e.pnl??0,this.requestRender?.()}setFills(e){this.fills=e.slice(-Wu),this.realisedPnl=e.reduce((e,t)=>e+(t.pnl??0),0),this.requestRender?.()}getRealisedPnl(){return this.realisedPnl}getFills(){return[...this.fills]}armed=null;isOverButton(e){return this.config.enabled&&uu(this.buttons,e)!==null}runButton(e){switch(e.type){case`cancelOrder`:this.eventCallback?.(`orderCancel`,{orderId:e.orderId});break;case`closePosition`:this.eventCallback?.(`positionClose`,{positionId:e.positionId});break;case`reversePosition`:this.eventCallback?.(`positionReverse`,{positionId:e.positionId});break;case`removeStop`:this.eventCallback?.(`positionModify`,{positionId:e.positionId,[e.which]:null});break}}startBracket(e,t){this.bracket.start(e,t),this.requestRender?.()}cancelBracket(){this.bracket.isActive()&&(this.bracket.cancel(),this.requestRender?.())}confirmBracket(){let e=this.bracket.getDraft();return e?(this.eventCallback?.(`bracketPlace`,{side:e.side,entry:e.entry,stopLoss:e.stopLoss,takeProfit:e.takeProfit,riskReward:Ou(e)}),this.bracket.cancel(),this.requestRender?.(),!0):!1}isBracketActive(){return this.bracket.isActive()}startOrderDraft(e,t){this.orderDraft.start(e,t),this.requestRender?.()}cancelOrderDraft(){this.orderDraft.isActive()&&(this.orderDraft.cancel(),this.requestRender?.())}confirmOrderDraft(){let e=this.orderDraft.toIntent(this.currentPrice);return e?(this.eventCallback?.(`orderPlace`,e),this.orderDraft.cancel(),this.requestRender?.(),!0):!1}isOrderDraftActive(){return this.orderDraft.isActive()}isOverDraggableLine(t,n,r=8){if(!this.config.enabled)return!1;let i=i=>{if(i===void 0)return!1;let a=e.w(i,n);return su(a,n)&&Math.abs(t.y-a)<=r};for(let e of this.orders)if(e.draggable!==!1&&i(e.price))return!0;for(let e of this.positions)if(i(e.stopLoss)||i(e.takeProfit))return!0;return!1}onPointerDown(e,t){if(!this.config.enabled)return!1;if(this.bracket.isActive()&&this.bracket.beginDrag(e,t)||this.orderDraft.isActive()&&this.orderDraft.beginDrag(e,t))return this.requestRender?.(),!0;let n=uu(this.buttons,e);return n?(this.armed=n.action,!0):this.dragHandler.onPointerDown(e,this.orders,this.positions,t,8)}onPointerMove(e,t){if(this.armed)return!0;if(this.bracket.isDragging()){let n=this.bracket.drag(e,t);return n&&this.requestRender?.(),n}if(this.orderDraft.isDragging()){let n=this.orderDraft.drag(e,t);return n&&this.requestRender?.(),n}if(!this.dragHandler.isActive())return!1;let n=this.dragHandler.onPointerMove(e,t);return n&&this.requestRender?.(),n}onPointerUp(e){if(this.armed){let t=this.armed;this.armed=null;let n=e?uu(this.buttons,e):null;return n&&lu(n.action,t)&&this.runButton(t),!0}if(this.bracket.isDragging())return this.bracket.endDrag(),this.requestRender?.(),!0;if(this.orderDraft.isDragging())return this.orderDraft.endDrag(),this.requestRender?.(),!0;let t=this.dragHandler.onPointerUp();return t?(t.sourceType===`order`?this.eventCallback?.(`orderModify`,{orderId:t.id,newPrice:t.newPrice,previousPrice:t.previousPrice}):this.eventCallback?.(`positionModify`,{positionId:t.id,[t.sourceType]:t.newPrice}),this.requestRender?.(),!0):!1}onContextMenu(t,n){if(!this.config.enabled||!this.config.contextMenu?.enabled||!this.container)return!1;let r=e.j(t.y,n);return this.contextMenu.show(t,r,this.container,this.config,n.formatPrice),!0}render(e,t,n){if(this.buttons=[],!this.config.enabled)return;let{chartRect:r}=t;e.save();try{e.beginPath(),e.rect(r.x,r.y,r.width,r.height),e.clip(),this.renderInPlot(e,t,n)}finally{e.restore()}}renderInPlot(e,t,n){this.depthData&&this.depthOverlay.render(e,this.depthData,t,this.config),this.config.fillMarks!==!1&&Uu(e,this.fills,t,this.config),this.positions.length>0&&this.positionRenderer.render(e,this.positions,this.currentPrice,t,n,this.config,this.buttons),this.orders.length>0&&this.orderRenderer.render(e,this.orders,t,n,this.config,this.dragHandler.getDragState(),this.buttons),this.bracket.isActive()&&this.bracket.render(e,t,n,this.config.pricePrecision??2),this.orderDraft.isActive()&&this.orderDraft.render(e,t,n,this.currentPrice,this.config.pricePrecision??2)}renderAxisBadges(e,t,n){this.config.enabled&&(this.positions.length>0&&this.positionRenderer.renderAxisBadges(e,this.positions,t,n,this.config),this.orders.length>0&&this.orderRenderer.renderAxisBadges(e,this.orders,t,n,this.config,this.dragHandler.getDragState()))}axisTagYs(t){if(!this.config.enabled)return[];let n=this.dragHandler.getDragState(),r=this.positions.map(n=>e.w(n.entryPrice,t));for(let i of this.orders){let a=n?.orderId===i.id&&n.sourceType===`order`?n.currentPrice:i.price;r.push(e.w(a,t))}let{chartRect:i}=t;return r.filter(e=>e>=i.y&&e<=i.y+i.height)}destroy(){this.contextMenu.destroy()}},Ku=class{constructor(e){this.manager=e}render(e,t,n){this.manager.render(e,t,n)}renderAxisBadges(e,t,n){this.manager.renderAxisBadges(e,t,n)}axisTagYs(e){return this.manager.axisTagYs(e)}},qu=class{name=`paper`;state=`disconnected`;listeners=new Map;orders=[];positions=[];markPrice;markTime;seq=0;constructor(e={}){this.markPrice=e.markPrice??0}connect(e){this.state=`connected`,this.emit(`connectionChange`,this.state),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}disconnect(){this.state=`disconnected`,this.emit(`connectionChange`,this.state)}getConnectionState(){return this.state}setMarkPrice(e,t){this.markPrice=e,this.markTime=t!==void 0&&Number.isFinite(t)?t:void 0,this.checkPendingOrders(),this.checkStops()}fillTime(){return this.markTime??Date.now()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}async placeOrder(e){let t={id:this.nextId(`ord`),side:e.side,type:e.type,price:e.price,stopPrice:e.stopPrice,quantity:e.quantity??1,label:e.type===`market`?void 0:Yu(e.type),draggable:!0,stopLoss:e.stopLoss,takeProfit:e.takeProfit,timeInForce:e.timeInForce};return e.type===`market`?this.fill(t,this.markPrice||e.price):(this.orders=[...this.orders,t],this.emit(`orders`,this.orders)),t}async modifyOrder(e){this.orders=this.orders.map(t=>t.id===e.orderId?{...t,price:e.newPrice}:t),this.emit(`orders`,this.orders)}async cancelOrder(e){this.orders=this.orders.filter(t=>t.id!==e.orderId),this.emit(`orders`,this.orders)}async modifyPosition(e){let t=(e,t)=>e===void 0?t:e??void 0;this.positions=this.positions.map(n=>n.id===e.positionId?{...n,stopLoss:t(e.stopLoss,n.stopLoss),takeProfit:t(e.takeProfit,n.takeProfit)}:n),this.emit(`positions`,this.positions)}async closePosition(e){let t=this.positions.find(t=>t.id===e.positionId);t&&(this.close(t,this.markPrice||t.entryPrice,`close`),this.emit(`positions`,this.positions))}async reversePosition(e){let t=this.positions.find(t=>t.id===e.positionId);if(!t)return;let n=this.markPrice||t.entryPrice;this.close(t,n,`reverse`);let r=t.quantity-(t.closedQuantity??0),i={id:this.nextId(`ord`),side:Ju(t.side),type:`market`,price:n,quantity:r};this.fill(i,n)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear(),this.orders=[],this.positions=[]}fill(e,t){this.orders=this.orders.filter(t=>t.id!==e.id);let n={id:this.nextId(`pos`),side:e.side,entryPrice:t,quantity:e.quantity,stopLoss:e.stopLoss,takeProfit:e.takeProfit};this.positions=[...this.positions,n];let r={orderId:e.id,side:e.side,price:t,quantity:e.quantity,time:this.fillTime(),positionId:n.id,reason:`order`};this.emit(`fill`,r),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}close(e,t,n){this.positions=this.positions.filter(t=>t.id!==e.id);let r=e.quantity-(e.closedQuantity??0),i=e.side===`buy`?1:-1;this.emit(`fill`,{orderId:this.nextId(`ord`),side:Ju(e.side),price:t,quantity:r,time:this.fillTime(),positionId:e.id,reason:n,pnl:(t-e.entryPrice)*r*i})}checkPendingOrders(){let e=this.orders.filter(e=>this.isTriggered(e));for(let t of e)this.fill(t,t.type===`limit`?t.price:t.stopPrice??t.price)}isTriggered(e){if(e.type===`limit`)return e.side===`buy`?this.markPrice<=e.price:this.markPrice>=e.price;if(e.type===`stop`||e.type===`stopLimit`){let t=e.stopPrice??e.price;return e.side===`buy`?this.markPrice>=t:this.markPrice<=t}return!1}checkStops(){let e=!1;for(let t of[...this.positions]){let n=t.stopLoss!==void 0&&(t.side===`buy`?this.markPrice<=t.stopLoss:this.markPrice>=t.stopLoss),r=t.takeProfit!==void 0&&(t.side===`buy`?this.markPrice>=t.takeProfit:this.markPrice<=t.takeProfit);!n&&!r||(this.close(t,n?t.stopLoss:t.takeProfit,n?`stopLoss`:`takeProfit`),e=!0)}e&&this.emit(`positions`,this.positions)}nextId(e){return`${e}-${++this.seq}`}emit(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Ju(e){return e===`buy`?`sell`:`buy`}function Yu(e){switch(e){case`stop`:return`STOP`;case`stopLimit`:return`STOP LIMIT`;default:return`LIMIT`}}var Xu=class{listeners=new Map;on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>n.delete(t)}once(e,t){let n=this.on(e,e=>{n(),t(e)});return n}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}removeAllListeners(){this.listeners.clear()}},Zu=class extends Xu{currentBar=null;timeframeMs;tickRing;ringHead=0;ringCount=0;ringCapacity;constructor(e,n=1e3){super(),this.timeframeMs=(0,t.timeframeToMs)(e),this.ringCapacity=n,this.tickRing=Array(n)}setTimeframe(e){this.timeframeMs=(0,t.timeframeToMs)(e),this.currentBar=null,this.ringHead=0,this.ringCount=0}processTick(e){let t=(this.ringHead+this.ringCount)%this.ringCapacity;this.tickRing[t]=e,this.ringCount<this.ringCapacity?this.ringCount++:this.ringHead=(this.ringHead+1)%this.ringCapacity;let n=this.alignToTimeframe(e.time);!this.currentBar||this.currentBar.time!==n?(this.currentBar&&(this.currentBar.closed=!0,this.emit(`barClose`,this.currentBar)),this.currentBar={time:n,open:e.price,high:e.price,low:e.price,close:e.price,volume:e.volume,closed:!1,tickCount:1}):(this.currentBar.high=Math.max(this.currentBar.high,e.price),this.currentBar.low=Math.min(this.currentBar.low,e.price),this.currentBar.close=e.price,this.currentBar.volume+=e.volume,this.currentBar.tickCount++),this.emit(`bar`,this.currentBar)}processBar(e,t){if(t&&this.currentBar&&this.currentBar.time===e.time)this.currentBar={...e,closed:!0,tickCount:this.currentBar.tickCount+1},this.emit(`barClose`,this.currentBar),this.currentBar=null;else if(!t)this.currentBar={...e,closed:!1,tickCount:(this.currentBar?.tickCount??0)+1},this.emit(`bar`,this.currentBar);else{let t={...e,closed:!0,tickCount:1};this.emit(`barClose`,t),this.currentBar=null}}getCurrentBar(){return this.currentBar?{...this.currentBar}:null}getTickBuffer(){let e=Array(this.ringCount);for(let t=0;t<this.ringCount;t++)e[t]=this.tickRing[(this.ringHead+t)%this.ringCapacity];return e}reset(){this.currentBar=null,this.ringHead=0,this.ringCount=0}alignToTimeframe(e){return this.timeframeMs>0?Math.floor(e/this.timeframeMs)*this.timeframeMs:e}},Qu=class extends Xu{config;attempt=0;timer=null;active=!1;constructor(e){super(),this.config={...t.DEFAULT_RECONNECT,...e}}schedule(e){if(!this.config.enabled||!this.active)return;if(this.attempt++,this.attempt>this.config.maxRetries){this.emit(`giveUp`,{attempts:this.attempt-1}),this.active=!1;return}let t=this.computeDelay();this.emit(`attempt`,{attempt:this.attempt,delay:t}),this.timer=setTimeout(()=>{this.timer=null,this.active&&e()},t)}onConnected(){this.attempt=0,this.cancel(),this.emit(`success`,void 0)}start(){this.active=!0}stop(){this.active=!1,this.cancel(),this.attempt=0}cancel(){this.timer&&=(clearTimeout(this.timer),null)}getAttempt(){return this.attempt}isActive(){return this.active}computeDelay(){let e=this.config.baseDelay,t=this.config.backoffMultiplier**(this.attempt-1),n=Math.min(e*t,this.config.maxDelay),r=n*.25*(Math.random()*2-1);return Math.max(0,Math.round(n+r))}},$u=class{price=null;previousClose=null;visible=!0;flashUntil=0;pricePrecision=null;locale=`en-US`;setLocale(e){this.locale=e}setPrice(e,t){this.price!==null&&e!==this.price&&(this.flashUntil=Date.now()+300),this.previousClose=t??this.price??e,this.price=e}setVisible(e){this.visible=e}isVisible(){return this.visible}setPricePrecision(e){this.pricePrecision=e}getPrice(){return this.price}render(n,r,i){let a=i.style?.lastPrice;if(!this.visible||this.price===null||a?.visible===!1)return;let o=e.w(this.price,r),{chartRect:s}=r;if(o<s.y||o>s.y+s.height)return;let c=this.previousClose===null||this.price>=this.previousClose?a?.up??i.candleUp??`#1fa874`:a?.down??i.candleDown??`#e8505b`,l=Date.now()<this.flashUntil,u=a?.width??1;n.setLineDash((0,t.lineDash)(a?.style??`dashed`,[4,3],u)),n.strokeStyle=c,n.lineWidth=u,n.globalAlpha=l?1:.7,n.beginPath(),n.moveTo(s.x,Math.round(o)+.5),n.lineTo(s.x+s.width,Math.round(o)+.5),n.stroke(),n.setLineDash([]),n.globalAlpha=1;let f=s.x+s.width+1,p=this.pricePrecision??(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max),m=r.formatPrice?r.formatPrice(this.price):(0,t.formatPrice)(this.price,p,this.locale);n.font=`bold 11px ${i.font.family}`;let h=n.measureText(m).width,g=r.priceAxisWidth??t.PRICE_AXIS_WIDTH,_=Math.min(h+12,g-2);n.fillStyle=c,d(n,f,o-10,_,20,i);let v=f-5;n.beginPath(),n.moveTo(v,o),n.lineTo(v+5,o-5),n.lineTo(v+5,o+5),n.closePath(),n.fill(),n.fillStyle=`#FFFFFF`,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(m,f+5,o)}},ed=1e3,td=10,nd=1440,rd=[`tick`,`barClose`,`snapshot`,`connectionChange`,`error`],id=new WeakMap;function ad(e){if(e instanceof ud||!e.supportedTimeframes?.length)return e;let t=id.get(e);return t||(t=new ud(e,e.supportedTimeframes),id.set(e,t)),t}function od(e,n){if(n.includes(e))return e;let r=(0,t.pickBaseTimeframe)(e,n);return r&&Math.ceil((0,t.timeframeToMs)(e)/(0,t.timeframeToMs)(r))<=1440?r:null}function sd(e,n){if((0,t.tickBarCount)(n)!==null)return typeof e.fetchTrades==`function`&&typeof e.subscribeTrades==`function`;let r=e.supportedTimeframes;return!r?.length||od(n,r)!==null}function cd(e,n){let r=(0,t.parseTimeframe)(n);if(r?.unit===`M`){let t=new Date(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+r.count,1)}return e+(0,t.timeframeToMs)(n)}function ld(e,t){let n=t[0],r={time:e,open:n.open,high:n.high,low:n.low,close:n.close,volume:n.volume};for(let e=1;e<t.length;e++){let n=t[e];n.high>r.high&&(r.high=n.high),n.low<r.low&&(r.low=n.low),r.close=n.close,r.volume+=n.volume}return r}var ud=class{name;fetchHistoryBefore;searchSymbols;resolveSymbol;subscribeQuotes;fetchNews;fetchTrades;subscribeTrades;listeners=new Map;unsubscribe=[];live=null;bucket=null;parts=new Map;tail=null;generation=0;constructor(e,t){this.inner=e,this.baseTimeframes=t,this.name=e.name,e.fetchHistoryBefore&&(this.fetchHistoryBefore=(e,t,n,r)=>this.historyBefore(e,t,n,r)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols.bind(e)),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol.bind(e)),e.subscribeQuotes&&(this.subscribeQuotes=e.subscribeQuotes.bind(e)),e.fetchNews&&(this.fetchNews=e.fetchNews.bind(e)),e.fetchTrades&&(this.fetchTrades=e.fetchTrades.bind(e)),e.subscribeTrades&&(this.subscribeTrades=e.subscribeTrades.bind(e)),this.listen(`bar`,e=>this.onBar(e));for(let e of rd)this.listen(e,t=>this.emit(e,t.data))}baseFor(e){let t=od(e,this.baseTimeframes);if(!t)throw RangeError(`${this.name} cannot serve the ${e} timeframe`);return t}connect(e){let t=this.baseFor(e.timeframe);this.generation++,this.resetBucket(),this.live=t===e.timeframe?null:{symbol:e.symbol,target:e.timeframe,base:t},this.live&&this.resumeFromHistory(this.live.symbol,this.live.target),this.inner.connect({...e,timeframe:t})}disconnect(){this.generation++,this.inner.disconnect(),this.resetBucket(),this.live=null}getConnectionState(){return this.inner.getConnectionState()}async fetchHistory(e,t,n=500){let r=this.baseFor(t);if(r===t)return this.inner.fetchHistory(e,t,n);let i=this.generation,a=this.baseBarsFor(t,r,n),o=await this.inner.fetchHistory(e,r,Math.min(a,ed)),s=await this.extendBack(e,r,o,a,i);return this.rememberTail(e,t,s),this.toTarget(s,t,n)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.generation++;for(let e of this.unsubscribe)e();this.unsubscribe.length=0,this.listeners.clear(),this.inner.dispose()}async historyBefore(e,t,n,r){let i=this.inner.fetchHistoryBefore.bind(this.inner),a=this.baseFor(t);if(a===t)return i(e,t,n,r);let o=this.generation,s=this.baseBarsFor(t,a,r),c=await i(e,a,n,Math.min(s,ed)),l=await this.extendBack(e,a,c.filter(e=>e.time<n),s,o,1);return this.toTarget(l,t,r)}baseBarsFor(e,n,r){return(r+1)*Math.ceil((0,t.timeframeToMs)(e)/(0,t.timeframeToMs)(n))}async extendBack(e,t,n,r,i,a=1){let o=this.inner.fetchHistoryBefore?.bind(this.inner),s=n,c=a;for(;o&&s.length>0&&s.length<r&&c<10&&i===this.generation;){let n=s[0].time,i=await o(e,t,n,Math.min(r-s.length,ed));c++;let a=i.filter(e=>e.time<n);if(a.length===0)break;s=a.concat(s)}return s}toTarget(e,n,r){if(e.length===0)return[];let i=(0,t.resampleBars)(e,n);return i.length>1&&i[0].time!==e[0].time&&i.shift(),i.length>r?i.slice(i.length-r):i}rememberTail(e,n,r){if(r.length===0)return;let i=(0,t.timeframeBucketStart)(r[r.length-1].time,n),a=r.length;for(;a>0&&(0,t.timeframeBucketStart)(r[a-1].time,n)===i;)a--;this.tail={symbol:e,target:n,bucket:i,bars:r.slice(a)}}resumeFromHistory(e,t){let n=this.tail;if(!(!n||n.symbol!==e||n.target!==t)){this.bucket=n.bucket;for(let e of n.bars)this.parts.set(e.time,e)}}onBar(e){let n=this.live;if(!n){this.emit(`bar`,e.data);return}let{bar:r,closed:i}=e.data,a=(0,t.timeframeBucketStart)(r.time,n.target);if(this.bucket!==null&&a<this.bucket)return;if(this.bucket!==null&&a>this.bucket){let e=this.composed();e&&this.emit(`bar`,{bar:e,closed:!0}),this.resetBucket()}this.bucket=a,this.parts.set(r.time,r);let o=this.composed();if(!o)return;let s=i&&(0,t.timeframeBucketStart)(cd(r.time,n.base),n.target)!==a;this.emit(`bar`,{bar:o,closed:s}),s&&(this.resetBucket(),this.bucket=(0,t.timeframeBucketStart)(cd(r.time,n.base),n.target))}composed(){if(this.bucket===null||this.parts.size===0)return null;let e=[...this.parts.values()].sort((e,t)=>e.time-t.time);return ld(this.bucket,e)}resetBucket(){this.bucket=null,this.parts=new Map}listen(e,t){let n=e=>t(e);this.inner.on(e,n),this.unsubscribe.push(()=>this.inner.off(e,n))}emit(e,t){let n=this.listeners.get(e);if(!n)return;let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}},dd=1e3,fd=15e3,pd=[`tick`,`bar`,`barClose`,`snapshot`,`connectionChange`,`error`],md=class{bar=null;count=0;lastTime=-1/0;constructor(e){this.tradesPerBar=e}push(e){let t=[],n=!1;for(let r of e){if(this.bar)this.bar={...this.bar,high:Math.max(this.bar.high,r.price),low:Math.min(this.bar.low,r.price),close:r.price,volume:this.bar.volume+r.volume};else{let e=Math.max(r.time,this.lastTime+1);this.lastTime=e,this.bar={time:e,open:r.price,high:r.price,low:r.price,close:r.price,volume:r.volume},this.count=0}this.count++,n=!0,this.count>=this.tradesPerBar&&(t.push({bar:this.bar,closed:!0}),this.bar=null,n=!1)}return n&&this.bar&&t.push({bar:this.bar,closed:!1}),t}build(e){return this.bar=null,this.count=0,this.lastTime=-1/0,this.push(e).map(e=>e.bar)}},hd=class{name;supportedTimeframes;searchSymbols;resolveSymbol;subscribeQuotes;fetchNews;fetchTrades;subscribeTrades;listeners=new Map;tick=null;stopTrades=null;keepAlive=null;tickMode=!1;state=`disconnected`;constructor(e){this.inner=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes,e.searchSymbols&&(this.searchSymbols=e.searchSymbols.bind(e)),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol.bind(e)),e.subscribeQuotes&&(this.subscribeQuotes=e.subscribeQuotes.bind(e)),e.fetchNews&&(this.fetchNews=e.fetchNews.bind(e)),this.fetchTrades=e.fetchTrades.bind(e),this.subscribeTrades=e.subscribeTrades.bind(e);for(let t of pd)e.on(t,e=>{this.tickMode||this.emit(t,e.data)})}async fetchHistory(e,n,r){let i=(0,t.tickBarCount)(n);if(i===null)return this.inner.fetchHistory(e,n,r);let a=(await this.inner.fetchTrades(e,dd)).filter(yd).sort((e,t)=>e.time-t.time),o=new md(i),s=o.build(a);return this.tick={symbol:e,builder:o,after:a.length?a[a.length-1].time:-1/0},r!==void 0&&r>0?s.slice(-r):s}fetchHistoryBefore(e,n,r,i){return(0,t.tickBarCount)(n)!==null||!this.inner.fetchHistoryBefore?Promise.resolve([]):this.inner.fetchHistoryBefore(e,n,r,i)}connect(e){this.disconnect();let n=(0,t.tickBarCount)(e.timeframe);if(n===null){this.tickMode=!1,this.inner.connect(e);return}this.tickMode=!0;let r=this.tick?.symbol===e.symbol?this.tick:{symbol:e.symbol,builder:new md(n),after:-1/0};this.tick=r,this.stopTrades=this.inner.subscribeTrades(e.symbol,e=>{let t=e.filter(e=>yd(e)&&e.time>=r.after);for(let{bar:e,closed:n}of r.builder.push(t))this.emit(`bar`,{bar:e,closed:n}),this.emit(`tick`,{time:e.time,price:e.close,volume:e.volume})}),this.state=`connected`,this.emit(`connectionChange`,`connected`),this.keepAlive=setInterval(()=>this.emit(`connectionChange`,`connected`),fd)}disconnect(){this.tickMode?(this.stopTrades?.(),this.stopTrades=null,this.keepAlive&&clearInterval(this.keepAlive),this.keepAlive=null,this.state=`disconnected`):this.inner.disconnect()}getConnectionState(){return this.tickMode?this.state:this.inner.getConnectionState()}dispose(){this.stopTrades?.(),this.stopTrades=null,this.keepAlive&&clearInterval(this.keepAlive),this.keepAlive=null,this.listeners.clear(),this.inner.dispose()}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(!n)return;let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}},gd=new WeakMap;function _d(e){if(e instanceof hd||!vd(e))return e;let t=gd.get(e);return t||(t=new hd(e),gd.set(e,t)),t}function vd(e){return typeof e.fetchTrades==`function`&&typeof e.subscribeTrades==`function`}function yd(e){return Number.isFinite(e?.time)&&Number.isFinite(e?.price)&&Number.isFinite(e?.volume)}var bd=class extends Xu{config=null;adapter=null;aggregator=null;reconnector;priceLine=new $u;state=`disconnected`;lastPrice=null;previousClose=null;unsubscribers=[];heartbeatTimer=null;lastMessageTime=0;connectSeq=0;constructor(){super(),this.reconnector=new Qu,this.wireReconnector()}async connect(e){this.disconnect();let n=_d(ad(e.adapter));this.config={...t.DEFAULT_STREAM_CONFIG,...e,adapter:n},this.adapter=n,this.aggregator=new Zu(e.timeframe),this.reconnector.removeAllListeners(),this.reconnector.stop(),this.reconnector=new Qu(e.reconnect??t.DEFAULT_RECONNECT),this.wireReconnector(),this.aggregator.on(`bar`,e=>{this.emit(`barUpdate`,e),this.updatePrice(e.close)}),this.aggregator.on(`barClose`,e=>{this.previousClose=e.close,this.emit(`barClose`,e)}),this.wireAdapter(),this.reconnector.start(),await this.doConnect()}disconnect(){this.connectSeq++,this.reconnector.stop(),this.stopHeartbeat();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.adapter&&=(this.adapter.disconnect(),null),this.aggregator?.reset(),this.aggregator?.removeAllListeners(),this.aggregator=null,this.config=null,this.lastPrice=null,this.previousClose=null,this.setState(`disconnected`)}async switchTo(e,t){!this.config||!this.adapter||(this.reconnector.stop(),this.adapter.disconnect(),this.reconnector.start(),this.aggregator?.reset(),this.aggregator?.setTimeframe(t),this.lastPrice=null,this.previousClose=null,this.config.symbol=e,this.config.timeframe=t,await this.doConnect())}getConnectionState(){return this.state}getConnectionInfo(){return{state:this.state,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}}getLastPrice(){return this.lastPrice}async doConnect(){if(!this.config||!this.adapter)return;let e=++this.connectSeq,{symbol:t,timeframe:n}=this.config;this.setState(`connecting`);try{let r=await this.adapter.fetchHistory(t,n,this.config.historyLimit??500);if(e!==this.connectSeq||!this.adapter)return;r.length>0&&(this.previousClose=r[r.length-1].close,this.updatePrice(r[r.length-1].close)),this.emit(`snapshot`,r),this.adapter.connect({symbol:t,timeframe:n}),this.startHeartbeat()}catch(t){if(e!==this.connectSeq)return;let n=t instanceof Error?t.message:String(t);this.emit(`error`,{message:n,code:`CONNECT_FAILED`}),this.setState(`error`),this.reconnector.schedule(()=>this.doConnect())}}wireReconnector(){this.reconnector.on(`attempt`,({attempt:e,delay:t})=>{this.setState(`reconnecting`),this.emit(`connectionChange`,{state:`reconnecting`,reconnectAttempt:e,lastMessageTime:this.lastMessageTime})}),this.reconnector.on(`giveUp`,({attempts:e})=>{this.setState(`error`),this.emit(`error`,{message:`Reconnection failed after ${e} attempts`,code:`RECONNECT_EXHAUSTED`})})}wireAdapter(){if(!this.adapter)return;let e=this.adapter,t=e=>{let t=e.data;this.lastMessageTime=Date.now(),t===`connected`?(this.reconnector.onConnected(),this.setState(`connected`)):(t===`disconnected`||t===`error`)&&this.reconnector.schedule(()=>this.doConnect())};e.on(`connectionChange`,t),this.unsubscribers.push(()=>e.off(`connectionChange`,t));let n=e=>{this.lastMessageTime=Date.now();let t=e.data;this.emit(`tick`,t),(t.bid!==void 0||t.ask!==void 0)&&this.emit(`quote`,{bid:t.bid,ask:t.ask}),this.config?.aggregateTicks&&this.aggregator?this.aggregator.processTick(t):this.updatePrice(t.price)};e.on(`tick`,n),this.unsubscribers.push(()=>e.off(`tick`,n));let r=e=>{this.lastMessageTime=Date.now();let{bar:t,closed:n}=e.data;this.aggregator&&this.aggregator.processBar(t,n)};e.on(`bar`,r),this.unsubscribers.push(()=>e.off(`bar`,r));let i=e=>{this.emit(`error`,{message:e.data?.message??`Adapter error`})};e.on(`error`,i),this.unsubscribers.push(()=>e.off(`error`,i))}updatePrice(e){e!==this.lastPrice&&(this.lastPrice=e,this.priceLine.setPrice(e,this.previousClose??void 0),this.emit(`priceChange`,{price:e,previousClose:this.previousClose}))}setState(e){this.state!==e&&(this.state=e,this.emit(`connectionChange`,{state:e,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}))}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{Date.now()-this.lastMessageTime>6e4&&this.state===`connected`&&(this.emit(`error`,{message:`Heartbeat timeout`,code:`HEARTBEAT_TIMEOUT`}),this.adapter?.disconnect(),this.reconnector.schedule(()=>this.doConnect()))},3e4)}stopHeartbeat(){this.heartbeatTimer&&=(clearInterval(this.heartbeatTimer),null)}dispose(){this.disconnect(),this.removeAllListeners()}},xd=class extends Xu{data;speed;index;status=`idle`;timer=null;constructor(e){if(super(),e.data.length===0)throw Error(`ReplayController requires non-empty data`);this.data=e.data,this.speed=Math.max(.01,e.speed??1),this.index=Math.max(0,Math.min(e.startIndex??0,e.data.length)),e.autoStart&&this.start()}getStatus(){return this.status}getIndex(){return this.index}getTotal(){return this.data.length}getPrefix(){return this.data.slice(0,this.index)}start(){if(this.status!==`playing`){if(this.index>=this.data.length){this.transition(`finished`);return}this.transition(`playing`),this.scheduleNext()}}pause(){this.status===`playing`&&(this.clearTimer(),this.transition(`paused`))}resume(){this.status===`paused`&&this.start()}stop(){this.clearTimer(),this.index=0,this.transition(`idle`)}step(e=1){if(!(e<=0)){this.clearTimer();for(let t=0;t<e;t++)if(!this.emitNext())return;this.status!==`finished`&&this.transition(`paused`)}}seek(e){let t=Math.max(0,Math.min(e,this.data.length));this.clearTimer(),this.index=t;let n=t>=this.data.length?`finished`:`paused`;this.transition(n)}setSpeed(e){this.speed=Math.max(.01,e),this.status===`playing`&&(this.clearTimer(),this.scheduleNext())}destroy(){this.clearTimer(),this.removeAllListeners()}scheduleNext(){let e=1e3/this.speed;this.timer=setTimeout(()=>{this.timer=null,this.status===`playing`&&this.emitNext()&&this.scheduleNext()},e)}emitNext(){if(this.index>=this.data.length)return this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1;let e=this.data[this.index],t=this.index;return this.index++,this.emit(`bar`,{bar:e,index:t,total:this.data.length}),this.index>=this.data.length?(this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1):!0}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}transition(e){this.status!==e&&(this.status=e,this.emit(`stateChange`,{status:e,index:this.index,total:this.data.length}))}};function Sd(e){if(!Array.isArray(e)||e.length<6)return null;let t=e[0];if(typeof t!=`number`||!Number.isFinite(t))return null;let n=X(e[1]),r=X(e[2]),i=X(e[3]),a=X(e[4]),o=X(e[5]);return n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}function Cd(e){if(!wd(e))return null;let t=e.t;if(typeof t!=`number`||!Number.isFinite(t))return null;let n=X(e.o),r=X(e.h),i=X(e.l),a=X(e.c),o=X(e.v);if(n===null||r===null||i===null||a===null||o===null)return null;let s=typeof e.x==`boolean`?e.x:!1;return{bar:{time:t,open:n,high:r,low:i,close:a,volume:o},closed:s}}function X(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function wd(e){return typeof e==`object`&&!!e}function Z(e){let t=typeof e==`string`?Number(e):e;return typeof t==`number`&&Number.isFinite(t)?t:void 0}function Td(e){let n=e&&typeof e==`object`&&`data`in e?e.data:e;if(!n||typeof n!=`object`)return null;let r=n;return r.e===`24hrMiniTicker`?(0,t.readQuote)({symbol:r.s,last:Z(r.c),open:Z(r.o),high:Z(r.h),low:Z(r.l),volume:Z(r.v),time:Z(r.E)}):null}function Ed(e){if(!e||typeof e!=`object`)return null;let n=e;return(0,t.readQuote)({symbol:n.symbol,last:Z(n.lastPrice),change:Z(n.priceChange),changePercent:Z(n.priceChangePercent),open:Z(n.openPrice),high:Z(n.highPrice),low:Z(n.lowPrice),prevClose:Z(n.prevClosePrice),volume:Z(n.volume),bid:Z(n.bidPrice),ask:Z(n.askPrice),time:Z(n.closeTime)})}function Dd(e){if(!e||typeof e!=`object`)return null;let t=e,n=Z(t.T),r=Z(t.p),i=Z(t.q);return n!==void 0&&r!==void 0&&i!==void 0?{time:n,price:r,volume:i}:null}var Od={"1s":`1s`,"1m":`1m`,"3m":`3m`,"5m":`5m`,"15m":`15m`,"30m":`30m`,"1h":`1h`,"2h":`2h`,"4h":`4h`,"6h":`6h`,"8h":`8h`,"12h":`12h`,"1d":`1d`,"3d":`3d`,"1w":`1w`,"1M":`1M`},kd=1e3,Ad=200,jd=[`USDT`,`USDC`,`FDUSD`,`BTC`,`ETH`,`BNB`,`EUR`,`TRY`,`BRL`,`JPY`];function Md(e){let t=e.currency?jd.indexOf(e.currency):-1;return t<0?0:40-t*3}function Nd(e){if(typeof e.symbol!=`string`||e.status!==`TRADING`)return null;let n=typeof e.baseAsset==`string`?e.baseAsset:``,r=typeof e.quoteAsset==`string`?e.quoteAsset:``,i=Array.isArray(e.filters)?e.filters.find(e=>typeof e==`object`&&!!e&&e.filterType===`PRICE_FILTER`&&typeof e.tickSize==`string`):void 0,a={symbol:e.symbol,description:n&&r?`${n} / ${r}`:e.symbol,exchange:`Binance`,type:`crypto`};return i&&(a.pricePrecision=(0,t.stepDecimals)(i.tickSize),a.minTick=Number(i.tickSize)),a.timezone=`UTC`,r&&(a.currency=r),a}function Pd(e){let t=e?.symbols;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=Nd(e);t&&n.push(t)}return n}var Fd=class{name=`binance`;supportedTimeframes=Object.keys(Od);ws=null;state=`disconnected`;listeners=new Map;config=null;restBase;wsBase;symbolList=null;constructor(e){this.restBase=e?.restBase??`https://api.binance.com/api/v3`,this.wsBase=e?.wsBase??`wss://stream.binance.com:9443/ws`}connect(e){this.config=e,this.connectWs()}disconnect(){if(this.ws){let e=this.ws;e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n=500){return this.fetchKlines(e,t,n,``)}async searchSymbols(e,n){return(0,t.rankSymbols)(await this.loadSymbols(),e,n?.limit??50,Md)}async resolveSymbol(e){if(this.symbolList){let t=(await this.symbolList.catch(()=>null))?.find(t=>t.symbol===e);if(t)return t}let t=await fetch(`${this.restBase}/exchangeInfo?symbol=${encodeURIComponent(e)}`);return t.ok?Pd(await t.json())[0]??null:null}loadSymbols(){return this.symbolList||(this.symbolList=(async()=>{let e=await fetch(`${this.restBase}/exchangeInfo`);if(!e.ok)throw Error(`Binance REST error: ${e.status}`);return Pd(await e.json())})(),this.symbolList.catch(()=>{this.symbolList=null})),this.symbolList}subscribeQuotes(e,t){let n=[...new Set(e.map(e=>e.trim().toUpperCase()))].filter(e=>/^[A-Z0-9]{2,30}$/.test(e)).slice(0,Ad);if(n.length===0)return()=>{};let r=!1,i=null,a=null,o=0,s=new Set,c=new AbortController;(async()=>{let e=await fetch(`${this.restBase}/ticker/24hr?symbols=${encodeURIComponent(JSON.stringify(n))}`,{signal:c.signal});if(e.ok)return e.json();let t=await fetch(`${this.restBase}/ticker/24hr`,{signal:c.signal});if(!t.ok)return[];let r=await t.json(),i=new Set(n);return Array.isArray(r)?r.filter(e=>i.has(e?.symbol)):[]})().then(e=>{if(r||!Array.isArray(e))return;let n=e.map(Ed).filter(e=>e!==null&&!s.has(e.symbol));n.length>0&&t(n)}).catch(()=>{});let l=this.wsBase.replace(/\/ws\/?$/,``),u=()=>{if(!r){try{i=new WebSocket(`${l}/stream?streams=${n.map(e=>`${e.toLowerCase()}@miniTicker`).join(`/`)}`)}catch{d();return}i.onopen=()=>{o=0},i.onmessage=e=>{let n;try{n=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}let i=Td(n);!i||r||(s.add(i.symbol),t([i]))},i.onclose=()=>{i=null,d()}}},d=()=>{r||(a=setTimeout(u,Math.min(3e4,1e3*2**o++)))};return u(),()=>{r=!0,c.abort(),a&&clearTimeout(a),i&&=(i.onopen=null,i.onmessage=null,i.onclose=null,i.close(),null)}}async fetchTrades(e,t=1e3){let n=Math.max(1,Math.min(1e3,Math.floor(t))),r=await fetch(`${this.restBase}/aggTrades?symbol=${encodeURIComponent(e.toUpperCase())}&limit=${n}`);if(!r.ok)throw Error(`Binance aggTrades ${r.status}`);let i=await r.json();return Array.isArray(i)?i.map(Dd).filter(e=>e!==null):[]}subscribeTrades(e,t){let n=`${e.trim().toLowerCase()}@aggTrade`;if(!/^[a-z0-9]{2,30}@aggTrade$/.test(n))return()=>{};let r=!1,i=null,a=null,o=0,s=()=>{if(!r){try{i=new WebSocket(`${this.wsBase}/${n}`)}catch{c();return}i.onopen=()=>{o=0},i.onmessage=e=>{let n;try{n=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}let i=Dd(n);i&&!r&&t([i])},i.onclose=()=>{i=null,c()}}},c=()=>{r||(a=setTimeout(s,Math.min(3e4,1e3*2**o++)))};return s(),()=>{r=!0,a&&clearTimeout(a),i&&=(i.onopen=null,i.onmessage=null,i.onclose=null,i.close(),null)}}fetchHistoryBefore(e,t,n,r=500){return this.fetchKlines(e,t,Math.min(r,kd),`&endTime=${Math.floor(n)-1}`)}async fetchKlines(e,t,n,r){let i=Od[t]??`15m`,a=`${this.restBase}/klines?symbol=${e}&interval=${i}&limit=${n}${r}`,o=await fetch(a);if(!o.ok)throw Error(`Binance REST error: ${o.status}`);let s=await o.json();if(!Array.isArray(s))return[];let c=[];for(let e of s){let t=Sd(e);t&&c.push(t)}return c}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}connectWs(){if(!this.config)return;let e=`${this.config.symbol.toLowerCase()}@kline_${Od[this.config.timeframe]??`15m`}`,t=`${this.wsBase}/${e}`;this.setState(`connecting`);try{this.ws=new WebSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws.onopen=()=>{this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`)},this.ws.onmessage=e=>{let t;try{t=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}typeof t==`object`&&t&&t.e===`kline`&&this.handleKline(t.k)},this.ws.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},this.ws.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}handleKline(e){let t=Cd(e);if(!t)return;let{bar:n,closed:r}=t;this.emitEvent(`bar`,{bar:n,closed:r}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume})}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},Id=class{name=`mock`;state=`disconnected`;listeners=new Map;config=null;options;tickTimer=null;currentPrice;oldestOpen=new Map;constructor(e){this.options={basePrice:100,volatility:1.5,tickInterval:2e3,historySize:500,...e},this.currentPrice=this.options.basePrice}connect(e){this.config=e,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startTicking()}disconnect(){this.stopTicking(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}subscribeQuotes(e,t){let n=[...new Set(e)].map(e=>{let t=this.options.basePrice*(.5+Ld(e)%1e3/1e3);return{symbol:e,open:t,last:t,high:t,low:t,volume:0}});if(n.length===0)return()=>{};let r=this.options.volatility/100,i=()=>t(n.map(e=>({symbol:e.symbol,last:e.last,open:e.open,high:e.high,low:e.low,volume:e.volume,change:e.last-e.open,changePercent:(e.last-e.open)/e.open*100,time:Date.now()})));i();let a=setInterval(()=>{for(let e of n)e.last=Math.max(e.open*.01,e.last*(1+(Math.random()-.5)*r)),e.high=Math.max(e.high,e.last),e.low=Math.min(e.low,e.last),e.volume+=Math.random()*100;i()},this.options.tickInterval);return()=>clearInterval(a)}async fetchTrades(e,t=1e3){let n=Math.max(1,Math.min(1e3,Math.floor(t))),r=Date.now(),i=this.options.volatility/1e3,a=this.options.basePrice*(.5+Ld(e)%1e3/1e3),o=[];for(let e=n-1;e>=0;e--)a=Math.max(a*.5,a*(1+(Math.random()-.5)*i)),o.push({time:r-e*1e3,price:a,volume:Math.random()*5});return o}subscribeTrades(e,t){let n=this.options.volatility/1e3,r=this.options.basePrice*(.5+Ld(e)%1e3/1e3),i=setInterval(()=>{let e=[];for(let t=0;t<3;t++)r=Math.max(r*.5,r*(1+(Math.random()-.5)*n)),e.push({time:Date.now(),price:r,volume:Math.random()*5});t(e)},this.options.tickInterval);return()=>clearInterval(i)}async fetchHistory(e,t,n){let r=this.options.historyGenerator?this.options.historyGenerator(e,t,n??this.options.historySize):this.generateHistory(t,n??this.options.historySize);return r.length>0&&this.oldestOpen.set(e,r[0].open),r}async fetchHistoryBefore(e,n,r,i){let a=(0,t.timeframeToMs)(n),o=this.options.volatility/100,s=Array(Math.max(0,i)),c=this.oldestOpen.get(e)??this.options.basePrice;for(let e=0;e<i;e++){let t=c/(1+(Math.random()-.52)*o),n=Math.max(t,c)+Math.random()*c*o*.3,l=Math.max(0,Math.min(t,c)-Math.random()*c*o*.3),u=Math.floor(1e4+Math.random()*1e5);s[i-1-e]={time:r-(e+1)*a,open:t,high:n,low:l,close:c,volume:u},c=t}return this.oldestOpen.set(e,c),s}async searchSymbols(e,n){return(0,t.rankSymbols)(this.options.symbols??[],e,n?.limit??50)}async resolveSymbol(e){return this.options.symbols?.find(t=>t.symbol===e)??null}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}generateHistory(e,n){let r=[],i=Date.now(),a=(0,t.timeframeToMs)(e),o=this.options.basePrice,s=this.options.volatility/100;for(let e=n-1;e>=0;e--){let t=i-e*a,n=(Math.random()-.48)*o*s,c=o;o+=n;let l=Math.max(c,o)+Math.random()*o*s*.3,u=Math.min(c,o)-Math.random()*o*s*.3,d=Math.floor(1e4+Math.random()*1e5);r.push({time:t,open:c,high:l,low:u,close:o,volume:d})}return this.currentPrice=o,r}startTicking(){this.stopTicking();let e=this.options.tickInterval??2e3;this.tickTimer=setInterval(()=>{if(this.state!==`connected`||!this.config)return;let e=this.options.volatility/100,n=(Math.random()-.48)*this.currentPrice*e*.3;this.currentPrice+=n;let r=Date.now(),i=(0,t.timeframeToMs)(this.config.timeframe),a={time:Math.floor(r/i)*i,open:this.currentPrice-n,high:Math.max(this.currentPrice,this.currentPrice-n)+Math.abs(n)*.2,low:Math.min(this.currentPrice,this.currentPrice-n)-Math.abs(n)*.2,close:this.currentPrice,volume:Math.floor(100+Math.random()*5e3)};this.emitEvent(`bar`,{bar:a,closed:!1}),this.emitEvent(`tick`,{time:r,price:this.currentPrice,volume:a.volume})},e)}stopTicking(){this.tickTimer&&=(clearInterval(this.tickTimer),null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Ld(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t}var Rd=class{name;supportedTimeframes;ws=null;state=`disconnected`;config=null;listeners=new Map;opts;fetchHistoryBefore;searchSymbols;resolveSymbol;constructor(e){this.opts=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes;let t=e.fetchHistoryBefore;t&&(this.fetchHistoryBefore=(e,n,r,i)=>t(e,n,r,i)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol)}connect(e){this.config=e,this.openSocket()}disconnect(){let e=this.config;if(this.ws){if(this.opts.unsubscribeMessage&&e)try{this.sendMessage(this.opts.unsubscribeMessage(e))}catch{}let t=this.ws;t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null,t.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchHistory(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}openSocket(){let e=this.config;if(!e)return;let t=this.opts.wsUrl(e);this.setState(`connecting`);let n;try{n=this.createSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws=n,n.onopen=()=>{if(this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`),this.opts.subscribeMessage)try{this.sendMessage(this.opts.subscribeMessage(e))}catch{}},n.onmessage=t=>{let n=this.decode(t.data);if(n===void 0)return;let r;try{r=this.opts.parseMessage(n,e)}catch{return}r&&(r.bar&&this.emitEvent(`bar`,{bar:r.bar,closed:r.closed??!1}),r.tick?this.emitEvent(`tick`,r.tick):r.bar&&this.emitEvent(`tick`,{time:Date.now(),price:r.bar.close,volume:r.bar.volume}))},n.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},n.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}sendMessage(e){e===void 0||!this.ws||this.ws.send(typeof e==`string`?e:JSON.stringify(e))}decode(e){if(this.opts.decode)try{return this.opts.decode(e)}catch{return}if(typeof e==`string`)try{return JSON.parse(e)}catch{return}return e}createSocket(e){if(this.opts.socketFactory)return this.opts.socketFactory(e);let t=globalThis.WebSocket;if(!t)throw Error(`No WebSocket implementation available`);return new t(e)}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},zd=class{name;supportedTimeframes;state=`disconnected`;listeners=new Map;config=null;timer=null;lastBarTime=0;opts;fetchHistoryBefore;searchSymbols;resolveSymbol;constructor(e){this.opts=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes;let t=e.fetchHistoryBefore;t&&(this.fetchHistoryBefore=(e,n,r,i)=>t(e,n,r,i)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol)}connect(e){this.config=e,this.lastBarTime=0,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startPolling()}disconnect(){this.stopPolling(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchBars(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}async poll(){let e=this.config;if(!e||this.state!==`connected`)return;let t;try{t=await this.opts.fetchBars(e.symbol,e.timeframe,this.opts.pollLimit??2)}catch(e){this.emitEvent(`error`,{message:`Poll failed`,cause:e});return}if(t.length===0)return;let n=t[t.length-1];if(this.lastBarTime>0&&n.time>this.lastBarTime){let e=t.find(e=>e.time===this.lastBarTime);e&&this.emitEvent(`bar`,{bar:e,closed:!0})}this.emitEvent(`bar`,{bar:n,closed:!1}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume}),this.lastBarTime=n.time}startPolling(){this.stopPolling(),this.poll();let e=this.opts.setInterval??((e,t)=>setInterval(e,t));this.timer=e(()=>{this.poll()},this.opts.intervalMs??5e3)}stopPolling(){this.timer!==null&&((this.opts.clearInterval??(e=>clearInterval(e)))(this.timer),this.timer=null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Q(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function Bd(e){return typeof e==`object`&&!!e}var Vd={"1m":60,"5m":300,"15m":900,"1h":3600,"6h":21600,"1d":86400};function Hd(e){return Vd[e]??3600}var Ud=class extends zd{constructor(e={}){let t=e.restBase??`https://api.exchange.coinbase.com`;super({name:`coinbase`,supportedTimeframes:Object.keys(Vd),intervalMs:e.intervalMs??5e3,pollLimit:2,fetchBars:(e,n)=>Wd(t,e,n)})}};async function Wd(e,t,n){let r=`${e}/products/${t}/candles?granularity=${Hd(n)}`,i=await fetch(r);if(!i.ok)throw Error(`Coinbase REST error: ${i.status}`);return Gd(await i.json())}function Gd(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Kd(n);e&&t.push(e)}return t.sort((e,t)=>e.time-t.time),t}function Kd(e){if(!Array.isArray(e)||e.length<6)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:i,high:r,low:n,close:a,volume:o}}var qd={"1m":`1`,"3m":`3`,"5m":`5`,"15m":`15`,"30m":`30`,"1h":`60`,"2h":`120`,"4h":`240`,"6h":`360`,"12h":`720`,"1d":`D`,"1w":`W`,"1M":`M`};function Jd(e){return qd[e]??`1`}var Yd=class extends Rd{constructor(e={}){let t=e.restBase??`https://api.bybit.com`,n=e.wsBase??`wss://stream.bybit.com/v5/public/spot`,r=e.category??`spot`;super({name:`bybit`,wsUrl:()=>n,subscribeMessage:e=>({op:`subscribe`,args:[`kline.${Jd(e.timeframe)}.${e.symbol}`]}),unsubscribeMessage:e=>({op:`unsubscribe`,args:[`kline.${Jd(e.timeframe)}.${e.symbol}`]}),supportedTimeframes:Object.keys(qd),parseMessage:Xd,fetchHistory:(e,n,i)=>Zd(t,r,e,n,i),fetchHistoryBefore:(e,n,i,a)=>Zd(t,r,e,n,a,Math.floor(i)-1)})}};function Xd(e){if(!Bd(e)||typeof e.topic!=`string`||!e.topic.startsWith(`kline.`))return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Bd(n))return null;let r=Q(n.start),i=Q(n.open),a=Q(n.high),o=Q(n.low),s=Q(n.close),c=Q(n.volume);if(r===null||i===null||a===null||o===null||s===null||c===null)return null;let l=typeof n.confirm==`boolean`?n.confirm:!1;return{bar:{time:r,open:i,high:a,low:o,close:s,volume:c},closed:l}}async function Zd(e,t,n,r,i,a){let o=`${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${Jd(r)}&limit=${Math.min(Math.max(i,1),1e3)}${a===void 0?``:`&end=${a}`}`,s=await fetch(o);if(!s.ok)throw Error(`Bybit REST error: ${s.status}`);return Qd(await s.json())}function Qd(e){if(!Bd(e)||!Bd(e.result))return[];let t=e.result.list;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=$d(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function $d(e){if(!Array.isArray(e)||e.length<6)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}var ef={"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"4h":240,"1d":1440,"1w":10080};function tf(e){return ef[e]??1}var nf=class extends Rd{constructor(e={}){let t=e.restBase??`https://api.kraken.com`,n=e.wsBase??`wss://ws.kraken.com/v2`;super({name:`kraken`,wsUrl:()=>n,subscribeMessage:e=>({method:`subscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:tf(e.timeframe)}}),unsubscribeMessage:e=>({method:`unsubscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:tf(e.timeframe)}}),supportedTimeframes:Object.keys(ef),parseMessage:rf,fetchHistory:(e,n)=>af(t,e,n)})}};function rf(e){if(!Bd(e)||e.channel!==`ohlc`)return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Bd(n))return null;let r=Q(n.open),i=Q(n.high),a=Q(n.low),o=Q(n.close),s=Q(n.volume),c=typeof n.interval_begin==`string`?Date.parse(n.interval_begin):NaN;return r===null||i===null||a===null||o===null||s===null||!Number.isFinite(c)?null:{bar:{time:c,open:r,high:i,low:a,close:o,volume:s},closed:!1}}async function af(e,t,n){let r=tf(n),i=t.replace(`/`,``),a=`${e}/0/public/OHLC?pair=${encodeURIComponent(i)}&interval=${r}`,o=await fetch(a);if(!o.ok)throw Error(`Kraken REST error: ${o.status}`);return of(await o.json())}function of(e){if(!Bd(e)||!Bd(e.result))return[];let t=null;for(let[n,r]of Object.entries(e.result))if(n!==`last`&&Array.isArray(r)){t=r;break}if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=sf(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function sf(e){if(!Array.isArray(e)||e.length<7)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[6]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:n,high:r,low:i,close:a,volume:o}}var cf={visible:!0,showSymbol:!0,showOHLC:!0,showChange:!0,showVolume:!0,position:`top-left`,fontSize:12},lf=class{config={...cf};symbol=``;timeframe=``;hoverBar=null;indicators=[];statusText=null;locale=`en-US`;pricePrecision=null;setConfig(e){Object.assign(this.config,e)}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}setSymbol(e){this.symbol=e}setTimeframe(e){this.timeframe=e}setChartType(e){}setHoverBar(e){this.hoverBar=e}setIndicatorValues(e){this.indicators=e}setStatusText(e){this.statusText=e}getHeight(){if(!this.config.visible||this.config.position!==`top-left`)return 0;let e=this.config.fontSize,t=6;return this.config.showSymbol?t+=e+6:this.statusText&&(t+=e+4),this.config.showOHLC&&(t+=e+3),this.config.showVolume&&(t+=e+2),t}render(e,n,r,i){if(!this.config.visible||i.length===0)return;let a=this.hoverBar??i[i.length-1],o=i.length>1?i[i.length-2]:a,{chartRect:s}=n,c=this.config.fontSize,l=r.style?.legend.text??r.text,u=r.style?.legend.label??r.textSecondary,d=this.config.position===`top-left`,f=d?s.x+8:s.x+s.width-8,p=s.y+6;if(e.textAlign=d?`left`:`right`,e.textBaseline=`top`,this.config.showSymbol){e.font=`bold ${c+2}px ${r.font.family}`,e.fillStyle=l;let t=[this.symbol,this.timeframe].filter(Boolean).join(` · `),n=this.statusText?`${t} ${this.statusText}`:t;e.fillText(n,f,p),p+=c+6}else this.statusText&&(e.font=`${c}px ${r.font.family}`,e.fillStyle=u,e.fillText(this.statusText,f,p),p+=c+4);if(this.config.showOHLC){e.font=`${c}px ${r.font.family}`;let i=a.close>=a.open,s=this.pricePrecision??(0,t.autoPricePrecision)(n.priceRange.min,n.priceRange.max),m=e=>n.formatPrice?.(e)??(0,t.formatPrice)(e,s,this.locale),h=[{label:`O`,value:m(a.open),color:l},{label:`H`,value:m(a.high),color:l},{label:`L`,value:m(a.low),color:l},{label:`C`,value:m(a.close),color:i?r.candleUp:r.candleDown}];if(this.config.showChange){let e=a.close-o.close,n=o.close===0?0:e/o.close*100,i=e>=0?`+`:``,s=(0,t.formatPrice)(n,2,this.locale);h.push({label:``,value:`${i}${m(e)} (${i}${s}%)`,color:e>=0?r.candleUp:r.candleDown})}let g=f;if(d)for(let t of h)t.label&&(e.fillStyle=u,e.fillText(t.label,g,p),g+=e.measureText(t.label+` `).width),e.fillStyle=t.color,e.fillText(t.value,g,p),g+=e.measureText(t.value+` `).width;else{let t=h.map(e=>`${e.label} ${e.value}`).join(` `);e.fillStyle=l,e.fillText(t,f,p)}p+=c+3}if(this.config.showVolume){e.font=`${c-1}px ${r.font.family}`,e.fillStyle=u;let t=a.volume>=1e6?`${(a.volume/1e6).toFixed(2)}M`:a.volume>=1e3?`${(a.volume/1e3).toFixed(2)}K`:a.volume.toFixed(0);e.fillText(`Vol ${t}`,f,p),p+=c+2}if(this.indicators.length>0){e.font=`${c-1}px ${r.font.family}`;let t=f;for(let n of this.indicators){e.fillStyle=n.color;let r=`${n.name} ${n.value}`;e.fillText(r,t,p),t+=e.measureText(r+` `).width}}}},uf=class{static toDataURL(e,t){let n=e.querySelectorAll(`canvas`);if(n.length===0)return``;let r=n[0],i=r.width,a=r.height,o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);t&&(s.fillStyle=t,s.fillRect(0,0,i,a));let c=Array.from(n).sort((e,t)=>(parseInt(e.style.zIndex)||0)-(parseInt(t.style.zIndex)||0));for(let e of c)s.drawImage(e,0,0);return o.toDataURL(`image/png`)}static async toBlob(e,t){let n=this.toDataURL(e,t);return n?(await fetch(n)).blob():null}static download(e,t=`chart.png`,n){let r=this.toDataURL(e,n);if(!r)return;let i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i)}},df=class{config=null;setConfig(e){this.config=e}isVisible(){return!!this.config?.text}render(e,t,n){if(!this.config?.text)return;let{chartRect:r}=t,i=this.config.fontSize??48,a=n.style?.watermark.color??this.config.color??n.textSecondary;e.save(),e.globalAlpha=.07,e.font=`bold ${i}px ${n.font.family}`,e.fillStyle=a,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(this.config.text,r.x+r.width/2,r.y+r.height/2),e.restore()}},ff=class{visible=!0;timeframeMs=0;setVisible(e){this.visible=e}isVisible(){return this.visible}setTimeframeMs(e){this.timeframeMs=e}render(t,n,r,i){if(!this.visible||!(this.timeframeMs>0)||i.length===0)return;let a=i[i.length-1],o=(a.time>0xe8d4a51000?a.time:a.time*1e3)+this.timeframeMs-Date.now();if(o<=0)return;let s=this.formatRemaining(o),c=e.b(i.length-1,n),l=n.chartRect.y+n.chartRect.height-4;c<n.chartRect.x||c>n.chartRect.x+n.chartRect.width||(t.font=`${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`bottom`,t.textAlign=`center`,t.fillStyle=r.textSecondary,t.fillText(s,c,l))}formatRemaining(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}:${String(r).padStart(2,`0`)}:${String(i).padStart(2,`0`)}`:`${r}:${String(i).padStart(2,`0`)}`}},pf={solid:null,dashed:[6,4],dotted:[2,3]},mf=class{config={visible:!1};cachedBreaksTyped=[];cachedMedianStep=0;cacheValid=!1;lastDataLength=0;locale=`en-US`;tz=null;setConfig(e){Object.assign(this.config,e)}setLocale(e){this.locale=e}setTimezone(e){e!==this.tz&&(this.tz=e,this.invalidateCache())}isVisible(){return this.config.visible}setVisible(e){this.config.visible=e}computeBreaksTyped(e){if(e.length<2)return[];if(this.cacheValid&&e.length===this.lastDataLength)return this.cachedBreaksTyped;let n=[],r=(0,t.timeParts)(this.toMs(e[0].time),this.tz);for(let i=1;i<e.length;i++){let a=this.toMs(e[i].time),o=(0,t.timeParts)(a,this.tz);if(o.year!==r.year)n.push({idx:i,kind:`year`,time:a,year:o.year});else if(o.month!==r.month)n.push({idx:i,kind:`month`,time:a,year:o.year});else if(o.day!==r.day){let e=new Date(Date.UTC(o.year,o.month-1,o.day)).getUTCDay()===1;n.push({idx:i,kind:e?`week`:`day`,time:a,year:o.year})}r=o}return this.lastDataLength=e.length,this.cachedBreaksTyped=n,this.cachedMedianStep=_f(e),this.cacheValid=!0,n}toMs(e){return e>0xe8d4a51000?e:e*1e3}render(e,t,n,r){this.renderLines(e,t,n,r),this.renderLabels(e,t,n,r)}renderLines(e,t,n,r){let i=this.marks(t,r,n);if(i.length===0)return;let{chartRect:a}=t,o=this.look(n),s=pf[o.style];e.save(),s&&e.setLineDash(s),e.strokeStyle=o.color;for(let t of i)e.globalAlpha=t.alpha,e.lineWidth=t.width,e.beginPath(),e.moveTo(t.px,a.y),e.lineTo(t.px,a.y+a.height),e.stroke();e.restore()}renderLabels(e,t,n,r){let i=this.marks(t,r,n).filter(e=>e.label!==null);if(i.length===0)return;let{chartRect:a}=t;e.save(),e.font=`600 11px ${n.font.family}`,e.textBaseline=`top`,e.textAlign=`left`,e.fillStyle=n.textSecondary;for(let t of i)e.globalAlpha=Math.min(1,t.alpha+.35),e.fillText(t.label,t.px+4,a.y+4);e.restore()}lineRects(e,t,n){let r=this.marks(e,n,t);if(r.length===0)return[];let{color:i,style:a}=this.look(t),o=pf[a]??void 0,{y:s,height:c}=e.chartRect;return r.map(e=>({x:e.px-e.width/2,y:s,width:e.width,height:c,color:i,alpha:e.alpha,...o?{dash:o}:{}}))}look(e){let t=e.style?.sessionBreaks;return{color:t?.color??this.config.color??e.axisLine,style:t?.style??this.config.lineStyle??`dashed`,width:t?.width??this.config.lineWidth??1}}marks(n,r,i){if(!this.config.visible||r.length<2)return[];let a=this.computeBreaksTyped(r);if(a.length===0||this.cachedMedianStep>=1380*60*1e3)return[];let{chartRect:o}=n,s=this.look(i).width,c=[];for(let r of a){let i=e.b(r.idx,n)-(n.barWidth+n.barSpacing)/2;if(i<o.x-1||i>o.x+o.width+1)continue;let a=Math.round(i)+.5,l=.25,u=s,d=null;r.kind===`day`?l=.22:r.kind===`week`?(l=.34,d=(0,t.zonedDateFormatter)(this.locale,hf,this.tz)(r.time)):r.kind===`month`?(l=.5,u=s+.5,d=(0,t.zonedDateFormatter)(this.locale,gf,this.tz)(r.time)):(l=.7,u=s+1,d=String(r.year)),c.push({px:a,width:u,alpha:l,label:d})}return c}invalidateCache(){this.lastDataLength=0,this.cachedBreaksTyped=[],this.cachedMedianStep=0,this.cacheValid=!1}},hf={month:`short`,day:`numeric`},gf={month:`short`,year:`numeric`};function _f(e){if(e.length<2)return 0;let t=Math.min(50,e.length-1),n=[];for(let r=1;r<=t;r++){let t=e[r-1].time,i=e[r].time,a=t>0xe8d4a51000?t:t*1e3,o=i>0xe8d4a51000?i:i*1e3;n.push(o-a)}return n.sort((e,t)=>e-t),n[Math.floor(n.length/2)]}var vf=864e5;function yf(e,t){let n={...e,...t};return t.tzOffsetMinutes!==void 0&&t.timeZone===void 0&&delete n.timeZone,n.windows?n.windows=n.windows.map(e=>({...e})):delete n.windows,n}function bf(e,t){let n=((e+t*6e4)%vf+vf)%vf;return Math.floor(n/6e4)}function xf(e,t,n){return t===n?!0:t<n?e>=t&&e<n:e>=t||e<n}function Sf(e,n){let r=bf(e,n.timeZone?(0,t.zoneOffsetMinutes)(n.timeZone,e):n.tzOffsetMinutes??0);return n.windows&&n.windows.length>0?n.windows.some(e=>xf(r,e.startMinute,e.endMinute)):xf(r,n.startMinute,n.endMinute)}var Cf={startMinute:570,endMinute:960,tzOffsetMinutes:-300,timeZone:`America/New_York`},wf=class{visible=!1;config={...Cf};setVisible(e){this.visible=e}isVisible(){return this.visible}setConfig(e){this.config=yf(this.config,e)}replaceConfig(e){this.config=yf(e,{})}getConfig(){return{...this.config,windows:this.config.windows?.map(e=>({...e}))}}render(e,t,n,r){let i=this.rects(t,n,r);if(i.length!==0){e.save(),e.fillStyle=i[0].color;for(let t of i)e.fillRect(t.x,t.y,t.width,t.height);e.restore()}}rects(t,n,r){if(!this.visible||t.length===0)return[];let{chartRect:i}=n,{from:a,to:o}=n.visibleRange,s=Math.max(0,a),c=Math.min(o,t.length-1);if(c<s)return[];let l=n.barWidth+n.barSpacing,u=r.name===`light`?`rgba(0,0,0,0.045)`:`rgba(0,0,0,0.28)`,d=[],f=-1,p=(t,r)=>{let a=e.b(t,n)-l/2,o=e.b(r,n)+l/2;d.push({x:a,y:i.y,width:o-a,height:i.height,color:u,alpha:1})};for(let e=s;e<=c;e++){let n=!Sf(t[e].time,this.config);n&&f===-1?f=e:!n&&f!==-1&&(p(f,e-1),f=-1)}return f!==-1&&p(f,c),d}},Tf=[2,3],Ef=16,Df=class{highLow=!1;quote=null;quoteShown=!0;priceText=null;setPriceText(e){this.priceText=e}setQuoteShown(e){this.quoteShown=e}setHighLow(e){this.highLow=e}isHighLowVisible(){return this.highLow}setBidAsk(e){this.quote=e?{...e}:null}getBidAsk(){return this.quote?{...this.quote}:null}levels(e,t){let n=[];if(this.highLow){let r=Math.max(0,t.visibleRange.from),i=Math.min(e.length-1,t.visibleRange.to),a=-1/0,o=1/0;for(let t=r;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);Number.isFinite(a)&&n.push({kind:`high`,price:a}),Number.isFinite(o)&&n.push({kind:`low`,price:o})}let{bid:r,ask:i}=(this.quoteShown?this.quote:null)??{};return r!==void 0&&Number.isFinite(r)&&n.push({kind:`bid`,price:r}),i!==void 0&&Number.isFinite(i)&&n.push({kind:`ask`,price:i}),n}render(t,n,r,i){let{chartRect:a}=n;t.save(),t.setLineDash(Tf),t.lineWidth=1;for(let o of this.levels(i,n)){let i=Math.round(e.w(o.price,n))+.5;i<a.y||i>a.y+a.height||(t.strokeStyle=Of(o.kind,r),t.beginPath(),t.moveTo(a.x,i),t.lineTo(a.x+a.width,i),t.stroke())}t.restore()}renderAxisTags(n,r,i,a){let{chartRect:o}=r,s=o.x+o.width+1,c=(r.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2,l=(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max);n.save(),n.font=`${i.font.sizeSmall}px ${i.font.family}`,n.textBaseline=`middle`,n.textAlign=`left`;for(let u of this.levels(a,r)){let a=e.w(u.price,r);if(a<o.y||a>o.y+o.height)continue;n.fillStyle=Of(u.kind,i),d(n,s,a-Ef/2,c,Ef,i),n.fillStyle=i.background;let f=r.formatPrice?.(u.price)??this.priceText?.(u.price)??(0,t.formatPrice)(u.price,l);n.fillText(f,s+5,a)}n.restore()}};function Of(e,t){switch(e){case`bid`:return t.candleUp;case`ask`:return t.candleDown;default:return t.style?.highLow.color??t.textSecondary}}var kf=500,Af=2,jf=[`movesUp`,`movesDown`];function Mf(e){return e.channel===`price`&&!e.drawingId&&!e.target&&!jf.includes(e.condition)}function Nf(e,t,n,r){switch(r){case`crossingUp`:return e!==void 0&&e<n&&t>=n;case`crossingDown`:return e!==void 0&&e>n&&t<=n;case`crossing`:return e!==void 0&&(e<n&&t>=n||e>n&&t<=n);case`greaterThan`:return t>n;case`lessThan`:return t<n;default:return!1}}var Pf=[`crossing`,`crossingUp`,`crossingDown`];function Ff(e,t,n){let r=e<0&&t>=0,i=e>0&&t<=0;return n===`crossingUp`?r:n===`crossingDown`?i:r||i}var If=1,Lf=2**31-1,Rf=class extends Xu{alerts=[];lastValues=new Map;drawingSides=new Map;drawingLevels=null;requestRender=null;pricePrecision=2;barTime=null;expiryTimer=null;history=new Map;lastDiffs=new Map;setBarTime(e){this.barTime=e}setRequestRender(e){this.requestRender=e}setPricePrecision(e){this.pricePrecision=e}addAlert(e,t=`crossing`,n,r=!1,i=`price`,a,o={}){let s=zf(t,i,o),c=`tc_alert_${If++}`,l={id:c,price:e,condition:t,message:n,triggered:!1,repeating:r,channel:i,label:a,...s};return this.alerts.push(l),s.expiresAt!==void 0&&this.scheduleExpiry(),this.emit(`added`,l),this.requestRender?.(),c}setDrawingLevels(e){this.drawingLevels=e}addDrawingAlert(e,t=`crossing`,n,r=!1,i){if(!Pf.includes(t))throw RangeError(`An alert on a drawing takes a crossing condition, not "${t}"`);let a=`tc_alert_${If++}`,o={id:a,price:this.drawingLevels?.(e)?.[0]??NaN,condition:t,message:n,triggered:!1,repeating:r,channel:`price`,label:i,drawingId:e};return this.alerts.push(o),this.emit(`added`,o),a}removeDrawingAlerts(e){for(let t of this.alerts.filter(t=>t.drawingId===e))this.removeAlert(t.id)}takeDrawingAlerts(e){let t=this.alerts.filter(t=>t.drawingId===e);for(let e of t)this.removeAlert(e.id);return t.map(e=>({...e}))}restoreAlerts(e){for(let t of e){if(this.alerts.some(e=>e.id===t.id))continue;let e={...t};this.alerts.push(e),this.emit(`added`,e)}this.scheduleExpiry(),this.requestRender?.()}pruneDrawingAlerts(e){let t=this.alerts.filter(t=>t.drawingId!==void 0&&!e.has(t.drawingId));for(let e of t)this.removeAlert(e.id);return t.length}removeAlert(e){this.drawingSides.delete(e),this.lastDiffs.delete(e);let t=this.alerts.some(t=>t.id===e&&t.expiresAt!==void 0);this.alerts=this.alerts.filter(t=>t.id!==e),t&&this.scheduleExpiry(),this.emit(`removed`,e),this.requestRender?.()}getAlerts(){return[...this.alerts]}getAlertAtPoint(t,n,r=6){let{chartRect:i}=n;if(t.y<i.y||t.y>i.y+i.height)return null;let a=null,o=r;for(let r of this.alerts){if(!Mf(r))continue;let i=Math.abs(e.w(r.price,n)-t.y);i<=o&&(o=i,a=r)}return a}updateAlertPrice(e,t){let n=this.alerts.find(t=>t.id===e);!n||!Number.isFinite(t)||(n.price=t,n.triggered=!1,n.expiresAt!==void 0&&this.scheduleExpiry(),this.emit(`updated`,{...n}),this.requestRender?.())}clearAlerts(){this.alerts=[],this.lastDiffs.clear(),this.drawingSides.clear(),this.scheduleExpiry(),this.requestRender?.()}checkPrice(e){this.checkChannel(`price`,e),this.checkDrawingAlerts(e)}checkDrawings(e){this.checkDrawingAlerts(e)}expire(){let e=Date.now(),t=this.alerts.filter(t=>!t.expired&&t.expiresAt!==void 0&&e>=t.expiresAt&&!(t.triggered&&!t.repeating));if(t.length!==0){for(let e of t)e.expired=!0;try{for(let e of t)this.emit(`expired`,{...e}),this.emit(`updated`,{...e})}finally{this.requestRender?.(),this.scheduleExpiry()}}}scheduleExpiry(){this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null;let e=Math.min(...this.alerts.filter(e=>!e.expired&&e.expiresAt!==void 0&&!(e.triggered&&!e.repeating)).map(e=>e.expiresAt));if(!Number.isFinite(e))return;let t=Math.min(Math.max(0,e-Date.now()),Lf);this.expiryTimer=setTimeout(()=>{this.expiryTimer=null,this.expire(),this.expiryTimer||this.scheduleExpiry()},t)}dispose(){this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null}checkDrawingAlerts(e){if(!(!this.drawingLevels||!Number.isFinite(e)))for(let t of this.alerts){if(!t.drawingId||t.expired)continue;let n=this.drawingLevels(t.drawingId);if(!n||n.length===0){this.drawingSides.delete(t.id);continue}t.price=n[0];let r=n.map(t=>Math.sign(e-t)),i=this.drawingSides.get(t.id);this.drawingSides.set(t.id,r),!(!i||i.length!==r.length)&&(r.some((e,n)=>Ff(i[n],e,t.condition))?t.triggered||(t.triggered=!0,this.emit(`triggered`,{...t})):t.repeating&&(t.triggered=!1))}}checkChannel(e,t){this.checkChannels(new Map([[e,t]]))}checkChannels(e,t={}){let n=(e instanceof Map?[...e.entries()]:Object.entries(e)).filter(([,e])=>Number.isFinite(e));if(n.length===0)return;this.expire();let r=new Map,i=new Map;for(let[e,t]of n){r.set(e,this.lastValues.get(e));let n=this.recordBar(e,t);n&&i.set(e,n),this.lastValues.set(e,t)}for(let e of this.alerts){if(e.drawingId||e.expired)continue;let n=r.has(e.channel),a=e.target!==void 0&&r.has(e.target);if(!n&&!a||e.target!==void 0&&t.together&&!(n&&a))continue;let o;if(e.onBarClose){let t=i.get(e.channel)??(e.target?i.get(e.target):void 0);if(!t)continue;o=this.closedBarMet(e,t)}else if(e.target)o=this.targetMet(e);else if(jf.includes(e.condition)){if(!n)continue;o=this.moveMet(e,this.history.get(e.channel)??[])}else{let t=r.get(e.channel);if(!n||t===void 0)continue;o=Nf(t,this.lastValues.get(e.channel),e.price,e.condition)}this.settle(e,o)}}settle(e,t){t?e.triggered||(e.triggered=!0,this.emit(`triggered`,{...e})):e.repeating&&(e.triggered=!1)}targetMet(e){let t=this.lastValues.get(e.channel),n=e.target?this.lastValues.get(e.target):void 0;if(t===void 0||n===void 0)return!1;let r=t-n,i=this.lastDiffs.get(e.id);return this.lastDiffs.set(e.id,r),e.price=n,Nf(i,r,0,e.condition)}moveMet(e,t,n=t.length){let r=e.bars??1,i=t.slice(Math.max(0,n-r),n);if(i.length<2||e.percent===void 0)return!1;let a=i[i.length-1].value,o=i.map(e=>e.value);if(e.condition===`movesUp`){let t=Math.min(...o);return t!==0&&(a-t)/Math.abs(t)*100>=e.percent}let s=Math.max(...o);return s!==0&&(s-a)/Math.abs(s)*100>=e.percent}closedBarMet(e,t){let n=this.history.get(e.channel)??[],r=n.findIndex(e=>e.time===t.time);if(r<0)return!1;if(jf.includes(e.condition))return this.moveMet(e,n,r+1);let i=(e,t)=>{let r=this.history.get(e)??[],i=n[t]?.time;return i===void 0?void 0:r.find(e=>e.time===i)?.value},a=n[r].value,o=r>0?n[r-1].value:void 0,s=e.price;if(e.target){let t=i(e.target,r),n=r>0?i(e.target,r-1):void 0;if(t===void 0)return!1;a-=t,o=o!==void 0&&n!==void 0?o-n:void 0,s=0,e.price=t}return Nf(o,a,s,e.condition)}recordBar(e,t){let n=this.barTime;if(n===null)return null;let r=this.history.get(e)??[],i=r[r.length-1];if(i&&n<i.time)return r=r.filter(e=>e.time<n),r.push({time:n,value:t}),this.history.set(e,r),null;if(i&&i.time===n)return r[r.length-1]={time:n,value:t},null;i=r[r.length-1],r.push({time:n,value:t});let a=Math.min(502,Math.max(3,...this.alerts.map(e=>(e.bars??1)+2)));return r.length>a&&r.splice(0,r.length-a),this.history.set(e,r),i?{channel:e,time:i.time}:null}clearLastValues(){this.lastValues.clear(),this.drawingSides.clear(),this.history.clear(),this.lastDiffs.clear()}saveToStorage(e){try{let t=this.alerts.map(e=>({id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,repeating:e.repeating,channel:e.channel,label:e.label,drawingId:e.drawingId,target:e.target,percent:e.percent,bars:e.bars,onBarClose:e.onBarClose,expiresAt:e.expiresAt,expired:e.expired}));localStorage.setItem(e,JSON.stringify(t))}catch{}}loadFromStorage(e){try{let t=localStorage.getItem(e);if(!t)return;let n=JSON.parse(t);if(!Array.isArray(n))return;for(let e of n){if(typeof e.drawingId==`string`&&e.condition&&!e.triggered){Pf.includes(e.condition)&&this.addDrawingAlert(e.drawingId,e.condition,e.message,e.repeating??!1,e.label);continue}if(!e.condition||e.triggered||e.expired)continue;let t=Bf(e),n=!t.target&&!jf.includes(e.condition),r=typeof e.price==`number`&&Number.isFinite(e.price)?e.price:NaN;if(!(n&&Number.isNaN(r)))try{this.addAlert(r,e.condition,e.message,e.repeating??!1,e.channel??`price`,e.label,t)}catch{}}}catch{}}render(t,n,r){let{chartRect:i}=n;for(let a of this.alerts){if(!Mf(a))continue;let o=e.w(a.price,n);if(o<i.y||o>i.y+i.height)continue;let s=a.expired?`#8a93a3`:a.triggered?`#f2a93b`:`#4c8dff`;t.setLineDash([2,6]),t.strokeStyle=s,t.lineWidth=1,t.beginPath(),t.moveTo(i.x,Math.round(o)+.5),t.lineTo(i.x+i.width,Math.round(o)+.5),t.stroke(),t.setLineDash([]),t.font=`10px ${r.font.family}`,t.fillStyle=s,t.textBaseline=`bottom`,t.textAlign=`right`;let c=`🔔 ${n.formatPrice?.(a.price)??a.price.toFixed(this.pricePrecision)}${a.message?` - ${a.message}`:``}`;t.fillText(c,i.x+i.width-4,o-2)}}};function zf(e,t,n){let r={},i=jf.includes(e);if(n.target!==void 0){if(i)throw RangeError(`An alert on a move takes no other line`);if(n.target===t)throw RangeError(`An alert can’t compare a line with itself`);r.target=n.target}if(i){let{percent:e,bars:t}=n;if(e===void 0||!Number.isFinite(e)||e<=0)throw RangeError(`An alert on a move needs a percent above 0`);if(t===void 0||!Number.isInteger(t)||t<2||t>500)throw RangeError(`An alert on a move needs 2 to 500 bars`);r.percent=e,r.bars=t}return n.onBarClose&&(r.onBarClose=!0),n.expiresAt!==void 0&&Number.isFinite(n.expiresAt)&&(r.expiresAt=n.expiresAt),r}function Bf(e){let t={};return typeof e.target==`string`&&e.target&&(t.target=e.target),typeof e.percent==`number`&&Number.isFinite(e.percent)&&(t.percent=e.percent),typeof e.bars==`number`&&Number.isInteger(e.bars)&&(t.bars=e.bars),e.onBarClose===!0&&(t.onBarClose=!0),typeof e.expiresAt==`number`&&Number.isFinite(e.expiresAt)&&(t.expiresAt=e.expiresAt),t}var Vf=class extends Xu{data=[];cursor=-1;timer=null;state=`stopped`;config={speed:1,interval:500};load(e){this.stop(),this.data=e,this.cursor=-1}play(e){if(this.data.length!==0){if(e){let{startIndex:t,paused:n,...r}=e;Object.assign(this.config,r);let i=t===void 0?null:this.clamp(t);if(n){this.clearTimer(),this.seekTo(i??Math.max(0,this.cursor)),this.setState(`paused`);return}i!==null&&(this.cursor=i-1)}if(this.isAtEnd()){this.clearTimer(),this.setState(`paused`);return}this.clearTimer(),this.setState(`playing`),this.timer=setInterval(()=>this.tick(),this.config.interval/this.config.speed)}}pause(){this.clearTimer(),this.setState(`paused`)}resume(){this.state===`paused`&&this.play()}stop(){this.clearTimer(),this.cursor=-1,this.setState(`stopped`)}seekTo(e){this.data.length!==0&&(this.cursor=this.clamp(e),this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}))}setSpeed(e){this.config.speed=e,this.state===`playing`&&this.play()}getState(){return this.state}isAtEnd(){return this.data.length>0&&this.cursor>=this.data.length-1}getProgress(){let e=this.data.length;return{current:Math.max(0,this.cursor),total:e,percent:e>0?(this.cursor+1)/e*100:0}}dispose(){this.stop(),this.removeAllListeners(),this.data=[]}tick(){if(this.isAtEnd()){this.clearTimer(),this.setState(`paused`),this.emit(`complete`,void 0);return}this.cursor++,this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}),this.isAtEnd()&&(this.clearTimer(),this.setState(`paused`),this.emit(`complete`,void 0))}clamp(e){return Number.isFinite(e)?Math.max(0,Math.min(Math.floor(e),this.data.length-1)):0}clearTimer(){this.timer&&=(clearInterval(this.timer),null)}setState(e){this.state!==e&&(this.state=e,this.emit(`stateChange`,e))}},Hf=64,Uf=3,Wf=3;function $(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Gf(e){return Array.isArray(e)?e:[]}function Kf(e,t){return typeof e==`string`?e:t}function qf(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function Jf(e){if(!$(e)||typeof e.id!=`string`||typeof e.type!=`string`||!Array.isArray(e.anchors)||e.anchors.length===0||e.anchors.length>Yf||!$(e.style))return null;let n=[];for(let t of e.anchors){if(!$(t)||typeof t.time!=`number`||typeof t.price!=`number`||!Number.isFinite(t.time)||!Number.isFinite(t.price))return null;n.push({time:t.time,price:t.price})}let r=(0,t.sanitizeDrawingStyle)(e.style);return r.color===void 0||r.lineWidth===void 0?null:{id:e.id,type:e.type,anchors:n,style:{lineStyle:`solid`,...r,color:r.color,lineWidth:r.lineWidth},visible:typeof e.visible==`boolean`?e.visible:!0,locked:typeof e.locked==`boolean`?e.locked:!1,options:$(e.options)?e.options:void 0,group:Qf(e.group),meta:$(e.meta)?e.meta:void 0}}var Yf=5e3,Xf=64,Zf=80;function Qf(e){if(!(!$(e)||typeof e.id!=`string`||typeof e.name!=`string`)&&!(e.id===``||e.id.length>Xf))return{id:e.id,name:e.name.slice(0,Zf)}}function $f(e){return!$(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.type!=`string`||typeof e.price!=`number`||typeof e.quantity!=`number`?null:e}function ep(e){if(!$(e))return;let n={},r=Gf(e.colors).filter(e=>typeof e==`string`);r.length>0&&(n.colors=r);let i=Gf(e.lineWidths).filter(e=>typeof e==`number`&&Number.isFinite(e)&&e>0);i.length>0&&(n.lineWidths=i),typeof e.opacity==`number`&&Number.isFinite(e.opacity)&&(n.opacity=Math.min(1,Math.max(0,e.opacity)));let a=(0,t.readIndicatorPlotStyles)(e.plots);return a&&(n.plots=a),Object.keys(n).length>0?n:void 0}var tp=[`crossingUp`,`crossingDown`,`crossing`,`greaterThan`,`lessThan`,`movesUp`,`movesDown`];function np(e){if(!$(e)||typeof e.id!=`string`)return null;let t=typeof e.drawingId==`string`?e.drawingId:void 0,n=typeof e.price==`number`&&Number.isFinite(e.price)?e.price:null,r=tp.find(t=>t===e.condition)??`crossing`,i=Bf(e),a=i.target!==void 0||r===`movesUp`||r===`movesDown`;return n===null&&!t&&!a?null:{id:e.id,price:n??NaN,drawingId:t,condition:r,message:typeof e.message==`string`?e.message:void 0,triggered:e.triggered===!0,repeating:e.repeating===!0,channel:Kf(e.channel,`price`),label:typeof e.label==`string`?e.label:void 0,...i,...e.expired===!0?{expired:!0}:{}}}function rp(e){return!$(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.entryPrice!=`number`||typeof e.quantity!=`number`?null:e}var ip=4e3;function ap(e){if(!$(e))return;let n={},r=[];for(let[i,a]of Object.entries(e)){let e=(0,t.readChartStyleOverrides)(a);r.push(...e.rejected);let o=Object.fromEntries(Object.entries(e.overrides).filter(([,e])=>e!==null));Object.keys(o).length>0&&(n[i.slice(0,Hf)]=o)}return r.length>0&&console.warn(`Saved style overrides left out: ${[...new Set(r)].join(`, `)}`),n}function op(e){if(!$(e))return sp();typeof e.version==`number`&&e.version>Wf&&console.warn(`Chart state from a newer version (${e.version}); loading what this version understands.`);let n=$(e.viewport)?e.viewport:{},r=[];for(let n of Gf(e.indicators))$(n)&&(typeof n.id!=`string`||typeof n.instanceId!=`string`||$(n.params)&&r.push({id:n.id,instanceId:n.instanceId,params:n.params,position:typeof n.position==`string`?n.position:void 0,style:ep(n.style),visible:typeof n.visible==`boolean`?n.visible:void 0,levels:Array.isArray(n.levels)?n.levels.filter(e=>typeof e==`number`&&Number.isFinite(e)):void 0,pane:typeof n.pane==`string`?n.pane:void 0,scale:n.scale===`left`?`left`:void 0,paneStyle:(0,t.readPaneStyle)(n.paneStyle)??void 0,paneSize:typeof n.paneSize==`number`&&Number.isFinite(n.paneSize)&&n.paneSize>0?Math.min(n.paneSize,ip):void 0,paneOrder:typeof n.paneOrder==`number`&&Number.isInteger(n.paneOrder)&&n.paneOrder>=0?n.paneOrder:void 0,paneCollapsed:n.paneCollapsed===!0?!0:void 0,paneMaximized:n.paneMaximized===!0?!0:void 0,paneLog:n.paneLog===!0?!0:void 0,paneInvert:n.paneInvert===!0?!0:void 0,panePercent:n.panePercent===!0?!0:void 0}));let i=[];for(let t of Gf(e.drawings)){let e=Jf(t);e&&i.push(e)}let a=[];for(let t of Gf(e.orders)){let e=$f(t);e&&a.push(e)}let o=[];for(let t of Gf(e.positions)){let e=rp(t);e&&o.push(e)}let s=[];for(let t of Gf(e.alerts)){let e=np(t);e&&s.push(e)}let c=ap(e.overrides);return{version:typeof e.version==`number`&&Array.isArray(e.indicators)?e.version:1,timestamp:qf(e.timestamp,Date.now()),symbol:typeof e.symbol==`string`?e.symbol:void 0,timeframe:typeof e.timeframe==`string`?e.timeframe:void 0,chartType:Kf(e.chartType,`candlestick`),...e.chartTypeOptions===void 0?{}:{chartTypeOptions:(0,t.readChartTypeOptions)(e.chartTypeOptions)},viewport:{barWidth:qf(n.barWidth,8),barSpacing:qf(n.barSpacing,2),offset:qf(n.offset,0)},theme:typeof e.theme==`string`?e.theme:void 0,...c?{overrides:c}:{},locale:typeof e.locale==`string`?e.locale:void 0,indicators:r,drawings:i,orders:a,positions:o,alerts:s}}function sp(){return{version:1,timestamp:Date.now(),chartType:`candlestick`,viewport:{barWidth:8,barSpacing:2,offset:0},indicators:[],drawings:[],orders:[],positions:[],alerts:[]}}var cp=class{static capture(e,t){return{version:e.getIndicators?Wf:1,timestamp:Date.now(),chartType:t?.chartType??`candlestick`,...t?.chartTypeOptions&&Object.keys(t.chartTypeOptions).length>0?{chartTypeOptions:t.chartTypeOptions}:{},symbol:t?.symbol,timeframe:t?.timeframe,viewport:{barWidth:8,barSpacing:2,offset:0},theme:e.getTheme().name,...e.getOverrides&&Object.keys(e.getOverrides()).length>0?{overrides:e.getOverrides()}:{},indicators:e.getIndicators?.()??[],drawings:e.getDrawings(),orders:e.getOrders?.()??[],positions:e.getPositions?.()??[],alerts:e.getAlerts?.()??[]}}static serialize(e){return JSON.stringify(e)}static deserialize(e){return op(JSON.parse(e))}static saveToStorage(e,t){localStorage.setItem(e,this.serialize(t))}static loadFromStorage(e){let t=localStorage.getItem(e);return t?this.deserialize(t):null}static downloadFile(e,t=`tc-chart-state.json`){let n=new Blob([this.serialize(e)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}static loadFromFile(){return new Promise((e,t)=>{let n=document.createElement(`input`);n.type=`file`,n.accept=`.json`,n.onchange=async()=>{let r=n.files?.[0];if(!r){t(Error(`No file selected`));return}let i=await r.text();e(this.deserialize(i))},n.click()})}},lp=class{undoStack=[];redoStack=[];maxHistory=50;onChange=null;setOnChange(e){this.onChange=e}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack.length=0,this.onChange?.()}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}undo(){let e=this.undoStack.pop();return e?(this.redoStack.push(e),this.onChange?.(),e):null}redo(){let e=this.redoStack.pop();return e?(this.undoStack.push(e),this.onChange?.(),e):null}clear(){this.undoStack.length=0,this.redoStack.length=0,this.onChange?.()}last(){return this.undoStack[this.undoStack.length-1]??null}dropLast(){this.undoStack.pop()&&(this.redoStack.length=0,this.onChange?.())}replaceLast(e){if(this.undoStack.length===0){this.push(e);return}this.undoStack[this.undoStack.length-1]=e,this.redoStack.length=0,this.onChange?.()}getState(){return{canUndo:this.undoStack.length>0,canRedo:this.redoStack.length>0,undoCount:this.undoStack.length,redoCount:this.redoStack.length}}},up=[`Time`,`Open`,`High`,`Low`,`Close`,`Volume`];function dp(e){return new Date((0,t.normalizeBarTime)(e)).toISOString()}function fp(e){let t=/^[=+\-@\t\r]/.test(e)&&!/^-?\d/.test(e)?`'${e}`:e;return/[",\r\n]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}var pp=e=>e==null||!Number.isFinite(e)?``:String(e),mp=class{static toCSV(e,t=[]){return[[...up,...t.map(e=>fp(e.name))].join(`,`),...e.map((e,n)=>[dp(e.time),e.open,e.high,e.low,e.close,e.volume,...t.map(e=>pp(e.values[n]))].join(`,`))].join(`
22
- `)}static toJSON(e,t=[]){return JSON.stringify(e.map((e,n)=>{let r={time:dp(e.time),open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume};for(let e of t){let t=e.values[n];r[e.name]=t==null||!Number.isFinite(t)?null:t}return r}),null,2)}static download(e,t,n){let r=new Blob([e],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}},hp=1,gp=3,_p=class extends Xu{markers=[];style={...t.DEFAULT_SIGNAL_STYLE};requestRender=null;dataGetter=null;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addMarker(e){let t=e.id??`tc_signal_${hp++}`,n={...e,id:t};return this.markers.push(n),this.emit(`added`,n),this.requestRender?.(),t}removeMarker(e){this.markers=this.markers.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getMarkers(){return[...this.markers]}clearMarkers(){this.markers=[],this.emit(`cleared`,void 0),this.requestRender?.()}setMarkers(e){this.markers=[...e],this.requestRender?.()}markerAt(t,n){let r=this.dataGetter?.();if(!r||r.length===0)return null;let{chartRect:i}=n;if(t.x<i.x||t.x>i.x+i.width||t.y<i.y||t.y>i.y+i.height)return null;let a=this.style.arrowSize??12;for(let i=this.markers.length-1;i>=0;i--){let o=this.markers[i],s=e.b(e.O(o.time,r),n),c=e.w(o.price,n),l=a*Math.max(.6,Math.min(1,o.confidence)),u=o.direction===`long`?c-l:(o.direction,c-l*.4),d=o.direction===`long`?c+l*.4:o.direction===`short`?c+l:c+l*.4;if(Math.abs(t.x-s)<=l*.6+gp&&t.y>=u-gp&&t.y<=d+gp)return o}return null}render(t,n,r){let i=this.dataGetter?.();if(!i||i.length===0||this.markers.length===0)return;let{chartRect:a}=n,o=this.style,s=o.arrowSize??12;t.save(),t.beginPath(),t.rect(a.x,a.y,a.width,a.height),t.clip();for(let c of this.markers){let l=e.b(e.O(c.time,i),n),u=e.w(c.price,n);if(l<a.x-s||l>a.x+a.width+s||u<a.y-s||u>a.y+a.height+s)continue;let d=this.resolveColor(c,o),f=s*Math.max(.6,Math.min(1,c.confidence));if(this.renderArrow(t,l,u,c.direction,f,d),o.showLabel&&c.label){t.font=`10px ${r.font.family}`,t.fillStyle=d,t.textAlign=`center`,t.textBaseline=c.direction===`long`?`top`:`bottom`;let e=c.direction===`long`?u+f+3:u-f-3;t.fillText(c.label,l,e)}if(o.showConfidence&&c.confidence<1){t.font=`9px ${r.font.family}`,t.fillStyle=d,t.globalAlpha=.7,t.textAlign=`center`,t.textBaseline=c.direction===`long`?`top`:`bottom`;let e=c.direction===`long`?u+f+(c.label?14:3):u-f-(c.label?14:3);t.fillText(`${Math.round(c.confidence*100)}%`,l,e),t.globalAlpha=1}}t.restore()}resolveColor(e,t){if(e.color)return e.color;if(t.sourceColors?.[e.source])return t.sourceColors[e.source];switch(e.direction){case`long`:return t.longColor??`#1fa874`;case`short`:return t.shortColor??`#e8505b`;default:return t.neutralColor??`#9E9E9E`}}renderArrow(e,t,n,r,i,a){e.fillStyle=a,e.beginPath(),r===`long`?(e.moveTo(t,n-i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n+i*.4),e.lineTo(t+i*.2,n+i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):r===`short`?(e.moveTo(t,n+i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n-i*.4),e.lineTo(t+i*.2,n-i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):e.arc(t,n,i*.4,0,Math.PI*2),e.closePath(),e.fill()}},vp=1,yp=class extends Xu{zones=[];style={...t.DEFAULT_TRADE_ZONE_STYLE};requestRender=null;dataGetter=null;pricePrecision=2;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setPricePrecision(e){this.pricePrecision=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addZone(e){let t=e.id??`tc_zone_${vp++}`,n={...e,id:t};return this.zones.push(n),this.emit(`added`,n),this.requestRender?.(),t}updateZone(e,t){let n=this.zones.findIndex(t=>t.id===e);n!==-1&&(this.zones[n]={...this.zones[n],...t},this.requestRender?.())}removeZone(e){this.zones=this.zones.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getZones(){return[...this.zones]}clearZones(){this.zones=[],this.emit(`cleared`,void 0),this.requestRender?.()}setZones(e){this.zones=[...e],this.requestRender?.()}render(e,t,n){let r=this.dataGetter?.();if(!r||r.length===0||this.zones.length===0)return;let{chartRect:i}=t,a=this.style;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.zones)this.renderZone(e,i,r,t,n,a);e.restore()}renderZone(t,n,r,i,a,o){let{chartRect:s}=i,c=e.O(n.entryTime,r),l=n.exitTime==null?r.length-1:e.O(n.exitTime,r),u=e.b(c,i),f=e.b(l,i),p=Math.max(s.x,Math.min(u,f)),m=Math.min(s.x+s.width,Math.max(u,f));if(m-p<1)return;let h=e.w(n.entryPrice,i),g=n.exitPrice==null?e.w(n.entryPrice,i):e.w(n.exitPrice,i),_=Math.min(h,g),v=Math.max(Math.max(h,g)-_,2),y=n.exitTime==null,b=n.pnl==null?n.direction===`long`?(n.exitPrice??n.entryPrice)>=n.entryPrice:(n.exitPrice??n.entryPrice)<=n.entryPrice:n.pnl>=0,x=y?o.activeColor??`#4c8dff`:b?o.profitColor??`#1fa874`:o.lossColor??`#e8505b`;t.fillStyle=x,t.globalAlpha=o.fillOpacity??.12,t.fillRect(p,_,m-p,v),t.globalAlpha=1;let S=o.borderWidth??1;t.strokeStyle=x,t.lineWidth=S,t.setLineDash([]),t.beginPath(),t.moveTo(p,Math.round(h)+.5),t.lineTo(m,Math.round(h)+.5),t.stroke(),!y&&n.exitPrice!=null&&(t.setLineDash([3,3]),t.beginPath(),t.moveTo(p,Math.round(g)+.5),t.lineTo(m,Math.round(g)+.5),t.stroke(),t.setLineDash([]));let C=n.direction===`long`?`▲`:`▼`;if(t.font=`bold 10px ${a.font.family}`,t.fillStyle=x,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${C} ${i.formatPrice?.(n.entryPrice)??n.entryPrice.toFixed(this.pricePrecision)}`,p+4,h-3),o.showPnl&&!y&&n.pnl!=null){let e=n.pnl>=0?`+`:``,r=n.pnlPercent==null?`${e}${n.pnl.toFixed(2)}`:`${e}${n.pnl.toFixed(2)} (${e}${n.pnlPercent.toFixed(2)}%)`;t.font=`bold 10px ${a.font.family}`,t.fillStyle=x,t.textBaseline=`top`,t.textAlign=`right`;let i=t.measureText(r).width+8,o=m-i-2,s=_+2;t.globalAlpha=.85,t.fillStyle=a.background,d(t,o,s,i,14,a),t.globalAlpha=1,t.fillStyle=x,t.fillText(r,m-4,s+1)}o.showLabel&&n.label&&(t.font=`9px ${a.font.family}`,t.fillStyle=x,t.globalAlpha=.8,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(n.label,p+4,h+3),t.globalAlpha=1)}},bp=class{active=!1;startBar=0;startPrice=0;endBar=0;endPrice=0;startTime=null;endTime=null;isActive(){return this.active}begin(t,n,r){let i=Math.round(e.k(t.x,n)),a=e.j(t.y,n);this.startBar=i,this.startPrice=a,this.endBar=i,this.endPrice=a,this.startTime=xp(i,r),this.endTime=this.startTime,this.active=!0}update(t,n,r){if(!this.active)return;let i=Math.round(e.k(t.x,n));this.endBar=i,this.endPrice=e.j(t.y,n),this.endTime=xp(i,r)}end(){this.active=!1}render(t,n,r){if(!this.active)return;let i=e.b(this.startBar,n),a=e.b(this.endBar,n),o=e.w(this.startPrice,n),s=e.w(this.endPrice,n),c=Math.min(i,a),l=Math.max(i,a),u=Math.min(o,s),d=Math.max(o,s),f=l-c,p=d-u,m=this.endPrice>=this.startPrice?r.candleUp:r.candleDown,h=Dp(m,.14);t.save();let{chartRect:g}=n;t.beginPath(),t.rect(g.x,g.y,g.width,g.height),t.clip(),t.fillStyle=h,t.fillRect(c,u,f,p),t.strokeStyle=m,t.lineWidth=1,t.setLineDash([4,3]),t.strokeRect(c+.5,u+.5,f,p),t.setLineDash([]),t.strokeStyle=m,t.lineWidth=1.5,t.beginPath(),t.moveTo(i,o),t.lineTo(a,s),t.stroke(),wp(t,i,o,m),wp(t,a,s,m),t.restore();let _=Math.abs(this.endBar-this.startBar),v=this.endPrice-this.startPrice,y=this.startPrice===0?0:v/this.startPrice*100,b=this.startTime!==null&&this.endTime!==null?Cp(Math.abs(this.endTime-this.startTime)):null,x=[],S=v>0?`+`:v<0?`−`:``,C=Math.abs(v);x.push(`${S}${n.formatPrice?.(C)??Sp(C)} (${S}${Math.abs(y).toFixed(2)}%)`),x.push(`${_} bars${b?` · `+b:``}`),t.save(),Tp(t,a,s,x,m,r),t.restore()}};function xp(e,t){if(e<0||e>=t.length)return null;let n=t[e].time;return n>0xe8d4a51000?n:n*1e3}function Sp(e){return e>=1e3?e.toFixed(2):e>=1?e.toFixed(4):e.toPrecision(4)}function Cp(e){let t=e/1e3;if(t<60)return`${t.toFixed(0)}s`;let n=t/60;if(n<60)return`${n.toFixed(1)}m`;let r=n/60;if(r<24)return`${r.toFixed(1)}h`;let i=r/24;if(i<30)return`${i.toFixed(1)}d`;let a=i/30;return a<12?`${a.toFixed(1)}mo`:`${(i/365).toFixed(1)}y`}function wp(e,t,n,r){e.fillStyle=r,e.beginPath(),e.arc(t,n,3.5,0,Math.PI*2),e.fill(),e.fillStyle=`#fff`,e.beginPath(),e.arc(t,n,1.5,0,Math.PI*2),e.fill()}function Tp(e,t,n,r,i,a){e.font=`600 11px ${a.font.family}`;let o=0;for(let t of r){let n=e.measureText(t).width;n>o&&(o=n)}let s=Math.ceil(o)+16,c=r.length*14+12,l=t+8,u=n+8,d=e.canvas.clientWidth||e.canvas.width;l+s>d-4&&(l=t-s-8),l<4&&(l=4),e.fillStyle=a.background,e.globalAlpha=.96,Ep(e,l,u,s,c,6),e.fill(),e.globalAlpha=1,e.strokeStyle=i,e.lineWidth=1,Ep(e,l+.5,u+.5,s-1,c-1,6),e.stroke(),e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<r.length;t++)e.fillStyle=t===0?i:a.textSecondary,e.fillText(r[t],l+8,u+6+t*14)}function Ep(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function Dp(e,t){if(e.startsWith(`#`)){let n=0,r=0,i=0;return e.length===4?(n=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16),i=parseInt(e[3]+e[3],16)):e.length>=7&&(n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16)),`rgba(${n},${r},${i},${t})`}if(e.startsWith(`rgb`)){let n=e.match(/[\d.]+/g);if(n&&n.length>=3)return`rgba(${n[0]},${n[1]},${n[2]},${t})`}return e}var Op=6,kp=class{start=null;current=null;isActive(){return this.start!==null}begin(e){this.start=e,this.current=e}update(e){this.start&&(this.current=e)}end(){let e=this.start,t=this.current;if(this.cancel(),!e||!t)return null;let n=Math.min(e.x,t.x),r=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);return{x0:n,y0:i,x1:r,y1:a,isClick:r-n<6&&a-i<6}}cancel(){this.start=null,this.current=null}render(e,t,n){if(!this.start||!this.current)return;let{chartRect:r}=t,i=e=>Math.max(r.x,Math.min(r.x+r.width,e)),a=e=>Math.max(r.y,Math.min(r.y+r.height,e)),o=i(Math.min(this.start.x,this.current.x)),s=i(Math.max(this.start.x,this.current.x)),c=a(Math.min(this.start.y,this.current.y)),l=a(Math.max(this.start.y,this.current.y));e.save(),e.fillStyle=n.crosshair,e.globalAlpha=.1,e.fillRect(o,c,s-o,l-c),e.globalAlpha=.8,e.strokeStyle=n.crosshair,e.lineWidth=1,e.setLineDash([4,3]),e.strokeRect(Math.round(o)+.5,Math.round(c)+.5,Math.round(s-o),Math.round(l-c)),e.restore()}},Ap={linear:e=>e,easeOutCubic:e=>1-(1-e)**3,easeOutQuart:e=>1-(1-e)**4,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeOutExpo:e=>e===1?1:1-2**(-10*e),easeOutElastic:e=>e===0||e===1?e:2**(-10*e)*Math.sin((e*10-.75)*(2*Math.PI/3))+1,spring:e=>1-Math.E**(-6*e)*Math.cos(8*e)},jp=class{animations=new Map;frameId=0;running=!1;animate(e,t){this.animations.set(e,{startTime:-1,duration:t.duration,easing:t.easing??Ap.easeOutCubic,onUpdate:t.onUpdate,onComplete:t.onComplete}),this.running||(this.running=!0,this.tick())}cancel(e){this.animations.delete(e),this.animations.size===0&&this.stop()}cancelAll(){this.animations.clear(),this.stop()}isAnimating(e){return e?this.animations.has(e):this.animations.size>0}tick(){this.frameId=requestAnimationFrame(e=>{let t=[];for(let[n,r]of this.animations){r.startTime<0&&(r.startTime=e);let i=e-r.startTime,a=Math.min(1,i/r.duration),o=r.easing(a);r.onUpdate(o),a>=1&&(r.onComplete?.(),t.push(n))}for(let e of t)this.animations.delete(e);this.animations.size>0?this.tick():this.running=!1})}stop(){this.frameId&&=(cancelAnimationFrame(this.frameId),0),this.running=!1}dispose(){this.cancelAll()}};function Mp(e){return!e||e===`dark`?t.DARK_THEME:e===`light`?t.LIGHT_THEME:e}var Np=class{canvas;ctx;container;theme;width=0;height=0;dpr=1;frameId=null;resizeObserver;constructor(e,t){this.container=e,this.theme=Mp(t),this.canvas=document.createElement(`canvas`),this.canvas.style.width=`100%`,this.canvas.style.height=`100%`,this.canvas.style.display=`block`,e.appendChild(this.canvas),this.ctx=this.canvas.getContext(`2d`),this.dpr=window.devicePixelRatio||1,this.updateSize(),this.resizeObserver=new ResizeObserver(()=>{this.updateSize(),this.requestRender()}),this.resizeObserver.observe(e)}updateSize(){this.dpr=window.devicePixelRatio||1;let e=this.container.getBoundingClientRect();this.width=e.width||this.container.clientWidth,this.height=e.height||this.container.clientHeight,this.canvas.width=Math.max(1,Math.floor(this.width*this.dpr)),this.canvas.height=Math.max(1,Math.floor(this.height*this.dpr))}requestRender(){this.frameId===null&&(this.frameId=requestAnimationFrame(()=>{this.frameId=null,(this.width===0||this.height===0)&&this.updateSize(),!(this.width===0||this.height===0)&&(this.ctx.save(),this.ctx.scale(this.dpr,this.dpr),this.ctx.clearRect(0,0,this.width,this.height),this.renderChart(this.ctx,this.width,this.height,this.theme),this.ctx.restore())}))}setTheme(e){this.theme=Mp(e),this.requestRender()}destroy(){this.frameId!==null&&cancelAnimationFrame(this.frameId),this.resizeObserver.disconnect(),this.canvas.remove()}},Pp=class{pos=null;canvas;onUpdate;handleMove;handleLeave;constructor(e,t){this.canvas=e,this.onUpdate=t,this.handleMove=t=>{let n=e.getBoundingClientRect();this.pos={x:t.clientX-n.left,y:t.clientY-n.top},this.onUpdate()},this.handleLeave=()=>{this.pos=null,this.onUpdate()},e.addEventListener(`pointermove`,this.handleMove),e.addEventListener(`pointerleave`,this.handleLeave)}getPosition(){return this.pos}isActive(){return this.pos!==null}drawCrosshair(e,t,n,r){this.pos&&(e.save(),e.strokeStyle=r,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(this.pos.x,0),e.lineTo(this.pos.x,n),e.stroke(),e.beginPath(),e.moveTo(0,this.pos.y),e.lineTo(t,this.pos.y),e.stroke(),e.restore())}destroy(){this.canvas.removeEventListener(`pointermove`,this.handleMove),this.canvas.removeEventListener(`pointerleave`,this.handleLeave)}};function Fp(e,t,n,r,i){let{data:a,mode:o=`area`,lineWidth:s=1.5,showLastPoint:c=!1,showMinMax:l=!1}=r;if(a.length<2||t<=0||n<=0)return;let u=r.color??i.lineColor,d=r.fillColor??u,f=t-4,p=n-4,m=1/0,h=-1/0,g=0,_=0;for(let e=0;e<a.length;e++)a[e]<m&&(m=a[e],g=e),a[e]>h&&(h=a[e],_=e);let v=h-m||1,y=e=>2+e/(a.length-1)*f,b=e=>2+p-(e-m)/v*p;if(o===`area`){let t=e.createLinearGradient(0,2,0,n-2);t.addColorStop(0,d+(d.startsWith(`#`)?`40`:``)),t.addColorStop(1,`transparent`),e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));e.lineTo(y(a.length-1),n-2),e.lineTo(y(0),n-2),e.closePath(),e.fillStyle=t,e.fill()}e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));if(e.strokeStyle=u,e.lineWidth=s,e.lineJoin=`round`,e.stroke(),c){let t=r.lastPointColor??u,n=y(a.length-1),i=b(a[a.length-1]);e.beginPath(),e.arc(n,i,3,0,Math.PI*2),e.fillStyle=t,e.fill()}if(l){let t=r.minPointColor??i.candleDown,n=r.maxPointColor??i.candleUp;e.beginPath(),e.arc(y(g),b(m),2.5,0,Math.PI*2),e.fillStyle=t,e.fill(),e.beginPath(),e.arc(y(_),b(h),2.5,0,Math.PI*2),e.fillStyle=n,e.fill()}}var Ip=50,Lp=60,Rp=20,zp=.2;function Bp(e){let t=[...e].sort((e,t)=>t.price-e.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function Vp(e){let t=[...e].sort((e,t)=>e.price-t.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function Hp(e,t){return{left:Ip,right:e-Lp,top:Rp,bottom:t-Rp,plotWidth:e-Ip-Lp,plotHeight:t-Rp*2}}function Up(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Wp(e,n,r,i,a,o,s,c){let{left:l,right:u,top:d,bottom:f,plotWidth:p,plotHeight:m}=n;e.save(),e.strokeStyle=o.grid,e.lineWidth=.5,e.fillStyle=o.axisLabel,e.font=`${o.font.sizeSmall}px ${o.font.family}`;let h=(0,t.computeTickStep)(0,a,5);for(let t=0;t<=a;t+=h){let n=f-t/a*m;e.beginPath(),e.moveTo(l,n),e.lineTo(u,n),e.stroke(),e.textAlign=`right`,e.textBaseline=`middle`,e.fillText(c(t),l-4,n)}let g=i-r,_=(0,t.computeTickStep)(r,i,6),v=Math.ceil(r/_)*_;for(let t=v;t<=i;t+=_){let n=l+(t-r)/g*p;e.beginPath(),e.moveTo(n,d),e.lineTo(n,f),e.stroke(),e.textAlign=`center`,e.textBaseline=`top`,e.fillText(s(t),n,f+4)}e.restore()}function Gp(e,t,n,r,i,a,o,s,c){if(t.length===0)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-e/a*f;if(e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}else{e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}if(e.closePath(),e.fillStyle=o,e.fill(),e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);n>0&&e.lineTo(r,m(t[n-1].cumulativeVolume)),e.lineTo(r,i)}}else{e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=1;n<t.length;n++){let r=m(t[n-1].cumulativeVolume),i=p(t[n].price),a=m(t[n].cumulativeVolume);e.lineTo(i,r),e.lineTo(i,a)}}e.strokeStyle=s,e.lineWidth=1.5,e.stroke()}function Kp(e,t,n,r,i,a,o,s,c){let{left:l,top:u,bottom:d,plotWidth:f}=r,p=l+(t-i)/a*f;if(e.save(),e.strokeStyle=o.textSecondary,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(p,u),e.lineTo(p,d),e.stroke(),e.restore(),s){let t=`Spread: ${c(n)}`;e.save(),e.font=`${o.font.sizeSmall}px ${o.font.family}`,e.fillStyle=o.textSecondary,e.textAlign=`center`,e.textBaseline=`bottom`,e.fillText(t,p,u-2),e.restore()}}function qp(e,t,n,r,i,a,o,s,c,l,u){let{left:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=i,g=t.x;if(g<d||g>i.right)return;let _=a+(g-d)/m*o,v=0,y=``;if(n.length>0&&_<=n[0].price){y=`Bid`;for(let e of n)if(_<=e.price)v=e.cumulativeVolume;else break}if(r.length>0&&_>=r[0].price){y=`Ask`;for(let e of r)if(_>=e.price)v=e.cumulativeVolume;else break}if(e.save(),e.strokeStyle=c.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(g,f),e.lineTo(g,p),e.stroke(),v>0){let t=p-v/s*h;e.beginPath(),e.moveTo(d,t),e.lineTo(i.right,t),e.stroke()}e.restore();let b=[`Price: ${l(_)}`,y?`${y} Vol: ${u(v)}`:``].filter(Boolean);e.save(),e.font=`${c.font.sizeSmall}px ${c.font.family}`;let x=Math.max(...b.map(t=>e.measureText(t).width))+16,S=b.length*(c.font.sizeSmall+4)+12,C=g+10,w=t.y-S/2;C+x>i.right&&(C=g-x-10),w<f&&(w=f),w+S>p&&(w=p-S),e.fillStyle=c.axisLabelBackground,e.globalAlpha=.9,e.fillRect(C,w,x,S),e.globalAlpha=1,e.fillStyle=c.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<b.length;t++)e.fillText(b[t],C+8,w+6+t*(c.font.sizeSmall+4));e.restore()}function Jp(e){return e.toFixed(2)}function Yp(e){return e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(0)}function Xp(e,t,n,r,i,a){let{data:o}=r;if(o.bids.length===0&&o.asks.length===0||t<=0||n<=0)return;let s=r.bidColor??i.candleUp,c=r.askColor??i.candleDown,l=r.bidFillColor??s+`40`,u=r.askFillColor??c+`40`,d=r.midPriceLine!==!1,f=r.spreadLabel!==!1,p=r.priceFormat??Jp,m=r.volumeFormat??Yp,h=Bp(o.bids),g=Vp(o.asks),_=h.length>0?h[0].price:0,v=g.length>0?g[0].price:0,y=h.length>0&&g.length>0?(_+v)/2:_||v,b=g.length>0&&h.length>0?v-_:0,x=h.length>0?h[h.length-1].price:y,S=g.length>0?g[g.length-1].price:y,C=Math.max(y-x,S-y)*(1+zp),w=y-C,T=y+C,E=T-w,D=h.length>0?h[h.length-1].cumulativeVolume:0,O=g.length>0?g[g.length-1].cumulativeVolume:0,k=Math.max(D,O)||1,ee=Hp(t,n);Up(e,t,n,i.background),Wp(e,ee,w,T,k,i,p,m),Gp(e,h,ee,w,E,k,l,s,`bid`),Gp(e,g,ee,w,E,k,u,c,`ask`),d&&Kp(e,y,b,ee,w,E,i,f,p),a&&qp(e,a,h,g,ee,w,E,k,i,p,m)}var Zp=70,Qp=30,$p=20,em=20,tm=.05;function nm(e,t){return{left:Zp,right:e-$p,top:em,bottom:t-Qp,plotWidth:e-Zp-$p,plotHeight:t-em-Qp}}function rm(e,t){let n=1/0,r=-1/0;for(let t of e)t.value<n&&(n=t.value),t.value>r&&(r=t.value);if(t)for(let e of t)e.value<n&&(n=e.value),e.value>r&&(r=e.value);let i=(r-n)*tm;return{valMin:n-i,valMax:r+i}}function im(e){let t=[],n=-1/0;for(let r of e)r.value>n&&(n=r.value),t.push(n);return t}function am(e){let t=864e5;if(365.25*t,e<7*t){let e=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});return t=>e.format(new Date(t))}if(e<315576e5){let e=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`});return t=>e.format(new Date(t))}let n=new Intl.DateTimeFormat(void 0,{month:`short`,year:`numeric`});return e=>n.format(new Date(e))}function om(e){return Math.abs(e)>=1e6?(e/1e6).toFixed(2)+`M`:Math.abs(e)>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function sm(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function cm(e,n,r,i,a,o,s,c,l){let{left:u,right:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=n;e.save(),e.strokeStyle=s.grid,e.lineWidth=.5,e.fillStyle=s.axisLabel,e.font=`${s.font.sizeSmall}px ${s.font.family}`;let g=(0,t.computeTickStep)(r,i,6),_=Math.ceil(r/g)*g;for(let t=_;t<=i;t+=g){let n=p-(t-r)/(i-r)*h;e.beginPath(),e.moveTo(u,n),e.lineTo(d,n),e.stroke(),e.textAlign=`right`,e.textBaseline=`middle`,e.fillText(c(t),u-6,n)}let v=o-a,y=(0,t.computeTickStep)(a,o,6),b=Math.ceil(a/y)*y;for(let t=b;t<=o;t+=y){let n=u+(t-a)/v*m;e.beginPath(),e.moveTo(n,f),e.lineTo(n,p),e.stroke(),e.textAlign=`center`,e.textBaseline=`top`,e.fillText(l(t),n,p+4)}e.restore()}function lm(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-(e-a)/o*f;e.save(),e.beginPath(),e.moveTo(p(t[0].time),m(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(p(t[n].time),m(t[n].value));e.strokeStyle=s,e.lineWidth=c,e.lineJoin=`round`,e.stroke(),e.restore()}function um(e,t,n,r,i,a,o,s){if(t.length<2)return;let{left:c,bottom:l,plotWidth:u,plotHeight:d}=n,f=e=>c+(e-r)/i*u,p=e=>l-(e-a)/o*d,m=e.createLinearGradient(0,n.top,0,l);m.addColorStop(0,s+`40`),m.addColorStop(1,`transparent`),e.save(),e.beginPath(),e.moveTo(f(t[0].time),p(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(f(t[n].time),p(t[n].value));e.lineTo(f(t[t.length-1].time),l),e.lineTo(f(t[0].time),l),e.closePath(),e.fillStyle=m,e.fill(),e.restore()}function dm(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=r,p=e=>l+(e-i)/a*d,m=e=>u-(e-o)/s*f;e.save(),e.fillStyle=c,e.beginPath(),e.moveTo(p(t[0].time),m(n[0]));for(let r=1;r<t.length;r++)e.lineTo(p(t[r].time),m(n[r]));for(let n=t.length-1;n>=0;n--)e.lineTo(p(t[n].time),m(t[n].value));e.closePath(),e.fill(),e.restore()}function fm(e,t,n,r,i,a,o,s,c,l){if(t.length===0)return;let{left:u,bottom:d,plotWidth:f,plotHeight:p}=n,m=t[t.length-1],h=u+(m.time-r)/i*f,g=d-(m.value-a)/o*p;e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`,e.fillStyle=c,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(s,h+4,g),e.restore()}function pm(e,t,n,r,i,a,o,s,c,l,u,d){let{left:f,top:p,bottom:m,plotWidth:h,plotHeight:g}=i,_=t.x;if(_<f||_>i.right)return;e.save(),e.strokeStyle=l.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(_,p),e.lineTo(_,m),e.stroke(),e.restore();let v=a+(_-f)/h*o,y=0,b=1/0;for(let e=0;e<n.length;e++){let t=Math.abs(n[e].time-v);t<b&&(b=t,y=e)}let x=n[y],S=[u(x.time),`Value: ${d(x.value)}`];r&&r.length>y&&S.push(`Benchmark: ${d(r[y].value)}`);let C=f+(x.time-a)/o*h,w=m-(x.value-s)/c*g;e.beginPath(),e.arc(C,w,3,0,Math.PI*2),e.fillStyle=l.lineColor,e.fill(),e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`;let T=Math.max(...S.map(t=>e.measureText(t).width))+16,E=S.length*(l.font.sizeSmall+4)+12,D=_+10,O=t.y-E/2;D+T>i.right&&(D=_-T-10),O<p&&(O=p),O+E>m&&(O=m-E),e.fillStyle=l.axisLabelBackground,e.globalAlpha=.9,e.fillRect(D,O,T,E),e.globalAlpha=1,e.fillStyle=l.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<S.length;t++)e.fillText(S[t],D+8,O+6+t*(l.font.sizeSmall+4));e.restore()}function mm(e,t,n,r,i,a){let{data:o}=r;if(o.length<2||t<=0||n<=0)return;let s=r.lineColor??i.lineColor,c=r.lineWidth??1.5,l=r.drawdown===!0,u=r.drawdownColor??i.candleDown+`30`,d=r.fillArea===!0,f=r.benchmark,p=r.benchmarkColor??i.textSecondary,m=r.benchmarkLabel??`Benchmark`,h=r.valueFormat??om,{valMin:g,valMax:_}=rm(o,f),v=_-g||1,y=o[0].time,b=o[o.length-1].time,x=b-y||1,S=r.timeFormat??am(x),C=nm(t,n);sm(e,t,n,i.background),cm(e,C,g,_,y,b,i,h,S),l&&dm(e,o,im(o),C,y,x,g,v,u),d&&um(e,o,C,y,x,g,v,s),lm(e,o,C,y,x,g,v,s,c),f&&f.length>=2&&(lm(e,f,C,y,x,g,v,p,1),fm(e,f,C,y,x,g,v,m,p,i)),a&&pm(e,a,o,f,C,y,x,g,v,i,S,h)}function hm(e,t,n){if(e.length===0)return[];let r=e.length,i=Math.ceil(Math.sqrt(r)),a=Math.ceil(r/i),o=t.width/i,s=t.height/a,c=[];for(let a=0;a<r;a++){let r=a%i,l=Math.floor(a/i);c.push({id:e[a].id,rect:{x:t.x+r*o+n,y:t.y+l*s+n,width:Math.max(0,o-n*2),height:Math.max(0,s-n*2)}})}return c}function gm(e,t){let n=e.reduce((e,t)=>e+t,0);if(n===0||t===0)return 1/0;let r=0;for(let i of e){let e=n/t,a=i/e,o=e>a?e/a:a/e;o>r&&(r=o)}return r}function _m(e,t,n,r,i,a){let o=r?n.height:n.width,s=e.reduce((e,t)=>e+t,0),c=o>0?s/o:0,l=0;for(let o=0;o<e.length;o++){let s=c>0?e[o]/c:0,u;u=r?{x:n.x+i,y:n.y+l+i,width:Math.max(0,c-i*2),height:Math.max(0,s-i*2)}:{x:n.x+l+i,y:n.y+i,width:Math.max(0,s-i*2),height:Math.max(0,c-i*2)},a.push({id:t[o],rect:u}),l+=s}}function vm(e,t,n,r,i){if(e.length===0)return;let a=n.width>=n.height,o=a?n.height:n.width;if(e.length===1){_m(e,t,n,a,r,i);return}let s=[],c=[],l=0;for(;l<e.length;){let u=[...s,e[l]];if(s.length===0||gm(u,o)<=gm(s,o))s.push(e[l]),c.push(t[l]),l++;else{_m(s,c,n,a,r,i);let u=s.reduce((e,t)=>e+t,0),d=o>0?u/o:0;n=a?{x:n.x+d,y:n.y,width:n.width-d,height:n.height}:{x:n.x,y:n.y+d,width:n.width,height:n.height-d},vm(e.slice(l),t.slice(l),n,r,i);return}}s.length>0&&_m(s,c,n,a,r,i)}function ym(e,t,n){if(e.length===0)return[];let r=[...e].sort((e,t)=>t.weight-e.weight),i=r.reduce((e,t)=>e+Math.max(0,t.weight),0);if(i===0)return[];let a=t.width*t.height,o=r.map(e=>Math.max(0,e.weight)/i*a),s=r.map(e=>e.id),c=[];return vm(o,s,{...t},n,c),c}function bm(e){return(e>=0?`+`:``)+e.toFixed(2)+`%`}function xm(e){return e.label}function Sm(e,n){let r=n.min??-5,i=n.max??5;if(e<=r)return n.negative;if(e>=i)return n.positive;if(e<0){let i=1-e/r;return(0,t.lerpColor)(n.negative,n.zero,i)}let a=e/i;return(0,t.lerpColor)(n.zero,n.positive,a)}function Cm(e,t,n,r,i,a){let o=Math.min(a,r/2,i/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+r-o,n),e.arcTo(t+r,n,t+r,n+o,o),e.lineTo(t+r,n+i-o),e.arcTo(t+r,n+i,t+r-o,n+i,o),e.lineTo(t+o,n+i),e.arcTo(t,n+i,t,n+i-o,o),e.lineTo(t,n+o),e.arcTo(t,n,t+o,n,o),e.closePath()}function wm(e,t,n,r,i,a,o,s,c,l,u){if(i<40||a<30)return;let d=n+i/2,f=r+a/2;if(e.save(),e.shadowColor=`rgba(0,0,0,0.6)`,e.shadowBlur=2,e.fillStyle=`#FFFFFF`,e.textAlign=`center`,s){let n=l(t),r=Math.min(o.font.sizeMedium,i/n.length*1.5,a/4);e.font=`bold `+Math.max(8,r)+`px `+o.font.family,e.textBaseline=c?`bottom`:`middle`,e.fillText(n,d,c?f-1:f,i-8)}if(c){let n=u(t.value),r=Math.min(o.font.sizeSmall,i/n.length*1.5,a/4);e.font=Math.max(7,r)+`px `+o.font.family,e.textBaseline=s?`top`:`middle`,e.fillText(n,d,s?f+1:f,i-8)}e.restore()}function Tm(e,t,n,r,i,a,o,s){let c=[o(t),s(t.value)];if(t.meta)for(let[e,n]of Object.entries(t.meta))c.push(e+`: `+String(n));e.save(),e.font=a.font.sizeSmall+`px `+a.font.family;let l=Math.max(...c.map(t=>e.measureText(t).width))+16,u=a.font.sizeSmall+4,d=c.length*u+12,f=n.x+14,p=n.y-d/2;f+l>r&&(f=n.x-l-14),p<0&&(p=0),p+d>i&&(p=i-d),e.fillStyle=a.axisLabelBackground,e.globalAlpha=.92,Cm(e,f,p,l,d,4),e.fill(),e.globalAlpha=1,e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<c.length;t++)e.fillText(c[t],f+8,p+6+t*u);e.restore()}function Em(e,t,n,r,i,a,o,s){if(r.length===0||i.length===0||t<=0||n<=0)return null;let c=a.colorScale??{negative:`#e8505b`,zero:`#424242`,positive:`#1fa874`},l=a.cellRadius??4,u=a.showLabels!==!1,d=a.showValues!==!1,f=a.valueFormat??bm,p=a.labelFormat??xm,m=new Map;for(let e of r)m.set(e.id,e);let h=null,g=null;if(s)for(let e of i){let{x:t,y:n,width:r,height:i}=e.rect;if(s.x>=t&&s.x<=t+r&&s.y>=n&&s.y<=n+i){h=e.id;let t=m.get(e.id);t&&(g={cell:t,rect:e});break}}e.fillStyle=o.background,e.fillRect(0,0,t,n);for(let t of i){let n=m.get(t.id);if(!n)continue;let{x:r,y:i,width:a,height:s}=t.rect;if(a<=0||s<=0)continue;let g=Sm(n.value,c);Cm(e,r,i,a,s,l),e.fillStyle=g,e.fill(),wm(e,n,r,i,a,s,o,u,d,p,f),t.id===h&&(Cm(e,r,i,a,s,l),e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.stroke())}return g&&s&&Tm(e,g.cell,s,t,n,o,p,f),g}var Dm=60,Om=12,km=24,Am=40,jm=.7,Mm=1;function Nm(e){return e.type?e.type:e.value>0?`positive`:e.value<0?`negative`:`subtotal`}function Pm(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function Fm(e,t){return{left:Dm,right:e-Om,top:km,bottom:t-Am,plotWidth:e-Dm-Om,plotHeight:t-km-Am}}function Im(e,t,n,r,i){let a=Array(e.length),o=Array(e.length),s=t.plotWidth/e.length,c=s*n,l=(s-c)/2,{left:u,bottom:d,plotHeight:f}=t,p=0;for(let t=0;t<e.length;t++){let n=e[t],m=Nm(n),h,g;m===`total`||m===`subtotal`?(h=0,g=n.value,p=n.value):(h=p,g=p+n.value,p=g);let _=Math.min(h,g),v=Math.max(h,g),y=d-(_-r)/i*f,b=d-(v-r)/i*f,x=Math.min(y,b),S=Math.max(Math.abs(b-y),Mm),C=u+t*s,w=C+l;a[t]={label:n.label,value:n.value,start:h,end:g,type:m,rectX:w,rectY:x,rectW:c,rectH:S,slotX:C,slotW:s},o[t]=p}return{bars:a,cumulatives:o}}function Lm(e){if(e.length===0)return{valMin:0,valMax:1};let t=0,n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i],o=Nm(a),s,c;o===`total`||o===`subtotal`?(s=0,c=a.value,r=a.value):(s=r,c=r+a.value,r=c),s<t&&(t=s),c<t&&(t=c),s>n&&(n=s),c>n&&(n=c)}let i=(n-t||1)*.1;return{valMin:t-i,valMax:n+i}}function Rm(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function zm(e,n,r,i,a,o){let{left:s,right:c,top:l,bottom:u,plotHeight:d}=n,f=i-r||1;e.strokeStyle=a.grid,e.lineWidth=.5,e.fillStyle=a.axisLabel,e.font=`${a.font.sizeSmall}px ${a.font.family}`,e.textAlign=`right`,e.textBaseline=`middle`;let p=(0,t.computeTickStep)(r,i,5),m=Math.ceil(r/p)*p;e.beginPath();for(let t=m;t<=i;t+=p){let n=Math.round(u-(t-r)/f*d)+.5;n<l||n>u||(e.moveTo(s,n),e.lineTo(c,n))}e.stroke();for(let t=m;t<=i;t+=p){let n=u-(t-r)/f*d;n<l-1||n>u+1||e.fillText(o(t),s-6,n)}if(r<0&&i>0){let t=Math.round(u-(0-r)/f*d)+.5;e.strokeStyle=a.axisLine,e.lineWidth=1,e.beginPath(),e.moveTo(s,t),e.lineTo(c,t),e.stroke()}}function Bm(e,t,n){let r=[`positive`,`negative`,`total`,`subtotal`];for(let i=0;i<r.length;i++){let a=r[i],o=n[a],s=!1;e.beginPath();for(let n=0;n<t.length;n++){let r=t[n];if(r.type!==a)continue;let i=Math.round(r.rectX),o=Math.round(r.rectY),c=Math.round(r.rectW),l=Math.round(r.rectH);e.rect(i,o,c,l),s=!0}s&&(e.fillStyle=o,e.fill())}}function Vm(e,t,n,r,i,a,o){if(o===`none`||t.length<2)return;let{bottom:s,plotHeight:c}=n;e.strokeStyle=a,e.lineWidth=1,o===`dashed`?e.setLineDash([4,4]):e.setLineDash([]),e.beginPath();for(let n=0;n<t.length-1;n++){let a=t[n],o=t[n+1],l=a.end,u=Math.round(s-(l-r)/i*c)+.5,d=Math.round(a.rectX+a.rectW),f=Math.round(o.rectX);f<=d||(e.moveTo(d,u),e.lineTo(f,u))}e.stroke(),e.setLineDash([])}function Hm(e,t,n,r,i,a){e.fillStyle=r.text,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`;for(let r=0;r<t.length;r++){let o=t[r],s;s=o.type===`total`||o.type===`subtotal`?i(o.value):a?`${o.value>=0?`+`:``}${i(o.value)}`:i(n[r]);let c=o.rectX+o.rectW/2;o.end<o.start?(e.textBaseline=`top`,e.fillText(s,c,o.rectY+o.rectH+4)):(e.textBaseline=`bottom`,e.fillText(s,c,o.rectY-4))}}function Um(e,t,n,r,i){e.fillStyle=r.axisLabel,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`,e.textBaseline=`top`;let a=n.bottom+6,o=t.length>0?t[0].slotW-4:0,s=!1;for(let n=0;n<t.length;n++)if(e.measureText(i(t[n].label)).width>o){s=!0;break}if(!s){for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.fillText(i(r.label),o,a)}return}e.save(),e.textAlign=`right`,e.textBaseline=`middle`;for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.setTransform(1,0,0,1,o,a+4),e.rotate(-Math.PI/4),e.fillText(i(r.label),0,0)}e.setTransform(1,0,0,1,0,0),e.restore()}function Wm(e,t,n){if(t<n.left||t>n.right)return null;for(let n=0;n<e.length;n++){let r=e[n];if(t>=r.slotX&&t<=r.slotX+r.slotW)return n}return null}function Gm(e,t,n,r,i,a,o,s){let c=t[r],l=n[r],u=Math.round(c.slotX+c.slotW/2)+.5;e.strokeStyle=o.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(u,a.top),e.lineTo(u,a.bottom),e.stroke(),e.setLineDash([]);let d=[c.label,`Value: ${c.value>=0&&(c.type===`positive`||c.type===`negative`)?`+`:``}${s(c.value)}`,`Total: ${s(l)}`];e.font=`${o.font.sizeSmall}px ${o.font.family}`;let f=0;for(let t=0;t<d.length;t++){let n=e.measureText(d[t]).width;n>f&&(f=n)}let p=f+16,m=d.length*(o.font.sizeSmall+4)+12,h=i.x+10,g=i.y-m/2;h+p>a.right&&(h=i.x-p-10),g<a.top&&(g=a.top),g+m>a.bottom&&(g=a.bottom-m),e.fillStyle=o.axisLabelBackground,e.globalAlpha=.9,e.fillRect(h,g,p,m),e.globalAlpha=1,e.fillStyle=o.text,e.textAlign=`left`,e.textBaseline=`top`;let _=o.font.sizeSmall+4;for(let t=0;t<d.length;t++)e.fillText(d[t],h+8,g+6+t*_)}function Km(e,t,n,r,i,a){let{data:o}=r;if(!o||o.length===0||t<=0||n<=0)return{hitBar:null};let s=r.positiveColor??i.candleUp,c=r.negativeColor??i.candleDown,l=r.totalColor??i.lineColor,u=r.subtotalColor??i.textSecondary,d=r.connectorColor??i.textSecondary,f=r.connectorStyle??`dashed`,p=r.barWidth??jm,m=r.showValues!==!1,h=r.showDelta!==!1,g=r.valueFormat??Pm,_=r.labelFormat??(e=>e),{valMin:v,valMax:y}=Lm(o),b=y-v||1,x=Fm(t,n),{bars:S,cumulatives:C}=Im(o,x,p,v,b);Rm(e,t,n,i.background),zm(e,x,v,y,i,g),Vm(e,S,x,v,b,d,f),Bm(e,S,{positive:s,negative:c,total:l,subtotal:u}),m&&Hm(e,S,C,i,g,h),Um(e,S,x,i,_);let w=a?Wm(S,a.x,x):null;return a&&w!==null&&Gm(e,S,C,w,a,x,i,g),{hitBar:w}}var qm=Math.PI/180,Jm=150,Ym=240,Xm=90,Zm=.14,Qm=1.6*qm,$m=.22,eh=8,th=18,nh=16,rh=6.5,ih=20,ah=5,oh=28;function sh(e,t,n){return e<t?t:e>n?n:e}function ch(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:Number.isInteger(e)?e.toFixed(0):e.toFixed(1)}function lh(e){let t=Number.isFinite(e.startAngle)?e.startAngle:Jm,n=(Number.isFinite(e.endAngle)?e.endAngle:t+Ym)-t;return n<=0&&(n=(n%360+360)%360||360),n=sh(n,Xm,360),{start:(t%360+360)%360*qm,sweep:n*qm}}function uh(e,t){let n=Math.min(Math.cos(e),Math.cos(t)),r=Math.max(Math.cos(e),Math.cos(t)),i=Math.min(Math.sin(e),Math.sin(t)),a=Math.max(Math.sin(e),Math.sin(t));for(let o=Math.ceil(e/(Math.PI/2));Math.PI/2*o<=t;o++){let e=Math.PI/2*o;n=Math.min(n,Math.cos(e)),r=Math.max(r,Math.cos(e)),i=Math.min(i,Math.sin(e)),a=Math.max(a,Math.sin(e))}return{minX:n,maxX:r,minY:i,maxY:a}}function dh(e){if(e.showZoneLabels!==!0||!e.zones)return 0;let t=e.zones.reduce((e,t)=>Math.max(e,t.label?.length??0),0);return t>0?t*rh+12:0}function fh(e,t,n){let r=Number.isFinite(n.min)?n.min:0,i=Number.isFinite(n.max)?n.max:100;i-r>Math.abs(r)*1e-9||(i=r+Math.max(1,Math.abs(r)*1e-6));let{start:a,sweep:o}=lh(n),s=a,c=a+o,l=sh(n.thickness??Zm,.04,.5),u=uh(s,c),d=Math.max(u.maxY,.18),f=dh(n),p=f>0?nh:0,m=Math.max(1,e-2*eh-2*f),h=Math.max(1,t-2*eh-th-p),g=1+l/2,_=Math.max(8,Math.min(m/((u.maxX-u.minX)*g),h/((d-u.minY)*g))),v=_*l,y=(d-u.minY)*_*g+th+p,b=e/2-(u.maxX+u.minX)/2*_,x=(t-y)/2+p-u.minY*_*g,S=_-v/2,C=Math.max(11,Math.round(S*.46)),w=u.maxY>.3?x-C*.12:x-C*.55,T=Math.max(Math.sin(s),Math.sin(c)),E=T>.2?x+T*_+v/2+2:1/0,D=Math.min(t-eh,E);return{cx:b,cy:x,radius:_,thickness:v,startAngle:s,endAngle:c,min:r,max:i,valueY:w,valueSize:C,textBottom:D}}function ph(e,t){let n=Number.isFinite(e)?sh((e-t.min)/(t.max-t.min),0,1):0;return t.startAngle+(t.endAngle-t.startAngle)*n}function mh(e,t){if(!t||!Number.isFinite(e))return;let n;for(let r of t)e>=r.from&&e<=r.to&&(n=r);return n}function hh(e,t,n){let r=(t??[]).map(t=>({a0:ph(t.from,e),a1:ph(t.to,e),color:t.color,track:!1})).filter(e=>e.a1>e.a0).sort((e,t)=>e.a0-t.a0),i=[],a=e.startAngle;for(let e of r)e.a1<=a||(e.a0>a+1e-9&&i.push({a0:a,a1:e.a0,color:n,track:!0}),i.push({...e,a0:Math.max(e.a0,a)}),a=e.a1);return a<e.endAngle-1e-9&&i.push({a0:a,a1:e.endAngle,color:n,track:!0}),i}function gh(e,t,n,r,i){r<=n||(e.beginPath(),e.arc(t.cx,t.cy,t.radius,n,r,!1),e.lineWidth=t.thickness,e.lineCap=`butt`,e.strokeStyle=i,e.stroke())}function _h(e,t,n,r,i,a){let o=t.cx+Math.cos(n)*t.radius,s=t.cy+Math.sin(n)*t.radius,c=a===`start`?n-Math.PI:n;e.globalAlpha=i,e.beginPath(),e.arc(o,s,t.thickness/2,c,c+(i>=1?Math.PI*2:Math.PI),!1),e.closePath(),e.fillStyle=r,e.fill(),e.globalAlpha=1}function vh(e,t,n,r,i,a){let o=hh(t,n,i),s=o.some(e=>!e.track);o.forEach((n,i)=>{let a=i>0&&!n.track&&!o[i-1].track?Qm/2:0,s=i<o.length-1&&!n.track&&!o[i+1].track?Qm/2:0,c=n.a0+a,l=n.a1-s;if(n.track){gh(e,t,c,l,n.color);return}e.globalAlpha=$m,gh(e,t,c,l,n.color),e.globalAlpha=1,gh(e,t,c,Math.min(l,r),n.color)}),s||gh(e,t,t.startAngle,r,a);let c=r>t.startAngle+1e-9,l=r>=t.endAngle-1e-9,u=(e,t)=>e.track?[!s&&t?a:i,1]:[e.color,t?1:$m],[d,f]=u(o[0],c),[p,m]=u(o[o.length-1],l);_h(e,t,t.startAngle,d,f,`start`),_h(e,t,t.endAngle,p,m,`end`)}function yh(e,t,n){let r=t.radius-t.thickness/2;if(r<oh)return;let i=Math.max(4,t.thickness*.45);e.strokeStyle=n,e.lineCap=`butt`;for(let n=0;n<=ih;n++){let a=n%ah===0,o=t.startAngle+(t.endAngle-t.startAngle)*n/ih,s=r-i,c=s-(a?Math.max(6,t.thickness*.55):Math.max(3,t.thickness*.3));e.globalAlpha=a?.55:.3,e.lineWidth=a?1.5:1,e.beginPath(),e.moveTo(t.cx+Math.cos(o)*s,t.cy+Math.sin(o)*s),e.lineTo(t.cx+Math.cos(o)*c,t.cy+Math.sin(o)*c),e.stroke()}e.globalAlpha=1}function bh(e,t,n,r,i){let a=t.cx+Math.cos(n)*t.radius,o=t.cy+Math.sin(n)*t.radius;e.beginPath(),e.arc(a,o,t.thickness*.78,0,Math.PI*2),e.fillStyle=r,e.fill(),e.lineWidth=Math.max(2,t.thickness*.32),e.strokeStyle=i,e.stroke()}function xh(e,t,n,r,i){let a=Math.cos(n),o=Math.sin(n),s=t.radius-t.thickness*.9,c=Math.max(6,t.thickness*.6),l=Math.max(1.5,t.thickness*.14);e.beginPath(),e.moveTo(t.cx+a*s,t.cy+o*s),e.lineTo(t.cx-o*l-a*c,t.cy+a*l-o*c),e.lineTo(t.cx+o*l-a*c,t.cy-a*l-o*c),e.closePath(),e.fillStyle=r,e.fill(),e.beginPath(),e.arc(t.cx,t.cy,Math.max(4,t.thickness*.42),0,Math.PI*2),e.fill(),e.lineWidth=2,e.strokeStyle=i,e.stroke()}function Sh(e,t,n,r,i,a,o){e.font=`${n} ${r}px ${i}`;let s=e.measureText(t).width;if(s<=a)return r;let c=Math.floor(r*a/s);return c<o?0:(e.font=`${n} ${c}px ${i}`,c)}function Ch(e,t,n,r,i,a,o){let s=a.font.family,c=(t.radius-t.thickness/2)*1.3,l=a.font.sizeSmall;e.textAlign=`center`,e.textBaseline=`middle`;let u=Sh(e,n,`600`,t.valueSize,s,c,l);if(u===0)return;let d=o?Math.min(t.cy+u*.8,t.textBottom-u/2):t.valueY;e.fillStyle=a.text,e.fillText(n,t.cx,d);let f=Math.max(l,Math.round(u*.26));if(i?.label&&!o){let n=i.label.toUpperCase();Sh(e,n,`600`,f,s,c*.9,l)>0&&(e.fillStyle=i.color,e.fillText(n,t.cx,d-u*.78))}if(r){let n=d+u*.72;n+f/2<=t.textBottom&&Sh(e,r,`400`,f,s,c,l)>0&&(e.fillStyle=a.textSecondary,e.fillText(r,t.cx,n))}}function wh(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall+1}px ${r.font.family}`;let i=t.thickness/2+6;for(let[r,a]of[[t.startAngle,t.min],[t.endAngle,t.max]]){let o=Math.cos(r),s=Math.sin(r),c=t.cx+o*t.radius,l=t.cy+s*t.radius;s>.2?(e.textAlign=`center`,e.textBaseline=`top`,e.fillText(n(a),c,l+i)):(e.textAlign=o<-.2?`right`:o>.2?`left`:`center`,e.textBaseline=s<-.2?`bottom`:`middle`,e.fillText(n(a),c+o*i,l+s*i))}}function Th(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textBaseline=`middle`;let i=t.radius+t.thickness/2+8;for(let r of n){if(!r.label)continue;let n=ph((sh(r.from,t.min,t.max)+sh(r.to,t.min,t.max))/2,t),a=Math.cos(n);e.textAlign=a<-.2?`right`:a>.2?`left`:`center`,e.fillText(r.label,t.cx+a*i,t.cy+Math.sin(n)*i)}}function Eh(e,t,n,r,i,a){if(t<=0||n<=0)return;let o=fh(t,n,r),s=Number.isFinite(a),c=s?sh(a,o.min,o.max):o.min,l=ph(c,o),u=s?mh(c,r.zones):void 0,d=r.pointer===`needle`,f=r.valueFormat??ch,p=u?.color??r.needleColor??i.lineColor;e.save(),e.fillStyle=i.background,e.fillRect(0,0,t,n),vh(e,o,r.zones,l,r.trackColor??i.grid,p),yh(e,o,i.textSecondary),s&&(d?xh(e,o,l,r.needleColor??i.text,i.background):bh(e,o,l,p,i.background)),r.showValue!==!1&&Ch(e,o,s?f(c):`—`,r.label,u,i,d),wh(e,o,f,i),r.showZoneLabels===!0&&r.zones?.length&&Th(e,o,r.zones,i),e.restore()}exports.ABCDPatternTool=gc,exports.ADXIndicator=xn,exports.ALMAIndicator=Pr,exports.ATRIndicator=bn,exports.AXIS_LABEL_HEIGHT=p,exports.AcceleratorOscillatorIndicator=lr,exports.AccumulationDistributionIndicator=_r,exports.AccumulativeSwingIndexIndicator=ki,exports.AdvanceDeclineIndicator=ji,exports.AlertDragHandler=_a,exports.AlertManager=Rf,exports.AlligatorIndicator=on,exports.AnchoredVWAPIndicator=Xt,exports.AnchoredVWAPTool=Us,exports.Animator=jp,exports.ArcTool=jl,exports.AreaRenderer=me,exports.AroonIndicator=En,exports.ArrowMarkTool=fl,exports.ArrowTool=Rs,exports.AverageDayRangeIndicator=oi,exports.AveragePriceIndicator=mi,exports.AwesomeOscillatorIndicator=hn,exports.AxisDragHandler=ga,exports.BalanceOfPowerIndicator=Jn,exports.BarCountdown=ff,exports.BarRenderer=he,exports.BarsPatternTool=au,exports.BaseFinanceChart=Np,exports.BaselineRenderer=ve,exports.BinanceAdapter=Fd,exports.BollingerBandWidthIndicator=qr,exports.BollingerBandsIndicator=zt,exports.BollingerPercentBIndicator=Kr,exports.BracketTool=Au,exports.BrushTool=wl,exports.BybitAdapter=Yd,exports.CCIIndicator=wn,exports.CMFIndicator=kn,exports.CalloutTool=il,exports.CandlestickRenderer=S,exports.CanvasLayer=n,exports.ChaikinOscillatorIndicator=gn,exports.ChaikinVolatilityIndicator=nr,exports.ChandeKrollStopIndicator=Ur,exports.ChandeMomentumIndicator=Xn,exports.ChandelierExitIndicator=an,exports.ChartLegend=lf,exports.ChartStateManager=cp,exports.ChopZoneIndicator=Fi,exports.ChoppinessIndexIndicator=Mn,exports.CircleTool=bc,exports.CoinbaseAdapter=Ud,exports.CompareRenderer=$e,exports.CompareSymbolIndicator=qi,exports.ConnorsRSIIndicator=In,exports.CoppockIndicator=Rn,exports.CorrelationCoefficientIndicator=Qi,exports.CorrelationLogIndicator=$i,exports.CrossLineTool=$s,exports.CrosshairHandler=ba,exports.CrosshairTooltip=Ia,exports.CurrentPriceLine=$u,exports.CurveTool=Al,exports.CyclicLinesTool=Ac,exports.CypherPatternTool=yc,exports.DEFAULT_LEGEND_CONFIG=cf,exports.DEFAULT_MAX_WEBGL_CHARTS=e.t,exports.DEFAULT_SESSION_HOURS=Cf,exports.DEMAIndicator=Mr,exports.DENSE_BAR_WIDTH=e.u,exports.DPRManager=a,exports.DataExporter=mp,exports.DateAndPriceRangeTool=Ec,exports.DateRangeTool=Ps,exports.DepthHeatmapBuffer=Ye,exports.DepthHeatmapRenderer=Xe,exports.DepthOverlay=wu,exports.DetrendedPriceOscillatorIndicator=qn,exports.DisparityIndexIndicator=fr,exports.DonchianChannelIndicator=Gt,exports.DrawingBase=W,exports.DrawingManager=wo,exports.DrawingRenderer=Yo,exports.EMAIndicator=Rt,exports.EaseOfMovementIndicator=$n,exports.Easing=Ap,exports.ElderRayIndicator=Hn,exports.ElliottCorrectionTool=ks,exports.ElliottDoubleComboTool=js,exports.ElliottImpulseTool=Os,exports.ElliottTriangleTool=As,exports.ElliottTripleComboTool=Ms,exports.ElliottWaveTool=Ds,exports.EllipseTool=vs,exports.Emitter=Xu,exports.EnvelopeIndicator=un,exports.EquivolumeRenderer=Ce,exports.EventBus=Ga,exports.ExtendedLineTool=ss,exports.FibArcsTool=Ul,exports.FibChannelTool=lc,exports.FibCirclesTool=Hl,exports.FibExtensionTool=gs,exports.FibRetracementTool=ms,exports.FibSpeedResistanceFanTool=pc,exports.FibSpiralTool=Kl,exports.FibTimeZonesTool=Ks,exports.FibWedgeTool=Wl,exports.FinanceCrosshair=Pp,exports.FisherTransformIndicator=Kn,exports.FlagTool=ll,exports.ForceIndexIndicator=Fn,exports.ForecastTool=ru,exports.GannBoxTool=Hs,exports.GannFanTool=Bs,exports.GannSquareTool=ql,exports.GridRenderer=e.o,exports.GuppyMMAIndicator=di,exports.HLCAreaRenderer=Te,exports.HammingMAIndicator=Si,exports.HeadAndShouldersTool=_c,exports.HiLoRenderer=Ae,exports.HighlighterTool=Tl,exports.HistoricalVolatilityIndicator=Yr,exports.HollowCandleRenderer=ge,exports.HorizontalLineTool=rs,exports.HorizontalRayTool=is,exports.HullMAIndicator=$t,exports.ICON_GLYPHS=pl,exports.IchimokuIndicator=Vt,exports.IconTool=hl,exports.IndicatorBase=N,exports.IndicatorEngine=jt,exports.IndicatorValueMap=P,exports.IndicatorWorkerHost=Gi,exports.InfoLineTool=ac,exports.InteractionManager=aa,exports.KAMAIndicator=Fr,exports.KSTIndicator=zn,exports.KagiRenderer=be,exports.KeltnerChannelIndicator=Wt,exports.KeyboardHandler=Ea,exports.KlingerIndicator=Gn,exports.KrakenAdapter=nf,exports.LSMAIndicator=Ir,exports.LayerManager=r,exports.LineRenderer=pe,exports.LineWithMarkersRenderer=De,exports.LinearRegressionChannelIndicator=Qt,exports.LinearRegressionSlopeIndicator=ii,exports.MACDIndicator=vn,exports.MAChannelIndicator=vi,exports.MACrossIndicator=Br,exports.MADoubleIndicator=Ei,exports.MARibbonIndicator=fi,exports.MATripleIndicator=Di,exports.MAX_ALERT_BARS=kf,exports.MAX_BASE_RATIO=nd,exports.MAX_BASE_REQUESTS=td,exports.MFIIndicator=Tn,exports.MIN_ALERT_BARS=Af,exports.MIN_BAR_UNIT=te,exports.MTFMovingAverageIndicator=nn,exports.MajorityRuleIndicator=Mi,exports.MarketProfileRenderer=Re,exports.MassIndexIndicator=Yn,exports.McGinleyDynamicIndicator=Lr,exports.MeasureOverlay=bp,exports.MeasureTool=Fs,exports.MedianPriceIndicator=hi,exports.MockAdapter=Id,exports.ModifiedSchiffPitchforkTool=Ss,exports.MomentumIndicator=Jr,exports.NetVolumeIndicator=si,exports.NoteTool=rl,exports.OBVIndicator=Sn,exports.OrderDraftTool=Iu,exports.OrderRenderer=mu,exports.PanHandler=ma,exports.PaneResizeHandler=va,exports.PaperExecutionAdapter=qu,exports.ParabolicSARIndicator=Ht,exports.ParallelChannelTool=cs,exports.PathTool=El,exports.PercentagePriceOscillatorIndicator=sr,exports.PeriodLevelsRenderer=Ue,exports.PinnedTooltip=Ba,exports.PitchfanTool=Gl,exports.PitchforkTool=bs,exports.PivotMarkersRenderer=qe,exports.PivotPointsIndicator=Jt,exports.PointAndFigureRenderer=xe,exports.PollingAdapter=zd,exports.PolylineTool=Dl,exports.PositionRenderer=Cu,exports.PrettyGoodOscillatorIndicator=mr,exports.PriceAxis=u,exports.PriceAxisAddButton=ca,exports.PriceLabelTool=Fc,exports.PriceLines=Df,exports.PriceOscillatorIndicator=Ri,exports.PriceRangeTool=Ns,exports.PriceVolumeTrendIndicator=er,exports.ProjectionTool=iu,exports.QstickIndicator=pr,exports.RANGE_PRESETS=ie,exports.ROCIndicator=Dn,exports.RSIIndicator=_n,exports.RayTool=os,exports.ReconnectManager=Qu,exports.RectangleTool=_s,exports.RegressionChannelTool=ls,exports.RelativeMomentumIndexIndicator=dr,exports.RelativeVigorIndicator=rr,exports.RelativeVolatilityIndexIndicator=ni,exports.RenderEngine=O,exports.RenderLoop=i,exports.RenkoRenderer=ye,exports.ReplayController=xd,exports.ReplayManager=Vf,exports.ResamplingAdapter=ud,exports.RiskRewardTool=Qs,exports.SELECTION_BOX_MIN_SIZE=Op,exports.SMAIndicator=Lt,exports.SMIErgodicIndicator=Li,exports.SMMAIndicator=Nr,exports.SNAPSHOT_VERSION=Uf,exports.SchaffTrendCycleIndicator=Un,exports.SchiffPitchforkTool=xs,exports.Screenshot=uf,exports.SelectionBoxOverlay=kp,exports.SessionBreaks=mf,exports.SessionShading=wf,exports.SessionVWAPIndicator=rn,exports.SignalMarkerManager=_p,exports.SineLineTool=Ql,exports.SpreadIndicator=Ji,exports.StandardErrorBandsIndicator=ci,exports.StandardErrorIndicator=ai,exports.StdDevIndicator=hr,exports.StepLineRenderer=Ee,exports.StochasticIndicator=yn,exports.StochasticMomentumIndexIndicator=ti,exports.StochasticRSIIndicator=ir,exports.StreamManager=bd,exports.SupertrendIndicator=Ut,exports.SymbolSeriesStore=Qe,exports.TEMAIndicator=mn,exports.TRIXIndicator=Zn,exports.TSIIndicator=On,exports.TextAnnotationTool=Ls,exports.ThreeDrivesTool=vc,exports.TickAggregator=Zu,exports.TickBarAdapter=hd,exports.TickBarBuilder=md,exports.TimeAxis=ta,exports.TimeCyclesTool=Zl,exports.TradeZoneManager=yp,exports.TradingContextMenu=Eu,exports.TradingDragHandler=Tu,exports.TradingManager=Gu,exports.TradingRenderer=Ku,exports.TrendAngleTool=rc,exports.TrendLineTool=ns,exports.TrendStrengthIndexIndicator=ri,exports.TriangleTool=ys,exports.TypicalPriceIndicator=gi,exports.UlcerIndexIndicator=Qr,exports.UltimateOscillatorIndicator=Nn,exports.UndoRedoManager=lp,exports.VROCIndicator=vr,exports.VWAPIndicator=Bt,exports.VWMAIndicator=cn,exports.VerticalLineTool=as,exports.Viewport=ne,exports.VolatilityIndexIndicator=Oi,exports.VolatilityOHLCIndicator=Vi,exports.VolatilityZeroTrendIndicator=Hi,exports.VolumeCandleRenderer=Se,exports.VolumeDeltaIndicator=An,exports.VolumeOscillatorIndicator=Xr,exports.VolumeProfileIndicator=gr,exports.VolumeProfileRangeTool=Ws,exports.VolumeProfileRenderer=Me,exports.VolumeRenderer=je,exports.VortexIndicator=jn,exports.WMAIndicator=ln,exports.Watermark=df,exports.WebSocketAdapter=Rd,exports.WilliamsADIndicator=tr,exports.WilliamsFractalsIndicator=Hr,exports.WilliamsRIndicator=Cn,exports.XABCDPatternTool=hc,exports.ZigZagIndicator=Zt,exports.ZoomHandler=ha,exports.alignOutput=Ot,exports.arcPoints=kl,exports.assignSessionLetters=Ie,exports.barIndexToTime=e.y,exports.barIndexToX=e.b,exports.barTimeStep=e.x,exports.barTimeStepMs=e.S,exports.bracketRiskReward=Ou,exports.claimGpuContext=e.n,exports.classifyPivots=Ge,exports.computeBracketDefaults=Du,exports.computeMarketProfile=Pe,exports.computePeriodLevels=He,exports.computeSessionProfiles=Le,exports.curvePoints=Ol,exports.drawAxisValueLabels=v,exports.drawnKeys=ut,exports.fillTag=d,exports.findDominantSwing=Xo,exports.findPivots=Ke,exports.forEachPixelColumn=e.d,exports.forecastOutcome=nu,exports.formatTooltipTime=Pa,exports.getIntParam=I,exports.getNumberParam=F,exports.getVisibleData=re,exports.gpuContextsLeft=e.r,exports.hasHistogram=vt,exports.hasTrades=vd,exports.indicatorValuePrecision=f,exports.inferOrderType=Pu,exports.inputSource=Tt,exports.isDense=e.f,exports.isInWindow=xf,exports.isPriceLevelAlert=Mf,exports.isRegularSession=Sf,exports.isUpTone=dt,exports.isWorkerResponse=Wi,exports.labelTextColor=h,exports.layoutAxisValueLabels=_,exports.layoutSquarifiedTreemap=ym,exports.layoutUniformGrid=hm,exports.lineSourceBars=Dt,exports.lineSpace=qa,exports.loadWebGL=k,exports.loadWebGLRenderer=ee,exports.lttbDownsample=ue,exports.lttbVisibleIndices=fe,exports.mergeSessionHours=yf,exports.minuteOfDay=bf,exports.paneLogRange=gt,exports.paneValueRange=ht,exports.plotColor=mt,exports.plotLook=M,exports.plotShown=ft,exports.priceBucketRow=e.C,exports.priceSourceBars=Et,exports.priceToY=e.w,exports.priceToYMapper=e.T,exports.rangePresetStart=le,exports.readAlertOptions=Bf,exports.registerBuiltInDrawingTools=ou,exports.registerBuiltInIndicators=Ui,exports.renderAxisValueLabels=y,exports.renderDenseBars=e.p,exports.renderDepthChart=Xp,exports.renderEquityCurve=mm,exports.renderGauge=Eh,exports.renderHeatmap=Em,exports.renderPlots=yt,exports.renderSparkline=Fp,exports.renderWaterfall=Km,exports.resolveBarIndex=e.E,exports.servesTimeframe=sd,exports.setMaxWebGLCharts=e.i,exports.sourceParam=wt,exports.spreadLabels=m,exports.timeToX=e.D,exports.timestampToBarIndex=e.O,exports.toHeikinAshi=et,exports.toKagi=it,exports.toLineBreak=rt,exports.toPointAndFigure=at,exports.toRangeBars=ot,exports.toRenko=tt,exports.tpoLetter=Fe,exports.waveLabel=ws,exports.whenGpuContextFree=e.a,exports.withResampling=ad,exports.withTickBars=_d,exports.xToBarIndex=e.k,exports.xToTime=e.A,exports.yToPrice=e.j;
21
+ `,t.addEventListener(`mouseenter`,()=>{t.style.background=`#1f2630`}),t.addEventListener(`mouseleave`,()=>{t.style.background=`transparent`}),t.addEventListener(`click`,()=>{this.onItemSelect?.(e.intent),this.hide()}),s.appendChild(t)}n.appendChild(s),this.menuElement=s;let l=e=>{(e instanceof KeyboardEvent&&e.key===`Escape`||e instanceof MouseEvent&&!s.contains(e.target))&&this.hide()};document.addEventListener(`mousedown`,l),document.addEventListener(`keydown`,l),this.removeHandler=()=>{document.removeEventListener(`mousedown`,l),document.removeEventListener(`keydown`,l)}}hide(){this.menuElement?.remove(),this.menuElement=null,this.removeHandler?.(),this.removeHandler=null}destroy(){this.hide(),this.onItemSelect=null}};function Du(e,t,n={}){let r=Math.max(Math.abs(t)*(n.riskFraction??.01),1e-8),i=r*(n.riskReward??2);return e===`buy`?{side:e,entry:t,stopLoss:t-r,takeProfit:t+i}:{side:e,entry:t,stopLoss:t+r,takeProfit:t-i}}function Ou(e){let t=Math.abs(e.entry-e.stopLoss);return t===0?0:Math.abs(e.takeProfit-e.entry)/t}var ku=6,Au=class{draft=null;dragging=null;defaults;constructor(e={}){this.defaults=e}start(e,t){this.draft=Du(e,t,this.defaults),this.dragging=null}cancel(){this.draft=null,this.dragging=null}isActive(){return this.draft!==null}getDraft(){return this.draft?{...this.draft}:null}hitTest(t,n){if(!this.draft)return null;let r=[`entry`,`sl`,`tp`],i=null,a=ku;for(let o of r){let r=e.w(this.priceOf(o),n),s=Math.abs(r-t.y);s<=a&&(a=s,i=o)}return i}beginDrag(e,t){let n=this.hitTest(e,t);return n?(this.dragging=n,!0):!1}drag(t,n){if(!this.draft||!this.dragging)return!1;let r=e.j(t.y,n);return this.draft=ju(this.draft,this.dragging,r),!0}endDrag(){this.dragging=null}isDragging(){return this.dragging!==null}priceOf(e){let t=this.draft;return e===`entry`?t.entry:e===`sl`?t.stopLoss:t.takeProfit}render(t,n,r,i=2){let a=this.draft;if(!a)return;let{chartRect:o}=n,s=o.x,c=o.x+o.width,l=e.w(a.entry,n),u=e.w(a.stopLoss,n),d=e.w(a.takeProfit,n),f=r.candleUp,p=r.candleDown;t.save(),t.globalAlpha=.12,t.fillStyle=f,t.fillRect(s,Math.min(l,d),o.width,Math.abs(d-l)),t.fillStyle=p,t.fillRect(s,Math.min(l,u),o.width,Math.abs(u-l)),t.globalAlpha=1,Mu(t,s,c,l,r.text,[6,3]),Mu(t,s,c,d,f,[]),Mu(t,s,c,u,p,[]);let m=Ou(a),h=a.side===`buy`?`LONG`:`SHORT`,g=e=>n.formatPrice?.(e)??e.toFixed(i);Nu(t,s+6,l,`${h} entry ${g(a.entry)}`,r.text,r),Nu(t,s+6,d,`TP ${g(a.takeProfit)} · ${m.toFixed(2)}R`,f,r),Nu(t,s+6,u,`SL ${g(a.stopLoss)}`,p,r);for(let[i,o]of[[a.entry,r.text],[a.takeProfit,f],[a.stopLoss,p]]){let r=e.w(i,n);t.fillStyle=o,t.beginPath(),t.arc(c-6,r,3.5,0,Math.PI*2),t.fill()}t.restore()}};function ju(e,t,n){let r=e.side===`buy`;if(t===`entry`){let t=n-e.entry;return{side:e.side,entry:n,stopLoss:e.stopLoss+t,takeProfit:e.takeProfit+t}}if(t===`sl`){let t=r?Math.min(n,e.entry):Math.max(n,e.entry);return{...e,stopLoss:t}}let i=r?Math.max(n,e.entry):Math.min(n,e.entry);return{...e,takeProfit:i}}function Mu(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Nu(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a.background,d(e,t-3,n-8,o+6,16,a),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}function Pu(e,t,n){return n==null?`limit`:e===`buy`?t<=n?`limit`:`stop`:t>=n?`limit`:`stop`}var Fu=6,Iu=class{draft=null;dragging=!1;start(e,t,n=1){this.draft={side:e,price:t,quantity:n},this.dragging=!1}cancel(){this.draft=null,this.dragging=!1}isActive(){return this.draft!==null}isDragging(){return this.dragging}getDraft(){return this.draft?{...this.draft}:null}setPrice(e){return this.draft?(this.draft={...this.draft,price:e},!0):!1}toIntent(e){return this.draft?{side:this.draft.side,type:Pu(this.draft.side,this.draft.price,e),price:this.draft.price,quantity:this.draft.quantity}:null}hitTest(t,n){return this.draft?Math.abs(e.w(this.draft.price,n)-t.y)<=Fu:!1}beginDrag(e,t){return this.hitTest(e,t)?(this.dragging=!0,!0):!1}drag(t,n){return!this.draft||!this.dragging?!1:this.setPrice(e.j(t.y,n))}endDrag(){this.dragging=!1}render(t,n,r,i,a=2){let o=this.draft;if(!o)return;let{chartRect:s}=n,c=s.x,l=s.x+s.width,u=e.w(o.price,n),d=Pu(o.side,o.price,i),f=o.side===`buy`?r.candleUp:r.candleDown;t.save(),Lu(t,c,l,u,f,[6,3]);let p=o.side===`buy`?`BUY`:`SELL`;Ru(t,c+6,u,`${p} ${d.toUpperCase()} ${n.formatPrice?.(o.price)??o.price.toFixed(a)}`,f,r),t.fillStyle=f,t.beginPath(),t.arc(l-6,u,3.5,0,Math.PI*2),t.fill(),t.restore()}};function Lu(e,t,n,r,i,a){e.strokeStyle=i,e.lineWidth=1,e.setLineDash(a),e.beginPath(),e.moveTo(t,Math.round(r)+.5),e.lineTo(n,Math.round(r)+.5),e.stroke(),e.setLineDash([])}function Ru(e,t,n,r,i,a){e.font=`600 10px system-ui, sans-serif`,e.textBaseline=`middle`,e.textAlign=`left`;let o=e.measureText(r).width;e.globalAlpha=.85,e.fillStyle=a.background,d(e,t-3,n-8,o+6,16,a),e.globalAlpha=1,e.fillStyle=i,e.fillText(r,t,n+.5)}var zu=5,Bu=7,Vu=2;function Hu(e,t){let n=t.data,r=n&&n.length>0?n[n.length-1].time:0;return r>0&&r<0xe8d4a51000?e/1e3:e}function Uu(t,n,r,i){if(n.length===0)return;let{chartRect:a}=r,o=i.orderColors?.buy??`#1fa874`,s=i.orderColors?.sell??`#e8505b`;t.lineWidth=1.5;for(let i of n){let n=e.D(Hu(i.time,r),r),c=e.w(i.price,r);if(n<a.x||n>a.x+a.width||c<a.y||c>a.y+a.height)continue;let l=i.side===`buy`,u=l?c+Vu:c-Vu,d=l?u+Bu:u-Bu;t.beginPath(),t.moveTo(n,u),t.lineTo(n-zu,d),t.lineTo(n+zu,d),t.closePath();let f=l?o:s;!i.reason||i.reason===`order`?(t.fillStyle=f,t.fill()):(t.strokeStyle=f,t.stroke())}}var Wu=1e3,Gu=class{orders=[];positions=[];depthData=null;currentPrice=null;config;orderRenderer=new mu;positionRenderer=new Cu;depthOverlay=new wu;dragHandler;contextMenu=new Eu;bracket=new Au;orderDraft=new Iu;buttons=[];fills=[];realisedPnl=0;requestRender=null;eventCallback=null;container=null;constructor(e){this.config={...t.DEFAULT_TRADING_CONFIG,...e},this.dragHandler=new Tu(this.config.dragThreshold),this.contextMenu.onItemSelect=e=>{this.eventCallback?.(`orderPlace`,e)}}setContainer(e){this.container=e}setRequestRender(e){this.requestRender=e}setEventCallback(e){this.eventCallback=e}setOrders(e){this.orders=e,this.requestRender?.()}setPositions(e){this.positions=e,this.requestRender?.()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}getCurrentPrice(){return this.currentPrice}setDepthData(e){this.depthData=e,this.requestRender?.()}setCurrentPrice(e){this.currentPrice=e,this.requestRender?.()}setConfig(e){Object.assign(this.config,e),this.requestRender?.()}addFill(e){this.fills=[...this.fills.slice(-(Wu-1)),e],this.realisedPnl+=e.pnl??0,this.requestRender?.()}setFills(e){this.fills=e.slice(-Wu),this.realisedPnl=e.reduce((e,t)=>e+(t.pnl??0),0),this.requestRender?.()}getRealisedPnl(){return this.realisedPnl}getFills(){return[...this.fills]}armed=null;isOverButton(e){return this.config.enabled&&uu(this.buttons,e)!==null}runButton(e){switch(e.type){case`cancelOrder`:this.eventCallback?.(`orderCancel`,{orderId:e.orderId});break;case`closePosition`:this.eventCallback?.(`positionClose`,{positionId:e.positionId});break;case`reversePosition`:this.eventCallback?.(`positionReverse`,{positionId:e.positionId});break;case`removeStop`:this.eventCallback?.(`positionModify`,{positionId:e.positionId,[e.which]:null});break}}startBracket(e,t){this.bracket.start(e,t),this.requestRender?.()}cancelBracket(){this.bracket.isActive()&&(this.bracket.cancel(),this.requestRender?.())}confirmBracket(){let e=this.bracket.getDraft();return e?(this.eventCallback?.(`bracketPlace`,{side:e.side,entry:e.entry,stopLoss:e.stopLoss,takeProfit:e.takeProfit,riskReward:Ou(e)}),this.bracket.cancel(),this.requestRender?.(),!0):!1}isBracketActive(){return this.bracket.isActive()}startOrderDraft(e,t){this.orderDraft.start(e,t),this.requestRender?.()}cancelOrderDraft(){this.orderDraft.isActive()&&(this.orderDraft.cancel(),this.requestRender?.())}confirmOrderDraft(){let e=this.orderDraft.toIntent(this.currentPrice);return e?(this.eventCallback?.(`orderPlace`,e),this.orderDraft.cancel(),this.requestRender?.(),!0):!1}isOrderDraftActive(){return this.orderDraft.isActive()}isOverDraggableLine(t,n,r=8){if(!this.config.enabled)return!1;let i=i=>{if(i===void 0)return!1;let a=e.w(i,n);return su(a,n)&&Math.abs(t.y-a)<=r};for(let e of this.orders)if(e.draggable!==!1&&i(e.price))return!0;for(let e of this.positions)if(i(e.stopLoss)||i(e.takeProfit))return!0;return!1}onPointerDown(e,t){if(!this.config.enabled)return!1;if(this.bracket.isActive()&&this.bracket.beginDrag(e,t)||this.orderDraft.isActive()&&this.orderDraft.beginDrag(e,t))return this.requestRender?.(),!0;let n=uu(this.buttons,e);return n?(this.armed=n.action,!0):this.dragHandler.onPointerDown(e,this.orders,this.positions,t,8)}onPointerMove(e,t){if(this.armed)return!0;if(this.bracket.isDragging()){let n=this.bracket.drag(e,t);return n&&this.requestRender?.(),n}if(this.orderDraft.isDragging()){let n=this.orderDraft.drag(e,t);return n&&this.requestRender?.(),n}if(!this.dragHandler.isActive())return!1;let n=this.dragHandler.onPointerMove(e,t);return n&&this.requestRender?.(),n}onPointerUp(e){if(this.armed){let t=this.armed;this.armed=null;let n=e?uu(this.buttons,e):null;return n&&lu(n.action,t)&&this.runButton(t),!0}if(this.bracket.isDragging())return this.bracket.endDrag(),this.requestRender?.(),!0;if(this.orderDraft.isDragging())return this.orderDraft.endDrag(),this.requestRender?.(),!0;let t=this.dragHandler.onPointerUp();return t?(t.sourceType===`order`?this.eventCallback?.(`orderModify`,{orderId:t.id,newPrice:t.newPrice,previousPrice:t.previousPrice}):this.eventCallback?.(`positionModify`,{positionId:t.id,[t.sourceType]:t.newPrice}),this.requestRender?.(),!0):!1}onContextMenu(t,n){if(!this.config.enabled||!this.config.contextMenu?.enabled||!this.container)return!1;let r=e.j(t.y,n);return this.contextMenu.show(t,r,this.container,this.config,n.formatPrice),!0}render(e,t,n){if(this.buttons=[],!this.config.enabled)return;let{chartRect:r}=t;e.save();try{e.beginPath(),e.rect(r.x,r.y,r.width,r.height),e.clip(),this.renderInPlot(e,t,n)}finally{e.restore()}}renderInPlot(e,t,n){this.depthData&&this.depthOverlay.render(e,this.depthData,t,this.config),this.config.fillMarks!==!1&&Uu(e,this.fills,t,this.config),this.positions.length>0&&this.positionRenderer.render(e,this.positions,this.currentPrice,t,n,this.config,this.buttons),this.orders.length>0&&this.orderRenderer.render(e,this.orders,t,n,this.config,this.dragHandler.getDragState(),this.buttons),this.bracket.isActive()&&this.bracket.render(e,t,n,this.config.pricePrecision??2),this.orderDraft.isActive()&&this.orderDraft.render(e,t,n,this.currentPrice,this.config.pricePrecision??2)}renderAxisBadges(e,t,n){this.config.enabled&&(this.positions.length>0&&this.positionRenderer.renderAxisBadges(e,this.positions,t,n,this.config),this.orders.length>0&&this.orderRenderer.renderAxisBadges(e,this.orders,t,n,this.config,this.dragHandler.getDragState()))}axisTagYs(t){if(!this.config.enabled)return[];let n=this.dragHandler.getDragState(),r=this.positions.map(n=>e.w(n.entryPrice,t));for(let i of this.orders){let a=n?.orderId===i.id&&n.sourceType===`order`?n.currentPrice:i.price;r.push(e.w(a,t))}let{chartRect:i}=t;return r.filter(e=>e>=i.y&&e<=i.y+i.height)}destroy(){this.contextMenu.destroy()}},Ku=class{constructor(e){this.manager=e}render(e,t,n){this.manager.render(e,t,n)}renderAxisBadges(e,t,n){this.manager.renderAxisBadges(e,t,n)}axisTagYs(e){return this.manager.axisTagYs(e)}},qu=class{name=`paper`;state=`disconnected`;listeners=new Map;orders=[];positions=[];markPrice;markTime;seq=0;constructor(e={}){this.markPrice=e.markPrice??0}connect(e){this.state=`connected`,this.emit(`connectionChange`,this.state),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}disconnect(){this.state=`disconnected`,this.emit(`connectionChange`,this.state)}getConnectionState(){return this.state}setMarkPrice(e,t){this.markPrice=e,this.markTime=t!==void 0&&Number.isFinite(t)?t:void 0,this.checkPendingOrders(),this.checkStops()}fillTime(){return this.markTime??Date.now()}getOrders(){return[...this.orders]}getPositions(){return[...this.positions]}async placeOrder(e){let t={id:this.nextId(`ord`),side:e.side,type:e.type,price:e.price,stopPrice:e.stopPrice,quantity:e.quantity??1,label:e.type===`market`?void 0:Yu(e.type),draggable:!0,stopLoss:e.stopLoss,takeProfit:e.takeProfit,timeInForce:e.timeInForce};return e.type===`market`?this.fill(t,this.markPrice||e.price):(this.orders=[...this.orders,t],this.emit(`orders`,this.orders)),t}async modifyOrder(e){this.orders=this.orders.map(t=>t.id===e.orderId?{...t,price:e.newPrice}:t),this.emit(`orders`,this.orders)}async cancelOrder(e){this.orders=this.orders.filter(t=>t.id!==e.orderId),this.emit(`orders`,this.orders)}async modifyPosition(e){let t=(e,t)=>e===void 0?t:e??void 0;this.positions=this.positions.map(n=>n.id===e.positionId?{...n,stopLoss:t(e.stopLoss,n.stopLoss),takeProfit:t(e.takeProfit,n.takeProfit)}:n),this.emit(`positions`,this.positions)}async closePosition(e){let t=this.positions.find(t=>t.id===e.positionId);t&&(this.close(t,this.markPrice||t.entryPrice,`close`),this.emit(`positions`,this.positions))}async reversePosition(e){let t=this.positions.find(t=>t.id===e.positionId);if(!t)return;let n=this.markPrice||t.entryPrice;this.close(t,n,`reverse`);let r=t.quantity-(t.closedQuantity??0),i={id:this.nextId(`ord`),side:Ju(t.side),type:`market`,price:n,quantity:r};this.fill(i,n)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear(),this.orders=[],this.positions=[]}fill(e,t){this.orders=this.orders.filter(t=>t.id!==e.id);let n={id:this.nextId(`pos`),side:e.side,entryPrice:t,quantity:e.quantity,stopLoss:e.stopLoss,takeProfit:e.takeProfit};this.positions=[...this.positions,n];let r={orderId:e.id,side:e.side,price:t,quantity:e.quantity,time:this.fillTime(),positionId:n.id,reason:`order`};this.emit(`fill`,r),this.emit(`orders`,this.orders),this.emit(`positions`,this.positions)}close(e,t,n){this.positions=this.positions.filter(t=>t.id!==e.id);let r=e.quantity-(e.closedQuantity??0),i=e.side===`buy`?1:-1;this.emit(`fill`,{orderId:this.nextId(`ord`),side:Ju(e.side),price:t,quantity:r,time:this.fillTime(),positionId:e.id,reason:n,pnl:(t-e.entryPrice)*r*i})}checkPendingOrders(){let e=this.orders.filter(e=>this.isTriggered(e));for(let t of e)this.fill(t,t.type===`limit`?t.price:t.stopPrice??t.price)}isTriggered(e){if(e.type===`limit`)return e.side===`buy`?this.markPrice<=e.price:this.markPrice>=e.price;if(e.type===`stop`||e.type===`stopLimit`){let t=e.stopPrice??e.price;return e.side===`buy`?this.markPrice>=t:this.markPrice<=t}return!1}checkStops(){let e=!1;for(let t of[...this.positions]){let n=t.stopLoss!==void 0&&(t.side===`buy`?this.markPrice<=t.stopLoss:this.markPrice>=t.stopLoss),r=t.takeProfit!==void 0&&(t.side===`buy`?this.markPrice>=t.takeProfit:this.markPrice<=t.takeProfit);!n&&!r||(this.close(t,n?t.stopLoss:t.takeProfit,n?`stopLoss`:`takeProfit`),e=!0)}e&&this.emit(`positions`,this.positions)}nextId(e){return`${e}-${++this.seq}`}emit(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Ju(e){return e===`buy`?`sell`:`buy`}function Yu(e){switch(e){case`stop`:return`STOP`;case`stopLimit`:return`STOP LIMIT`;default:return`LIMIT`}}var Xu=class{listeners=new Map;on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>n.delete(t)}once(e,t){let n=this.on(e,e=>{n(),t(e)});return n}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}removeAllListeners(){this.listeners.clear()}},Zu=class extends Xu{currentBar=null;timeframeMs;tickRing;ringHead=0;ringCount=0;ringCapacity;constructor(e,n=1e3){super(),this.timeframeMs=(0,t.timeframeToMs)(e),this.ringCapacity=n,this.tickRing=Array(n)}setTimeframe(e){this.timeframeMs=(0,t.timeframeToMs)(e),this.currentBar=null,this.ringHead=0,this.ringCount=0}processTick(e){let t=(this.ringHead+this.ringCount)%this.ringCapacity;this.tickRing[t]=e,this.ringCount<this.ringCapacity?this.ringCount++:this.ringHead=(this.ringHead+1)%this.ringCapacity;let n=this.alignToTimeframe(e.time);!this.currentBar||this.currentBar.time!==n?(this.currentBar&&(this.currentBar.closed=!0,this.emit(`barClose`,this.currentBar)),this.currentBar={time:n,open:e.price,high:e.price,low:e.price,close:e.price,volume:e.volume,closed:!1,tickCount:1}):(this.currentBar.high=Math.max(this.currentBar.high,e.price),this.currentBar.low=Math.min(this.currentBar.low,e.price),this.currentBar.close=e.price,this.currentBar.volume+=e.volume,this.currentBar.tickCount++),this.emit(`bar`,this.currentBar)}processBar(e,t){if(t&&this.currentBar&&this.currentBar.time===e.time)this.currentBar={...e,closed:!0,tickCount:this.currentBar.tickCount+1},this.emit(`barClose`,this.currentBar),this.currentBar=null;else if(!t)this.currentBar={...e,closed:!1,tickCount:(this.currentBar?.tickCount??0)+1},this.emit(`bar`,this.currentBar);else{let t={...e,closed:!0,tickCount:1};this.emit(`barClose`,t),this.currentBar=null}}getCurrentBar(){return this.currentBar?{...this.currentBar}:null}getTickBuffer(){let e=Array(this.ringCount);for(let t=0;t<this.ringCount;t++)e[t]=this.tickRing[(this.ringHead+t)%this.ringCapacity];return e}reset(){this.currentBar=null,this.ringHead=0,this.ringCount=0}alignToTimeframe(e){return this.timeframeMs>0?Math.floor(e/this.timeframeMs)*this.timeframeMs:e}},Qu=class extends Xu{config;attempt=0;timer=null;active=!1;constructor(e){super(),this.config={...t.DEFAULT_RECONNECT,...e}}schedule(e){if(!this.config.enabled||!this.active)return;if(this.attempt++,this.attempt>this.config.maxRetries){this.emit(`giveUp`,{attempts:this.attempt-1}),this.active=!1;return}let t=this.computeDelay();this.emit(`attempt`,{attempt:this.attempt,delay:t}),this.timer=setTimeout(()=>{this.timer=null,this.active&&e()},t)}onConnected(){this.attempt=0,this.cancel(),this.emit(`success`,void 0)}start(){this.active=!0}stop(){this.active=!1,this.cancel(),this.attempt=0}cancel(){this.timer&&=(clearTimeout(this.timer),null)}getAttempt(){return this.attempt}isActive(){return this.active}computeDelay(){let e=this.config.baseDelay,t=this.config.backoffMultiplier**(this.attempt-1),n=Math.min(e*t,this.config.maxDelay),r=n*.25*(Math.random()*2-1);return Math.max(0,Math.round(n+r))}},$u=class{price=null;previousClose=null;visible=!0;flashUntil=0;pricePrecision=null;locale=`en-US`;setLocale(e){this.locale=e}setPrice(e,t){this.price!==null&&e!==this.price&&(this.flashUntil=Date.now()+300),this.previousClose=t??this.price??e,this.price=e}setVisible(e){this.visible=e}isVisible(){return this.visible}setPricePrecision(e){this.pricePrecision=e}getPrice(){return this.price}render(n,r,i){let a=i.style?.lastPrice;if(!this.visible||this.price===null||a?.visible===!1)return;let o=e.w(this.price,r),{chartRect:s}=r;if(o<s.y||o>s.y+s.height)return;let c=this.previousClose===null||this.price>=this.previousClose?a?.up??i.candleUp??`#1fa874`:a?.down??i.candleDown??`#e8505b`,l=Date.now()<this.flashUntil,u=a?.width??1;n.setLineDash((0,t.lineDash)(a?.style??`dashed`,[4,3],u)),n.strokeStyle=c,n.lineWidth=u,n.globalAlpha=l?1:.7,n.beginPath(),n.moveTo(s.x,Math.round(o)+.5),n.lineTo(s.x+s.width,Math.round(o)+.5),n.stroke(),n.setLineDash([]),n.globalAlpha=1;let f=s.x+s.width+1,p=this.pricePrecision??(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max),m=r.formatPrice?r.formatPrice(this.price):(0,t.formatPrice)(this.price,p,this.locale);n.font=`bold 11px ${i.font.family}`;let h=n.measureText(m).width,g=r.priceAxisWidth??t.PRICE_AXIS_WIDTH,_=Math.min(h+12,g-2);n.fillStyle=c,d(n,f,o-10,_,20,i);let v=f-5;n.beginPath(),n.moveTo(v,o),n.lineTo(v+5,o-5),n.lineTo(v+5,o+5),n.closePath(),n.fill(),n.fillStyle=`#FFFFFF`,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(m,f+5,o)}},ed=1e3,td=10,nd=1440,rd=[`tick`,`barClose`,`snapshot`,`connectionChange`,`error`],id=new WeakMap;function ad(e){if(e instanceof ud||!e.supportedTimeframes?.length)return e;let t=id.get(e);return t||(t=new ud(e,e.supportedTimeframes),id.set(e,t)),t}function od(e,n){if(n.includes(e))return e;let r=(0,t.pickBaseTimeframe)(e,n);return r&&Math.ceil((0,t.timeframeToMs)(e)/(0,t.timeframeToMs)(r))<=1440?r:null}function sd(e,n){if((0,t.tickBarCount)(n)!==null)return typeof e.fetchTrades==`function`&&typeof e.subscribeTrades==`function`;let r=e.supportedTimeframes;return!r?.length||od(n,r)!==null}function cd(e,n){let r=(0,t.parseTimeframe)(n);if(r?.unit===`M`){let t=new Date(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+r.count,1)}return e+(0,t.timeframeToMs)(n)}function ld(e,t){let n=t[0],r={time:e,open:n.open,high:n.high,low:n.low,close:n.close,volume:n.volume};for(let e=1;e<t.length;e++){let n=t[e];n.high>r.high&&(r.high=n.high),n.low<r.low&&(r.low=n.low),r.close=n.close,r.volume+=n.volume}return r}var ud=class{name;fetchHistoryBefore;searchSymbols;resolveSymbol;subscribeQuotes;fetchNews;fetchTrades;subscribeTrades;listeners=new Map;unsubscribe=[];live=null;bucket=null;parts=new Map;tail=null;generation=0;constructor(e,t){this.inner=e,this.baseTimeframes=t,this.name=e.name,e.fetchHistoryBefore&&(this.fetchHistoryBefore=(e,t,n,r)=>this.historyBefore(e,t,n,r)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols.bind(e)),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol.bind(e)),e.subscribeQuotes&&(this.subscribeQuotes=e.subscribeQuotes.bind(e)),e.fetchNews&&(this.fetchNews=e.fetchNews.bind(e)),e.fetchTrades&&(this.fetchTrades=e.fetchTrades.bind(e)),e.subscribeTrades&&(this.subscribeTrades=e.subscribeTrades.bind(e)),this.listen(`bar`,e=>this.onBar(e));for(let e of rd)this.listen(e,t=>this.emit(e,t.data))}baseFor(e){let t=od(e,this.baseTimeframes);if(!t)throw RangeError(`${this.name} cannot serve the ${e} timeframe`);return t}connect(e){let t=this.baseFor(e.timeframe);this.generation++,this.resetBucket(),this.live=t===e.timeframe?null:{symbol:e.symbol,target:e.timeframe,base:t},this.live&&this.resumeFromHistory(this.live.symbol,this.live.target),this.inner.connect({...e,timeframe:t})}disconnect(){this.generation++,this.inner.disconnect(),this.resetBucket(),this.live=null}getConnectionState(){return this.inner.getConnectionState()}async fetchHistory(e,t,n=500){let r=this.baseFor(t);if(r===t)return this.inner.fetchHistory(e,t,n);let i=this.generation,a=this.baseBarsFor(t,r,n),o=await this.inner.fetchHistory(e,r,Math.min(a,ed)),s=await this.extendBack(e,r,o,a,i);return this.rememberTail(e,t,s),this.toTarget(s,t,n)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.generation++;for(let e of this.unsubscribe)e();this.unsubscribe.length=0,this.listeners.clear(),this.inner.dispose()}async historyBefore(e,t,n,r){let i=this.inner.fetchHistoryBefore.bind(this.inner),a=this.baseFor(t);if(a===t)return i(e,t,n,r);let o=this.generation,s=this.baseBarsFor(t,a,r),c=await i(e,a,n,Math.min(s,ed)),l=await this.extendBack(e,a,c.filter(e=>e.time<n),s,o,1);return this.toTarget(l,t,r)}baseBarsFor(e,n,r){return(r+1)*Math.ceil((0,t.timeframeToMs)(e)/(0,t.timeframeToMs)(n))}async extendBack(e,t,n,r,i,a=1){let o=this.inner.fetchHistoryBefore?.bind(this.inner),s=n,c=a;for(;o&&s.length>0&&s.length<r&&c<10&&i===this.generation;){let n=s[0].time,i=await o(e,t,n,Math.min(r-s.length,ed));c++;let a=i.filter(e=>e.time<n);if(a.length===0)break;s=a.concat(s)}return s}toTarget(e,n,r){if(e.length===0)return[];let i=(0,t.resampleBars)(e,n);return i.length>1&&i[0].time!==e[0].time&&i.shift(),i.length>r?i.slice(i.length-r):i}rememberTail(e,n,r){if(r.length===0)return;let i=(0,t.timeframeBucketStart)(r[r.length-1].time,n),a=r.length;for(;a>0&&(0,t.timeframeBucketStart)(r[a-1].time,n)===i;)a--;this.tail={symbol:e,target:n,bucket:i,bars:r.slice(a)}}resumeFromHistory(e,t){let n=this.tail;if(!(!n||n.symbol!==e||n.target!==t)){this.bucket=n.bucket;for(let e of n.bars)this.parts.set(e.time,e)}}onBar(e){let n=this.live;if(!n){this.emit(`bar`,e.data);return}let{bar:r,closed:i}=e.data,a=(0,t.timeframeBucketStart)(r.time,n.target);if(this.bucket!==null&&a<this.bucket)return;if(this.bucket!==null&&a>this.bucket){let e=this.composed();e&&this.emit(`bar`,{bar:e,closed:!0}),this.resetBucket()}this.bucket=a,this.parts.set(r.time,r);let o=this.composed();if(!o)return;let s=i&&(0,t.timeframeBucketStart)(cd(r.time,n.base),n.target)!==a;this.emit(`bar`,{bar:o,closed:s}),s&&(this.resetBucket(),this.bucket=(0,t.timeframeBucketStart)(cd(r.time,n.base),n.target))}composed(){if(this.bucket===null||this.parts.size===0)return null;let e=[...this.parts.values()].sort((e,t)=>e.time-t.time);return ld(this.bucket,e)}resetBucket(){this.bucket=null,this.parts=new Map}listen(e,t){let n=e=>t(e);this.inner.on(e,n),this.unsubscribe.push(()=>this.inner.off(e,n))}emit(e,t){let n=this.listeners.get(e);if(!n)return;let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}},dd=1e3,fd=15e3,pd=[`tick`,`bar`,`barClose`,`snapshot`,`connectionChange`,`error`],md=class{bar=null;count=0;lastTime=-1/0;constructor(e){this.tradesPerBar=e}push(e){let t=[],n=!1;for(let r of e){if(this.bar)this.bar={...this.bar,high:Math.max(this.bar.high,r.price),low:Math.min(this.bar.low,r.price),close:r.price,volume:this.bar.volume+r.volume};else{let e=Math.max(r.time,this.lastTime+1);this.lastTime=e,this.bar={time:e,open:r.price,high:r.price,low:r.price,close:r.price,volume:r.volume},this.count=0}this.count++,n=!0,this.count>=this.tradesPerBar&&(t.push({bar:this.bar,closed:!0}),this.bar=null,n=!1)}return n&&this.bar&&t.push({bar:this.bar,closed:!1}),t}build(e){return this.bar=null,this.count=0,this.lastTime=-1/0,this.push(e).map(e=>e.bar)}},hd=class{name;supportedTimeframes;searchSymbols;resolveSymbol;subscribeQuotes;fetchNews;fetchTrades;subscribeTrades;listeners=new Map;tick=null;stopTrades=null;keepAlive=null;tickMode=!1;state=`disconnected`;constructor(e){this.inner=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes,e.searchSymbols&&(this.searchSymbols=e.searchSymbols.bind(e)),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol.bind(e)),e.subscribeQuotes&&(this.subscribeQuotes=e.subscribeQuotes.bind(e)),e.fetchNews&&(this.fetchNews=e.fetchNews.bind(e)),this.fetchTrades=e.fetchTrades.bind(e),this.subscribeTrades=e.subscribeTrades.bind(e);for(let t of pd)e.on(t,e=>{this.tickMode||this.emit(t,e.data)})}async fetchHistory(e,n,r){let i=(0,t.tickBarCount)(n);if(i===null)return this.inner.fetchHistory(e,n,r);let a=(await this.inner.fetchTrades(e,dd)).filter(yd).sort((e,t)=>e.time-t.time),o=new md(i),s=o.build(a);return this.tick={symbol:e,builder:o,after:a.length?a[a.length-1].time:-1/0},r!==void 0&&r>0?s.slice(-r):s}fetchHistoryBefore(e,n,r,i){return(0,t.tickBarCount)(n)!==null||!this.inner.fetchHistoryBefore?Promise.resolve([]):this.inner.fetchHistoryBefore(e,n,r,i)}connect(e){this.disconnect();let n=(0,t.tickBarCount)(e.timeframe);if(n===null){this.tickMode=!1,this.inner.connect(e);return}this.tickMode=!0;let r=this.tick?.symbol===e.symbol?this.tick:{symbol:e.symbol,builder:new md(n),after:-1/0};this.tick=r,this.stopTrades=this.inner.subscribeTrades(e.symbol,e=>{let t=e.filter(e=>yd(e)&&e.time>=r.after);for(let{bar:e,closed:n}of r.builder.push(t))this.emit(`bar`,{bar:e,closed:n}),this.emit(`tick`,{time:e.time,price:e.close,volume:e.volume})}),this.state=`connected`,this.emit(`connectionChange`,`connected`),this.keepAlive=setInterval(()=>this.emit(`connectionChange`,`connected`),fd)}disconnect(){this.tickMode?(this.stopTrades?.(),this.stopTrades=null,this.keepAlive&&clearInterval(this.keepAlive),this.keepAlive=null,this.state=`disconnected`):this.inner.disconnect()}getConnectionState(){return this.tickMode?this.state:this.inner.getConnectionState()}dispose(){this.stopTrades?.(),this.stopTrades=null,this.keepAlive&&clearInterval(this.keepAlive),this.keepAlive=null,this.listeners.clear(),this.inner.dispose()}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let n=this.listeners.get(e);if(!n)return;let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}},gd=new WeakMap;function _d(e){if(e instanceof hd||!vd(e))return e;let t=gd.get(e);return t||(t=new hd(e),gd.set(e,t)),t}function vd(e){return typeof e.fetchTrades==`function`&&typeof e.subscribeTrades==`function`}function yd(e){return Number.isFinite(e?.time)&&Number.isFinite(e?.price)&&Number.isFinite(e?.volume)}var bd=class extends Xu{config=null;adapter=null;aggregator=null;reconnector;priceLine=new $u;state=`disconnected`;lastPrice=null;previousClose=null;unsubscribers=[];heartbeatTimer=null;lastMessageTime=0;connectSeq=0;constructor(){super(),this.reconnector=new Qu,this.wireReconnector()}async connect(e){this.disconnect();let n=_d(ad(e.adapter));this.config={...t.DEFAULT_STREAM_CONFIG,...e,adapter:n},this.adapter=n,this.aggregator=new Zu(e.timeframe),this.reconnector.removeAllListeners(),this.reconnector.stop(),this.reconnector=new Qu(e.reconnect??t.DEFAULT_RECONNECT),this.wireReconnector(),this.aggregator.on(`bar`,e=>{this.emit(`barUpdate`,e),this.updatePrice(e.close)}),this.aggregator.on(`barClose`,e=>{this.previousClose=e.close,this.emit(`barClose`,e)}),this.wireAdapter(),this.reconnector.start(),await this.doConnect()}disconnect(){this.connectSeq++,this.reconnector.stop(),this.stopHeartbeat();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.adapter&&=(this.adapter.disconnect(),null),this.aggregator?.reset(),this.aggregator?.removeAllListeners(),this.aggregator=null,this.config=null,this.lastPrice=null,this.previousClose=null,this.setState(`disconnected`)}async switchTo(e,t){!this.config||!this.adapter||(this.reconnector.stop(),this.adapter.disconnect(),this.reconnector.start(),this.aggregator?.reset(),this.aggregator?.setTimeframe(t),this.lastPrice=null,this.previousClose=null,this.config.symbol=e,this.config.timeframe=t,await this.doConnect())}getConnectionState(){return this.state}getConnectionInfo(){return{state:this.state,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}}getLastPrice(){return this.lastPrice}async doConnect(){if(!this.config||!this.adapter)return;let e=++this.connectSeq,{symbol:t,timeframe:n}=this.config;this.setState(`connecting`);try{let r=await this.adapter.fetchHistory(t,n,this.config.historyLimit??500);if(e!==this.connectSeq||!this.adapter)return;r.length>0&&(this.previousClose=r[r.length-1].close,this.updatePrice(r[r.length-1].close)),this.emit(`snapshot`,r),this.adapter.connect({symbol:t,timeframe:n}),this.startHeartbeat()}catch(t){if(e!==this.connectSeq)return;let n=t instanceof Error?t.message:String(t);this.emit(`error`,{message:n,code:`CONNECT_FAILED`}),this.setState(`error`),this.reconnector.schedule(()=>this.doConnect())}}wireReconnector(){this.reconnector.on(`attempt`,({attempt:e,delay:t})=>{this.setState(`reconnecting`),this.emit(`connectionChange`,{state:`reconnecting`,reconnectAttempt:e,lastMessageTime:this.lastMessageTime})}),this.reconnector.on(`giveUp`,({attempts:e})=>{this.setState(`error`),this.emit(`error`,{message:`Reconnection failed after ${e} attempts`,code:`RECONNECT_EXHAUSTED`})})}wireAdapter(){if(!this.adapter)return;let e=this.adapter,t=e=>{let t=e.data;this.lastMessageTime=Date.now(),t===`connected`?(this.reconnector.onConnected(),this.setState(`connected`)):(t===`disconnected`||t===`error`)&&this.reconnector.schedule(()=>this.doConnect())};e.on(`connectionChange`,t),this.unsubscribers.push(()=>e.off(`connectionChange`,t));let n=e=>{this.lastMessageTime=Date.now();let t=e.data;this.emit(`tick`,t),(t.bid!==void 0||t.ask!==void 0)&&this.emit(`quote`,{bid:t.bid,ask:t.ask}),this.config?.aggregateTicks&&this.aggregator?this.aggregator.processTick(t):this.updatePrice(t.price)};e.on(`tick`,n),this.unsubscribers.push(()=>e.off(`tick`,n));let r=e=>{this.lastMessageTime=Date.now();let{bar:t,closed:n}=e.data;this.aggregator&&this.aggregator.processBar(t,n)};e.on(`bar`,r),this.unsubscribers.push(()=>e.off(`bar`,r));let i=e=>{this.emit(`error`,{message:e.data?.message??`Adapter error`})};e.on(`error`,i),this.unsubscribers.push(()=>e.off(`error`,i))}updatePrice(e){e!==this.lastPrice&&(this.lastPrice=e,this.priceLine.setPrice(e,this.previousClose??void 0),this.emit(`priceChange`,{price:e,previousClose:this.previousClose}))}setState(e){this.state!==e&&(this.state=e,this.emit(`connectionChange`,{state:e,reconnectAttempt:this.reconnector.getAttempt(),lastMessageTime:this.lastMessageTime}))}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{Date.now()-this.lastMessageTime>6e4&&this.state===`connected`&&(this.emit(`error`,{message:`Heartbeat timeout`,code:`HEARTBEAT_TIMEOUT`}),this.adapter?.disconnect(),this.reconnector.schedule(()=>this.doConnect()))},3e4)}stopHeartbeat(){this.heartbeatTimer&&=(clearInterval(this.heartbeatTimer),null)}dispose(){this.disconnect(),this.removeAllListeners()}},xd=class extends Xu{data;speed;index;status=`idle`;timer=null;constructor(e){if(super(),e.data.length===0)throw Error(`ReplayController requires non-empty data`);this.data=e.data,this.speed=Math.max(.01,e.speed??1),this.index=Math.max(0,Math.min(e.startIndex??0,e.data.length)),e.autoStart&&this.start()}getStatus(){return this.status}getIndex(){return this.index}getTotal(){return this.data.length}getPrefix(){return this.data.slice(0,this.index)}start(){if(this.status!==`playing`){if(this.index>=this.data.length){this.transition(`finished`);return}this.transition(`playing`),this.scheduleNext()}}pause(){this.status===`playing`&&(this.clearTimer(),this.transition(`paused`))}resume(){this.status===`paused`&&this.start()}stop(){this.clearTimer(),this.index=0,this.transition(`idle`)}step(e=1){if(!(e<=0)){this.clearTimer();for(let t=0;t<e;t++)if(!this.emitNext())return;this.status!==`finished`&&this.transition(`paused`)}}seek(e){let t=Math.max(0,Math.min(e,this.data.length));this.clearTimer(),this.index=t;let n=t>=this.data.length?`finished`:`paused`;this.transition(n)}setSpeed(e){this.speed=Math.max(.01,e),this.status===`playing`&&(this.clearTimer(),this.scheduleNext())}destroy(){this.clearTimer(),this.removeAllListeners()}scheduleNext(){let e=1e3/this.speed;this.timer=setTimeout(()=>{this.timer=null,this.status===`playing`&&this.emitNext()&&this.scheduleNext()},e)}emitNext(){if(this.index>=this.data.length)return this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1;let e=this.data[this.index],t=this.index;return this.index++,this.emit(`bar`,{bar:e,index:t,total:this.data.length}),this.index>=this.data.length?(this.transition(`finished`),this.emit(`finished`,{total:this.data.length}),!1):!0}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}transition(e){this.status!==e&&(this.status=e,this.emit(`stateChange`,{status:e,index:this.index,total:this.data.length}))}};function Sd(e){if(!Array.isArray(e)||e.length<6)return null;let t=e[0];if(typeof t!=`number`||!Number.isFinite(t))return null;let n=X(e[1]),r=X(e[2]),i=X(e[3]),a=X(e[4]),o=X(e[5]);return n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}function Cd(e){if(!wd(e))return null;let t=e.t;if(typeof t!=`number`||!Number.isFinite(t))return null;let n=X(e.o),r=X(e.h),i=X(e.l),a=X(e.c),o=X(e.v);if(n===null||r===null||i===null||a===null||o===null)return null;let s=typeof e.x==`boolean`?e.x:!1;return{bar:{time:t,open:n,high:r,low:i,close:a,volume:o},closed:s}}function X(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function wd(e){return typeof e==`object`&&!!e}function Z(e){let t=typeof e==`string`?Number(e):e;return typeof t==`number`&&Number.isFinite(t)?t:void 0}function Td(e){let n=e&&typeof e==`object`&&`data`in e?e.data:e;if(!n||typeof n!=`object`)return null;let r=n;return r.e===`24hrMiniTicker`?(0,t.readQuote)({symbol:r.s,last:Z(r.c),open:Z(r.o),high:Z(r.h),low:Z(r.l),volume:Z(r.v),time:Z(r.E)}):null}function Ed(e){if(!e||typeof e!=`object`)return null;let n=e;return(0,t.readQuote)({symbol:n.symbol,last:Z(n.lastPrice),change:Z(n.priceChange),changePercent:Z(n.priceChangePercent),open:Z(n.openPrice),high:Z(n.highPrice),low:Z(n.lowPrice),prevClose:Z(n.prevClosePrice),volume:Z(n.volume),bid:Z(n.bidPrice),ask:Z(n.askPrice),time:Z(n.closeTime)})}function Dd(e){if(!e||typeof e!=`object`)return null;let t=e,n=Z(t.T),r=Z(t.p),i=Z(t.q);return n!==void 0&&r!==void 0&&i!==void 0?{time:n,price:r,volume:i}:null}var Od={"1s":`1s`,"1m":`1m`,"3m":`3m`,"5m":`5m`,"15m":`15m`,"30m":`30m`,"1h":`1h`,"2h":`2h`,"4h":`4h`,"6h":`6h`,"8h":`8h`,"12h":`12h`,"1d":`1d`,"3d":`3d`,"1w":`1w`,"1M":`1M`},kd=1e3,Ad=200,jd=[`USDT`,`USDC`,`FDUSD`,`BTC`,`ETH`,`BNB`,`EUR`,`TRY`,`BRL`,`JPY`];function Md(e){let t=e.currency?jd.indexOf(e.currency):-1;return t<0?0:40-t*3}function Nd(e){if(typeof e.symbol!=`string`||e.status!==`TRADING`)return null;let n=typeof e.baseAsset==`string`?e.baseAsset:``,r=typeof e.quoteAsset==`string`?e.quoteAsset:``,i=Array.isArray(e.filters)?e.filters.find(e=>typeof e==`object`&&!!e&&e.filterType===`PRICE_FILTER`&&typeof e.tickSize==`string`):void 0,a={symbol:e.symbol,description:n&&r?`${n} / ${r}`:e.symbol,exchange:`Binance`,type:`crypto`};return i&&(a.pricePrecision=(0,t.stepDecimals)(i.tickSize),a.minTick=Number(i.tickSize)),a.timezone=`UTC`,r&&(a.currency=r),a}function Pd(e){let t=e?.symbols;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=Nd(e);t&&n.push(t)}return n}var Fd=class{name=`binance`;supportedTimeframes=Object.keys(Od);ws=null;state=`disconnected`;listeners=new Map;config=null;restBase;wsBase;symbolList=null;constructor(e){this.restBase=e?.restBase??`https://api.binance.com/api/v3`,this.wsBase=e?.wsBase??`wss://stream.binance.com:9443/ws`}connect(e){this.config=e,this.connectWs()}disconnect(){if(this.ws){let e=this.ws;e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n=500){return this.fetchKlines(e,t,n,``)}async searchSymbols(e,n){return(0,t.rankSymbols)(await this.loadSymbols(),e,n?.limit??50,Md)}async resolveSymbol(e){if(this.symbolList){let t=(await this.symbolList.catch(()=>null))?.find(t=>t.symbol===e);if(t)return t}let t=await fetch(`${this.restBase}/exchangeInfo?symbol=${encodeURIComponent(e)}`);return t.ok?Pd(await t.json())[0]??null:null}loadSymbols(){return this.symbolList||(this.symbolList=(async()=>{let e=await fetch(`${this.restBase}/exchangeInfo`);if(!e.ok)throw Error(`Binance REST error: ${e.status}`);return Pd(await e.json())})(),this.symbolList.catch(()=>{this.symbolList=null})),this.symbolList}subscribeQuotes(e,t){let n=[...new Set(e.map(e=>e.trim().toUpperCase()))].filter(e=>/^[A-Z0-9]{2,30}$/.test(e)).slice(0,Ad);if(n.length===0)return()=>{};let r=!1,i=null,a=null,o=0,s=new Set,c=new AbortController;(async()=>{let e=await fetch(`${this.restBase}/ticker/24hr?symbols=${encodeURIComponent(JSON.stringify(n))}`,{signal:c.signal});if(e.ok)return e.json();let t=await fetch(`${this.restBase}/ticker/24hr`,{signal:c.signal});if(!t.ok)return[];let r=await t.json(),i=new Set(n);return Array.isArray(r)?r.filter(e=>i.has(e?.symbol)):[]})().then(e=>{if(r||!Array.isArray(e))return;let n=e.map(Ed).filter(e=>e!==null&&!s.has(e.symbol));n.length>0&&t(n)}).catch(()=>{});let l=this.wsBase.replace(/\/ws\/?$/,``),u=()=>{if(!r){try{i=new WebSocket(`${l}/stream?streams=${n.map(e=>`${e.toLowerCase()}@miniTicker`).join(`/`)}`)}catch{d();return}i.onopen=()=>{o=0},i.onmessage=e=>{let n;try{n=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}let i=Td(n);!i||r||(s.add(i.symbol),t([i]))},i.onclose=()=>{i=null,d()}}},d=()=>{r||(a=setTimeout(u,Math.min(3e4,1e3*2**o++)))};return u(),()=>{r=!0,c.abort(),a&&clearTimeout(a),i&&=(i.onopen=null,i.onmessage=null,i.onclose=null,i.close(),null)}}async fetchTrades(e,t=1e3){let n=Math.max(1,Math.min(1e3,Math.floor(t))),r=await fetch(`${this.restBase}/aggTrades?symbol=${encodeURIComponent(e.toUpperCase())}&limit=${n}`);if(!r.ok)throw Error(`Binance aggTrades ${r.status}`);let i=await r.json();return Array.isArray(i)?i.map(Dd).filter(e=>e!==null):[]}subscribeTrades(e,t){let n=`${e.trim().toLowerCase()}@aggTrade`;if(!/^[a-z0-9]{2,30}@aggTrade$/.test(n))return()=>{};let r=!1,i=null,a=null,o=0,s=()=>{if(!r){try{i=new WebSocket(`${this.wsBase}/${n}`)}catch{c();return}i.onopen=()=>{o=0},i.onmessage=e=>{let n;try{n=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}let i=Dd(n);i&&!r&&t([i])},i.onclose=()=>{i=null,c()}}},c=()=>{r||(a=setTimeout(s,Math.min(3e4,1e3*2**o++)))};return s(),()=>{r=!0,a&&clearTimeout(a),i&&=(i.onopen=null,i.onmessage=null,i.onclose=null,i.close(),null)}}fetchHistoryBefore(e,t,n,r=500){return this.fetchKlines(e,t,Math.min(r,kd),`&endTime=${Math.floor(n)-1}`)}async fetchKlines(e,t,n,r){let i=Od[t]??`15m`,a=`${this.restBase}/klines?symbol=${e}&interval=${i}&limit=${n}${r}`,o=await fetch(a);if(!o.ok)throw Error(`Binance REST error: ${o.status}`);let s=await o.json();if(!Array.isArray(s))return[];let c=[];for(let e of s){let t=Sd(e);t&&c.push(t)}return c}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}connectWs(){if(!this.config)return;let e=`${this.config.symbol.toLowerCase()}@kline_${Od[this.config.timeframe]??`15m`}`,t=`${this.wsBase}/${e}`;this.setState(`connecting`);try{this.ws=new WebSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws.onopen=()=>{this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`)},this.ws.onmessage=e=>{let t;try{t=JSON.parse(typeof e.data==`string`?e.data:``)}catch{return}typeof t==`object`&&t&&t.e===`kline`&&this.handleKline(t.k)},this.ws.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},this.ws.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}handleKline(e){let t=Cd(e);if(!t)return;let{bar:n,closed:r}=t;this.emitEvent(`bar`,{bar:n,closed:r}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume})}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},Id=class{name=`mock`;state=`disconnected`;listeners=new Map;config=null;options;tickTimer=null;currentPrice;oldestOpen=new Map;constructor(e){this.options={basePrice:100,volatility:1.5,tickInterval:2e3,historySize:500,...e},this.currentPrice=this.options.basePrice}connect(e){this.config=e,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startTicking()}disconnect(){this.stopTicking(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}subscribeQuotes(e,t){let n=[...new Set(e)].map(e=>{let t=this.options.basePrice*(.5+Ld(e)%1e3/1e3);return{symbol:e,open:t,last:t,high:t,low:t,volume:0}});if(n.length===0)return()=>{};let r=this.options.volatility/100,i=()=>t(n.map(e=>({symbol:e.symbol,last:e.last,open:e.open,high:e.high,low:e.low,volume:e.volume,change:e.last-e.open,changePercent:(e.last-e.open)/e.open*100,time:Date.now()})));i();let a=setInterval(()=>{for(let e of n)e.last=Math.max(e.open*.01,e.last*(1+(Math.random()-.5)*r)),e.high=Math.max(e.high,e.last),e.low=Math.min(e.low,e.last),e.volume+=Math.random()*100;i()},this.options.tickInterval);return()=>clearInterval(a)}async fetchTrades(e,t=1e3){let n=Math.max(1,Math.min(1e3,Math.floor(t))),r=Date.now(),i=this.options.volatility/1e3,a=this.options.basePrice*(.5+Ld(e)%1e3/1e3),o=[];for(let e=n-1;e>=0;e--)a=Math.max(a*.5,a*(1+(Math.random()-.5)*i)),o.push({time:r-e*1e3,price:a,volume:Math.random()*5});return o}subscribeTrades(e,t){let n=this.options.volatility/1e3,r=this.options.basePrice*(.5+Ld(e)%1e3/1e3),i=setInterval(()=>{let e=[];for(let t=0;t<3;t++)r=Math.max(r*.5,r*(1+(Math.random()-.5)*n)),e.push({time:Date.now(),price:r,volume:Math.random()*5});t(e)},this.options.tickInterval);return()=>clearInterval(i)}async fetchHistory(e,t,n){let r=this.options.historyGenerator?this.options.historyGenerator(e,t,n??this.options.historySize):this.generateHistory(t,n??this.options.historySize);return r.length>0&&this.oldestOpen.set(e,r[0].open),r}async fetchHistoryBefore(e,n,r,i){let a=(0,t.timeframeToMs)(n),o=this.options.volatility/100,s=Array(Math.max(0,i)),c=this.oldestOpen.get(e)??this.options.basePrice;for(let e=0;e<i;e++){let t=c/(1+(Math.random()-.52)*o),n=Math.max(t,c)+Math.random()*c*o*.3,l=Math.max(0,Math.min(t,c)-Math.random()*c*o*.3),u=Math.floor(1e4+Math.random()*1e5);s[i-1-e]={time:r-(e+1)*a,open:t,high:n,low:l,close:c,volume:u},c=t}return this.oldestOpen.set(e,c),s}async searchSymbols(e,n){return(0,t.rankSymbols)(this.options.symbols??[],e,n?.limit??50)}async resolveSymbol(e){return this.options.symbols?.find(t=>t.symbol===e)??null}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}generateHistory(e,n){let r=[],i=Date.now(),a=(0,t.timeframeToMs)(e),o=this.options.basePrice,s=this.options.volatility/100;for(let e=n-1;e>=0;e--){let t=i-e*a,n=(Math.random()-.48)*o*s,c=o;o+=n;let l=Math.max(c,o)+Math.random()*o*s*.3,u=Math.min(c,o)-Math.random()*o*s*.3,d=Math.floor(1e4+Math.random()*1e5);r.push({time:t,open:c,high:l,low:u,close:o,volume:d})}return this.currentPrice=o,r}startTicking(){this.stopTicking();let e=this.options.tickInterval??2e3;this.tickTimer=setInterval(()=>{if(this.state!==`connected`||!this.config)return;let e=this.options.volatility/100,n=(Math.random()-.48)*this.currentPrice*e*.3;this.currentPrice+=n;let r=Date.now(),i=(0,t.timeframeToMs)(this.config.timeframe),a={time:Math.floor(r/i)*i,open:this.currentPrice-n,high:Math.max(this.currentPrice,this.currentPrice-n)+Math.abs(n)*.2,low:Math.min(this.currentPrice,this.currentPrice-n)-Math.abs(n)*.2,close:this.currentPrice,volume:Math.floor(100+Math.random()*5e3)};this.emitEvent(`bar`,{bar:a,closed:!1}),this.emitEvent(`tick`,{time:r,price:this.currentPrice,volume:a.volume})},e)}stopTicking(){this.tickTimer&&=(clearInterval(this.tickTimer),null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Ld(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t}var Rd=class{name;supportedTimeframes;ws=null;state=`disconnected`;config=null;listeners=new Map;opts;fetchHistoryBefore;searchSymbols;resolveSymbol;constructor(e){this.opts=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes;let t=e.fetchHistoryBefore;t&&(this.fetchHistoryBefore=(e,n,r,i)=>t(e,n,r,i)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol)}connect(e){this.config=e,this.openSocket()}disconnect(){let e=this.config;if(this.ws){if(this.opts.unsubscribeMessage&&e)try{this.sendMessage(this.opts.unsubscribeMessage(e))}catch{}let t=this.ws;t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null,t.close(),this.ws=null}this.setState(`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchHistory(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}openSocket(){let e=this.config;if(!e)return;let t=this.opts.wsUrl(e);this.setState(`connecting`);let n;try{n=this.createSocket(t)}catch{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket creation failed`}),this.emitEvent(`connectionChange`,`error`);return}this.ws=n,n.onopen=()=>{if(this.setState(`connected`),this.emitEvent(`connectionChange`,`connected`),this.opts.subscribeMessage)try{this.sendMessage(this.opts.subscribeMessage(e))}catch{}},n.onmessage=t=>{let n=this.decode(t.data);if(n===void 0)return;let r;try{r=this.opts.parseMessage(n,e)}catch{return}r&&(r.bar&&this.emitEvent(`bar`,{bar:r.bar,closed:r.closed??!1}),r.tick?this.emitEvent(`tick`,r.tick):r.bar&&this.emitEvent(`tick`,{time:Date.now(),price:r.bar.close,volume:r.bar.volume}))},n.onerror=()=>{this.setState(`error`),this.emitEvent(`error`,{message:`WebSocket error`})},n.onclose=()=>{this.setState(`disconnected`),this.emitEvent(`connectionChange`,`disconnected`)}}sendMessage(e){e===void 0||!this.ws||this.ws.send(typeof e==`string`?e:JSON.stringify(e))}decode(e){if(this.opts.decode)try{return this.opts.decode(e)}catch{return}if(typeof e==`string`)try{return JSON.parse(e)}catch{return}return e}createSocket(e){if(this.opts.socketFactory)return this.opts.socketFactory(e);let t=globalThis.WebSocket;if(!t)throw Error(`No WebSocket implementation available`);return new t(e)}setState(e){this.state=e}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}},zd=class{name;supportedTimeframes;state=`disconnected`;listeners=new Map;config=null;timer=null;lastBarTime=0;opts;fetchHistoryBefore;searchSymbols;resolveSymbol;constructor(e){this.opts=e,this.name=e.name,this.supportedTimeframes=e.supportedTimeframes;let t=e.fetchHistoryBefore;t&&(this.fetchHistoryBefore=(e,n,r,i)=>t(e,n,r,i)),e.searchSymbols&&(this.searchSymbols=e.searchSymbols),e.resolveSymbol&&(this.resolveSymbol=e.resolveSymbol)}connect(e){this.config=e,this.lastBarTime=0,this.state=`connected`,this.emitEvent(`connectionChange`,`connected`),this.startPolling()}disconnect(){this.stopPolling(),this.state=`disconnected`,this.emitEvent(`connectionChange`,`disconnected`)}getConnectionState(){return this.state}fetchHistory(e,t,n){return this.opts.fetchBars(e,t,n??this.opts.defaultHistoryLimit??500)}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}dispose(){this.disconnect(),this.listeners.clear()}async poll(){let e=this.config;if(!e||this.state!==`connected`)return;let t;try{t=await this.opts.fetchBars(e.symbol,e.timeframe,this.opts.pollLimit??2)}catch(e){this.emitEvent(`error`,{message:`Poll failed`,cause:e});return}if(t.length===0)return;let n=t[t.length-1];if(this.lastBarTime>0&&n.time>this.lastBarTime){let e=t.find(e=>e.time===this.lastBarTime);e&&this.emitEvent(`bar`,{bar:e,closed:!0})}this.emitEvent(`bar`,{bar:n,closed:!1}),this.emitEvent(`tick`,{time:Date.now(),price:n.close,volume:n.volume}),this.lastBarTime=n.time}startPolling(){this.stopPolling(),this.poll();let e=this.opts.setInterval??((e,t)=>setInterval(e,t));this.timer=e(()=>{this.poll()},this.opts.intervalMs??5e3)}stopPolling(){this.timer!==null&&((this.opts.clearInterval??(e=>clearInterval(e)))(this.timer),this.timer=null)}emitEvent(e,t){let n=this.listeners.get(e);if(n){let r={type:e,data:t,timestamp:Date.now()};for(let e of n)e(r)}}};function Q(e){if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e==`string`){let t=parseFloat(e);return Number.isFinite(t)?t:null}return null}function Bd(e){return typeof e==`object`&&!!e}var Vd={"1m":60,"5m":300,"15m":900,"1h":3600,"6h":21600,"1d":86400};function Hd(e){return Vd[e]??3600}var Ud=class extends zd{constructor(e={}){let t=e.restBase??`https://api.exchange.coinbase.com`;super({name:`coinbase`,supportedTimeframes:Object.keys(Vd),intervalMs:e.intervalMs??5e3,pollLimit:2,fetchBars:(e,n)=>Wd(t,e,n)})}};async function Wd(e,t,n){let r=`${e}/products/${t}/candles?granularity=${Hd(n)}`,i=await fetch(r);if(!i.ok)throw Error(`Coinbase REST error: ${i.status}`);return Gd(await i.json())}function Gd(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Kd(n);e&&t.push(e)}return t.sort((e,t)=>e.time-t.time),t}function Kd(e){if(!Array.isArray(e)||e.length<6)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:i,high:r,low:n,close:a,volume:o}}var qd={"1m":`1`,"3m":`3`,"5m":`5`,"15m":`15`,"30m":`30`,"1h":`60`,"2h":`120`,"4h":`240`,"6h":`360`,"12h":`720`,"1d":`D`,"1w":`W`,"1M":`M`};function Jd(e){return qd[e]??`1`}var Yd=class extends Rd{constructor(e={}){let t=e.restBase??`https://api.bybit.com`,n=e.wsBase??`wss://stream.bybit.com/v5/public/spot`,r=e.category??`spot`;super({name:`bybit`,wsUrl:()=>n,subscribeMessage:e=>({op:`subscribe`,args:[`kline.${Jd(e.timeframe)}.${e.symbol}`]}),unsubscribeMessage:e=>({op:`unsubscribe`,args:[`kline.${Jd(e.timeframe)}.${e.symbol}`]}),supportedTimeframes:Object.keys(qd),parseMessage:Xd,fetchHistory:(e,n,i)=>Zd(t,r,e,n,i),fetchHistoryBefore:(e,n,i,a)=>Zd(t,r,e,n,a,Math.floor(i)-1)})}};function Xd(e){if(!Bd(e)||typeof e.topic!=`string`||!e.topic.startsWith(`kline.`))return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Bd(n))return null;let r=Q(n.start),i=Q(n.open),a=Q(n.high),o=Q(n.low),s=Q(n.close),c=Q(n.volume);if(r===null||i===null||a===null||o===null||s===null||c===null)return null;let l=typeof n.confirm==`boolean`?n.confirm:!1;return{bar:{time:r,open:i,high:a,low:o,close:s,volume:c},closed:l}}async function Zd(e,t,n,r,i,a){let o=`${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${Jd(r)}&limit=${Math.min(Math.max(i,1),1e3)}${a===void 0?``:`&end=${a}`}`,s=await fetch(o);if(!s.ok)throw Error(`Bybit REST error: ${s.status}`);return Qd(await s.json())}function Qd(e){if(!Bd(e)||!Bd(e.result))return[];let t=e.result.list;if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=$d(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function $d(e){if(!Array.isArray(e)||e.length<6)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[5]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t,open:n,high:r,low:i,close:a,volume:o}}var ef={"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"4h":240,"1d":1440,"1w":10080};function tf(e){return ef[e]??1}var nf=class extends Rd{constructor(e={}){let t=e.restBase??`https://api.kraken.com`,n=e.wsBase??`wss://ws.kraken.com/v2`;super({name:`kraken`,wsUrl:()=>n,subscribeMessage:e=>({method:`subscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:tf(e.timeframe)}}),unsubscribeMessage:e=>({method:`unsubscribe`,params:{channel:`ohlc`,symbol:[e.symbol],interval:tf(e.timeframe)}}),supportedTimeframes:Object.keys(ef),parseMessage:rf,fetchHistory:(e,n)=>af(t,e,n)})}};function rf(e){if(!Bd(e)||e.channel!==`ohlc`)return null;let t=e.data;if(!Array.isArray(t)||t.length===0)return null;let n=t[t.length-1];if(!Bd(n))return null;let r=Q(n.open),i=Q(n.high),a=Q(n.low),o=Q(n.close),s=Q(n.volume),c=typeof n.interval_begin==`string`?Date.parse(n.interval_begin):NaN;return r===null||i===null||a===null||o===null||s===null||!Number.isFinite(c)?null:{bar:{time:c,open:r,high:i,low:a,close:o,volume:s},closed:!1}}async function af(e,t,n){let r=tf(n),i=t.replace(`/`,``),a=`${e}/0/public/OHLC?pair=${encodeURIComponent(i)}&interval=${r}`,o=await fetch(a);if(!o.ok)throw Error(`Kraken REST error: ${o.status}`);return of(await o.json())}function of(e){if(!Bd(e)||!Bd(e.result))return[];let t=null;for(let[n,r]of Object.entries(e.result))if(n!==`last`&&Array.isArray(r)){t=r;break}if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=sf(e);t&&n.push(t)}return n.sort((e,t)=>e.time-t.time),n}function sf(e){if(!Array.isArray(e)||e.length<7)return null;let t=Q(e[0]),n=Q(e[1]),r=Q(e[2]),i=Q(e[3]),a=Q(e[4]),o=Q(e[6]);return t===null||n===null||r===null||i===null||a===null||o===null?null:{time:t*1e3,open:n,high:r,low:i,close:a,volume:o}}var cf={visible:!0,showSymbol:!0,showOHLC:!0,showChange:!0,showVolume:!0,position:`top-left`,fontSize:12},lf=class{config={...cf};symbol=``;timeframe=``;hoverBar=null;indicators=[];statusText=null;locale=`en-US`;pricePrecision=null;setConfig(e){Object.assign(this.config,e)}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}setSymbol(e){this.symbol=e}setTimeframe(e){this.timeframe=e}setChartType(e){}setHoverBar(e){this.hoverBar=e}setIndicatorValues(e){this.indicators=e}setStatusText(e){this.statusText=e}getHeight(){if(!this.config.visible||this.config.position!==`top-left`)return 0;let e=this.config.fontSize,t=6;return this.config.showSymbol?t+=e+6:this.statusText&&(t+=e+4),this.config.showOHLC&&(t+=e+3),this.config.showVolume&&(t+=e+2),t}render(e,n,r,i){if(!this.config.visible||i.length===0)return;let a=this.hoverBar??i[i.length-1],o=i.length>1?i[i.length-2]:a,{chartRect:s}=n,c=this.config.fontSize,l=r.style?.legend.text??r.text,u=r.style?.legend.label??r.textSecondary,d=this.config.position===`top-left`,f=d?s.x+8:s.x+s.width-8,p=s.y+6;if(e.textAlign=d?`left`:`right`,e.textBaseline=`top`,this.config.showSymbol){e.font=`bold ${c+2}px ${r.font.family}`,e.fillStyle=l;let t=[this.symbol,this.timeframe].filter(Boolean).join(` · `),n=this.statusText?`${t} ${this.statusText}`:t;e.fillText(n,f,p),p+=c+6}else this.statusText&&(e.font=`${c}px ${r.font.family}`,e.fillStyle=u,e.fillText(this.statusText,f,p),p+=c+4);if(this.config.showOHLC){e.font=`${c}px ${r.font.family}`;let i=a.close>=a.open,s=this.pricePrecision??(0,t.autoPricePrecision)(n.priceRange.min,n.priceRange.max),m=e=>n.formatPrice?.(e)??(0,t.formatPrice)(e,s,this.locale),h=[{label:`O`,value:m(a.open),color:l},{label:`H`,value:m(a.high),color:l},{label:`L`,value:m(a.low),color:l},{label:`C`,value:m(a.close),color:i?r.candleUp:r.candleDown}];if(this.config.showChange){let e=a.close-o.close,n=o.close===0?0:e/o.close*100,i=e>=0?`+`:``,s=(0,t.formatPrice)(n,2,this.locale);h.push({label:``,value:`${i}${m(e)} (${i}${s}%)`,color:e>=0?r.candleUp:r.candleDown})}let g=f;if(d)for(let t of h)t.label&&(e.fillStyle=u,e.fillText(t.label,g,p),g+=e.measureText(t.label+` `).width),e.fillStyle=t.color,e.fillText(t.value,g,p),g+=e.measureText(t.value+` `).width;else{let t=h.map(e=>`${e.label} ${e.value}`).join(` `);e.fillStyle=l,e.fillText(t,f,p)}p+=c+3}if(this.config.showVolume){e.font=`${c-1}px ${r.font.family}`,e.fillStyle=u;let t=a.volume>=1e6?`${(a.volume/1e6).toFixed(2)}M`:a.volume>=1e3?`${(a.volume/1e3).toFixed(2)}K`:a.volume.toFixed(0);e.fillText(`Vol ${t}`,f,p),p+=c+2}if(this.indicators.length>0){e.font=`${c-1}px ${r.font.family}`;let t=f;for(let n of this.indicators){e.fillStyle=n.color;let r=`${n.name} ${n.value}`;e.fillText(r,t,p),t+=e.measureText(r+` `).width}}}},uf=class{static toDataURL(e,t){let n=e.querySelectorAll(`canvas`);if(n.length===0)return``;let r=n[0],i=r.width,a=r.height,o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);t&&(s.fillStyle=t,s.fillRect(0,0,i,a));let c=Array.from(n).sort((e,t)=>(parseInt(e.style.zIndex)||0)-(parseInt(t.style.zIndex)||0));for(let e of c)s.drawImage(e,0,0);return o.toDataURL(`image/png`)}static async toBlob(e,t){let n=this.toDataURL(e,t);return n?(await fetch(n)).blob():null}static download(e,t=`chart.png`,n){let r=this.toDataURL(e,n);if(!r)return;let i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i)}},df=class{config=null;setConfig(e){this.config=e}isVisible(){return!!this.config?.text}render(e,t,n){if(!this.config?.text)return;let{chartRect:r}=t,i=this.config.fontSize??48,a=n.style?.watermark.color??this.config.color??n.textSecondary;e.save(),e.globalAlpha=.07,e.font=`bold ${i}px ${n.font.family}`,e.fillStyle=a,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(this.config.text,r.x+r.width/2,r.y+r.height/2),e.restore()}},ff=class{visible=!0;timeframeMs=0;setVisible(e){this.visible=e}isVisible(){return this.visible}setTimeframeMs(e){this.timeframeMs=e}render(t,n,r,i){if(!this.visible||!(this.timeframeMs>0)||i.length===0)return;let a=i[i.length-1],o=(a.time>0xe8d4a51000?a.time:a.time*1e3)+this.timeframeMs-Date.now();if(o<=0)return;let s=this.formatRemaining(o),c=e.b(i.length-1,n),l=n.chartRect.y+n.chartRect.height-4;c<n.chartRect.x||c>n.chartRect.x+n.chartRect.width||(t.font=`${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`bottom`,t.textAlign=`center`,t.fillStyle=r.textSecondary,t.fillText(s,c,l))}formatRemaining(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}:${String(r).padStart(2,`0`)}:${String(i).padStart(2,`0`)}`:`${r}:${String(i).padStart(2,`0`)}`}},pf={solid:null,dashed:[6,4],dotted:[2,3]},mf=class{config={visible:!1};cachedBreaksTyped=[];cachedMedianStep=0;cacheValid=!1;lastDataLength=0;locale=`en-US`;tz=null;setConfig(e){Object.assign(this.config,e)}setLocale(e){this.locale=e}setTimezone(e){e!==this.tz&&(this.tz=e,this.invalidateCache())}isVisible(){return this.config.visible}setVisible(e){this.config.visible=e}computeBreaksTyped(e){if(e.length<2)return[];if(this.cacheValid&&e.length===this.lastDataLength)return this.cachedBreaksTyped;let n=[],r=(0,t.timeParts)(this.toMs(e[0].time),this.tz);for(let i=1;i<e.length;i++){let a=this.toMs(e[i].time),o=(0,t.timeParts)(a,this.tz);if(o.year!==r.year)n.push({idx:i,kind:`year`,time:a,year:o.year});else if(o.month!==r.month)n.push({idx:i,kind:`month`,time:a,year:o.year});else if(o.day!==r.day){let e=new Date(Date.UTC(o.year,o.month-1,o.day)).getUTCDay()===1;n.push({idx:i,kind:e?`week`:`day`,time:a,year:o.year})}r=o}return this.lastDataLength=e.length,this.cachedBreaksTyped=n,this.cachedMedianStep=_f(e),this.cacheValid=!0,n}toMs(e){return e>0xe8d4a51000?e:e*1e3}render(e,t,n,r){this.renderLines(e,t,n,r),this.renderLabels(e,t,n,r)}renderLines(e,t,n,r){let i=this.marks(t,r,n);if(i.length===0)return;let{chartRect:a}=t,o=this.look(n),s=pf[o.style];e.save(),s&&e.setLineDash(s),e.strokeStyle=o.color;for(let t of i)e.globalAlpha=t.alpha,e.lineWidth=t.width,e.beginPath(),e.moveTo(t.px,a.y),e.lineTo(t.px,a.y+a.height),e.stroke();e.restore()}renderLabels(e,t,n,r){let i=this.marks(t,r,n).filter(e=>e.label!==null);if(i.length===0)return;let{chartRect:a}=t;e.save(),e.font=`600 11px ${n.font.family}`,e.textBaseline=`top`,e.textAlign=`left`,e.fillStyle=n.textSecondary;for(let t of i)e.globalAlpha=Math.min(1,t.alpha+.35),e.fillText(t.label,t.px+4,a.y+4);e.restore()}lineRects(e,t,n){let r=this.marks(e,n,t);if(r.length===0)return[];let{color:i,style:a}=this.look(t),o=pf[a]??void 0,{y:s,height:c}=e.chartRect;return r.map(e=>({x:e.px-e.width/2,y:s,width:e.width,height:c,color:i,alpha:e.alpha,...o?{dash:o}:{}}))}look(e){let t=e.style?.sessionBreaks;return{color:t?.color??this.config.color??e.axisLine,style:t?.style??this.config.lineStyle??`dashed`,width:t?.width??this.config.lineWidth??1}}marks(n,r,i){if(!this.config.visible||r.length<2)return[];let a=this.computeBreaksTyped(r);if(a.length===0||this.cachedMedianStep>=1380*60*1e3)return[];let{chartRect:o}=n,s=this.look(i).width,c=[];for(let r of a){let i=e.b(r.idx,n)-(n.barWidth+n.barSpacing)/2;if(i<o.x-1||i>o.x+o.width+1)continue;let a=Math.round(i)+.5,l=.25,u=s,d=null;r.kind===`day`?l=.22:r.kind===`week`?(l=.34,d=(0,t.zonedDateFormatter)(this.locale,hf,this.tz)(r.time)):r.kind===`month`?(l=.5,u=s+.5,d=(0,t.zonedDateFormatter)(this.locale,gf,this.tz)(r.time)):(l=.7,u=s+1,d=String(r.year)),c.push({px:a,width:u,alpha:l,label:d})}return c}invalidateCache(){this.lastDataLength=0,this.cachedBreaksTyped=[],this.cachedMedianStep=0,this.cacheValid=!1}},hf={month:`short`,day:`numeric`},gf={month:`short`,year:`numeric`};function _f(e){if(e.length<2)return 0;let t=Math.min(50,e.length-1),n=[];for(let r=1;r<=t;r++){let t=e[r-1].time,i=e[r].time,a=t>0xe8d4a51000?t:t*1e3,o=i>0xe8d4a51000?i:i*1e3;n.push(o-a)}return n.sort((e,t)=>e-t),n[Math.floor(n.length/2)]}var vf=864e5;function yf(e,t){let n={...e,...t};return t.tzOffsetMinutes!==void 0&&t.timeZone===void 0&&delete n.timeZone,n.windows?n.windows=n.windows.map(e=>({...e})):delete n.windows,n}function bf(e,t){let n=((e+t*6e4)%vf+vf)%vf;return Math.floor(n/6e4)}function xf(e,t,n){return t===n?!0:t<n?e>=t&&e<n:e>=t||e<n}function Sf(e,n){let r=bf(e,n.timeZone?(0,t.zoneOffsetMinutes)(n.timeZone,e):n.tzOffsetMinutes??0);return n.windows&&n.windows.length>0?n.windows.some(e=>xf(r,e.startMinute,e.endMinute)):xf(r,n.startMinute,n.endMinute)}var Cf={startMinute:570,endMinute:960,tzOffsetMinutes:-300,timeZone:`America/New_York`},wf=class{visible=!1;config={...Cf};setVisible(e){this.visible=e}isVisible(){return this.visible}setConfig(e){this.config=yf(this.config,e)}replaceConfig(e){this.config=yf(e,{})}getConfig(){return{...this.config,windows:this.config.windows?.map(e=>({...e}))}}render(e,t,n,r){let i=this.rects(t,n,r);if(i.length!==0){e.save(),e.fillStyle=i[0].color;for(let t of i)e.fillRect(t.x,t.y,t.width,t.height);e.restore()}}rects(t,n,r){if(!this.visible||t.length===0)return[];let{chartRect:i}=n,{from:a,to:o}=n.visibleRange,s=Math.max(0,a),c=Math.min(o,t.length-1);if(c<s)return[];let l=n.barWidth+n.barSpacing,u=r.name===`light`?`rgba(0,0,0,0.045)`:`rgba(0,0,0,0.28)`,d=[],f=-1,p=(t,r)=>{let a=e.b(t,n)-l/2,o=e.b(r,n)+l/2;d.push({x:a,y:i.y,width:o-a,height:i.height,color:u,alpha:1})};for(let e=s;e<=c;e++){let n=!Sf(t[e].time,this.config);n&&f===-1?f=e:!n&&f!==-1&&(p(f,e-1),f=-1)}return f!==-1&&p(f,c),d}},Tf=[2,3],Ef=16,Df=class{highLow=!1;quote=null;quoteShown=!0;priceText=null;setPriceText(e){this.priceText=e}setQuoteShown(e){this.quoteShown=e}setHighLow(e){this.highLow=e}isHighLowVisible(){return this.highLow}setBidAsk(e){this.quote=e?{...e}:null}getBidAsk(){return this.quote?{...this.quote}:null}levels(e,t){let n=[];if(this.highLow){let r=Math.max(0,t.visibleRange.from),i=Math.min(e.length-1,t.visibleRange.to),a=-1/0,o=1/0;for(let t=r;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);Number.isFinite(a)&&n.push({kind:`high`,price:a}),Number.isFinite(o)&&n.push({kind:`low`,price:o})}let{bid:r,ask:i}=(this.quoteShown?this.quote:null)??{};return r!==void 0&&Number.isFinite(r)&&n.push({kind:`bid`,price:r}),i!==void 0&&Number.isFinite(i)&&n.push({kind:`ask`,price:i}),n}render(t,n,r,i){let{chartRect:a}=n;t.save(),t.setLineDash(Tf),t.lineWidth=1;for(let o of this.levels(i,n)){let i=Math.round(e.w(o.price,n))+.5;i<a.y||i>a.y+a.height||(t.strokeStyle=Of(o.kind,r),t.beginPath(),t.moveTo(a.x,i),t.lineTo(a.x+a.width,i),t.stroke())}t.restore()}renderAxisTags(n,r,i,a){let{chartRect:o}=r,s=o.x+o.width+1,c=(r.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2,l=(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max);n.save(),n.font=`${i.font.sizeSmall}px ${i.font.family}`,n.textBaseline=`middle`,n.textAlign=`left`;for(let u of this.levels(a,r)){let a=e.w(u.price,r);if(a<o.y||a>o.y+o.height)continue;n.fillStyle=Of(u.kind,i),d(n,s,a-Ef/2,c,Ef,i),n.fillStyle=i.background;let f=r.formatPrice?.(u.price)??this.priceText?.(u.price)??(0,t.formatPrice)(u.price,l);n.fillText(f,s+5,a)}n.restore()}};function Of(e,t){switch(e){case`bid`:return t.candleUp;case`ask`:return t.candleDown;default:return t.style?.highLow.color??t.textSecondary}}var kf=500,Af=2,jf=[`movesUp`,`movesDown`];function Mf(e){return e.channel===`price`&&!e.drawingId&&!e.target&&!jf.includes(e.condition)}function Nf(e,t,n,r){switch(r){case`crossingUp`:return e!==void 0&&e<n&&t>=n;case`crossingDown`:return e!==void 0&&e>n&&t<=n;case`crossing`:return e!==void 0&&(e<n&&t>=n||e>n&&t<=n);case`greaterThan`:return t>n;case`lessThan`:return t<n;default:return!1}}var Pf=[`crossing`,`crossingUp`,`crossingDown`];function Ff(e,t,n){let r=e<0&&t>=0,i=e>0&&t<=0;return n===`crossingUp`?r:n===`crossingDown`?i:r||i}var If=1,Lf=2**31-1,Rf=class extends Xu{alerts=[];lastValues=new Map;drawingSides=new Map;drawingLevels=null;requestRender=null;pricePrecision=2;barTime=null;expiryTimer=null;history=new Map;lastDiffs=new Map;setBarTime(e){this.barTime=e}setRequestRender(e){this.requestRender=e}setPricePrecision(e){this.pricePrecision=e}addAlert(e,t=`crossing`,n,r=!1,i=`price`,a,o={}){let s=zf(t,i,o),c=`tc_alert_${If++}`,l={id:c,price:e,condition:t,message:n,triggered:!1,repeating:r,channel:i,label:a,...s};return this.alerts.push(l),s.expiresAt!==void 0&&this.scheduleExpiry(),this.emit(`added`,l),this.requestRender?.(),c}setDrawingLevels(e){this.drawingLevels=e}addDrawingAlert(e,t=`crossing`,n,r=!1,i){if(!Pf.includes(t))throw RangeError(`An alert on a drawing takes a crossing condition, not "${t}"`);let a=`tc_alert_${If++}`,o={id:a,price:this.drawingLevels?.(e)?.[0]??NaN,condition:t,message:n,triggered:!1,repeating:r,channel:`price`,label:i,drawingId:e};return this.alerts.push(o),this.emit(`added`,o),a}removeDrawingAlerts(e){for(let t of this.alerts.filter(t=>t.drawingId===e))this.removeAlert(t.id)}takeDrawingAlerts(e){let t=this.alerts.filter(t=>t.drawingId===e);for(let e of t)this.removeAlert(e.id);return t.map(e=>({...e}))}restoreAlerts(e){for(let t of e){if(this.alerts.some(e=>e.id===t.id))continue;let e={...t};this.alerts.push(e),this.emit(`added`,e)}this.scheduleExpiry(),this.requestRender?.()}pruneDrawingAlerts(e){let t=this.alerts.filter(t=>t.drawingId!==void 0&&!e.has(t.drawingId));for(let e of t)this.removeAlert(e.id);return t.length}removeAlert(e){this.drawingSides.delete(e),this.lastDiffs.delete(e);let t=this.alerts.some(t=>t.id===e&&t.expiresAt!==void 0);this.alerts=this.alerts.filter(t=>t.id!==e),t&&this.scheduleExpiry(),this.emit(`removed`,e),this.requestRender?.()}getAlerts(){return[...this.alerts]}getAlertAtPoint(t,n,r=6){let{chartRect:i}=n;if(t.y<i.y||t.y>i.y+i.height)return null;let a=null,o=r;for(let r of this.alerts){if(!Mf(r))continue;let i=Math.abs(e.w(r.price,n)-t.y);i<=o&&(o=i,a=r)}return a}updateAlertPrice(e,t){let n=this.alerts.find(t=>t.id===e);!n||!Number.isFinite(t)||(n.price=t,n.triggered=!1,n.expiresAt!==void 0&&this.scheduleExpiry(),this.emit(`updated`,{...n}),this.requestRender?.())}clearAlerts(){this.alerts=[],this.lastDiffs.clear(),this.drawingSides.clear(),this.scheduleExpiry(),this.requestRender?.()}checkPrice(e){this.checkChannel(`price`,e),this.checkDrawingAlerts(e)}checkDrawings(e){this.checkDrawingAlerts(e)}expire(){let e=Date.now(),t=this.alerts.filter(t=>!t.expired&&t.expiresAt!==void 0&&e>=t.expiresAt&&!(t.triggered&&!t.repeating));if(t.length!==0){for(let e of t)e.expired=!0;try{for(let e of t)this.emit(`expired`,{...e}),this.emit(`updated`,{...e})}finally{this.requestRender?.(),this.scheduleExpiry()}}}scheduleExpiry(){this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null;let e=Math.min(...this.alerts.filter(e=>!e.expired&&e.expiresAt!==void 0&&!(e.triggered&&!e.repeating)).map(e=>e.expiresAt));if(!Number.isFinite(e))return;let t=Math.min(Math.max(0,e-Date.now()),Lf);this.expiryTimer=setTimeout(()=>{this.expiryTimer=null,this.expire(),this.expiryTimer||this.scheduleExpiry()},t)}dispose(){this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null}checkDrawingAlerts(e){if(!(!this.drawingLevels||!Number.isFinite(e)))for(let t of this.alerts){if(!t.drawingId||t.expired)continue;let n=this.drawingLevels(t.drawingId);if(!n||n.length===0){this.drawingSides.delete(t.id);continue}t.price=n[0];let r=n.map(t=>Math.sign(e-t)),i=this.drawingSides.get(t.id);this.drawingSides.set(t.id,r),!(!i||i.length!==r.length)&&(r.some((e,n)=>Ff(i[n],e,t.condition))?t.triggered||(t.triggered=!0,this.emit(`triggered`,{...t})):t.repeating&&(t.triggered=!1))}}checkChannel(e,t){this.checkChannels(new Map([[e,t]]))}checkChannels(e,t={}){let n=(e instanceof Map?[...e.entries()]:Object.entries(e)).filter(([,e])=>Number.isFinite(e));if(n.length===0)return;this.expire();let r=new Map,i=new Map;for(let[e,t]of n){r.set(e,this.lastValues.get(e));let n=this.recordBar(e,t);n&&i.set(e,n),this.lastValues.set(e,t)}for(let e of this.alerts){if(e.drawingId||e.expired)continue;let n=r.has(e.channel),a=e.target!==void 0&&r.has(e.target);if(!n&&!a||e.target!==void 0&&t.together&&!(n&&a))continue;let o;if(e.onBarClose){let t=i.get(e.channel)??(e.target?i.get(e.target):void 0);if(!t)continue;o=this.closedBarMet(e,t)}else if(e.target)o=this.targetMet(e);else if(jf.includes(e.condition)){if(!n)continue;o=this.moveMet(e,this.history.get(e.channel)??[])}else{let t=r.get(e.channel);if(!n||t===void 0)continue;o=Nf(t,this.lastValues.get(e.channel),e.price,e.condition)}this.settle(e,o)}}settle(e,t){t?e.triggered||(e.triggered=!0,this.emit(`triggered`,{...e})):e.repeating&&(e.triggered=!1)}targetMet(e){let t=this.lastValues.get(e.channel),n=e.target?this.lastValues.get(e.target):void 0;if(t===void 0||n===void 0)return!1;let r=t-n,i=this.lastDiffs.get(e.id);return this.lastDiffs.set(e.id,r),e.price=n,Nf(i,r,0,e.condition)}moveMet(e,t,n=t.length){let r=e.bars??1,i=t.slice(Math.max(0,n-r),n);if(i.length<2||e.percent===void 0)return!1;let a=i[i.length-1].value,o=i.map(e=>e.value);if(e.condition===`movesUp`){let t=Math.min(...o);return t!==0&&(a-t)/Math.abs(t)*100>=e.percent}let s=Math.max(...o);return s!==0&&(s-a)/Math.abs(s)*100>=e.percent}closedBarMet(e,t){let n=this.history.get(e.channel)??[],r=n.findIndex(e=>e.time===t.time);if(r<0)return!1;if(jf.includes(e.condition))return this.moveMet(e,n,r+1);let i=(e,t)=>{let r=this.history.get(e)??[],i=n[t]?.time;return i===void 0?void 0:r.find(e=>e.time===i)?.value},a=n[r].value,o=r>0?n[r-1].value:void 0,s=e.price;if(e.target){let t=i(e.target,r),n=r>0?i(e.target,r-1):void 0;if(t===void 0)return!1;a-=t,o=o!==void 0&&n!==void 0?o-n:void 0,s=0,e.price=t}return Nf(o,a,s,e.condition)}recordBar(e,t){let n=this.barTime;if(n===null)return null;let r=this.history.get(e)??[],i=r[r.length-1];if(i&&n<i.time)return r=r.filter(e=>e.time<n),r.push({time:n,value:t}),this.history.set(e,r),null;if(i&&i.time===n)return r[r.length-1]={time:n,value:t},null;i=r[r.length-1],r.push({time:n,value:t});let a=Math.min(502,Math.max(3,...this.alerts.map(e=>(e.bars??1)+2)));return r.length>a&&r.splice(0,r.length-a),this.history.set(e,r),i?{channel:e,time:i.time}:null}clearLastValues(){this.lastValues.clear(),this.drawingSides.clear(),this.history.clear(),this.lastDiffs.clear()}saveToStorage(e){try{let t=this.alerts.map(e=>({id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,repeating:e.repeating,channel:e.channel,label:e.label,drawingId:e.drawingId,target:e.target,percent:e.percent,bars:e.bars,onBarClose:e.onBarClose,expiresAt:e.expiresAt,expired:e.expired}));localStorage.setItem(e,JSON.stringify(t))}catch{}}loadFromStorage(e){try{let t=localStorage.getItem(e);if(!t)return;let n=JSON.parse(t);if(!Array.isArray(n))return;for(let e of n){if(typeof e.drawingId==`string`&&e.condition&&!e.triggered){Pf.includes(e.condition)&&this.addDrawingAlert(e.drawingId,e.condition,e.message,e.repeating??!1,e.label);continue}if(!e.condition||e.triggered||e.expired)continue;let t=Bf(e),n=!t.target&&!jf.includes(e.condition),r=typeof e.price==`number`&&Number.isFinite(e.price)?e.price:NaN;if(!(n&&Number.isNaN(r)))try{this.addAlert(r,e.condition,e.message,e.repeating??!1,e.channel??`price`,e.label,t)}catch{}}}catch{}}render(t,n,r){let{chartRect:i}=n;for(let a of this.alerts){if(!Mf(a))continue;let o=e.w(a.price,n);if(o<i.y||o>i.y+i.height)continue;let s=a.expired?`#8a93a3`:a.triggered?`#f2a93b`:`#4c8dff`;t.setLineDash([2,6]),t.strokeStyle=s,t.lineWidth=1,t.beginPath(),t.moveTo(i.x,Math.round(o)+.5),t.lineTo(i.x+i.width,Math.round(o)+.5),t.stroke(),t.setLineDash([]),t.font=`10px ${r.font.family}`,t.fillStyle=s,t.textBaseline=`bottom`,t.textAlign=`right`;let c=`🔔 ${n.formatPrice?.(a.price)??a.price.toFixed(this.pricePrecision)}${a.message?` - ${a.message}`:``}`;t.fillText(c,i.x+i.width-4,o-2)}}};function zf(e,t,n){let r={},i=jf.includes(e);if(n.target!==void 0){if(i)throw RangeError(`An alert on a move takes no other line`);if(n.target===t)throw RangeError(`An alert can’t compare a line with itself`);r.target=n.target}if(i){let{percent:e,bars:t}=n;if(e===void 0||!Number.isFinite(e)||e<=0)throw RangeError(`An alert on a move needs a percent above 0`);if(t===void 0||!Number.isInteger(t)||t<2||t>500)throw RangeError(`An alert on a move needs 2 to 500 bars`);r.percent=e,r.bars=t}return n.onBarClose&&(r.onBarClose=!0),n.expiresAt!==void 0&&Number.isFinite(n.expiresAt)&&(r.expiresAt=n.expiresAt),r}function Bf(e){let t={};return typeof e.target==`string`&&e.target&&(t.target=e.target),typeof e.percent==`number`&&Number.isFinite(e.percent)&&(t.percent=e.percent),typeof e.bars==`number`&&Number.isInteger(e.bars)&&(t.bars=e.bars),e.onBarClose===!0&&(t.onBarClose=!0),typeof e.expiresAt==`number`&&Number.isFinite(e.expiresAt)&&(t.expiresAt=e.expiresAt),t}var Vf=16,Hf=()=>typeof requestAnimationFrame==`function`&&!(typeof document<`u`&&document.hidden),Uf={now:()=>typeof performance<`u`?performance.now():Date.now(),frame:e=>Hf()?{raf:requestAnimationFrame(e)}:{timeout:setTimeout(e,Vf)},cancel:e=>{let t=e;t.raf!==void 0&&cancelAnimationFrame(t.raf),t.timeout!==void 0&&clearTimeout(t.timeout)}},Wf=class extends Xu{data=[];cursor=-1;timer=null;frameHandle=null;run=0;state=`stopped`;config={speed:1,interval:500};paceMs=null;constructor(e=Uf){super(),this.clock=e}load(e){this.stop(),this.data=e,this.cursor=-1}play(e){if(this.data.length===0)return;if(e){let{startIndex:t,paused:n,duration:r,...i}=e;this.config={...this.config,...i};let a=t===void 0?null:this.clamp(t);if(n){this.clearTimer(),this.seekTo(a??Math.max(0,this.cursor)),this.setPace(r),this.setState(`paused`);return}a!==null&&(this.cursor=a-1),this.setPace(r)}if(this.isAtEnd()){this.clearTimer(),this.setState(`paused`);return}this.clearTimer();let t=this.paceMs??this.config.interval/this.config.speed;if(!(t>0)||!Number.isFinite(t)){this.setState(`paused`);return}this.setState(`playing`),t<Vf||this.paceMs!==null?this.runFrames(t):this.timer=setInterval(()=>this.advance(1),t)}pause(){this.clearTimer(),this.setState(`paused`)}resume(){this.state===`paused`&&this.play()}stop(){this.clearTimer(),this.cursor=-1,this.setState(`stopped`)}seekTo(e){this.data.length!==0&&(this.cursor=this.clamp(e),this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}))}setSpeed(e){this.config={...this.config,speed:e},this.paceMs=null,this.state===`playing`&&this.play()}getState(){return this.state}isAtEnd(){return this.data.length>0&&this.cursor>=this.data.length-1}getProgress(){let e=this.data.length;return{current:Math.max(0,this.cursor),total:e,percent:e>0?(this.cursor+1)/e*100:0}}dispose(){this.stop(),this.removeAllListeners(),this.data=[]}setPace(e){this.paceMs=e!==void 0&&e>0&&Number.isFinite(e)?e/Math.max(1,this.data.length-1-this.cursor):null}runFrames(e){let t=this.run,n=this.clock.now(),r=0,i=()=>{if(t!==this.run||this.state!==`playing`)return;this.frameHandle=null;let a=this.clock.now();r+=Math.min(50,Math.max(0,a-n)),n=a;let o=Math.floor(r/e);try{o>0&&(r-=o*e,this.advance(o))}finally{t===this.run&&this.state===`playing`&&this.frameHandle===null&&(this.frameHandle=this.clock.frame(i))}};this.frameHandle=this.clock.frame(i)}advance(e){if(this.isAtEnd()){this.finish();return}this.cursor=Math.min(this.data.length-1,this.cursor+e),this.emit(`bar`,{bar:this.data[this.cursor],index:this.cursor,total:this.data.length}),this.isAtEnd()&&this.finish()}finish(){this.clearTimer(),this.setState(`paused`),this.emit(`complete`,void 0)}clamp(e){return Number.isFinite(e)?Math.max(0,Math.min(Math.floor(e),this.data.length-1)):0}clearTimer(){this.run++,this.timer&&=(clearInterval(this.timer),null),this.frameHandle!==null&&(this.clock.cancel(this.frameHandle),this.frameHandle=null)}setState(e){this.state!==e&&(this.state=e,this.emit(`stateChange`,e))}},Gf=64,Kf=3,qf=3;function $(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Jf(e){return Array.isArray(e)?e:[]}function Yf(e,t){return typeof e==`string`?e:t}function Xf(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function Zf(e){if(!$(e)||typeof e.id!=`string`||typeof e.type!=`string`||!Array.isArray(e.anchors)||e.anchors.length===0||e.anchors.length>Qf||!$(e.style))return null;let n=[];for(let t of e.anchors){if(!$(t)||typeof t.time!=`number`||typeof t.price!=`number`||!Number.isFinite(t.time)||!Number.isFinite(t.price))return null;n.push({time:t.time,price:t.price})}let r=(0,t.sanitizeDrawingStyle)(e.style);return r.color===void 0||r.lineWidth===void 0?null:{id:e.id,type:e.type,anchors:n,style:{lineStyle:`solid`,...r,color:r.color,lineWidth:r.lineWidth},visible:typeof e.visible==`boolean`?e.visible:!0,locked:typeof e.locked==`boolean`?e.locked:!1,options:$(e.options)?e.options:void 0,group:tp(e.group),meta:$(e.meta)?e.meta:void 0}}var Qf=5e3,$f=64,ep=80;function tp(e){if(!(!$(e)||typeof e.id!=`string`||typeof e.name!=`string`)&&!(e.id===``||e.id.length>$f))return{id:e.id,name:e.name.slice(0,ep)}}function np(e){return!$(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.type!=`string`||typeof e.price!=`number`||typeof e.quantity!=`number`?null:e}function rp(e){if(!$(e))return;let n={},r=Jf(e.colors).filter(e=>typeof e==`string`);r.length>0&&(n.colors=r);let i=Jf(e.lineWidths).filter(e=>typeof e==`number`&&Number.isFinite(e)&&e>0);i.length>0&&(n.lineWidths=i),typeof e.opacity==`number`&&Number.isFinite(e.opacity)&&(n.opacity=Math.min(1,Math.max(0,e.opacity)));let a=(0,t.readIndicatorPlotStyles)(e.plots);return a&&(n.plots=a),Object.keys(n).length>0?n:void 0}var ip=[`crossingUp`,`crossingDown`,`crossing`,`greaterThan`,`lessThan`,`movesUp`,`movesDown`];function ap(e){if(!$(e)||typeof e.id!=`string`)return null;let t=typeof e.drawingId==`string`?e.drawingId:void 0,n=typeof e.price==`number`&&Number.isFinite(e.price)?e.price:null,r=ip.find(t=>t===e.condition)??`crossing`,i=Bf(e),a=i.target!==void 0||r===`movesUp`||r===`movesDown`;return n===null&&!t&&!a?null:{id:e.id,price:n??NaN,drawingId:t,condition:r,message:typeof e.message==`string`?e.message:void 0,triggered:e.triggered===!0,repeating:e.repeating===!0,channel:Yf(e.channel,`price`),label:typeof e.label==`string`?e.label:void 0,...i,...e.expired===!0?{expired:!0}:{}}}function op(e){return!$(e)||typeof e.id!=`string`||typeof e.side!=`string`||typeof e.entryPrice!=`number`||typeof e.quantity!=`number`?null:e}var sp=4e3;function cp(e){if(!$(e))return;let n={},r=[];for(let[i,a]of Object.entries(e)){let e=(0,t.readChartStyleOverrides)(a);r.push(...e.rejected);let o=Object.fromEntries(Object.entries(e.overrides).filter(([,e])=>e!==null));Object.keys(o).length>0&&(n[i.slice(0,Gf)]=o)}return r.length>0&&console.warn(`Saved style overrides left out: ${[...new Set(r)].join(`, `)}`),n}function lp(e){if(!$(e))return up();typeof e.version==`number`&&e.version>qf&&console.warn(`Chart state from a newer version (${e.version}); loading what this version understands.`);let n=$(e.viewport)?e.viewport:{},r=[];for(let n of Jf(e.indicators))$(n)&&(typeof n.id!=`string`||typeof n.instanceId!=`string`||$(n.params)&&r.push({id:n.id,instanceId:n.instanceId,params:n.params,position:typeof n.position==`string`?n.position:void 0,style:rp(n.style),visible:typeof n.visible==`boolean`?n.visible:void 0,levels:Array.isArray(n.levels)?n.levels.filter(e=>typeof e==`number`&&Number.isFinite(e)):void 0,pane:typeof n.pane==`string`?n.pane:void 0,scale:n.scale===`left`?`left`:void 0,paneStyle:(0,t.readPaneStyle)(n.paneStyle)??void 0,paneSize:typeof n.paneSize==`number`&&Number.isFinite(n.paneSize)&&n.paneSize>0?Math.min(n.paneSize,sp):void 0,paneOrder:typeof n.paneOrder==`number`&&Number.isInteger(n.paneOrder)&&n.paneOrder>=0?n.paneOrder:void 0,paneCollapsed:n.paneCollapsed===!0?!0:void 0,paneMaximized:n.paneMaximized===!0?!0:void 0,paneLog:n.paneLog===!0?!0:void 0,paneInvert:n.paneInvert===!0?!0:void 0,panePercent:n.panePercent===!0?!0:void 0}));let i=[];for(let t of Jf(e.drawings)){let e=Zf(t);e&&i.push(e)}let a=[];for(let t of Jf(e.orders)){let e=np(t);e&&a.push(e)}let o=[];for(let t of Jf(e.positions)){let e=op(t);e&&o.push(e)}let s=[];for(let t of Jf(e.alerts)){let e=ap(t);e&&s.push(e)}let c=cp(e.overrides);return{version:typeof e.version==`number`&&Array.isArray(e.indicators)?e.version:1,timestamp:Xf(e.timestamp,Date.now()),symbol:typeof e.symbol==`string`?e.symbol:void 0,timeframe:typeof e.timeframe==`string`?e.timeframe:void 0,chartType:Yf(e.chartType,`candlestick`),...e.chartTypeOptions===void 0?{}:{chartTypeOptions:(0,t.readChartTypeOptions)(e.chartTypeOptions)},viewport:{barWidth:Xf(n.barWidth,8),barSpacing:Xf(n.barSpacing,2),offset:Xf(n.offset,0)},theme:typeof e.theme==`string`?e.theme:void 0,...c?{overrides:c}:{},locale:typeof e.locale==`string`?e.locale:void 0,indicators:r,drawings:i,orders:a,positions:o,alerts:s}}function up(){return{version:1,timestamp:Date.now(),chartType:`candlestick`,viewport:{barWidth:8,barSpacing:2,offset:0},indicators:[],drawings:[],orders:[],positions:[],alerts:[]}}var dp=class{static capture(e,t){return{version:e.getIndicators?qf:1,timestamp:Date.now(),chartType:t?.chartType??`candlestick`,...t?.chartTypeOptions&&Object.keys(t.chartTypeOptions).length>0?{chartTypeOptions:t.chartTypeOptions}:{},symbol:t?.symbol,timeframe:t?.timeframe,viewport:{barWidth:8,barSpacing:2,offset:0},theme:e.getTheme().name,...e.getOverrides&&Object.keys(e.getOverrides()).length>0?{overrides:e.getOverrides()}:{},indicators:e.getIndicators?.()??[],drawings:e.getDrawings(),orders:e.getOrders?.()??[],positions:e.getPositions?.()??[],alerts:e.getAlerts?.()??[]}}static serialize(e){return JSON.stringify(e)}static deserialize(e){return lp(JSON.parse(e))}static saveToStorage(e,t){localStorage.setItem(e,this.serialize(t))}static loadFromStorage(e){let t=localStorage.getItem(e);return t?this.deserialize(t):null}static downloadFile(e,t=`tc-chart-state.json`){let n=new Blob([this.serialize(e)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}static loadFromFile(){return new Promise((e,t)=>{let n=document.createElement(`input`);n.type=`file`,n.accept=`.json`,n.onchange=async()=>{let r=n.files?.[0];if(!r){t(Error(`No file selected`));return}let i=await r.text();e(this.deserialize(i))},n.click()})}},fp=class{undoStack=[];redoStack=[];maxHistory=50;onChange=null;setOnChange(e){this.onChange=e}push(e){this.undoStack.push(e),this.undoStack.length>this.maxHistory&&this.undoStack.shift(),this.redoStack.length=0,this.onChange?.()}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}undo(){let e=this.undoStack.pop();return e?(this.redoStack.push(e),this.onChange?.(),e):null}redo(){let e=this.redoStack.pop();return e?(this.undoStack.push(e),this.onChange?.(),e):null}clear(){this.undoStack.length=0,this.redoStack.length=0,this.onChange?.()}last(){return this.undoStack[this.undoStack.length-1]??null}dropLast(){this.undoStack.pop()&&(this.redoStack.length=0,this.onChange?.())}replaceLast(e){if(this.undoStack.length===0){this.push(e);return}this.undoStack[this.undoStack.length-1]=e,this.redoStack.length=0,this.onChange?.()}getState(){return{canUndo:this.undoStack.length>0,canRedo:this.redoStack.length>0,undoCount:this.undoStack.length,redoCount:this.redoStack.length}}},pp=[`Time`,`Open`,`High`,`Low`,`Close`,`Volume`];function mp(e){return new Date((0,t.normalizeBarTime)(e)).toISOString()}function hp(e){let t=/^[=+\-@\t\r]/.test(e)&&!/^-?\d/.test(e)?`'${e}`:e;return/[",\r\n]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}var gp=e=>e==null||!Number.isFinite(e)?``:String(e),_p=class{static toCSV(e,t=[]){return[[...pp,...t.map(e=>hp(e.name))].join(`,`),...e.map((e,n)=>[mp(e.time),e.open,e.high,e.low,e.close,e.volume,...t.map(e=>gp(e.values[n]))].join(`,`))].join(`
22
+ `)}static toJSON(e,t=[]){return JSON.stringify(e.map((e,n)=>{let r={time:mp(e.time),open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume};for(let e of t){let t=e.values[n];r[e.name]=t==null||!Number.isFinite(t)?null:t}return r}),null,2)}static download(e,t,n){let r=new Blob([e],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}};function vp(e,t,n=-1/0){return t===null?e:e.filter(e=>e.time>=n&&e.time<t)}function yp(e,t,n=-1/0){return t===null?e:e.filter(e=>e.entryTime>=n&&e.entryTime<t).map(e=>{if(e.exitTime===void 0||e.exitTime<t)return e;let{exitTime:n,exitPrice:r,pnl:i,pnlPercent:a,...o}=e;return o})}var bp=1,xp=3,Sp=class extends Xu{markers=[];style={...t.DEFAULT_SIGNAL_STYLE};requestRender=null;dataGetter=null;revealUntil=null;revealFrom=-1/0;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addMarker(e){let t=e.id??`tc_signal_${bp++}`,n={...e,id:t};return this.markers.push(n),this.emit(`added`,n),this.requestRender?.(),t}removeMarker(e){this.markers=this.markers.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getMarkers(){return[...this.markers]}clearMarkers(){this.markers=[],this.emit(`cleared`,void 0),this.requestRender?.()}setMarkers(e){this.markers=[...e],this.requestRender?.()}setRevealUntil(e,t=-1/0){e===this.revealUntil&&t===this.revealFrom||(this.revealUntil=e,this.revealFrom=t,this.requestRender?.())}shownMarkers(){return[...vp(this.markers,this.revealUntil,this.revealFrom)]}markerAt(t,n){let r=this.dataGetter?.();if(!r||r.length===0)return null;let{chartRect:i}=n;if(t.x<i.x||t.x>i.x+i.width||t.y<i.y||t.y>i.y+i.height)return null;let a=this.style.arrowSize??12,o=vp(this.markers,this.revealUntil,this.revealFrom);for(let i=o.length-1;i>=0;i--){let s=o[i],c=e.b(e.O(s.time,r),n),l=e.w(s.price,n),u=a*Math.max(.6,Math.min(1,s.confidence)),d=s.direction===`long`?l-u:(s.direction,l-u*.4),f=s.direction===`long`?l+u*.4:s.direction===`short`?l+u:l+u*.4;if(Math.abs(t.x-c)<=u*.6+xp&&t.y>=d-xp&&t.y<=f+xp)return s}return null}render(t,n,r){let i=this.dataGetter?.(),a=vp(this.markers,this.revealUntil,this.revealFrom);if(!i||i.length===0||a.length===0)return;let{chartRect:o}=n,s=this.style,c=s.arrowSize??12;t.save(),t.beginPath(),t.rect(o.x,o.y,o.width,o.height),t.clip();for(let l of a){let a=e.b(e.O(l.time,i),n),u=e.w(l.price,n);if(a<o.x-c||a>o.x+o.width+c||u<o.y-c||u>o.y+o.height+c)continue;let d=this.resolveColor(l,s),f=c*Math.max(.6,Math.min(1,l.confidence));if(this.renderArrow(t,a,u,l.direction,f,d),s.showLabel&&l.label){t.font=`10px ${r.font.family}`,t.fillStyle=d,t.textAlign=`center`,t.textBaseline=l.direction===`long`?`top`:`bottom`;let e=l.direction===`long`?u+f+3:u-f-3;t.fillText(l.label,a,e)}if(s.showConfidence&&l.confidence<1){t.font=`9px ${r.font.family}`,t.fillStyle=d,t.globalAlpha=.7,t.textAlign=`center`,t.textBaseline=l.direction===`long`?`top`:`bottom`;let e=l.direction===`long`?u+f+(l.label?14:3):u-f-(l.label?14:3);t.fillText(`${Math.round(l.confidence*100)}%`,a,e),t.globalAlpha=1}}t.restore()}resolveColor(e,t){if(e.color)return e.color;if(t.sourceColors?.[e.source])return t.sourceColors[e.source];switch(e.direction){case`long`:return t.longColor??`#1fa874`;case`short`:return t.shortColor??`#e8505b`;default:return t.neutralColor??`#9E9E9E`}}renderArrow(e,t,n,r,i,a){e.fillStyle=a,e.beginPath(),r===`long`?(e.moveTo(t,n-i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n+i*.4),e.lineTo(t+i*.2,n+i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):r===`short`?(e.moveTo(t,n+i),e.lineTo(t-i*.6,n),e.lineTo(t-i*.2,n),e.lineTo(t-i*.2,n-i*.4),e.lineTo(t+i*.2,n-i*.4),e.lineTo(t+i*.2,n),e.lineTo(t+i*.6,n)):e.arc(t,n,i*.4,0,Math.PI*2),e.closePath(),e.fill()}},Cp=1,wp=class extends Xu{zones=[];style={...t.DEFAULT_TRADE_ZONE_STYLE};requestRender=null;dataGetter=null;revealUntil=null;revealFrom=-1/0;pricePrecision=2;setRequestRender(e){this.requestRender=e}setDataGetter(e){this.dataGetter=e}setPricePrecision(e){this.pricePrecision=e}setStyle(e){this.style={...this.style,...e},this.requestRender?.()}getStyle(){return{...this.style}}addZone(e){let t=e.id??`tc_zone_${Cp++}`,n={...e,id:t};return this.zones.push(n),this.emit(`added`,n),this.requestRender?.(),t}updateZone(e,t){let n=this.zones.findIndex(t=>t.id===e);n!==-1&&(this.zones[n]={...this.zones[n],...t},this.requestRender?.())}removeZone(e){this.zones=this.zones.filter(t=>t.id!==e),this.emit(`removed`,e),this.requestRender?.()}getZones(){return[...this.zones]}clearZones(){this.zones=[],this.emit(`cleared`,void 0),this.requestRender?.()}setZones(e){this.zones=[...e],this.requestRender?.()}setRevealUntil(e,t=-1/0){e===this.revealUntil&&t===this.revealFrom||(this.revealUntil=e,this.revealFrom=t,this.requestRender?.())}shownZones(){return[...yp(this.zones,this.revealUntil,this.revealFrom)]}render(e,t,n){let r=this.dataGetter?.(),i=yp(this.zones,this.revealUntil,this.revealFrom);if(!r||r.length===0||i.length===0)return;let{chartRect:a}=t,o=this.style;e.save(),e.beginPath(),e.rect(a.x,a.y,a.width,a.height),e.clip();for(let a of i)this.renderZone(e,a,r,t,n,o);e.restore()}renderZone(t,n,r,i,a,o){let{chartRect:s}=i,c=e.O(n.entryTime,r),l=n.exitTime==null?r.length-1:e.O(n.exitTime,r),u=e.b(c,i),f=e.b(l,i),p=Math.max(s.x,Math.min(u,f)),m=Math.min(s.x+s.width,Math.max(u,f));if(m-p<1)return;let h=e.w(n.entryPrice,i),g=n.exitPrice==null?e.w(n.entryPrice,i):e.w(n.exitPrice,i),_=Math.min(h,g),v=Math.max(Math.max(h,g)-_,2),y=n.exitTime==null,b=n.pnl==null?n.direction===`long`?(n.exitPrice??n.entryPrice)>=n.entryPrice:(n.exitPrice??n.entryPrice)<=n.entryPrice:n.pnl>=0,x=y?o.activeColor??`#4c8dff`:b?o.profitColor??`#1fa874`:o.lossColor??`#e8505b`;t.fillStyle=x,t.globalAlpha=o.fillOpacity??.12,t.fillRect(p,_,m-p,v),t.globalAlpha=1;let S=o.borderWidth??1;t.strokeStyle=x,t.lineWidth=S,t.setLineDash([]),t.beginPath(),t.moveTo(p,Math.round(h)+.5),t.lineTo(m,Math.round(h)+.5),t.stroke(),!y&&n.exitPrice!=null&&(t.setLineDash([3,3]),t.beginPath(),t.moveTo(p,Math.round(g)+.5),t.lineTo(m,Math.round(g)+.5),t.stroke(),t.setLineDash([]));let C=n.direction===`long`?`▲`:`▼`;if(t.font=`bold 10px ${a.font.family}`,t.fillStyle=x,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${C} ${i.formatPrice?.(n.entryPrice)??n.entryPrice.toFixed(this.pricePrecision)}`,p+4,h-3),o.showPnl&&!y&&n.pnl!=null){let e=n.pnl>=0?`+`:``,r=n.pnlPercent==null?`${e}${n.pnl.toFixed(2)}`:`${e}${n.pnl.toFixed(2)} (${e}${n.pnlPercent.toFixed(2)}%)`;t.font=`bold 10px ${a.font.family}`,t.fillStyle=x,t.textBaseline=`top`,t.textAlign=`right`;let i=t.measureText(r).width+8,o=m-i-2,s=_+2;t.globalAlpha=.85,t.fillStyle=a.background,d(t,o,s,i,14,a),t.globalAlpha=1,t.fillStyle=x,t.fillText(r,m-4,s+1)}o.showLabel&&n.label&&(t.font=`9px ${a.font.family}`,t.fillStyle=x,t.globalAlpha=.8,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(n.label,p+4,h+3),t.globalAlpha=1)}},Tp=class{active=!1;startBar=0;startPrice=0;endBar=0;endPrice=0;startTime=null;endTime=null;isActive(){return this.active}begin(t,n,r){let i=Math.round(e.k(t.x,n)),a=e.j(t.y,n);this.startBar=i,this.startPrice=a,this.endBar=i,this.endPrice=a,this.startTime=Ep(i,r),this.endTime=this.startTime,this.active=!0}update(t,n,r){if(!this.active)return;let i=Math.round(e.k(t.x,n));this.endBar=i,this.endPrice=e.j(t.y,n),this.endTime=Ep(i,r)}end(){this.active=!1}render(t,n,r){if(!this.active)return;let i=e.b(this.startBar,n),a=e.b(this.endBar,n),o=e.w(this.startPrice,n),s=e.w(this.endPrice,n),c=Math.min(i,a),l=Math.max(i,a),u=Math.min(o,s),d=Math.max(o,s),f=l-c,p=d-u,m=this.endPrice>=this.startPrice?r.candleUp:r.candleDown,h=Mp(m,.14);t.save();let{chartRect:g}=n;t.beginPath(),t.rect(g.x,g.y,g.width,g.height),t.clip(),t.fillStyle=h,t.fillRect(c,u,f,p),t.strokeStyle=m,t.lineWidth=1,t.setLineDash([4,3]),t.strokeRect(c+.5,u+.5,f,p),t.setLineDash([]),t.strokeStyle=m,t.lineWidth=1.5,t.beginPath(),t.moveTo(i,o),t.lineTo(a,s),t.stroke(),kp(t,i,o,m),kp(t,a,s,m),t.restore();let _=Math.abs(this.endBar-this.startBar),v=this.endPrice-this.startPrice,y=this.startPrice===0?0:v/this.startPrice*100,b=this.startTime!==null&&this.endTime!==null?Op(Math.abs(this.endTime-this.startTime)):null,x=[],S=v>0?`+`:v<0?`−`:``,C=Math.abs(v);x.push(`${S}${n.formatPrice?.(C)??Dp(C)} (${S}${Math.abs(y).toFixed(2)}%)`),x.push(`${_} bars${b?` · `+b:``}`),t.save(),Ap(t,a,s,x,m,r),t.restore()}};function Ep(e,t){if(e<0||e>=t.length)return null;let n=t[e].time;return n>0xe8d4a51000?n:n*1e3}function Dp(e){return e>=1e3?e.toFixed(2):e>=1?e.toFixed(4):e.toPrecision(4)}function Op(e){let t=e/1e3;if(t<60)return`${t.toFixed(0)}s`;let n=t/60;if(n<60)return`${n.toFixed(1)}m`;let r=n/60;if(r<24)return`${r.toFixed(1)}h`;let i=r/24;if(i<30)return`${i.toFixed(1)}d`;let a=i/30;return a<12?`${a.toFixed(1)}mo`:`${(i/365).toFixed(1)}y`}function kp(e,t,n,r){e.fillStyle=r,e.beginPath(),e.arc(t,n,3.5,0,Math.PI*2),e.fill(),e.fillStyle=`#fff`,e.beginPath(),e.arc(t,n,1.5,0,Math.PI*2),e.fill()}function Ap(e,t,n,r,i,a){e.font=`600 11px ${a.font.family}`;let o=0;for(let t of r){let n=e.measureText(t).width;n>o&&(o=n)}let s=Math.ceil(o)+16,c=r.length*14+12,l=t+8,u=n+8,d=e.canvas.clientWidth||e.canvas.width;l+s>d-4&&(l=t-s-8),l<4&&(l=4),e.fillStyle=a.background,e.globalAlpha=.96,jp(e,l,u,s,c,6),e.fill(),e.globalAlpha=1,e.strokeStyle=i,e.lineWidth=1,jp(e,l+.5,u+.5,s-1,c-1,6),e.stroke(),e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<r.length;t++)e.fillStyle=t===0?i:a.textSecondary,e.fillText(r[t],l+8,u+6+t*14)}function jp(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function Mp(e,t){if(e.startsWith(`#`)){let n=0,r=0,i=0;return e.length===4?(n=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16),i=parseInt(e[3]+e[3],16)):e.length>=7&&(n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16)),`rgba(${n},${r},${i},${t})`}if(e.startsWith(`rgb`)){let n=e.match(/[\d.]+/g);if(n&&n.length>=3)return`rgba(${n[0]},${n[1]},${n[2]},${t})`}return e}var Np=6,Pp=class{start=null;current=null;isActive(){return this.start!==null}begin(e){this.start=e,this.current=e}update(e){this.start&&(this.current=e)}end(){let e=this.start,t=this.current;if(this.cancel(),!e||!t)return null;let n=Math.min(e.x,t.x),r=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);return{x0:n,y0:i,x1:r,y1:a,isClick:r-n<6&&a-i<6}}cancel(){this.start=null,this.current=null}render(e,t,n){if(!this.start||!this.current)return;let{chartRect:r}=t,i=e=>Math.max(r.x,Math.min(r.x+r.width,e)),a=e=>Math.max(r.y,Math.min(r.y+r.height,e)),o=i(Math.min(this.start.x,this.current.x)),s=i(Math.max(this.start.x,this.current.x)),c=a(Math.min(this.start.y,this.current.y)),l=a(Math.max(this.start.y,this.current.y));e.save(),e.fillStyle=n.crosshair,e.globalAlpha=.1,e.fillRect(o,c,s-o,l-c),e.globalAlpha=.8,e.strokeStyle=n.crosshair,e.lineWidth=1,e.setLineDash([4,3]),e.strokeRect(Math.round(o)+.5,Math.round(c)+.5,Math.round(s-o),Math.round(l-c)),e.restore()}},Fp={linear:e=>e,easeOutCubic:e=>1-(1-e)**3,easeOutQuart:e=>1-(1-e)**4,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeOutExpo:e=>e===1?1:1-2**(-10*e),easeOutElastic:e=>e===0||e===1?e:2**(-10*e)*Math.sin((e*10-.75)*(2*Math.PI/3))+1,spring:e=>1-Math.E**(-6*e)*Math.cos(8*e)},Ip=class{animations=new Map;frameId=0;running=!1;animate(e,t){this.animations.set(e,{startTime:-1,duration:t.duration,easing:t.easing??Fp.easeOutCubic,onUpdate:t.onUpdate,onComplete:t.onComplete}),this.running||(this.running=!0,this.tick())}cancel(e){this.animations.delete(e),this.animations.size===0&&this.stop()}cancelAll(){this.animations.clear(),this.stop()}isAnimating(e){return e?this.animations.has(e):this.animations.size>0}tick(){this.frameId=requestAnimationFrame(e=>{let t=[];for(let[n,r]of this.animations){r.startTime<0&&(r.startTime=e);let i=e-r.startTime,a=Math.min(1,i/r.duration),o=r.easing(a);r.onUpdate(o),a>=1&&(r.onComplete?.(),t.push(n))}for(let e of t)this.animations.delete(e);this.animations.size>0?this.tick():this.running=!1})}stop(){this.frameId&&=(cancelAnimationFrame(this.frameId),0),this.running=!1}dispose(){this.cancelAll()}};function Lp(e){return!e||e===`dark`?t.DARK_THEME:e===`light`?t.LIGHT_THEME:e}var Rp=class{canvas;ctx;container;theme;width=0;height=0;dpr=1;frameId=null;resizeObserver;constructor(e,t){this.container=e,this.theme=Lp(t),this.canvas=document.createElement(`canvas`),this.canvas.style.width=`100%`,this.canvas.style.height=`100%`,this.canvas.style.display=`block`,e.appendChild(this.canvas),this.ctx=this.canvas.getContext(`2d`),this.dpr=window.devicePixelRatio||1,this.updateSize(),this.resizeObserver=new ResizeObserver(()=>{this.updateSize(),this.requestRender()}),this.resizeObserver.observe(e)}updateSize(){this.dpr=window.devicePixelRatio||1;let e=this.container.getBoundingClientRect();this.width=e.width||this.container.clientWidth,this.height=e.height||this.container.clientHeight,this.canvas.width=Math.max(1,Math.floor(this.width*this.dpr)),this.canvas.height=Math.max(1,Math.floor(this.height*this.dpr))}requestRender(){this.frameId===null&&(this.frameId=requestAnimationFrame(()=>{this.frameId=null,(this.width===0||this.height===0)&&this.updateSize(),!(this.width===0||this.height===0)&&(this.ctx.save(),this.ctx.scale(this.dpr,this.dpr),this.ctx.clearRect(0,0,this.width,this.height),this.renderChart(this.ctx,this.width,this.height,this.theme),this.ctx.restore())}))}setTheme(e){this.theme=Lp(e),this.requestRender()}destroy(){this.frameId!==null&&cancelAnimationFrame(this.frameId),this.resizeObserver.disconnect(),this.canvas.remove()}},zp=class{pos=null;canvas;onUpdate;handleMove;handleLeave;constructor(e,t){this.canvas=e,this.onUpdate=t,this.handleMove=t=>{let n=e.getBoundingClientRect();this.pos={x:t.clientX-n.left,y:t.clientY-n.top},this.onUpdate()},this.handleLeave=()=>{this.pos=null,this.onUpdate()},e.addEventListener(`pointermove`,this.handleMove),e.addEventListener(`pointerleave`,this.handleLeave)}getPosition(){return this.pos}isActive(){return this.pos!==null}drawCrosshair(e,t,n,r){this.pos&&(e.save(),e.strokeStyle=r,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(this.pos.x,0),e.lineTo(this.pos.x,n),e.stroke(),e.beginPath(),e.moveTo(0,this.pos.y),e.lineTo(t,this.pos.y),e.stroke(),e.restore())}destroy(){this.canvas.removeEventListener(`pointermove`,this.handleMove),this.canvas.removeEventListener(`pointerleave`,this.handleLeave)}};function Bp(e,t,n,r,i){let{data:a,mode:o=`area`,lineWidth:s=1.5,showLastPoint:c=!1,showMinMax:l=!1}=r;if(a.length<2||t<=0||n<=0)return;let u=r.color??i.lineColor,d=r.fillColor??u,f=t-4,p=n-4,m=1/0,h=-1/0,g=0,_=0;for(let e=0;e<a.length;e++)a[e]<m&&(m=a[e],g=e),a[e]>h&&(h=a[e],_=e);let v=h-m||1,y=e=>2+e/(a.length-1)*f,b=e=>2+p-(e-m)/v*p;if(o===`area`){let t=e.createLinearGradient(0,2,0,n-2);t.addColorStop(0,d+(d.startsWith(`#`)?`40`:``)),t.addColorStop(1,`transparent`),e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));e.lineTo(y(a.length-1),n-2),e.lineTo(y(0),n-2),e.closePath(),e.fillStyle=t,e.fill()}e.beginPath(),e.moveTo(y(0),b(a[0]));for(let t=1;t<a.length;t++)e.lineTo(y(t),b(a[t]));if(e.strokeStyle=u,e.lineWidth=s,e.lineJoin=`round`,e.stroke(),c){let t=r.lastPointColor??u,n=y(a.length-1),i=b(a[a.length-1]);e.beginPath(),e.arc(n,i,3,0,Math.PI*2),e.fillStyle=t,e.fill()}if(l){let t=r.minPointColor??i.candleDown,n=r.maxPointColor??i.candleUp;e.beginPath(),e.arc(y(g),b(m),2.5,0,Math.PI*2),e.fillStyle=t,e.fill(),e.beginPath(),e.arc(y(_),b(h),2.5,0,Math.PI*2),e.fillStyle=n,e.fill()}}var Vp=50,Hp=60,Up=20,Wp=.2;function Gp(e){let t=[...e].sort((e,t)=>t.price-e.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function Kp(e){let t=[...e].sort((e,t)=>e.price-t.price),n=[],r=0;for(let e of t)r+=e.volume,n.push({price:e.price,cumulativeVolume:r});return n}function qp(e,t){return{left:Vp,right:e-Hp,top:Up,bottom:t-Up,plotWidth:e-Vp-Hp,plotHeight:t-Up*2}}function Jp(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Yp(e,n,r,i,a,o,s,c){let{left:l,right:u,top:d,bottom:f,plotWidth:p,plotHeight:m}=n;e.save(),e.strokeStyle=o.grid,e.lineWidth=.5,e.fillStyle=o.axisLabel,e.font=`${o.font.sizeSmall}px ${o.font.family}`;let h=(0,t.computeTickStep)(0,a,5);for(let t=0;t<=a;t+=h){let n=f-t/a*m;e.beginPath(),e.moveTo(l,n),e.lineTo(u,n),e.stroke(),e.textAlign=`right`,e.textBaseline=`middle`,e.fillText(c(t),l-4,n)}let g=i-r,_=(0,t.computeTickStep)(r,i,6),v=Math.ceil(r/_)*_;for(let t=v;t<=i;t+=_){let n=l+(t-r)/g*p;e.beginPath(),e.moveTo(n,d),e.lineTo(n,f),e.stroke(),e.textAlign=`center`,e.textBaseline=`top`,e.fillText(s(t),n,f+4)}e.restore()}function Xp(e,t,n,r,i,a,o,s,c){if(t.length===0)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-e/a*f;if(e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}else{e.moveTo(p(t[0].price),u);for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);e.lineTo(r,i),n<t.length-1&&e.lineTo(p(t[n+1].price),i)}e.lineTo(p(t[t.length-1].price),u)}if(e.closePath(),e.fillStyle=o,e.fill(),e.beginPath(),c===`bid`){e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=0;n<t.length;n++){let r=p(t[n].price),i=m(t[n].cumulativeVolume);n>0&&e.lineTo(r,m(t[n-1].cumulativeVolume)),e.lineTo(r,i)}}else{e.moveTo(p(t[0].price),m(t[0].cumulativeVolume));for(let n=1;n<t.length;n++){let r=m(t[n-1].cumulativeVolume),i=p(t[n].price),a=m(t[n].cumulativeVolume);e.lineTo(i,r),e.lineTo(i,a)}}e.strokeStyle=s,e.lineWidth=1.5,e.stroke()}function Zp(e,t,n,r,i,a,o,s,c){let{left:l,top:u,bottom:d,plotWidth:f}=r,p=l+(t-i)/a*f;if(e.save(),e.strokeStyle=o.textSecondary,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(p,u),e.lineTo(p,d),e.stroke(),e.restore(),s){let t=`Spread: ${c(n)}`;e.save(),e.font=`${o.font.sizeSmall}px ${o.font.family}`,e.fillStyle=o.textSecondary,e.textAlign=`center`,e.textBaseline=`bottom`,e.fillText(t,p,u-2),e.restore()}}function Qp(e,t,n,r,i,a,o,s,c,l,u){let{left:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=i,g=t.x;if(g<d||g>i.right)return;let _=a+(g-d)/m*o,v=0,y=``;if(n.length>0&&_<=n[0].price){y=`Bid`;for(let e of n)if(_<=e.price)v=e.cumulativeVolume;else break}if(r.length>0&&_>=r[0].price){y=`Ask`;for(let e of r)if(_>=e.price)v=e.cumulativeVolume;else break}if(e.save(),e.strokeStyle=c.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(g,f),e.lineTo(g,p),e.stroke(),v>0){let t=p-v/s*h;e.beginPath(),e.moveTo(d,t),e.lineTo(i.right,t),e.stroke()}e.restore();let b=[`Price: ${l(_)}`,y?`${y} Vol: ${u(v)}`:``].filter(Boolean);e.save(),e.font=`${c.font.sizeSmall}px ${c.font.family}`;let x=Math.max(...b.map(t=>e.measureText(t).width))+16,S=b.length*(c.font.sizeSmall+4)+12,C=g+10,w=t.y-S/2;C+x>i.right&&(C=g-x-10),w<f&&(w=f),w+S>p&&(w=p-S),e.fillStyle=c.axisLabelBackground,e.globalAlpha=.9,e.fillRect(C,w,x,S),e.globalAlpha=1,e.fillStyle=c.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<b.length;t++)e.fillText(b[t],C+8,w+6+t*(c.font.sizeSmall+4));e.restore()}function $p(e){return e.toFixed(2)}function em(e){return e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(0)}function tm(e,t,n,r,i,a){let{data:o}=r;if(o.bids.length===0&&o.asks.length===0||t<=0||n<=0)return;let s=r.bidColor??i.candleUp,c=r.askColor??i.candleDown,l=r.bidFillColor??s+`40`,u=r.askFillColor??c+`40`,d=r.midPriceLine!==!1,f=r.spreadLabel!==!1,p=r.priceFormat??$p,m=r.volumeFormat??em,h=Gp(o.bids),g=Kp(o.asks),_=h.length>0?h[0].price:0,v=g.length>0?g[0].price:0,y=h.length>0&&g.length>0?(_+v)/2:_||v,b=g.length>0&&h.length>0?v-_:0,x=h.length>0?h[h.length-1].price:y,S=g.length>0?g[g.length-1].price:y,C=Math.max(y-x,S-y)*(1+Wp),w=y-C,T=y+C,E=T-w,D=h.length>0?h[h.length-1].cumulativeVolume:0,O=g.length>0?g[g.length-1].cumulativeVolume:0,k=Math.max(D,O)||1,ee=qp(t,n);Jp(e,t,n,i.background),Yp(e,ee,w,T,k,i,p,m),Xp(e,h,ee,w,E,k,l,s,`bid`),Xp(e,g,ee,w,E,k,u,c,`ask`),d&&Zp(e,y,b,ee,w,E,i,f,p),a&&Qp(e,a,h,g,ee,w,E,k,i,p,m)}var nm=70,rm=30,im=20,am=20,om=.05;function sm(e,t){return{left:nm,right:e-im,top:am,bottom:t-rm,plotWidth:e-nm-im,plotHeight:t-am-rm}}function cm(e,t){let n=1/0,r=-1/0;for(let t of e)t.value<n&&(n=t.value),t.value>r&&(r=t.value);if(t)for(let e of t)e.value<n&&(n=e.value),e.value>r&&(r=e.value);let i=(r-n)*om;return{valMin:n-i,valMax:r+i}}function lm(e){let t=[],n=-1/0;for(let r of e)r.value>n&&(n=r.value),t.push(n);return t}function um(e){let t=864e5;if(365.25*t,e<7*t){let e=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});return t=>e.format(new Date(t))}if(e<315576e5){let e=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`});return t=>e.format(new Date(t))}let n=new Intl.DateTimeFormat(void 0,{month:`short`,year:`numeric`});return e=>n.format(new Date(e))}function dm(e){return Math.abs(e)>=1e6?(e/1e6).toFixed(2)+`M`:Math.abs(e)>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function fm(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function pm(e,n,r,i,a,o,s,c,l){let{left:u,right:d,top:f,bottom:p,plotWidth:m,plotHeight:h}=n;e.save(),e.strokeStyle=s.grid,e.lineWidth=.5,e.fillStyle=s.axisLabel,e.font=`${s.font.sizeSmall}px ${s.font.family}`;let g=(0,t.computeTickStep)(r,i,6),_=Math.ceil(r/g)*g;for(let t=_;t<=i;t+=g){let n=p-(t-r)/(i-r)*h;e.beginPath(),e.moveTo(u,n),e.lineTo(d,n),e.stroke(),e.textAlign=`right`,e.textBaseline=`middle`,e.fillText(c(t),u-6,n)}let v=o-a,y=(0,t.computeTickStep)(a,o,6),b=Math.ceil(a/y)*y;for(let t=b;t<=o;t+=y){let n=u+(t-a)/v*m;e.beginPath(),e.moveTo(n,f),e.lineTo(n,p),e.stroke(),e.textAlign=`center`,e.textBaseline=`top`,e.fillText(l(t),n,p+4)}e.restore()}function mm(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=n,p=e=>l+(e-r)/i*d,m=e=>u-(e-a)/o*f;e.save(),e.beginPath(),e.moveTo(p(t[0].time),m(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(p(t[n].time),m(t[n].value));e.strokeStyle=s,e.lineWidth=c,e.lineJoin=`round`,e.stroke(),e.restore()}function hm(e,t,n,r,i,a,o,s){if(t.length<2)return;let{left:c,bottom:l,plotWidth:u,plotHeight:d}=n,f=e=>c+(e-r)/i*u,p=e=>l-(e-a)/o*d,m=e.createLinearGradient(0,n.top,0,l);m.addColorStop(0,s+`40`),m.addColorStop(1,`transparent`),e.save(),e.beginPath(),e.moveTo(f(t[0].time),p(t[0].value));for(let n=1;n<t.length;n++)e.lineTo(f(t[n].time),p(t[n].value));e.lineTo(f(t[t.length-1].time),l),e.lineTo(f(t[0].time),l),e.closePath(),e.fillStyle=m,e.fill(),e.restore()}function gm(e,t,n,r,i,a,o,s,c){if(t.length<2)return;let{left:l,bottom:u,plotWidth:d,plotHeight:f}=r,p=e=>l+(e-i)/a*d,m=e=>u-(e-o)/s*f;e.save(),e.fillStyle=c,e.beginPath(),e.moveTo(p(t[0].time),m(n[0]));for(let r=1;r<t.length;r++)e.lineTo(p(t[r].time),m(n[r]));for(let n=t.length-1;n>=0;n--)e.lineTo(p(t[n].time),m(t[n].value));e.closePath(),e.fill(),e.restore()}function _m(e,t,n,r,i,a,o,s,c,l){if(t.length===0)return;let{left:u,bottom:d,plotWidth:f,plotHeight:p}=n,m=t[t.length-1],h=u+(m.time-r)/i*f,g=d-(m.value-a)/o*p;e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`,e.fillStyle=c,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(s,h+4,g),e.restore()}function vm(e,t,n,r,i,a,o,s,c,l,u,d){let{left:f,top:p,bottom:m,plotWidth:h,plotHeight:g}=i,_=t.x;if(_<f||_>i.right)return;e.save(),e.strokeStyle=l.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(_,p),e.lineTo(_,m),e.stroke(),e.restore();let v=a+(_-f)/h*o,y=0,b=1/0;for(let e=0;e<n.length;e++){let t=Math.abs(n[e].time-v);t<b&&(b=t,y=e)}let x=n[y],S=[u(x.time),`Value: ${d(x.value)}`];r&&r.length>y&&S.push(`Benchmark: ${d(r[y].value)}`);let C=f+(x.time-a)/o*h,w=m-(x.value-s)/c*g;e.beginPath(),e.arc(C,w,3,0,Math.PI*2),e.fillStyle=l.lineColor,e.fill(),e.save(),e.font=`${l.font.sizeSmall}px ${l.font.family}`;let T=Math.max(...S.map(t=>e.measureText(t).width))+16,E=S.length*(l.font.sizeSmall+4)+12,D=_+10,O=t.y-E/2;D+T>i.right&&(D=_-T-10),O<p&&(O=p),O+E>m&&(O=m-E),e.fillStyle=l.axisLabelBackground,e.globalAlpha=.9,e.fillRect(D,O,T,E),e.globalAlpha=1,e.fillStyle=l.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<S.length;t++)e.fillText(S[t],D+8,O+6+t*(l.font.sizeSmall+4));e.restore()}function ym(e,t,n,r,i,a){let{data:o}=r;if(o.length<2||t<=0||n<=0)return;let s=r.lineColor??i.lineColor,c=r.lineWidth??1.5,l=r.drawdown===!0,u=r.drawdownColor??i.candleDown+`30`,d=r.fillArea===!0,f=r.benchmark,p=r.benchmarkColor??i.textSecondary,m=r.benchmarkLabel??`Benchmark`,h=r.valueFormat??dm,{valMin:g,valMax:_}=cm(o,f),v=_-g||1,y=o[0].time,b=o[o.length-1].time,x=b-y||1,S=r.timeFormat??um(x),C=sm(t,n);fm(e,t,n,i.background),pm(e,C,g,_,y,b,i,h,S),l&&gm(e,o,lm(o),C,y,x,g,v,u),d&&hm(e,o,C,y,x,g,v,s),mm(e,o,C,y,x,g,v,s,c),f&&f.length>=2&&(mm(e,f,C,y,x,g,v,p,1),_m(e,f,C,y,x,g,v,m,p,i)),a&&vm(e,a,o,f,C,y,x,g,v,i,S,h)}function bm(e,t,n){if(e.length===0)return[];let r=e.length,i=Math.ceil(Math.sqrt(r)),a=Math.ceil(r/i),o=t.width/i,s=t.height/a,c=[];for(let a=0;a<r;a++){let r=a%i,l=Math.floor(a/i);c.push({id:e[a].id,rect:{x:t.x+r*o+n,y:t.y+l*s+n,width:Math.max(0,o-n*2),height:Math.max(0,s-n*2)}})}return c}function xm(e,t){let n=e.reduce((e,t)=>e+t,0);if(n===0||t===0)return 1/0;let r=0;for(let i of e){let e=n/t,a=i/e,o=e>a?e/a:a/e;o>r&&(r=o)}return r}function Sm(e,t,n,r,i,a){let o=r?n.height:n.width,s=e.reduce((e,t)=>e+t,0),c=o>0?s/o:0,l=0;for(let o=0;o<e.length;o++){let s=c>0?e[o]/c:0,u;u=r?{x:n.x+i,y:n.y+l+i,width:Math.max(0,c-i*2),height:Math.max(0,s-i*2)}:{x:n.x+l+i,y:n.y+i,width:Math.max(0,s-i*2),height:Math.max(0,c-i*2)},a.push({id:t[o],rect:u}),l+=s}}function Cm(e,t,n,r,i){if(e.length===0)return;let a=n.width>=n.height,o=a?n.height:n.width;if(e.length===1){Sm(e,t,n,a,r,i);return}let s=[],c=[],l=0;for(;l<e.length;){let u=[...s,e[l]];if(s.length===0||xm(u,o)<=xm(s,o))s.push(e[l]),c.push(t[l]),l++;else{Sm(s,c,n,a,r,i);let u=s.reduce((e,t)=>e+t,0),d=o>0?u/o:0;n=a?{x:n.x+d,y:n.y,width:n.width-d,height:n.height}:{x:n.x,y:n.y+d,width:n.width,height:n.height-d},Cm(e.slice(l),t.slice(l),n,r,i);return}}s.length>0&&Sm(s,c,n,a,r,i)}function wm(e,t,n){if(e.length===0)return[];let r=[...e].sort((e,t)=>t.weight-e.weight),i=r.reduce((e,t)=>e+Math.max(0,t.weight),0);if(i===0)return[];let a=t.width*t.height,o=r.map(e=>Math.max(0,e.weight)/i*a),s=r.map(e=>e.id),c=[];return Cm(o,s,{...t},n,c),c}function Tm(e){return(e>=0?`+`:``)+e.toFixed(2)+`%`}function Em(e){return e.label}function Dm(e,n){let r=n.min??-5,i=n.max??5;if(e<=r)return n.negative;if(e>=i)return n.positive;if(e<0){let i=1-e/r;return(0,t.lerpColor)(n.negative,n.zero,i)}let a=e/i;return(0,t.lerpColor)(n.zero,n.positive,a)}function Om(e,t,n,r,i,a){let o=Math.min(a,r/2,i/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+r-o,n),e.arcTo(t+r,n,t+r,n+o,o),e.lineTo(t+r,n+i-o),e.arcTo(t+r,n+i,t+r-o,n+i,o),e.lineTo(t+o,n+i),e.arcTo(t,n+i,t,n+i-o,o),e.lineTo(t,n+o),e.arcTo(t,n,t+o,n,o),e.closePath()}function km(e,t,n,r,i,a,o,s,c,l,u){if(i<40||a<30)return;let d=n+i/2,f=r+a/2;if(e.save(),e.shadowColor=`rgba(0,0,0,0.6)`,e.shadowBlur=2,e.fillStyle=`#FFFFFF`,e.textAlign=`center`,s){let n=l(t),r=Math.min(o.font.sizeMedium,i/n.length*1.5,a/4);e.font=`bold `+Math.max(8,r)+`px `+o.font.family,e.textBaseline=c?`bottom`:`middle`,e.fillText(n,d,c?f-1:f,i-8)}if(c){let n=u(t.value),r=Math.min(o.font.sizeSmall,i/n.length*1.5,a/4);e.font=Math.max(7,r)+`px `+o.font.family,e.textBaseline=s?`top`:`middle`,e.fillText(n,d,s?f+1:f,i-8)}e.restore()}function Am(e,t,n,r,i,a,o,s){let c=[o(t),s(t.value)];if(t.meta)for(let[e,n]of Object.entries(t.meta))c.push(e+`: `+String(n));e.save(),e.font=a.font.sizeSmall+`px `+a.font.family;let l=Math.max(...c.map(t=>e.measureText(t).width))+16,u=a.font.sizeSmall+4,d=c.length*u+12,f=n.x+14,p=n.y-d/2;f+l>r&&(f=n.x-l-14),p<0&&(p=0),p+d>i&&(p=i-d),e.fillStyle=a.axisLabelBackground,e.globalAlpha=.92,Om(e,f,p,l,d,4),e.fill(),e.globalAlpha=1,e.fillStyle=a.text,e.textBaseline=`top`,e.textAlign=`left`;for(let t=0;t<c.length;t++)e.fillText(c[t],f+8,p+6+t*u);e.restore()}function jm(e,t,n,r,i,a,o,s){if(r.length===0||i.length===0||t<=0||n<=0)return null;let c=a.colorScale??{negative:`#e8505b`,zero:`#424242`,positive:`#1fa874`},l=a.cellRadius??4,u=a.showLabels!==!1,d=a.showValues!==!1,f=a.valueFormat??Tm,p=a.labelFormat??Em,m=new Map;for(let e of r)m.set(e.id,e);let h=null,g=null;if(s)for(let e of i){let{x:t,y:n,width:r,height:i}=e.rect;if(s.x>=t&&s.x<=t+r&&s.y>=n&&s.y<=n+i){h=e.id;let t=m.get(e.id);t&&(g={cell:t,rect:e});break}}e.fillStyle=o.background,e.fillRect(0,0,t,n);for(let t of i){let n=m.get(t.id);if(!n)continue;let{x:r,y:i,width:a,height:s}=t.rect;if(a<=0||s<=0)continue;let g=Dm(n.value,c);Om(e,r,i,a,s,l),e.fillStyle=g,e.fill(),km(e,n,r,i,a,s,o,u,d,p,f),t.id===h&&(Om(e,r,i,a,s,l),e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.stroke())}return g&&s&&Am(e,g.cell,s,t,n,o,p,f),g}var Mm=60,Nm=12,Pm=24,Fm=40,Im=.7,Lm=1;function Rm(e){return e.type?e.type:e.value>0?`positive`:e.value<0?`negative`:`subtotal`}function zm(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:e.toFixed(2)}function Bm(e,t){return{left:Mm,right:e-Nm,top:Pm,bottom:t-Fm,plotWidth:e-Mm-Nm,plotHeight:t-Pm-Fm}}function Vm(e,t,n,r,i){let a=Array(e.length),o=Array(e.length),s=t.plotWidth/e.length,c=s*n,l=(s-c)/2,{left:u,bottom:d,plotHeight:f}=t,p=0;for(let t=0;t<e.length;t++){let n=e[t],m=Rm(n),h,g;m===`total`||m===`subtotal`?(h=0,g=n.value,p=n.value):(h=p,g=p+n.value,p=g);let _=Math.min(h,g),v=Math.max(h,g),y=d-(_-r)/i*f,b=d-(v-r)/i*f,x=Math.min(y,b),S=Math.max(Math.abs(b-y),Lm),C=u+t*s,w=C+l;a[t]={label:n.label,value:n.value,start:h,end:g,type:m,rectX:w,rectY:x,rectW:c,rectH:S,slotX:C,slotW:s},o[t]=p}return{bars:a,cumulatives:o}}function Hm(e){if(e.length===0)return{valMin:0,valMax:1};let t=0,n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i],o=Rm(a),s,c;o===`total`||o===`subtotal`?(s=0,c=a.value,r=a.value):(s=r,c=r+a.value,r=c),s<t&&(t=s),c<t&&(t=c),s>n&&(n=s),c>n&&(n=c)}let i=(n-t||1)*.1;return{valMin:t-i,valMax:n+i}}function Um(e,t,n,r){e.fillStyle=r,e.fillRect(0,0,t,n)}function Wm(e,n,r,i,a,o){let{left:s,right:c,top:l,bottom:u,plotHeight:d}=n,f=i-r||1;e.strokeStyle=a.grid,e.lineWidth=.5,e.fillStyle=a.axisLabel,e.font=`${a.font.sizeSmall}px ${a.font.family}`,e.textAlign=`right`,e.textBaseline=`middle`;let p=(0,t.computeTickStep)(r,i,5),m=Math.ceil(r/p)*p;e.beginPath();for(let t=m;t<=i;t+=p){let n=Math.round(u-(t-r)/f*d)+.5;n<l||n>u||(e.moveTo(s,n),e.lineTo(c,n))}e.stroke();for(let t=m;t<=i;t+=p){let n=u-(t-r)/f*d;n<l-1||n>u+1||e.fillText(o(t),s-6,n)}if(r<0&&i>0){let t=Math.round(u-(0-r)/f*d)+.5;e.strokeStyle=a.axisLine,e.lineWidth=1,e.beginPath(),e.moveTo(s,t),e.lineTo(c,t),e.stroke()}}function Gm(e,t,n){let r=[`positive`,`negative`,`total`,`subtotal`];for(let i=0;i<r.length;i++){let a=r[i],o=n[a],s=!1;e.beginPath();for(let n=0;n<t.length;n++){let r=t[n];if(r.type!==a)continue;let i=Math.round(r.rectX),o=Math.round(r.rectY),c=Math.round(r.rectW),l=Math.round(r.rectH);e.rect(i,o,c,l),s=!0}s&&(e.fillStyle=o,e.fill())}}function Km(e,t,n,r,i,a,o){if(o===`none`||t.length<2)return;let{bottom:s,plotHeight:c}=n;e.strokeStyle=a,e.lineWidth=1,o===`dashed`?e.setLineDash([4,4]):e.setLineDash([]),e.beginPath();for(let n=0;n<t.length-1;n++){let a=t[n],o=t[n+1],l=a.end,u=Math.round(s-(l-r)/i*c)+.5,d=Math.round(a.rectX+a.rectW),f=Math.round(o.rectX);f<=d||(e.moveTo(d,u),e.lineTo(f,u))}e.stroke(),e.setLineDash([])}function qm(e,t,n,r,i,a){e.fillStyle=r.text,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`;for(let r=0;r<t.length;r++){let o=t[r],s;s=o.type===`total`||o.type===`subtotal`?i(o.value):a?`${o.value>=0?`+`:``}${i(o.value)}`:i(n[r]);let c=o.rectX+o.rectW/2;o.end<o.start?(e.textBaseline=`top`,e.fillText(s,c,o.rectY+o.rectH+4)):(e.textBaseline=`bottom`,e.fillText(s,c,o.rectY-4))}}function Jm(e,t,n,r,i){e.fillStyle=r.axisLabel,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textAlign=`center`,e.textBaseline=`top`;let a=n.bottom+6,o=t.length>0?t[0].slotW-4:0,s=!1;for(let n=0;n<t.length;n++)if(e.measureText(i(t[n].label)).width>o){s=!0;break}if(!s){for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.fillText(i(r.label),o,a)}return}e.save(),e.textAlign=`right`,e.textBaseline=`middle`;for(let n=0;n<t.length;n++){let r=t[n],o=r.slotX+r.slotW/2;e.setTransform(1,0,0,1,o,a+4),e.rotate(-Math.PI/4),e.fillText(i(r.label),0,0)}e.setTransform(1,0,0,1,0,0),e.restore()}function Ym(e,t,n){if(t<n.left||t>n.right)return null;for(let n=0;n<e.length;n++){let r=e[n];if(t>=r.slotX&&t<=r.slotX+r.slotW)return n}return null}function Xm(e,t,n,r,i,a,o,s){let c=t[r],l=n[r],u=Math.round(c.slotX+c.slotW/2)+.5;e.strokeStyle=o.crosshair,e.lineWidth=.5,e.setLineDash([4,4]),e.beginPath(),e.moveTo(u,a.top),e.lineTo(u,a.bottom),e.stroke(),e.setLineDash([]);let d=[c.label,`Value: ${c.value>=0&&(c.type===`positive`||c.type===`negative`)?`+`:``}${s(c.value)}`,`Total: ${s(l)}`];e.font=`${o.font.sizeSmall}px ${o.font.family}`;let f=0;for(let t=0;t<d.length;t++){let n=e.measureText(d[t]).width;n>f&&(f=n)}let p=f+16,m=d.length*(o.font.sizeSmall+4)+12,h=i.x+10,g=i.y-m/2;h+p>a.right&&(h=i.x-p-10),g<a.top&&(g=a.top),g+m>a.bottom&&(g=a.bottom-m),e.fillStyle=o.axisLabelBackground,e.globalAlpha=.9,e.fillRect(h,g,p,m),e.globalAlpha=1,e.fillStyle=o.text,e.textAlign=`left`,e.textBaseline=`top`;let _=o.font.sizeSmall+4;for(let t=0;t<d.length;t++)e.fillText(d[t],h+8,g+6+t*_)}function Zm(e,t,n,r,i,a){let{data:o}=r;if(!o||o.length===0||t<=0||n<=0)return{hitBar:null};let s=r.positiveColor??i.candleUp,c=r.negativeColor??i.candleDown,l=r.totalColor??i.lineColor,u=r.subtotalColor??i.textSecondary,d=r.connectorColor??i.textSecondary,f=r.connectorStyle??`dashed`,p=r.barWidth??Im,m=r.showValues!==!1,h=r.showDelta!==!1,g=r.valueFormat??zm,_=r.labelFormat??(e=>e),{valMin:v,valMax:y}=Hm(o),b=y-v||1,x=Bm(t,n),{bars:S,cumulatives:C}=Vm(o,x,p,v,b);Um(e,t,n,i.background),Wm(e,x,v,y,i,g),Km(e,S,x,v,b,d,f),Gm(e,S,{positive:s,negative:c,total:l,subtotal:u}),m&&qm(e,S,C,i,g,h),Jm(e,S,x,i,_);let w=a?Ym(S,a.x,x):null;return a&&w!==null&&Xm(e,S,C,w,a,x,i,g),{hitBar:w}}var Qm=Math.PI/180,$m=150,eh=240,th=90,nh=.14,rh=1.6*Qm,ih=.22,ah=8,oh=18,sh=16,ch=6.5,lh=20,uh=5,dh=28;function fh(e,t,n){return e<t?t:e>n?n:e}function ph(e){let t=Math.abs(e);return t>=1e6?(e/1e6).toFixed(2)+`M`:t>=1e3?(e/1e3).toFixed(1)+`K`:Number.isInteger(e)?e.toFixed(0):e.toFixed(1)}function mh(e){let t=Number.isFinite(e.startAngle)?e.startAngle:$m,n=(Number.isFinite(e.endAngle)?e.endAngle:t+eh)-t;return n<=0&&(n=(n%360+360)%360||360),n=fh(n,th,360),{start:(t%360+360)%360*Qm,sweep:n*Qm}}function hh(e,t){let n=Math.min(Math.cos(e),Math.cos(t)),r=Math.max(Math.cos(e),Math.cos(t)),i=Math.min(Math.sin(e),Math.sin(t)),a=Math.max(Math.sin(e),Math.sin(t));for(let o=Math.ceil(e/(Math.PI/2));Math.PI/2*o<=t;o++){let e=Math.PI/2*o;n=Math.min(n,Math.cos(e)),r=Math.max(r,Math.cos(e)),i=Math.min(i,Math.sin(e)),a=Math.max(a,Math.sin(e))}return{minX:n,maxX:r,minY:i,maxY:a}}function gh(e){if(e.showZoneLabels!==!0||!e.zones)return 0;let t=e.zones.reduce((e,t)=>Math.max(e,t.label?.length??0),0);return t>0?t*ch+12:0}function _h(e,t,n){let r=Number.isFinite(n.min)?n.min:0,i=Number.isFinite(n.max)?n.max:100;i-r>Math.abs(r)*1e-9||(i=r+Math.max(1,Math.abs(r)*1e-6));let{start:a,sweep:o}=mh(n),s=a,c=a+o,l=fh(n.thickness??nh,.04,.5),u=hh(s,c),d=Math.max(u.maxY,.18),f=gh(n),p=f>0?sh:0,m=Math.max(1,e-2*ah-2*f),h=Math.max(1,t-2*ah-oh-p),g=1+l/2,_=Math.max(8,Math.min(m/((u.maxX-u.minX)*g),h/((d-u.minY)*g))),v=_*l,y=(d-u.minY)*_*g+oh+p,b=e/2-(u.maxX+u.minX)/2*_,x=(t-y)/2+p-u.minY*_*g,S=_-v/2,C=Math.max(11,Math.round(S*.46)),w=u.maxY>.3?x-C*.12:x-C*.55,T=Math.max(Math.sin(s),Math.sin(c)),E=T>.2?x+T*_+v/2+2:1/0,D=Math.min(t-ah,E);return{cx:b,cy:x,radius:_,thickness:v,startAngle:s,endAngle:c,min:r,max:i,valueY:w,valueSize:C,textBottom:D}}function vh(e,t){let n=Number.isFinite(e)?fh((e-t.min)/(t.max-t.min),0,1):0;return t.startAngle+(t.endAngle-t.startAngle)*n}function yh(e,t){if(!t||!Number.isFinite(e))return;let n;for(let r of t)e>=r.from&&e<=r.to&&(n=r);return n}function bh(e,t,n){let r=(t??[]).map(t=>({a0:vh(t.from,e),a1:vh(t.to,e),color:t.color,track:!1})).filter(e=>e.a1>e.a0).sort((e,t)=>e.a0-t.a0),i=[],a=e.startAngle;for(let e of r)e.a1<=a||(e.a0>a+1e-9&&i.push({a0:a,a1:e.a0,color:n,track:!0}),i.push({...e,a0:Math.max(e.a0,a)}),a=e.a1);return a<e.endAngle-1e-9&&i.push({a0:a,a1:e.endAngle,color:n,track:!0}),i}function xh(e,t,n,r,i){r<=n||(e.beginPath(),e.arc(t.cx,t.cy,t.radius,n,r,!1),e.lineWidth=t.thickness,e.lineCap=`butt`,e.strokeStyle=i,e.stroke())}function Sh(e,t,n,r,i,a){let o=t.cx+Math.cos(n)*t.radius,s=t.cy+Math.sin(n)*t.radius,c=a===`start`?n-Math.PI:n;e.globalAlpha=i,e.beginPath(),e.arc(o,s,t.thickness/2,c,c+(i>=1?Math.PI*2:Math.PI),!1),e.closePath(),e.fillStyle=r,e.fill(),e.globalAlpha=1}function Ch(e,t,n,r,i,a){let o=bh(t,n,i),s=o.some(e=>!e.track);o.forEach((n,i)=>{let a=i>0&&!n.track&&!o[i-1].track?rh/2:0,s=i<o.length-1&&!n.track&&!o[i+1].track?rh/2:0,c=n.a0+a,l=n.a1-s;if(n.track){xh(e,t,c,l,n.color);return}e.globalAlpha=ih,xh(e,t,c,l,n.color),e.globalAlpha=1,xh(e,t,c,Math.min(l,r),n.color)}),s||xh(e,t,t.startAngle,r,a);let c=r>t.startAngle+1e-9,l=r>=t.endAngle-1e-9,u=(e,t)=>e.track?[!s&&t?a:i,1]:[e.color,t?1:ih],[d,f]=u(o[0],c),[p,m]=u(o[o.length-1],l);Sh(e,t,t.startAngle,d,f,`start`),Sh(e,t,t.endAngle,p,m,`end`)}function wh(e,t,n){let r=t.radius-t.thickness/2;if(r<dh)return;let i=Math.max(4,t.thickness*.45);e.strokeStyle=n,e.lineCap=`butt`;for(let n=0;n<=lh;n++){let a=n%uh===0,o=t.startAngle+(t.endAngle-t.startAngle)*n/lh,s=r-i,c=s-(a?Math.max(6,t.thickness*.55):Math.max(3,t.thickness*.3));e.globalAlpha=a?.55:.3,e.lineWidth=a?1.5:1,e.beginPath(),e.moveTo(t.cx+Math.cos(o)*s,t.cy+Math.sin(o)*s),e.lineTo(t.cx+Math.cos(o)*c,t.cy+Math.sin(o)*c),e.stroke()}e.globalAlpha=1}function Th(e,t,n,r,i){let a=t.cx+Math.cos(n)*t.radius,o=t.cy+Math.sin(n)*t.radius;e.beginPath(),e.arc(a,o,t.thickness*.78,0,Math.PI*2),e.fillStyle=r,e.fill(),e.lineWidth=Math.max(2,t.thickness*.32),e.strokeStyle=i,e.stroke()}function Eh(e,t,n,r,i){let a=Math.cos(n),o=Math.sin(n),s=t.radius-t.thickness*.9,c=Math.max(6,t.thickness*.6),l=Math.max(1.5,t.thickness*.14);e.beginPath(),e.moveTo(t.cx+a*s,t.cy+o*s),e.lineTo(t.cx-o*l-a*c,t.cy+a*l-o*c),e.lineTo(t.cx+o*l-a*c,t.cy-a*l-o*c),e.closePath(),e.fillStyle=r,e.fill(),e.beginPath(),e.arc(t.cx,t.cy,Math.max(4,t.thickness*.42),0,Math.PI*2),e.fill(),e.lineWidth=2,e.strokeStyle=i,e.stroke()}function Dh(e,t,n,r,i,a,o){e.font=`${n} ${r}px ${i}`;let s=e.measureText(t).width;if(s<=a)return r;let c=Math.floor(r*a/s);return c<o?0:(e.font=`${n} ${c}px ${i}`,c)}function Oh(e,t,n,r,i,a,o){let s=a.font.family,c=(t.radius-t.thickness/2)*1.3,l=a.font.sizeSmall;e.textAlign=`center`,e.textBaseline=`middle`;let u=Dh(e,n,`600`,t.valueSize,s,c,l);if(u===0)return;let d=o?Math.min(t.cy+u*.8,t.textBottom-u/2):t.valueY;e.fillStyle=a.text,e.fillText(n,t.cx,d);let f=Math.max(l,Math.round(u*.26));if(i?.label&&!o){let n=i.label.toUpperCase();Dh(e,n,`600`,f,s,c*.9,l)>0&&(e.fillStyle=i.color,e.fillText(n,t.cx,d-u*.78))}if(r){let n=d+u*.72;n+f/2<=t.textBottom&&Dh(e,r,`400`,f,s,c,l)>0&&(e.fillStyle=a.textSecondary,e.fillText(r,t.cx,n))}}function kh(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall+1}px ${r.font.family}`;let i=t.thickness/2+6;for(let[r,a]of[[t.startAngle,t.min],[t.endAngle,t.max]]){let o=Math.cos(r),s=Math.sin(r),c=t.cx+o*t.radius,l=t.cy+s*t.radius;s>.2?(e.textAlign=`center`,e.textBaseline=`top`,e.fillText(n(a),c,l+i)):(e.textAlign=o<-.2?`right`:o>.2?`left`:`center`,e.textBaseline=s<-.2?`bottom`:`middle`,e.fillText(n(a),c+o*i,l+s*i))}}function Ah(e,t,n,r){e.fillStyle=r.textSecondary,e.font=`${r.font.sizeSmall}px ${r.font.family}`,e.textBaseline=`middle`;let i=t.radius+t.thickness/2+8;for(let r of n){if(!r.label)continue;let n=vh((fh(r.from,t.min,t.max)+fh(r.to,t.min,t.max))/2,t),a=Math.cos(n);e.textAlign=a<-.2?`right`:a>.2?`left`:`center`,e.fillText(r.label,t.cx+a*i,t.cy+Math.sin(n)*i)}}function jh(e,t,n,r,i,a){if(t<=0||n<=0)return;let o=_h(t,n,r),s=Number.isFinite(a),c=s?fh(a,o.min,o.max):o.min,l=vh(c,o),u=s?yh(c,r.zones):void 0,d=r.pointer===`needle`,f=r.valueFormat??ph,p=u?.color??r.needleColor??i.lineColor;e.save(),e.fillStyle=i.background,e.fillRect(0,0,t,n),Ch(e,o,r.zones,l,r.trackColor??i.grid,p),wh(e,o,i.textSecondary),s&&(d?Eh(e,o,l,r.needleColor??i.text,i.background):Th(e,o,l,p,i.background)),r.showValue!==!1&&Oh(e,o,s?f(c):`—`,r.label,u,i,d),kh(e,o,f,i),r.showZoneLabels===!0&&r.zones?.length&&Ah(e,o,r.zones,i),e.restore()}exports.ABCDPatternTool=gc,exports.ADXIndicator=xn,exports.ALMAIndicator=Pr,exports.ATRIndicator=bn,exports.AXIS_LABEL_HEIGHT=p,exports.AcceleratorOscillatorIndicator=lr,exports.AccumulationDistributionIndicator=_r,exports.AccumulativeSwingIndexIndicator=ki,exports.AdvanceDeclineIndicator=ji,exports.AlertDragHandler=_a,exports.AlertManager=Rf,exports.AlligatorIndicator=on,exports.AnchoredVWAPIndicator=Xt,exports.AnchoredVWAPTool=Us,exports.Animator=Ip,exports.ArcTool=jl,exports.AreaRenderer=me,exports.AroonIndicator=En,exports.ArrowMarkTool=fl,exports.ArrowTool=Rs,exports.AverageDayRangeIndicator=oi,exports.AveragePriceIndicator=mi,exports.AwesomeOscillatorIndicator=hn,exports.AxisDragHandler=ga,exports.BalanceOfPowerIndicator=Jn,exports.BarCountdown=ff,exports.BarRenderer=he,exports.BarsPatternTool=au,exports.BaseFinanceChart=Rp,exports.BaselineRenderer=ve,exports.BinanceAdapter=Fd,exports.BollingerBandWidthIndicator=qr,exports.BollingerBandsIndicator=zt,exports.BollingerPercentBIndicator=Kr,exports.BracketTool=Au,exports.BrushTool=wl,exports.BybitAdapter=Yd,exports.CCIIndicator=wn,exports.CMFIndicator=kn,exports.CalloutTool=il,exports.CandlestickRenderer=S,exports.CanvasLayer=n,exports.ChaikinOscillatorIndicator=gn,exports.ChaikinVolatilityIndicator=nr,exports.ChandeKrollStopIndicator=Ur,exports.ChandeMomentumIndicator=Xn,exports.ChandelierExitIndicator=an,exports.ChartLegend=lf,exports.ChartStateManager=dp,exports.ChopZoneIndicator=Fi,exports.ChoppinessIndexIndicator=Mn,exports.CircleTool=bc,exports.CoinbaseAdapter=Ud,exports.CompareRenderer=$e,exports.CompareSymbolIndicator=qi,exports.ConnorsRSIIndicator=In,exports.CoppockIndicator=Rn,exports.CorrelationCoefficientIndicator=Qi,exports.CorrelationLogIndicator=$i,exports.CrossLineTool=$s,exports.CrosshairHandler=ba,exports.CrosshairTooltip=Ia,exports.CurrentPriceLine=$u,exports.CurveTool=Al,exports.CyclicLinesTool=Ac,exports.CypherPatternTool=yc,exports.DEFAULT_LEGEND_CONFIG=cf,exports.DEFAULT_MAX_WEBGL_CHARTS=e.t,exports.DEFAULT_SESSION_HOURS=Cf,exports.DEMAIndicator=Mr,exports.DENSE_BAR_WIDTH=e.u,exports.DPRManager=a,exports.DataExporter=_p,exports.DateAndPriceRangeTool=Ec,exports.DateRangeTool=Ps,exports.DepthHeatmapBuffer=Ye,exports.DepthHeatmapRenderer=Xe,exports.DepthOverlay=wu,exports.DetrendedPriceOscillatorIndicator=qn,exports.DisparityIndexIndicator=fr,exports.DonchianChannelIndicator=Gt,exports.DrawingBase=W,exports.DrawingManager=wo,exports.DrawingRenderer=Yo,exports.EMAIndicator=Rt,exports.EaseOfMovementIndicator=$n,exports.Easing=Fp,exports.ElderRayIndicator=Hn,exports.ElliottCorrectionTool=ks,exports.ElliottDoubleComboTool=js,exports.ElliottImpulseTool=Os,exports.ElliottTriangleTool=As,exports.ElliottTripleComboTool=Ms,exports.ElliottWaveTool=Ds,exports.EllipseTool=vs,exports.Emitter=Xu,exports.EnvelopeIndicator=un,exports.EquivolumeRenderer=Ce,exports.EventBus=Ga,exports.ExtendedLineTool=ss,exports.FibArcsTool=Ul,exports.FibChannelTool=lc,exports.FibCirclesTool=Hl,exports.FibExtensionTool=gs,exports.FibRetracementTool=ms,exports.FibSpeedResistanceFanTool=pc,exports.FibSpiralTool=Kl,exports.FibTimeZonesTool=Ks,exports.FibWedgeTool=Wl,exports.FinanceCrosshair=zp,exports.FisherTransformIndicator=Kn,exports.FlagTool=ll,exports.ForceIndexIndicator=Fn,exports.ForecastTool=ru,exports.GannBoxTool=Hs,exports.GannFanTool=Bs,exports.GannSquareTool=ql,exports.GridRenderer=e.o,exports.GuppyMMAIndicator=di,exports.HLCAreaRenderer=Te,exports.HammingMAIndicator=Si,exports.HeadAndShouldersTool=_c,exports.HiLoRenderer=Ae,exports.HighlighterTool=Tl,exports.HistoricalVolatilityIndicator=Yr,exports.HollowCandleRenderer=ge,exports.HorizontalLineTool=rs,exports.HorizontalRayTool=is,exports.HullMAIndicator=$t,exports.ICON_GLYPHS=pl,exports.IchimokuIndicator=Vt,exports.IconTool=hl,exports.IndicatorBase=N,exports.IndicatorEngine=jt,exports.IndicatorValueMap=P,exports.IndicatorWorkerHost=Gi,exports.InfoLineTool=ac,exports.InteractionManager=aa,exports.KAMAIndicator=Fr,exports.KSTIndicator=zn,exports.KagiRenderer=be,exports.KeltnerChannelIndicator=Wt,exports.KeyboardHandler=Ea,exports.KlingerIndicator=Gn,exports.KrakenAdapter=nf,exports.LSMAIndicator=Ir,exports.LayerManager=r,exports.LineRenderer=pe,exports.LineWithMarkersRenderer=De,exports.LinearRegressionChannelIndicator=Qt,exports.LinearRegressionSlopeIndicator=ii,exports.MACDIndicator=vn,exports.MAChannelIndicator=vi,exports.MACrossIndicator=Br,exports.MADoubleIndicator=Ei,exports.MARibbonIndicator=fi,exports.MATripleIndicator=Di,exports.MAX_ALERT_BARS=kf,exports.MAX_BASE_RATIO=nd,exports.MAX_BASE_REQUESTS=td,exports.MFIIndicator=Tn,exports.MIN_ALERT_BARS=Af,exports.MIN_BAR_UNIT=te,exports.MTFMovingAverageIndicator=nn,exports.MajorityRuleIndicator=Mi,exports.MarketProfileRenderer=Re,exports.MassIndexIndicator=Yn,exports.McGinleyDynamicIndicator=Lr,exports.MeasureOverlay=Tp,exports.MeasureTool=Fs,exports.MedianPriceIndicator=hi,exports.MockAdapter=Id,exports.ModifiedSchiffPitchforkTool=Ss,exports.MomentumIndicator=Jr,exports.NetVolumeIndicator=si,exports.NoteTool=rl,exports.OBVIndicator=Sn,exports.OrderDraftTool=Iu,exports.OrderRenderer=mu,exports.PanHandler=ma,exports.PaneResizeHandler=va,exports.PaperExecutionAdapter=qu,exports.ParabolicSARIndicator=Ht,exports.ParallelChannelTool=cs,exports.PathTool=El,exports.PercentagePriceOscillatorIndicator=sr,exports.PeriodLevelsRenderer=Ue,exports.PinnedTooltip=Ba,exports.PitchfanTool=Gl,exports.PitchforkTool=bs,exports.PivotMarkersRenderer=qe,exports.PivotPointsIndicator=Jt,exports.PointAndFigureRenderer=xe,exports.PollingAdapter=zd,exports.PolylineTool=Dl,exports.PositionRenderer=Cu,exports.PrettyGoodOscillatorIndicator=mr,exports.PriceAxis=u,exports.PriceAxisAddButton=ca,exports.PriceLabelTool=Fc,exports.PriceLines=Df,exports.PriceOscillatorIndicator=Ri,exports.PriceRangeTool=Ns,exports.PriceVolumeTrendIndicator=er,exports.ProjectionTool=iu,exports.QstickIndicator=pr,exports.RANGE_PRESETS=ie,exports.ROCIndicator=Dn,exports.RSIIndicator=_n,exports.RayTool=os,exports.ReconnectManager=Qu,exports.RectangleTool=_s,exports.RegressionChannelTool=ls,exports.RelativeMomentumIndexIndicator=dr,exports.RelativeVigorIndicator=rr,exports.RelativeVolatilityIndexIndicator=ni,exports.RenderEngine=O,exports.RenderLoop=i,exports.RenkoRenderer=ye,exports.ReplayController=xd,exports.ReplayManager=Wf,exports.ResamplingAdapter=ud,exports.RiskRewardTool=Qs,exports.SELECTION_BOX_MIN_SIZE=Np,exports.SMAIndicator=Lt,exports.SMIErgodicIndicator=Li,exports.SMMAIndicator=Nr,exports.SNAPSHOT_VERSION=Kf,exports.SchaffTrendCycleIndicator=Un,exports.SchiffPitchforkTool=xs,exports.Screenshot=uf,exports.SelectionBoxOverlay=Pp,exports.SessionBreaks=mf,exports.SessionShading=wf,exports.SessionVWAPIndicator=rn,exports.SignalMarkerManager=Sp,exports.SineLineTool=Ql,exports.SpreadIndicator=Ji,exports.StandardErrorBandsIndicator=ci,exports.StandardErrorIndicator=ai,exports.StdDevIndicator=hr,exports.StepLineRenderer=Ee,exports.StochasticIndicator=yn,exports.StochasticMomentumIndexIndicator=ti,exports.StochasticRSIIndicator=ir,exports.StreamManager=bd,exports.SupertrendIndicator=Ut,exports.SymbolSeriesStore=Qe,exports.TEMAIndicator=mn,exports.TRIXIndicator=Zn,exports.TSIIndicator=On,exports.TextAnnotationTool=Ls,exports.ThreeDrivesTool=vc,exports.TickAggregator=Zu,exports.TickBarAdapter=hd,exports.TickBarBuilder=md,exports.TimeAxis=ta,exports.TimeCyclesTool=Zl,exports.TradeZoneManager=wp,exports.TradingContextMenu=Eu,exports.TradingDragHandler=Tu,exports.TradingManager=Gu,exports.TradingRenderer=Ku,exports.TrendAngleTool=rc,exports.TrendLineTool=ns,exports.TrendStrengthIndexIndicator=ri,exports.TriangleTool=ys,exports.TypicalPriceIndicator=gi,exports.UlcerIndexIndicator=Qr,exports.UltimateOscillatorIndicator=Nn,exports.UndoRedoManager=fp,exports.VROCIndicator=vr,exports.VWAPIndicator=Bt,exports.VWMAIndicator=cn,exports.VerticalLineTool=as,exports.Viewport=ne,exports.VolatilityIndexIndicator=Oi,exports.VolatilityOHLCIndicator=Vi,exports.VolatilityZeroTrendIndicator=Hi,exports.VolumeCandleRenderer=Se,exports.VolumeDeltaIndicator=An,exports.VolumeOscillatorIndicator=Xr,exports.VolumeProfileIndicator=gr,exports.VolumeProfileRangeTool=Ws,exports.VolumeProfileRenderer=Me,exports.VolumeRenderer=je,exports.VortexIndicator=jn,exports.WMAIndicator=ln,exports.Watermark=df,exports.WebSocketAdapter=Rd,exports.WilliamsADIndicator=tr,exports.WilliamsFractalsIndicator=Hr,exports.WilliamsRIndicator=Cn,exports.XABCDPatternTool=hc,exports.ZigZagIndicator=Zt,exports.ZoomHandler=ha,exports.alignOutput=Ot,exports.arcPoints=kl,exports.assignSessionLetters=Ie,exports.barIndexToTime=e.y,exports.barIndexToX=e.b,exports.barTimeStep=e.x,exports.barTimeStepMs=e.S,exports.bracketRiskReward=Ou,exports.claimGpuContext=e.n,exports.classifyPivots=Ge,exports.computeBracketDefaults=Du,exports.computeMarketProfile=Pe,exports.computePeriodLevels=He,exports.computeSessionProfiles=Le,exports.curvePoints=Ol,exports.drawAxisValueLabels=v,exports.drawnKeys=ut,exports.fillTag=d,exports.findDominantSwing=Xo,exports.findPivots=Ke,exports.forEachPixelColumn=e.d,exports.forecastOutcome=nu,exports.formatTooltipTime=Pa,exports.getIntParam=I,exports.getNumberParam=F,exports.getVisibleData=re,exports.gpuContextsLeft=e.r,exports.hasHistogram=vt,exports.hasTrades=vd,exports.indicatorValuePrecision=f,exports.inferOrderType=Pu,exports.inputSource=Tt,exports.isDense=e.f,exports.isInWindow=xf,exports.isPriceLevelAlert=Mf,exports.isRegularSession=Sf,exports.isUpTone=dt,exports.isWorkerResponse=Wi,exports.labelTextColor=h,exports.layoutAxisValueLabels=_,exports.layoutSquarifiedTreemap=wm,exports.layoutUniformGrid=bm,exports.lineSourceBars=Dt,exports.lineSpace=qa,exports.loadWebGL=k,exports.loadWebGLRenderer=ee,exports.lttbDownsample=ue,exports.lttbVisibleIndices=fe,exports.mergeSessionHours=yf,exports.minuteOfDay=bf,exports.paneLogRange=gt,exports.paneValueRange=ht,exports.plotColor=mt,exports.plotLook=M,exports.plotShown=ft,exports.priceBucketRow=e.C,exports.priceSourceBars=Et,exports.priceToY=e.w,exports.priceToYMapper=e.T,exports.rangePresetStart=le,exports.readAlertOptions=Bf,exports.registerBuiltInDrawingTools=ou,exports.registerBuiltInIndicators=Ui,exports.renderAxisValueLabels=y,exports.renderDenseBars=e.p,exports.renderDepthChart=tm,exports.renderEquityCurve=ym,exports.renderGauge=jh,exports.renderHeatmap=jm,exports.renderPlots=yt,exports.renderSparkline=Bp,exports.renderWaterfall=Zm,exports.resolveBarIndex=e.E,exports.servesTimeframe=sd,exports.setMaxWebGLCharts=e.i,exports.sourceParam=wt,exports.spreadLabels=m,exports.timeToX=e.D,exports.timestampToBarIndex=e.O,exports.toHeikinAshi=et,exports.toKagi=it,exports.toLineBreak=rt,exports.toPointAndFigure=at,exports.toRangeBars=ot,exports.toRenko=tt,exports.tpoLetter=Fe,exports.waveLabel=ws,exports.whenGpuContextFree=e.a,exports.withResampling=ad,exports.withTickBars=_d,exports.xToBarIndex=e.k,exports.xToTime=e.A,exports.yToPrice=e.j;
23
23
  //# sourceMappingURL=index.cjs.map